Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e979abd6 authored by Vojtech Bocek's avatar Vojtech Bocek Committed by Dees Troy
Browse files

Fix some crashes during theme (re)loading



Change-Id: I01405fbe86a48ae79f2cbe633b89f2dcfb1ef266
Signed-off-by: default avatarVojtech Bocek <vbocek@gmail.com>
parent 85cfb7d7
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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)
@@ -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))
		if (child && LoadPages(child))
		{
			templates.pop_back();
			doc->clear();
			delete doc;
			return -1;
		}

		mIncludedDocs.push_back(doc);

		if (CheckInclude(package, &doc))
		if (CheckInclude(package, doc))
			return -1;

		chld = chld->next_sibling("xmlfile");
+1 −0
Original line number Diff line number Diff line
@@ -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