Add cancel backup capability.

This will stop the iteration of the partition objects, kill the
current twrpTar thread and remove the backup directory.

Implement TWAtomicInt class to give us a wrapper that automatically
uses mutexes before the read and write to help ensure that the
reads and writes will be atomic based on documentation.

Change-Id: I645b22bc980a292e9c7202acb24ffd22ebe68c63
diff --git a/gui/action.cpp b/gui/action.cpp
index d758430..e7f74d4 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -56,6 +56,7 @@
 
 #include "rapidxml.hpp"
 #include "objects.hpp"
+#include "../tw_atomic.hpp"
 
 void curtainClose(void);
 
@@ -169,6 +170,7 @@
 		mf["fixsu"] = &GUIAction::fixsu;
 		mf["startmtp"] = &GUIAction::startmtp;
 		mf["stopmtp"] = &GUIAction::stopmtp;
+		mf["cancelbackup"] = &GUIAction::cancelbackup;
 
 		// remember actions that run in the caller thread
 		for (mapFunc::const_iterator it = mf.begin(); it != mf.end(); ++it)
@@ -314,6 +316,13 @@
 	gui_print("Simulating actions...\n");
 	for (int i = 0; i < 5; i++)
 	{
+		if (PartitionManager.stop_backup.get_value()) {
+			DataManager::SetValue("tw_cancel_backup", 1);
+			gui_print("Backup Canceled.\n");
+			DataManager::SetValue("ui_progress", 0);
+			PartitionManager.stop_backup.set_value(0);
+			return;
+		}
 		usleep(500000);
 		DataManager::SetValue("ui_progress", i * 20);
 	}
@@ -1087,13 +1096,13 @@
 
 int GUIAction::nandroid(std::string arg)
 {
-	operation_start("Nandroid");
-	int ret = 0;
-
 	if (simulate) {
 		DataManager::SetValue("tw_partition", "Simulation");
 		simulate_progress_bar();
 	} else {
+		operation_start("Nandroid");
+		int ret = 0;
+
 		if (arg == "backup") {
 			string Backup_Name;
 			DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
@@ -1103,7 +1112,6 @@
 			else {
 				operation_end(1);
 				return -1;
-
 			}
 			DataManager::SetValue(TW_BACKUP_NAME, "(Auto Generate)");
 		} else if (arg == "restore") {
@@ -1112,16 +1120,42 @@
 			ret = PartitionManager.Run_Restore(Restore_Name);
 		} else {
 			operation_end(1);
-					return -1;
-				}
-			}
-			DataManager::SetValue("tw_encrypt_backup", 0);
+			return -1;
+		}
+		DataManager::SetValue("tw_encrypt_backup", 0);
+		if (!PartitionManager.stop_backup.get_value()) {
 			if (ret == false)
 				ret = 1; // 1 for failure
 			else
 				ret = 0; // 0 for success
+			DataManager::SetValue("tw_cancel_backup", 0);
 			operation_end(ret);
-			return 0;
+		}
+		else {
+			DataManager::SetValue("tw_cancel_backup", 1);
+			gui_print("Backup Canceled.\n");
+			ret = 0;
+		}
+		return ret;
+	}
+	return 0;
+}
+
+int GUIAction::cancelbackup(std::string arg) {
+	if (simulate) {
+		simulate_progress_bar();
+		PartitionManager.stop_backup.set_value(1);
+		operation_end(0);
+	}
+	else {
+		operation_start("Cancel Backup");
+		int op_status = PartitionManager.Cancel_Backup();
+		if (op_status != 0)
+			op_status = 1; // failure
+		operation_end(op_status);
+	}
+
+	return 0;
 }
 
 int GUIAction::fixpermissions(std::string arg)
diff --git a/gui/devices/480x854/res/ui.xml b/gui/devices/480x854/res/ui.xml
index dd7efd7..c4ce65f 100644
--- a/gui/devices/480x854/res/ui.xml
+++ b/gui/devices/480x854/res/ui.xml
@@ -50,6 +50,7 @@
 		<variable name="col1_x" value="10" />
 		<variable name="col2_x" value="240" />
 		<variable name="col_center_x" value="128" />
+		<variable name="col_center_medium_x" value="183" />
 		<variable name="center_x" value="240" />
 		<variable name="row1_y" value="140" />
 		<variable name="row2_y" value="290" />
diff --git a/gui/devices/landscape/res/landscape.xml b/gui/devices/landscape/res/landscape.xml
index f66eb8b..eb6d9dd 100644
--- a/gui/devices/landscape/res/landscape.xml
+++ b/gui/devices/landscape/res/landscape.xml
@@ -670,7 +670,7 @@
 			<object type="button">
 				<highlight color="%highlight_color%" />
 				<condition var1="tw_has_cancel" var2="1" />
-				<placement x="%col4_x%" y="%slider_y%" />
+                                <placement x="%col_center_x%" y="%cancel_button_y%" />
 				<font resource="font" color="%button_text_color%" />
 				<text>Cancel</text>
 				<image resource="main_button" />
