MD5 checking: fix issues introduced with adb backup patchset

This patchset will fix issues with creating and checking
md5 checksums with single partitions and subpartitions.

Change-Id: Iddfaf46412e95635af958094726cf9e3eb5a4cc8
diff --git a/partition.cpp b/partition.cpp
index 89650db..6edc368 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -1612,7 +1612,7 @@
 	return false;
 }
 
-bool TWPartition::Check_MD5(string restore_folder) {
+bool TWPartition::Check_MD5(PartitionSettings *part_settings) {
 	string Full_Filename, md5file;
 	char split_filename[512];
 	int index = 0;
@@ -1621,7 +1621,7 @@
 	sync();
 
 	memset(split_filename, 0, sizeof(split_filename));
-	Full_Filename = restore_folder + "/" + Backup_FileName;
+	Full_Filename = part_settings->Restore_Name + "/" + part_settings->Backup_FileName;
 	if (!TWFunc::Path_Exists(Full_Filename)) {
 		// This is a split archive, we presume
 		sprintf(split_filename, "%s%03i", Full_Filename.c_str(), index);
@@ -1647,7 +1647,7 @@
 		// Single file archive
 		md5file = Full_Filename + ".md5";
 		if (!TWFunc::Path_Exists(md5file)) {
-			gui_msg(Msg(msg::kError, "no_md5_found=No md5 file found for '{1}'. Please unselect Enable MD5 verification to restore.")(split_filename));
+			gui_msg(Msg(msg::kError, "no_md5_found=No md5 file found for '{1}'. Please unselect Enable MD5 verification to restore.")(md5file));
 			return false;
 		}
 		md5sum.setfn(Full_Filename);
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index a326d79..1c7a970 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -551,11 +551,21 @@
 	part_settings->Backup_FileName = part_settings->Part->Backup_Name + "." +  part_settings->Part->Current_File_System + ".win";
 	if (part_settings->Part->Backup(part_settings, &tar_fork_pid)) {
 		bool md5Success = false;
+		if (part_settings->adbbackup) {
+			md5Success = true;
+		}
+		else
+			md5Success = Make_MD5(part_settings);
+
+		TWFunc::SetPerformanceMode(false);
 		if (part_settings->Part->Has_SubPartition) {
 			std::vector<TWPartition*>::iterator subpart;
+			TWPartition *parentPart = part_settings->Part;
 
 			for (subpart = Partitions.begin(); subpart != Partitions.end(); subpart++) {
-				if ((*subpart)->Can_Be_Backed_Up && (*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == part_settings->Part->Mount_Point) {
+				part_settings->Part = *subpart;
+				if ((*subpart)->Can_Be_Backed_Up && (*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == parentPart->Mount_Point) {
+					part_settings->Backup_FileName = part_settings->Part->Backup_Name + "." +  part_settings->Part->Current_File_System + ".win";
 					if (!(*subpart)->Backup(part_settings, &tar_fork_pid)) {
 						TWFunc::SetPerformanceMode(false);
 						Clean_Backup_Folder(part_settings->Backup_Folder);
@@ -577,6 +587,7 @@
 		time(&stop);
 		int backup_time = (int) difftime(stop, start);
 		LOGINFO("Partition Backup time: %d\n", backup_time);
+
 		if (part_settings->Part->Backup_Method == BM_FILES) {
 			part_settings->file_time += backup_time;
 		} else {
@@ -584,13 +595,6 @@
 
 		}
 
-		if (part_settings->adbbackup) {
-			md5Success = true;
-		}
-		else
-			md5Success = Make_MD5(part_settings);
-		TWFunc::SetPerformanceMode(false);
-
 		return md5Success;
 	} else {
 		Clean_Backup_Folder(part_settings->Backup_Folder);
@@ -889,10 +893,12 @@
 	}
 	if (part_settings->Part->Has_SubPartition) {
 		std::vector<TWPartition*>::iterator subpart;
+		TWPartition *parentPart = part_settings->Part;
 
 		for (subpart = Partitions.begin(); subpart != Partitions.end(); subpart++) {
-
-			if ((*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == part_settings->Part->Mount_Point) {
+			part_settings->Part = *subpart;
+			if ((*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == parentPart->Mount_Point) {
+				part_settings->Part = (*subpart);
 				if (!(*subpart)->Restore(part_settings)) {
 					TWFunc::SetPerformanceMode(false);
 					return false;
@@ -953,16 +959,19 @@
 					return false;
 				}
 
-				if (check_md5 > 0 && !part_settings.Part->Check_MD5(Restore_Name))
+				if (check_md5 > 0 && !part_settings.Part->Check_MD5(&part_settings))
 					return false;
 				part_settings.partition_count++;
 				part_settings.total_restore_size += part_settings.Part->Get_Restore_Size(&part_settings);
 				if (part_settings.Part->Has_SubPartition) {
+					TWPartition *parentPart = part_settings.Part;
 					std::vector<TWPartition*>::iterator subpart;
 
 					for (subpart = Partitions.begin(); subpart != Partitions.end(); subpart++) {
-						if ((*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == part_settings.Part->Mount_Point) {
-							if (check_md5 > 0 && !(*subpart)->Check_MD5(Restore_Name))
+						part_settings.Backup_FileName = parentPart->Backup_Name + "." +  parentPart->Current_File_System + ".win";
+						part_settings.Part = *subpart;
+						if ((*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == parentPart->Mount_Point) {
+							if (check_md5 > 0 && !(*subpart)->Check_MD5(&part_settings))
 								return false;
 							part_settings.total_restore_size += (*subpart)->Get_Restore_Size(&part_settings);
 						}
diff --git a/partitions.hpp b/partitions.hpp
index 7416fbe..201a4e1 100644
--- a/partitions.hpp
+++ b/partitions.hpp
@@ -60,8 +60,8 @@
 	uint64_t img_bytes;                                                        // total image bytes of all emmc partitions
 	uint64_t file_bytes;                                                       // total file bytes of all file based partitions
 	int partition_count;                                                       // Number of partitions to restore
-	ProgressTracking *progress;
-	enum PartitionManager_Op PM_Method;                                        //Current operation of backup or restore
+	ProgressTracking *progress;                                                // Keep track of progress in GUI	
+	enum PartitionManager_Op PM_Method;                                        // Current operation of backup or restore
 };
 
 enum Backup_Method_enum {
@@ -94,7 +94,7 @@
 	bool Can_Resize();                                                        // Checks to see if we have everything needed to be able to resize the current file system
 	bool Resize();                                                            // Resizes the current file system
 	bool Backup(PartitionSettings *part_settings, pid_t *tar_fork_pid);       // Backs up the partition to the folder specified
-	bool Check_MD5(string restore_folder);                                    // Checks MD5 of a backup
+	bool Check_MD5(PartitionSettings *part_settings);                         // Checks MD5 of a backup
 	bool Restore(PartitionSettings *part_settings);                           // Restores the partition using the backup folder provided
 	unsigned long long Get_Restore_Size(PartitionSettings *part_settings);// Returns the overall restore size of the backup
 	string Backup_Method_By_Name();                                           // Returns a string of the backup method for human readable output