fixPermissions: simplify code, fix bugs

- avoid parsing permission strings
- fix memory leaks, a fix new/free mismatch and a compiler warning
- fix that only first updated-package was processed
- fix a potential stack overflow if packages.xml is huge
- minor refactoring for reducing duplicated code
- don't process packages without codePath
- fix path for deleting app data (currently unused anyway)
- fix file ownership on libs
- try not to mess up Android 5.0 app permissions

Patch set 4

- make fixing SELinux contexts an option with a check box
- add some notes / text to the themes

Patch set 6

- decouple "fix permissions" from "fix contexts"

Change-Id: Icc77ecc581befc5ce6e419b1f3b8ca189208c234
diff --git a/fixPermissions.hpp b/fixPermissions.hpp
index e57d7bf..f61a9a1 100644
--- a/fixPermissions.hpp
+++ b/fixPermissions.hpp
@@ -16,28 +16,31 @@
 
 class fixPermissions {
 	public:
+		fixPermissions();
+		~fixPermissions();
 		int fixPerms(bool enable_debug, bool remove_data_for_missing_apps);
+		int fixContexts();
 		int fixDataInternalContexts(void);
 
 	private:
-		int pchown(std::string fn, int puid, int pgid);
-		int pchmod(std::string fn, string mode);
-		vector <string> listAllDirectories(std::string path);
-		vector <string> listAllFiles(std::string path);
-		int getPackages();
-		int fixSystemApps();
-		int fixDataApps();
-		int fixAllFiles(string directory, int gid, int uid, string file_perms);
+		int pchown(string fn, int puid, int pgid);
+		int pchmod(string fn, mode_t mode);
+		vector <string> listAllDirectories(string path);
+		vector <string> listAllFiles(string path);
+		void deletePackages();
+		int getPackages(const string& packageFile);
+		int fixApps();
+		int fixAllFiles(string directory, int uid, int gid, mode_t file_perms);
+		int fixDir(const string& dir, int diruid, int dirgid, mode_t dirmode, int fileuid, int filegid, mode_t filemode);
 		int fixDataData(string dataDir);
-		int restorecon(std::string entry, struct stat *sb);
+		int restorecon(string entry, struct stat *sb);
 		int fixDataDataContexts(void);
-		int fixContextsRecursively(std::string path, int level);
+		int fixContextsRecursively(string path, int level);
 
 		struct package {
 			string pkgName;
 			string codePath;
 			string appDir;
-			string app;
 			string dDir;
 			int gid;
 			int uid;
@@ -45,8 +48,5 @@
 		};
 		bool debug;
 		bool remove_data;
-		bool multi_user;
 		package* head;
-		package* temp;
-		string packageFile;
 };