@@ -2157,6 +2157,17 @@
 
 			<object type="template" name="action_page_console" />
 
+			<object type="button">
+				<highlight color="%highlight_color%" />
+				<placement x="%col_center_medium_x%" y="%row3_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>Cancel</text>
+				<image resource="medium_button" />
+				<actions>
+					<action function="cancelbackup"></action>
+				</actions>
+			</object>
+
 			<object type="template" name="progress_bar" />
 
 			<object type="action">
@@ -2165,6 +2176,7 @@
 
 			<object type="action">
 				<condition var1="tw_operation_state" var2="1" />
+				<condition var1="tw_cancel_backup" var2="0" />
 				<actions>
 					<action function="set">tw_back=backup</action>
 					<action function="set">tw_complete_text1=Backup Complete</action>
@@ -2173,6 +2185,17 @@
 				</actions>
 			</object>
 
+			<object type="action">
+				<condition var1="tw_operation_state" var2="1" />
+				<condition var1="tw_cancel_backup" var2="1" />
+				<actions>
+					<action function="set">tw_back=backup</action>
+					<action function="set">tw_complete_text1=Backup Cancelled</action>
+					<action function="set">tw_show_reboot=1</action>
+					<action function="page">action_complete</action>
+				</actions>
+			</object>
+
 			<object type="template" name="footer" />
 		</page>
 
diff --git a/gui/devices/portrait/res/portrait.xml b/gui/devices/portrait/res/portrait.xml
index bb8e372..fe61671 100644
--- a/gui/devices/portrait/res/portrait.xml
+++ b/gui/devices/portrait/res/portrait.xml
@@ -1867,6 +1867,17 @@
 
 			<object type="template" name="action_page_console" />
 
+			<object type="button">
+				<highlight color="%highlight_color%" />
+				<placement x="%col_center_medium_x%" y="%row4_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>Cancel</text>
+				<image resource="medium_button" />
+				<actions>
+					<action function="cancelbackup"></action>
+				</actions>
+			</object>
+
 			<object type="template" name="progress_bar" />
 
 			<object type="action">
@@ -1875,6 +1886,7 @@
 
 			<object type="action">
 				<condition var1="tw_operation_state" var2="1" />
+				<condition var1="tw_cancel_backup" var2="0" />
 				<actions>
 					<action function="set">tw_back=backup</action>
 					<action function="set">tw_complete_text1=Backup Complete</action>
@@ -1882,6 +1894,17 @@
 					<action function="page">action_complete</action>
 				</actions>
 			</object>
+
+			<object type="action">
+				<condition var1="tw_operation_state" var2="1" />
+				<condition var1="tw_cancel_backup" var2="1" />
+				<actions>
+					<action function="set">tw_back=backup</action>
+					<action function="set">tw_complete_text1=Backup Cancelled</action>
+					<action function="set">tw_show_reboot=1</action>
+					<action function="page">action_complete</action>
+				</actions>
+			</object>
 		</page>
 
 		<page name="restore">
diff --git a/gui/devices/watch/res/watch.xml b/gui/devices/watch/res/watch.xml
index dc787b3..49e172e 100644
--- a/gui/devices/watch/res/watch.xml
+++ b/gui/devices/watch/res/watch.xml
@@ -1859,6 +1859,21 @@
 
 			<object type="template" name="action_page_console" />
 
+
+
+			<object type="template" name="progress_bar" />
+
+			<object type="button">
+				<highlight color="%highlight_color%" />
+				<placement x="%col_center_medium_x%" y="%row4_y%" />
+				<font resource="font" color="%button_text_color%" />
+				<text>Cancel</text>
+				<image resource="medium_button" />
+				<actions>
+					<action function="cancelbackup"></action>
+				</actions>
+			</object>
+
 			<object type="template" name="progress_bar" />
 
 			<object type="action">
@@ -1867,6 +1882,7 @@
 
 			<object type="action">
 				<condition var1="tw_operation_state" var2="1" />
+				<condition var1="tw_cancel_backup" var2="0" />
 				<actions>
 					<action function="set">tw_back=backup</action>
 					<action function="set">tw_complete_text1=Backup Complete</action>
@@ -1874,6 +1890,17 @@
 					<action function="page">action_complete</action>
 				</actions>
 			</object>
+
+			<object type="action">
+				<condition var1="tw_operation_state" var2="1" />
+				<condition var1="tw_cancel_backup" var2="1" />
+				<actions>
+					<action function="set">tw_back=backup</action>
+					<action function="set">tw_complete_text1=Backup Cancelled</action>
+					<action function="set">tw_show_reboot=1</action>
+					<action function="page">action_complete</action>
+				</actions>
+			</object>
 		</page>
 
 		<page name="restore">
diff --git a/gui/objects.hpp b/gui/objects.hpp
index 99b5855..832569c 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -360,6 +360,7 @@
 	int startmtp(std::string arg);
 	int stopmtp(std::string arg);
 	int flashimage(std::string arg);
+	int cancelbackup(std::string arg);
 
 	int simulate;
 };