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