Fix some crashes during theme (re)loading

Change-Id: I01405fbe86a48ae79f2cbe633b89f2dcfb1ef266
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
This commit is contained in:
Vojtech Bocek
2015-01-12 20:23:37 +01:00
committed by Dees Troy
parent 85cfb7d7b7
commit e979abd6cc
3 changed files with 29 additions and 15 deletions
+3 -4
View File
@@ -385,8 +385,9 @@ int GUIAction::doActions()
}
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 GUIAction::reload(std::string arg)
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 @@ int GUIAction::reload(std::string arg)
ret_val = 1;
}
}
operation_end(ret_val);
return 0;
}
+25 -11
View File
@@ -557,11 +557,16 @@ PageSet::~PageSet()
{
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 @@ int PageSet::Load(ZipArchive* package)
return -1;
}
}
return CheckInclude(package, &mDoc);
}
@@ -620,7 +625,7 @@ int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc)
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 @@ int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc)
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 @@ int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc)
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");
+1
View File
@@ -111,6 +111,7 @@ protected:
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