Add wipe functions, compiles in CM7, text shows in UI, zips install

Zip install works, had to move mincrypt code into TWRP to prevent
a crash when checking the zip signature.
Added wipe functions
Made it compile in CM7
Made text show up in console and logging
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index 21752a0..7ff5e8e 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -34,6 +34,12 @@
 #include "common.h"
 #include "partitions.hpp"
 #include "data.hpp"
+#include "twrp-functions.hpp"
+
+extern "C" {
+	#include "extra-functions.h"
+	int __system(const char *command);
+}
 
 #ifdef TW_INCLUDE_CRYPTO
 	#ifdef TW_INCLUDE_JB_CRYPTO
@@ -89,10 +95,7 @@
 	}
 	for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
 		if ((*iter)->Can_Be_Mounted) {
-			if ((*iter)->Is_Decrypted)
-				Line = (*iter)->Decrypted_Block_Device + " " + (*iter)->Mount_Point + " " + (*iter)->Current_File_System + " rw\n";
-			else
-				Line = (*iter)->Block_Device + " " + (*iter)->Mount_Point + " " + (*iter)->Current_File_System + " rw\n";
+			Line = (*iter)->Actual_Block_Device + " " + (*iter)->Mount_Point + " " + (*iter)->Current_File_System + " rw\n";
 			fputs(Line.c_str(), fp);
 			// Handle subpartition tracking
 			if ((*iter)->Is_SubPartition) {
@@ -112,7 +115,7 @@
 	std::vector<TWPartition*>::iterator iter;
 	int ret = false;
 	bool found = false;
-	string Local_Path = Get_Root_Path(Path);
+	string Local_Path = TWFunc::Get_Root_Path(Path);
 
 	// Iterate through all partitions
 	for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
@@ -181,7 +184,7 @@
 	std::vector<TWPartition*>::iterator iter;
 	int ret = false;
 	bool found = false;
-	string Local_Path = Get_Root_Path(Path);
+	string Local_Path = TWFunc::Get_Root_Path(Path);
 
 	// Iterate through all partitions
 	for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
@@ -294,7 +297,7 @@
 
 TWPartition* TWPartitionManager::Find_Partition_By_Path(string Path) {
 	std::vector<TWPartition*>::iterator iter;
-	string Local_Path = Get_Root_Path(Path);
+	string Local_Path = TWFunc::Get_Root_Path(Path);
 
 	for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
 		if ((*iter)->Mount_Point == Local_Path || (!(*iter)->Symlink_Mount_Point.empty() && (*iter)->Symlink_Mount_Point == Local_Path))
@@ -307,7 +310,7 @@
 	std::vector<TWPartition*>::iterator iter;
 
 	for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
-		if ((*iter)->Block_Device == Block || (*iter)->Alternate_Block_Device == Block || ((*iter)->Is_Decrypted && (*iter)->Decrypted_Block_Device == Block))
+		if ((*iter)->Primary_Block_Device == Block || (*iter)->Alternate_Block_Device == Block || ((*iter)->Is_Decrypted && (*iter)->Decrypted_Block_Device == Block))
 			return (*iter);
 	}
 	return NULL;
@@ -331,7 +334,7 @@
 int TWPartitionManager::Run_Restore(string Restore_Name) {
 	int check;
 	TWPartition* Part;
-
+LOGE("TO DO: Check MD5 of all partitions before restoring ANY partitions.\n");
 	DataManager::GetValue(TW_RESTORE_SYSTEM_VAR, check);
 	if (check > 0) {
 		Part = Find_Partition_By_Path("/system");
@@ -389,7 +392,7 @@
 #ifdef SP1_NAME
 	DataManager::GetValue(TW_RESTORE_SP1_VAR, check);
 	if (check > 0) {
-		Part = Find_Partition_By_Path(Get_Root_Path(SP1_NAME));
+		Part = Find_Partition_By_Path(TWFunc::Get_Root_Path(SP1_NAME));
 		if (Part) {
 			if (!Part->Restore(Restore_Name))
 				return false;
@@ -400,7 +403,7 @@
 #ifdef SP2_NAME
 	DataManager::GetValue(TW_RESTORE_SP2_VAR, check);
 	if (check > 0) {
-		Part = Find_Partition_By_Path(Get_Root_Path(SP2_NAME));
+		Part = Find_Partition_By_Path(TWFunc::Get_Root_Path(SP2_NAME));
 		if (Part) {
 			if (!Part->Restore(Restore_Name))
 				return false;
@@ -411,7 +414,7 @@
 #ifdef SP3_NAME
 	DataManager::GetValue(TW_RESTORE_SP3_VAR, check);
 	if (check > 0) {
-		Part = Find_Partition_By_Path(Get_Root_Path(SP3_NAME));
+		Part = Find_Partition_By_Path(TWFunc::Get_Root_Path(SP3_NAME));
 		if (Part) {
 			if (!Part->Restore(Restore_Name))
 				return false;
@@ -518,15 +521,15 @@
 		if (Part->Mount_Point == "/sd-ext")
 			tw_restore_sdext = 1;
 #ifdef SP1_NAME
-		if (Part->Mount_Point == Get_Root_Path(SP1_Name))
+		if (Part->Mount_Point == TWFunc::Get_Root_Path(SP1_Name))
 			tw_restore_sp1 = 1;
 #endif
 #ifdef SP2_NAME
-		if (Part->Mount_Point == Get_Root_Path(SP2_Name))
+		if (Part->Mount_Point == TWFunc::Get_Root_Path(SP2_Name))
 			tw_restore_sp2 = 1;
 #endif
 #ifdef SP3_NAME
-		if (Part->Mount_Point == Get_Root_Path(SP3_Name))
+		if (Part->Mount_Point == TWFunc::Get_Root_Path(SP3_Name))
 			tw_restore_sp3 = 1;
 #endif
 	}
@@ -551,7 +554,7 @@
 	std::vector<TWPartition*>::iterator iter;
 	int ret = false;
 	bool found = false;
-	string Local_Path = Get_Root_Path(Path);
+	string Local_Path = TWFunc::Get_Root_Path(Path);
 
 	// Iterate through all partitions
 	for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
@@ -612,7 +615,7 @@
 	int ret = true;
 
 	for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
-		if ((*iter)->Wipe_During_Factory_Reset) {
+		if ((*iter)->Wipe_During_Factory_Reset && (*iter)->Is_Present) {
 			if (!(*iter)->Wipe())
 				ret = false;
 		}
@@ -620,6 +623,101 @@
 	return ret;
 }
 
+int TWPartitionManager::Wipe_Dalvik_Cache(void) {
+	struct stat st;
+
+	if (!Mount_By_Path("/data", true))
+		return false;
+
+	if (!Mount_By_Path("/cache", true))
+		return false;
+
+	ui_print("\nWiping Dalvik Cache Directories...\n");
+	__system("rm -rf /data/dalvik-cache");
+	ui_print("Cleaned: /data/dalvik-cache...\n");
+	__system("rm -rf /cache/dalvik-cache");
+	ui_print("Cleaned: /cache/dalvik-cache...\n");
+	__system("rm -rf /cache/dc");
+	ui_print("Cleaned: /cache/dc\n");
+
+	TWPartition* sdext = Find_Partition_By_Path("/sd-ext");
+	if (sdext != NULL) {
+		if (sdext->Is_Present && sdext->Mount(false)) {
+			if (stat("/sd-ext/dalvik-cache", &st) == 0) {
+                __system("rm -rf /sd-ext/dalvik-cache");
+        	    ui_print("Cleaned: /sd-ext/dalvik-cache...\n");
+    	    }
+        }
+	}
+	ui_print("-- Dalvik Cache Directories Wipe Complete!\n\n");
+	return true;
+}
+
+int TWPartitionManager::Wipe_Rotate_Data(void) {
+	if (!Mount_By_Path("/data", true))
+		return false;
+
+	__system("rm -r /data/misc/akmd*");
+	__system("rm -r /data/misc/rild*");
+	ui_print("Rotation data wiped.\n");
+	return true;
+}
+
+int TWPartitionManager::Wipe_Battery_Stats(void) {
+	struct stat st;
+
+	if (!Mount_By_Path("/data", true))
+		return false;
+
+	if (0 != stat("/data/system/batterystats.bin", &st)) {
+		ui_print("No Battery Stats Found. No Need To Wipe.\n");
+	} else {
+		remove("/data/system/batterystats.bin");
+		ui_print("Cleared battery stats.\n");
+	}
+	return true;
+}
+
+int TWPartitionManager::Format_Data(void) {
+	TWPartition* dat = Find_Partition_By_Path("/data");
+
+	if (dat != NULL) {
+		if (!dat->UnMount(true))
+			return false;
+
+		return dat->Wipe_Encryption();
+	} else {
+		LOGE("Unable to locate /data.\n");
+		return false;
+	}
+	return false;
+}
+
+int TWPartitionManager::Wipe_Media_From_Data(void) {
+	TWPartition* dat = Find_Partition_By_Path("/data");
+
+	if (dat != NULL) {
+		if (!dat->Has_Data_Media) {
+			LOGE("This device does not have /data/media\n");
+			return false;
+		}
+		if (!dat->Mount(true))
+			return false;
+
+		ui_print("Wiping internal storage -- /data/media...\n");
+		__system("rm -rf /data/media");
+		__system("cd /data && mkdir media && chmod 775 media");
+		if (dat->Has_Data_Media) {
+			dat->Recreate_Media_Folder();
+		}
+		return true;
+	} else {
+		LOGE("Unable to locate /data.\n");
+		return false;
+	}
+	return false;
+}
+
 void TWPartitionManager::Refresh_Sizes(void) {
 	Update_System_Details();
 	return;
@@ -692,7 +790,7 @@
 	} else {
 		TWPartition* dat = Find_Partition_By_Path("/data");
 		if (dat != NULL) {
-			DataManager::SetValue(TW_DATA_BLK_DEVICE, dat->Block_Device);
+			DataManager::SetValue(TW_DATA_BLK_DEVICE, dat->Primary_Block_Device);
 			DataManager::SetValue(TW_IS_DECRYPTED, 1);
 			dat->Is_Decrypted = true;
 			dat->Decrypted_Block_Device = crypto_blkdev;
@@ -711,17 +809,15 @@
 	return 1;
 }
 
-string TWPartitionManager::Get_Root_Path(string Path) {
-	string Local_Path = Path;
+int TWPartitionManager::Fix_Permissions(void) {
+	if (!Mount_By_Path("/data", true))
+		return false;
 
-	// Make sure that we have a leading slash
-	if (Local_Path.substr(0, 1) != "/")
-		Local_Path = "/" + Local_Path;
+	if (!Mount_By_Path("/system", true))
+		return false;
 
-	// Trim the path to get the root path only
-	size_t position = Local_Path.find("/", 2);
-	if (position != string::npos) {
-		Local_Path.resize(position);
-	}
-	return Local_Path;
-}
+	ui_print("Fixing Permissions\nThis may take a few minutes.\n");
+	__system("./sbin/fix_permissions.sh");
+	ui_print("Done.\n\n");
+	return true;
+}
\ No newline at end of file