Fix some crashes during theme (re)loading
Change-Id: I01405fbe86a48ae79f2cbe633b89f2dcfb1ef266
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
diff --git a/gui/action.cpp b/gui/action.cpp
index c298d02..8ea1dae 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -385,8 +385,9 @@
}
else
{
- for (it = mActions.begin(); it != mActions.end(); ++it)
- doAction(*it);
+ const size_t cnt = mActions.size();
+ for (size_t i = 0; i < cnt; ++i)
+ doAction(mActions[i]);
}
return 0;
@@ -484,7 +485,6 @@
int check = 0, ret_val = 0;
std::string theme_path;
- operation_start("Reload Theme");
theme_path = DataManager::GetSettingsStoragePath();
if (PartitionManager.Mount_By_Path(theme_path.c_str(), 1) < 0) {
LOGERR("Unable to mount %s during reload function startup.\n", theme_path.c_str());
@@ -502,7 +502,6 @@
ret_val = 1;
}
}
- operation_end(ret_val);
return 0;
}
diff --git a/gui/pages.cpp b/gui/pages.cpp
index aae85ae..94c351b 100644
--- a/gui/pages.cpp
+++ b/gui/pages.cpp
@@ -557,11 +557,16 @@
{
for (std::vector<Page*>::iterator itr = mPages.begin(); itr != mPages.end(); ++itr)
delete *itr;
- for (std::vector<xml_node<>*>::iterator itr2 = templates.begin(); itr2 != templates.end(); ++itr2)
- delete *itr2;
delete mResources;
free(mXmlFile);
+
+ mDoc.clear();
+
+ for (std::vector<xml_document<>*>::iterator itr = mIncludedDocs.begin(); itr != mIncludedDocs.end(); ++itr) {
+ (*itr)->clear();
+ delete *itr;
+ }
}
int PageSet::Load(ZipArchive* package)
@@ -605,7 +610,7 @@
return -1;
}
}
-
+
return CheckInclude(package, &mDoc);
}
@@ -620,7 +625,7 @@
long len;
char* xmlFile = NULL;
string filename;
- xml_document<> doc;
+ xml_document<> *doc = NULL;
par = parentDoc->first_node("recovery");
if (!par) {
@@ -682,11 +687,14 @@
return -1;
}
}
- doc.parse<0>(xmlFile);
- parent = doc.first_node("recovery");
+ xmlFile[len] = '\0';
+ doc = new xml_document<>();
+ doc->parse<0>(xmlFile);
+
+ parent = doc->first_node("recovery");
if (!parent)
- parent = doc.first_node("install");
+ parent = doc->first_node("install");
// Now, let's parse the XML
LOGINFO("Loading included resources...\n");
@@ -711,11 +719,17 @@
templates.push_back(xmltemplate);
child = parent->first_node("pages");
- if (child)
- if (LoadPages(child))
- return -1;
+ if (child && LoadPages(child))
+ {
+ templates.pop_back();
+ doc->clear();
+ delete doc;
+ return -1;
+ }
- if (CheckInclude(package, &doc))
+ mIncludedDocs.push_back(doc);
+
+ if (CheckInclude(package, doc))
return -1;
chld = chld->next_sibling("xmlfile");
diff --git a/gui/pages.hpp b/gui/pages.hpp
index 2ce3e13..b042c0d 100644
--- a/gui/pages.hpp
+++ b/gui/pages.hpp
@@ -111,6 +111,7 @@
std::vector<xml_node<>*> templates;
Page* mCurrentPage;
Page* mOverlayPage; // This is a special case, used for "locking" the screen
+ std::vector<xml_document<>*> mIncludedDocs;
};
class PageManager