summaryrefslogtreecommitdiffstats
path: root/gui
diff options
context:
space:
mode:
authorthat <github@that.at>2014-12-30 11:30:13 +0100
committerthat <github@that.at>2014-12-30 11:30:13 +0100
commit3f7b1aced8fd10d24a9850c6fd65fc819e744ddd (patch)
tree6f54c044e8aa0ef3ae4751646cc5f55d284e433c /gui
parenttwrp-functions: remove unused functions (diff)
downloadandroid_bootable_recovery-3f7b1aced8fd10d24a9850c6fd65fc819e744ddd.tar
android_bootable_recovery-3f7b1aced8fd10d24a9850c6fd65fc819e744ddd.tar.gz
android_bootable_recovery-3f7b1aced8fd10d24a9850c6fd65fc819e744ddd.tar.bz2
android_bootable_recovery-3f7b1aced8fd10d24a9850c6fd65fc819e744ddd.tar.lz
android_bootable_recovery-3f7b1aced8fd10d24a9850c6fd65fc819e744ddd.tar.xz
android_bootable_recovery-3f7b1aced8fd10d24a9850c6fd65fc819e744ddd.tar.zst
android_bootable_recovery-3f7b1aced8fd10d24a9850c6fd65fc819e744ddd.zip
Diffstat (limited to 'gui')
-rw-r--r--gui/action.cpp2136
-rw-r--r--gui/objects.hpp73
2 files changed, 1149 insertions, 1060 deletions
diff --git a/gui/action.cpp b/gui/action.cpp
index ff2c2e00f..d1daab75b 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -53,11 +53,6 @@ extern "C" {
#include "../minadbd/adb.h"
#include "../adb_install.h"
#include "../set_metadata.h"
-
-int TWinstall_zip(const char* path, int* wipe_cache);
-void run_script(const char *str1, const char *str2, const char *str3, const char *str4, const char *str5, const char *str6, const char *str7, int request_confirm);
-int gui_console_only();
-int gui_start();
};
#include "rapidxml.hpp"
@@ -69,6 +64,11 @@ extern blanktimer blankTimer;
void curtainClose(void);
+GUIAction::mapFunc GUIAction::mf;
+static string zip_queue[10];
+static int zip_queue_index;
+static pthread_t terminal_command;
+
GUIAction::GUIAction(xml_node<>* node)
: GUIObject(node)
{
@@ -78,6 +78,65 @@ GUIAction::GUIAction(xml_node<>* node)
if (!node) return;
+ if (mf.empty()) {
+ mf["reboot"] = &GUIAction::reboot;
+ mf["home"] = &GUIAction::home;
+ mf["key"] = &GUIAction::key;
+ mf["page"] = &GUIAction::page;
+ mf["reload"] = &GUIAction::reload;
+ mf["readBackup"] = &GUIAction::readBackup;
+ mf["set"] = &GUIAction::set;
+ mf["clear"] = &GUIAction::clear;
+ mf["mount"] = &GUIAction::mount;
+ mf["unmount"] = &GUIAction::unmount;
+ mf["umount"] = &GUIAction::unmount;
+ mf["restoredefaultsettings"] = &GUIAction::restoredefaultsettings;
+ mf["copylog"] = &GUIAction::copylog;
+ mf["compute"] = &GUIAction::compute;
+ mf["addsubtract"] = &GUIAction::compute;
+ mf["setguitimezone"] = &GUIAction::setguitimezone;
+ mf["overlay"] = &GUIAction::overlay;
+ mf["queuezip"] = &GUIAction::queuezip;
+ mf["cancelzip"] = &GUIAction::cancelzip;
+ mf["queueclear"] = &GUIAction::queueclear;
+ mf["sleep"] = &GUIAction::sleep;
+ mf["appenddatetobackupname"] = &GUIAction::appenddatetobackupname;
+ mf["generatebackupname"] = &GUIAction::generatebackupname;
+ mf["checkpartitionlist"] = &GUIAction::checkpartitionlist;
+ mf["getpartitiondetails"] = &GUIAction::getpartitiondetails;
+ mf["screenshot"] = &GUIAction::screenshot;
+ mf["setbrightness"] = &GUIAction::setbrightness;
+
+ // threaded actions
+ mf["fileexists"] = &GUIAction::fileexists;
+ mf["flash"] = &GUIAction::flash;
+ mf["wipe"] = &GUIAction::wipe;
+ mf["refreshsizes"] = &GUIAction::refreshsizes;
+ mf["nandroid"] = &GUIAction::nandroid;
+ mf["fixpermissions"] = &GUIAction::fixpermissions;
+ mf["dd"] = &GUIAction::dd;
+ mf["partitionsd"] = &GUIAction::partitionsd;
+ mf["installhtcdumlock"] = &GUIAction::installhtcdumlock;
+ mf["htcdumlockrestoreboot"] = &GUIAction::htcdumlockrestoreboot;
+ mf["htcdumlockreflashrecovery"] = &GUIAction::htcdumlockreflashrecovery;
+ mf["cmd"] = &GUIAction::cmd;
+ mf["terminalcommand"] = &GUIAction::terminalcommand;
+ mf["killterminal"] = &GUIAction::killterminal;
+ mf["reinjecttwrp"] = &GUIAction::reinjecttwrp;
+ mf["checkbackupname"] = &GUIAction::checkbackupname;
+ mf["decrypt"] = &GUIAction::decrypt;
+ mf["adbsideload"] = &GUIAction::adbsideload;
+ mf["adbsideloadcancel"] = &GUIAction::adbsideloadcancel;
+ mf["openrecoveryscript"] = &GUIAction::openrecoveryscript;
+ mf["installsu"] = &GUIAction::installsu;
+ mf["fixsu"] = &GUIAction::fixsu;
+ mf["decrypt_backup"] = &GUIAction::decrypt_backup;
+ mf["repair"] = &GUIAction::repair;
+ mf["changefilesystem"] = &GUIAction::changefilesystem;
+ mf["startmtp"] = &GUIAction::startmtp;
+ mf["stopmtp"] = &GUIAction::stopmtp;
+ }
+
// First, get the action
actions = node->first_node("actions");
if (actions) child = actions->first_node("action");
@@ -199,7 +258,7 @@ void GUIAction::simulate_progress_bar(void)
}
}
-int GUIAction::flash_zip(std::string filename, std::string pageName, const int simulate, int* wipe_cache)
+int GUIAction::flash_zip(std::string filename, std::string pageName, int* wipe_cache)
{
int ret_val = 0;
@@ -214,17 +273,12 @@ int GUIAction::flash_zip(std::string filename, std::string pageName, const int s
// We're going to jump to this page first, like a loading page
gui_changePage(pageName);
- int fd = -1;
- ZipArchive zip;
-
if (!PartitionManager.Mount_By_Path(filename, true))
return -1;
+ // TODO: why again?
gui_changePage(pageName);
- if (fd >= 0)
- close(fd);
-
if (simulate) {
simulate_progress_bar();
} else {
@@ -252,73 +306,35 @@ int GUIAction::flash_zip(std::string filename, std::string pageName, const int s
int GUIAction::doActions()
{
- if (mActions.size() < 1) return -1;
- if (mActions.size() == 1)
- return doAction(mActions.at(0), 0);
-
- // For multi-action, we always use a thread
- pthread_t t;
- pthread_attr_t tattr;
-
- if (pthread_attr_init(&tattr)) {
- LOGERR("Unable to pthread_attr_init\n");
+ if (mActions.size() < 1)
return -1;
- }
- if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE)) {
- LOGERR("Error setting pthread_attr_setdetachstate\n");
- return -1;
- }
- if (pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM)) {
- LOGERR("Error setting pthread_attr_setscope\n");
- return -1;
- }
- /*if (pthread_attr_setstacksize(&tattr, 524288)) {
- LOGERR("Error setting pthread_attr_setstacksize\n");
- return -1;
- }
- */
- int ret = pthread_create(&t, &tattr, thread_start, this);
- if (ret) {
- LOGERR("Unable to create more threads for actions... continuing in same thread! %i\n", ret);
- thread_start(this);
- } else {
- if (pthread_join(t, NULL)) {
- LOGERR("Error joining threads\n");
- }
- }
- if (pthread_attr_destroy(&tattr)) {
- LOGERR("Failed to pthread_attr_destroy\n");
- return -1;
- }
+
+ std::vector<Action>::iterator it;
+ for (it = mActions.begin(); it != mActions.end(); ++it)
+ doAction(*it);
return 0;
}
-void* GUIAction::thread_start(void *cookie)
+int GUIAction::doAction(Action action)
{
- GUIAction* ourThis = (GUIAction*) cookie;
+ DataManager::GetValue(TW_SIMULATE_ACTIONS, simulate);
- DataManager::SetValue(TW_ACTION_BUSY, 1);
+ std::string function = gui_parse_text(action.mFunction);
+ std::string arg = gui_parse_text(action.mArg);
- if (ourThis->mActions.size() > 1)
- {
- std::vector<Action>::iterator iter;
- for (iter = ourThis->mActions.begin(); iter != ourThis->mActions.end(); iter++)
- ourThis->doAction(*iter, 1);
- }
- else
- {
- ourThis->doAction(ourThis->mActions.at(0), 1);
- }
- int check = 0;
- DataManager::GetValue("tw_background_thread_running", check);
- if (check == 0)
- DataManager::SetValue(TW_ACTION_BUSY, 0);
- return NULL;
+ // find function and execute it
+ mapFunc::const_iterator funcitr = mf.find(function);
+ if (funcitr != mf.end())
+ return (this->*funcitr->second)(arg);
+
+ LOGERR("Unknown action '%s'\n", function.c_str());
+ return -1;
}
void GUIAction::operation_start(const string operation_name)
{
+ LOGINFO("operation_start: '%s'\n", operation_name.c_str());
time(&Start);
DataManager::SetValue(TW_ACTION_BUSY, 1);
DataManager::SetValue("ui_progress", 0);
@@ -327,7 +343,7 @@ void GUIAction::operation_start(const string operation_name)
DataManager::SetValue("tw_operation_state", 0);
}
-void GUIAction::operation_end(const int operation_status, const int simulate)
+void GUIAction::operation_end(const int operation_status)
{
time_t Stop;
int simulate_fail;
@@ -354,670 +370,666 @@ void GUIAction::operation_end(const int operation_status, const int simulate)
time(&Stop);
if ((int) difftime(Stop, Start) > 10)
DataManager::Vibrate("tw_action_vibrate");
+ LOGINFO("operation_end - status=%d\n", operation_status);
}
-int GUIAction::doAction(Action action, int isThreaded /* = 0 */)
+int GUIAction::reboot(std::string arg)
{
- static string zip_queue[10];
- static int zip_queue_index;
- static pthread_t terminal_command;
- int simulate;
+ //curtainClose(); this sometimes causes a crash
- std::string arg = gui_parse_text(action.mArg);
+ sync();
+ DataManager::SetValue("tw_gui_done", 1);
+ DataManager::SetValue("tw_reboot_arg", arg);
- std::string function = gui_parse_text(action.mFunction);
+ return 0;
+}
- DataManager::GetValue(TW_SIMULATE_ACTIONS, simulate);
+int GUIAction::home(std::string arg)
+{
+ PageManager::SelectPackage("TWRP");
+ gui_changePage("main");
+ return 0;
+}
- if (function == "reboot")
- {
- //curtainClose(); this sometimes causes a crash
+int GUIAction::key(std::string arg)
+{
+ const int key = getKeyByName(arg);
+ PageManager::NotifyKey(key, true);
+ PageManager::NotifyKey(key, false);
+ return 0;
+}
- sync();
- DataManager::SetValue("tw_gui_done", 1);
- DataManager::SetValue("tw_reboot_arg", arg);
+int GUIAction::page(std::string arg)
+{
+ std::string page_name = gui_parse_text(arg);
+ return gui_changePage(page_name);
+}
- return 0;
+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());
+ check = 1;
}
- if (function == "home")
+
+ theme_path += "/TWRP/theme/ui.zip";
+ if (check != 0 || PageManager::ReloadPackage("TWRP", theme_path) != 0)
{
- PageManager::SelectPackage("TWRP");
- gui_changePage("main");
- return 0;
+ // Loading the custom theme failed - try loading the stock theme
+ LOGINFO("Attempting to reload stock theme...\n");
+ if (PageManager::ReloadPackage("TWRP", "/res/ui.xml"))
+ {
+ LOGERR("Failed to load base packages.\n");
+ ret_val = 1;
+ }
}
+ operation_end(ret_val);
+ return 0;
+}
- if (function == "key")
+int GUIAction::readBackup(std::string arg)
+{
+ string Restore_Name;
+ DataManager::GetValue("tw_restore", Restore_Name);
+ PartitionManager.Set_Restore_Files(Restore_Name);
+ return 0;
+}
+
+int GUIAction::set(std::string arg)
+{
+ if (arg.find('=') != string::npos)
{
- const int key = getKeyByName(arg);
- PageManager::NotifyKey(key, true);
- PageManager::NotifyKey(key, false);
- return 0;
- }
+ string varName = arg.substr(0, arg.find('='));
+ string value = arg.substr(arg.find('=') + 1, string::npos);
- if (function == "page") {
- std::string page_name = gui_parse_text(arg);
- return gui_changePage(page_name);
+ DataManager::GetValue(value, value);
+ DataManager::SetValue(varName, value);
}
+ else
+ DataManager::SetValue(arg, "1");
+ return 0;
+}
- if (function == "reload") {
- int check = 0, ret_val = 0;
- std::string theme_path;
+int GUIAction::clear(std::string arg)
+{
+ DataManager::SetValue(arg, "0");
+ return 0;
+}
- 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());
- check = 1;
- }
+int GUIAction::mount(std::string arg)
+{
+ if (arg == "usb") {
+ DataManager::SetValue(TW_ACTION_BUSY, 1);
+ if (!simulate)
+ PartitionManager.usb_storage_enable();
+ else
+ gui_print("Simulating actions...\n");
+ } else if (!simulate) {
+ PartitionManager.Mount_By_Path(arg, true);
+ PartitionManager.Add_MTP_Storage(arg);
+ } else
+ gui_print("Simulating actions...\n");
+ return 0;
+}
- theme_path += "/TWRP/theme/ui.zip";
- if (check != 0 || PageManager::ReloadPackage("TWRP", theme_path) != 0)
- {
- // Loading the custom theme failed - try loading the stock theme
- LOGINFO("Attempting to reload stock theme...\n");
- if (PageManager::ReloadPackage("TWRP", "/res/ui.xml"))
- {
- LOGERR("Failed to load base packages.\n");
- ret_val = 1;
- }
- }
- operation_end(ret_val, simulate);
- return 0;
- }
+int GUIAction::unmount(std::string arg)
+{
+ if (arg == "usb") {
+ if (!simulate)
+ PartitionManager.usb_storage_disable();
+ else
+ gui_print("Simulating actions...\n");
+ DataManager::SetValue(TW_ACTION_BUSY, 0);
+ } else if (!simulate) {
+ PartitionManager.UnMount_By_Path(arg, true);
+ } else
+ gui_print("Simulating actions...\n");
+ return 0;
+}
- if (function == "readBackup")
- {
- string Restore_Name;
- DataManager::GetValue("tw_restore", Restore_Name);
- PartitionManager.Set_Restore_Files(Restore_Name);
- return 0;
+int GUIAction::restoredefaultsettings(std::string arg)
+{
+ operation_start("Restore Defaults");
+ if (simulate) // Simulated so that people don't accidently wipe out the "simulation is on" setting
+ gui_print("Simulating actions...\n");
+ else {
+ DataManager::ResetDefaults();
+ PartitionManager.Update_System_Details();
+ PartitionManager.Mount_Current_Storage(true);
}
+ operation_end(0);
+ return 0;
+}
- if (function == "set")
+int GUIAction::copylog(std::string arg)
+{
+ operation_start("Copy Log");
+ if (!simulate)
{
- if (arg.find('=') != string::npos)
- {
- string varName = arg.substr(0, arg.find('='));
- string value = arg.substr(arg.find('=') + 1, string::npos);
+ string dst;
+ PartitionManager.Mount_Current_Storage(true);
+ dst = DataManager::GetCurrentStoragePath() + "/recovery.log";
+ TWFunc::copy_file("/tmp/recovery.log", dst.c_str(), 0755);
+ tw_set_default_metadata(dst.c_str());
+ sync();
+ gui_print("Copied recovery log to %s.\n", DataManager::GetCurrentStoragePath().c_str());
+ } else
+ simulate_progress_bar();
+ operation_end(0);
+ return 0;
+}
- DataManager::GetValue(value, value);
- DataManager::SetValue(varName, value);
- }
- else
- DataManager::SetValue(arg, "1");
- return 0;
- }
- if (function == "clear")
+
+int GUIAction::compute(std::string arg)
+{
+ if (arg.find("+") != string::npos)
{
- DataManager::SetValue(arg, "0");
- return 0;
- }
+ string varName = arg.substr(0, arg.find('+'));
+ string string_to_add = arg.substr(arg.find('+') + 1, string::npos);
+ int amount_to_add = atoi(string_to_add.c_str());
+ int value;
- if (function == "mount") {
- if (arg == "usb") {
- DataManager::SetValue(TW_ACTION_BUSY, 1);
- if (!simulate)
- PartitionManager.usb_storage_enable();
- else
- gui_print("Simulating actions...\n");
- } else if (!simulate) {
- PartitionManager.Mount_By_Path(arg, true);
- PartitionManager.Add_MTP_Storage(arg);
- } else
- gui_print("Simulating actions...\n");
+ DataManager::GetValue(varName, value);
+ DataManager::SetValue(varName, value + amount_to_add);
return 0;
}
-
- if (function == "umount" || function == "unmount") {
- if (arg == "usb") {
- if (!simulate)
- PartitionManager.usb_storage_disable();
- else
- gui_print("Simulating actions...\n");
- DataManager::SetValue(TW_ACTION_BUSY, 0);
- } else if (!simulate) {
- PartitionManager.UnMount_By_Path(arg, true);
- } else
- gui_print("Simulating actions...\n");
- return 0;
- }
-
- if (function == "restoredefaultsettings")
+ if (arg.find("-") != string::npos)
{
- operation_start("Restore Defaults");
- if (simulate) // Simulated so that people don't accidently wipe out the "simulation is on" setting
- gui_print("Simulating actions...\n");
- else {
- DataManager::ResetDefaults();
- PartitionManager.Update_System_Details();
- PartitionManager.Mount_Current_Storage(true);
- }
- operation_end(0, simulate);
+ string varName = arg.substr(0, arg.find('-'));
+ string string_to_subtract = arg.substr(arg.find('-') + 1, string::npos);
+ int amount_to_subtract = atoi(string_to_subtract.c_str());
+ int value;
+
+ DataManager::GetValue(varName, value);
+ value -= amount_to_subtract;
+ if (value <= 0)
+ value = 0;
+ DataManager::SetValue(varName, value);
return 0;
}
-
- if (function == "copylog")
+ if (arg.find("*") != string::npos)
{
- operation_start("Copy Log");
- if (!simulate)
- {
- string dst;
- PartitionManager.Mount_Current_Storage(true);
- dst = DataManager::GetCurrentStoragePath() + "/recovery.log";
- TWFunc::copy_file("/tmp/recovery.log", dst.c_str(), 0755);
- tw_set_default_metadata(dst.c_str());
- sync();
- gui_print("Copied recovery log to %s.\n", DataManager::GetCurrentStoragePath().c_str());
- } else
- simulate_progress_bar();
- operation_end(0, simulate);
+ string varName = arg.substr(0, arg.find('*'));
+ string multiply_by_str = gui_parse_text(arg.substr(arg.find('*') + 1, string::npos));
+ int multiply_by = atoi(multiply_by_str.c_str());
+ int value;
+
+ DataManager::GetValue(varName, value);
+ DataManager::SetValue(varName, value*multiply_by);
return 0;
}
-
- if (function == "compute" || function == "addsubtract")
+ if (arg.find("/") != string::npos)
{
- if (arg.find("+") != string::npos)
- {
- string varName = arg.substr(0, arg.find('+'));
- string string_to_add = arg.substr(arg.find('+') + 1, string::npos);
- int amount_to_add = atoi(string_to_add.c_str());
- int value;
+ string varName = arg.substr(0, arg.find('/'));
+ string divide_by_str = gui_parse_text(arg.substr(arg.find('/') + 1, string::npos));
+ int divide_by = atoi(divide_by_str.c_str());
+ int value;
- DataManager::GetValue(varName, value);
- DataManager::SetValue(varName, value + amount_to_add);
- return 0;
- }
- if (arg.find("-") != string::npos)
+ if(divide_by != 0)
{
- string varName = arg.substr(0, arg.find('-'));
- string string_to_subtract = arg.substr(arg.find('-') + 1, string::npos);
- int amount_to_subtract = atoi(string_to_subtract.c_str());
- int value;
-
DataManager::GetValue(varName, value);
- value -= amount_to_subtract;
- if (value <= 0)
- value = 0;
- DataManager::SetValue(varName, value);
- return 0;
+ DataManager::SetValue(varName, value/divide_by);
}
- if (arg.find("*") != string::npos)
- {
- string varName = arg.substr(0, arg.find('*'));
- string multiply_by_str = gui_parse_text(arg.substr(arg.find('*') + 1, string::npos));
- int multiply_by = atoi(multiply_by_str.c_str());
- int value;
+ return 0;
+ }
+ LOGERR("Unable to perform compute '%s'\n", arg.c_str());
+ return -1;
+}
- DataManager::GetValue(varName, value);
- DataManager::SetValue(varName, value*multiply_by);
- return 0;
- }
- if (arg.find("/") != string::npos)
- {
- string varName = arg.substr(0, arg.find('/'));
- string divide_by_str = gui_parse_text(arg.substr(arg.find('/') + 1, string::npos));
- int divide_by = atoi(divide_by_str.c_str());
- int value;
+int GUIAction::setguitimezone(std::string arg)
+{
+ string SelectedZone;
+ DataManager::GetValue(TW_TIME_ZONE_GUISEL, SelectedZone); // read the selected time zone into SelectedZone
+ string Zone = SelectedZone.substr(0, SelectedZone.find(';')); // parse to get time zone
+ string DSTZone = SelectedZone.substr(SelectedZone.find(';') + 1, string::npos); // parse to get DST component
- if(divide_by != 0)
- {
- DataManager::GetValue(varName, value);
- DataManager::SetValue(varName, value/divide_by);
- }
- return 0;
- }
- LOGERR("Unable to perform compute '%s'\n", arg.c_str());
- return -1;
- }
+ int dst;
+ DataManager::GetValue(TW_TIME_ZONE_GUIDST, dst); // check wether user chose to use DST
- if (function == "setguitimezone")
- {
- string SelectedZone;
- DataManager::GetValue(TW_TIME_ZONE_GUISEL, SelectedZone); // read the selected time zone into SelectedZone
- string Zone = SelectedZone.substr(0, SelectedZone.find(';')); // parse to get time zone
- string DSTZone = SelectedZone.substr(SelectedZone.find(';') + 1, string::npos); // parse to get DST component
+ string offset;
+ DataManager::GetValue(TW_TIME_ZONE_GUIOFFSET, offset); // pull in offset
- int dst;
- DataManager::GetValue(TW_TIME_ZONE_GUIDST, dst); // check wether user chose to use DST
+ string NewTimeZone = Zone;
+ if (offset != "0")
+ NewTimeZone += ":" + offset;
- string offset;
- DataManager::GetValue(TW_TIME_ZONE_GUIOFFSET, offset); // pull in offset
+ if (dst != 0)
+ NewTimeZone += DSTZone;
- string NewTimeZone = Zone;
- if (offset != "0")
- NewTimeZone += ":" + offset;
+ DataManager::SetValue(TW_TIME_ZONE_VAR, NewTimeZone);
+ DataManager::update_tz_environment_variables();
+ return 0;
+}
- if (dst != 0)
- NewTimeZone += DSTZone;
+int GUIAction::overlay(std::string arg)
+{
+ return gui_changeOverlay(arg);
+}
- DataManager::SetValue(TW_TIME_ZONE_VAR, NewTimeZone);
- DataManager::update_tz_environment_variables();
+int GUIAction::queuezip(std::string arg)
+{
+ if (zip_queue_index >= 10) {
+ gui_print("Maximum zip queue reached!\n");
return 0;
}
-
- if (function == "togglestorage") {
- LOGERR("togglestorage action was deprecated from TWRP\n");
- return 0;
+ DataManager::GetValue("tw_filename", zip_queue[zip_queue_index]);
+ if (strlen(zip_queue[zip_queue_index].c_str()) > 0) {
+ zip_queue_index++;
+ DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
}
+ return 0;
+}
- if (function == "overlay")
- return gui_changeOverlay(arg);
-
- if (function == "queuezip")
- {
- if (zip_queue_index >= 10) {
- gui_print("Maximum zip queue reached!\n");
- return 0;
- }
- DataManager::GetValue("tw_filename", zip_queue[zip_queue_index]);
- if (strlen(zip_queue[zip_queue_index].c_str()) > 0) {
- zip_queue_index++;
- DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
- }
+int GUIAction::cancelzip(std::string arg)
+{
+ if (zip_queue_index <= 0) {
+ gui_print("Minimum zip queue reached!\n");
return 0;
+ } else {
+ zip_queue_index--;
+ DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
}
+ return 0;
+}
- if (function == "cancelzip")
- {
- if (zip_queue_index <= 0) {
- gui_print("Minimum zip queue reached!\n");
- return 0;
- } else {
- zip_queue_index--;
- DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
- }
- return 0;
- }
+int GUIAction::queueclear(std::string arg)
+{
+ zip_queue_index = 0;
+ DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
+ return 0;
+}
- if (function == "queueclear")
- {
- zip_queue_index = 0;
- DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
- return 0;
- }
+int GUIAction::sleep(std::string arg)
+{
+ operation_start("Sleep");
+ usleep(atoi(arg.c_str()));
+ operation_end(0);
+ return 0;
+}
- if (function == "sleep")
- {
- operation_start("Sleep");
- usleep(atoi(arg.c_str()));
- operation_end(0, simulate);
- return 0;
- }
+int GUIAction::appenddatetobackupname(std::string arg)
+{
+ operation_start("AppendDateToBackupName");
+ string Backup_Name;
+ DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
+ Backup_Name += TWFunc::Get_Current_Date();
+ if (Backup_Name.size() > MAX_BACKUP_NAME_LEN)
+ Backup_Name.resize(MAX_BACKUP_NAME_LEN);
+ DataManager::SetValue(TW_BACKUP_NAME, Backup_Name);
+ operation_end(0);
+ return 0;
+}
- if (function == "appenddatetobackupname")
- {
- operation_start("AppendDateToBackupName");
- string Backup_Name;
- DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
- Backup_Name += TWFunc::Get_Current_Date();
- if (Backup_Name.size() > MAX_BACKUP_NAME_LEN)
- Backup_Name.resize(MAX_BACKUP_NAME_LEN);
- DataManager::SetValue(TW_BACKUP_NAME, Backup_Name);
- operation_end(0, simulate);
- return 0;
- }
+int GUIAction::generatebackupname(std::string arg)
+{
+ operation_start("GenerateBackupName");
+ TWFunc::Auto_Generate_Backup_Name();
+ operation_end(0);
+ return 0;
+}
- if (function == "generatebackupname")
- {
- operation_start("GenerateBackupName");
- TWFunc::Auto_Generate_Backup_Name();
- operation_end(0, simulate);
- return 0;
- }
- if (function == "checkpartitionlist") {
- string Wipe_List, wipe_path;
- int count = 0;
-
- DataManager::GetValue("tw_wipe_list", Wipe_List);
- LOGINFO("checkpartitionlist list '%s'\n", Wipe_List.c_str());
- if (!Wipe_List.empty()) {
- size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
- while (end_pos != string::npos && start_pos < Wipe_List.size()) {
- wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
- LOGINFO("checkpartitionlist wipe_path '%s'\n", wipe_path.c_str());
- if (wipe_path == "/and-sec" || wipe_path == "DALVIK" || wipe_path == "INTERNAL") {
- // Do nothing
- } else {
- count++;
- }
- start_pos = end_pos + 1;
- end_pos = Wipe_List.find(";", start_pos);
+int GUIAction::checkpartitionlist(std::string arg)
+{
+ string Wipe_List, wipe_path;
+ int count = 0;
+
+ DataManager::GetValue("tw_wipe_list", Wipe_List);
+ LOGINFO("checkpartitionlist list '%s'\n", Wipe_List.c_str());
+ if (!Wipe_List.empty()) {
+ size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
+ while (end_pos != string::npos && start_pos < Wipe_List.size()) {
+ wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
+ LOGINFO("checkpartitionlist wipe_path '%s'\n", wipe_path.c_str());
+ if (wipe_path == "/and-sec" || wipe_path == "DALVIK" || wipe_path == "INTERNAL") {
+ // Do nothing
+ } else {
+ count++;
}
- DataManager::SetValue("tw_check_partition_list", count);
- } else {
- DataManager::SetValue("tw_check_partition_list", 0);
+ start_pos = end_pos + 1;
+ end_pos = Wipe_List.find(";", start_pos);
}
- return 0;
+ DataManager::SetValue("tw_check_partition_list", count);
+ } else {
+ DataManager::SetValue("tw_check_partition_list", 0);
}
- if (function == "getpartitiondetails") {
- string Wipe_List, wipe_path;
- int count = 0;
-
- DataManager::GetValue("tw_wipe_list", Wipe_List);
- LOGINFO("getpartitiondetails list '%s'\n", Wipe_List.c_str());
- if (!Wipe_List.empty()) {
- size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
- while (end_pos != string::npos && start_pos < Wipe_List.size()) {
- wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
- LOGINFO("getpartitiondetails wipe_path '%s'\n", wipe_path.c_str());
- if (wipe_path == "/and-sec" || wipe_path == "DALVIK" || wipe_path == "INTERNAL") {
- // Do nothing
- } else {
- DataManager::SetValue("tw_partition_path", wipe_path);
- break;
- }
- start_pos = end_pos + 1;
- end_pos = Wipe_List.find(";", start_pos);
+ return 0;
+}
+
+int GUIAction::getpartitiondetails(std::string arg)
+{
+ string Wipe_List, wipe_path;
+ int count = 0;
+
+ DataManager::GetValue("tw_wipe_list", Wipe_List);
+ LOGINFO("getpartitiondetails list '%s'\n", Wipe_List.c_str());
+ if (!Wipe_List.empty()) {
+ size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
+ while (end_pos != string::npos && start_pos < Wipe_List.size()) {
+ wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
+ LOGINFO("getpartitiondetails wipe_path '%s'\n", wipe_path.c_str());
+ if (wipe_path == "/and-sec" || wipe_path == "DALVIK" || wipe_path == "INTERNAL") {
+ // Do nothing
+ } else {
+ DataManager::SetValue("tw_partition_path", wipe_path);
+ break;
}
- if (!wipe_path.empty()) {
- TWPartition* Part = PartitionManager.Find_Partition_By_Path(wipe_path);
- if (Part) {
- unsigned long long mb = 1048576;
-
- DataManager::SetValue("tw_partition_name", Part->Display_Name);
- DataManager::SetValue("tw_partition_mount_point", Part->Mount_Point);
- DataManager::SetValue("tw_partition_file_system", Part->Current_File_System);
- DataManager::SetValue("tw_partition_size", Part->Size / mb);
- DataManager::SetValue("tw_partition_used", Part->Used / mb);
- DataManager::SetValue("tw_partition_free", Part->Free / mb);
- DataManager::SetValue("tw_partition_backup_size", Part->Backup_Size / mb);
- DataManager::SetValue("tw_partition_removable", Part->Removable);
- DataManager::SetValue("tw_partition_is_present", Part->Is_Present);
-
- if (Part->Can_Repair())
- DataManager::SetValue("tw_partition_can_repair", 1);
- else
- DataManager::SetValue("tw_partition_can_repair", 0);
- if (TWFunc::Path_Exists("/sbin/mkdosfs"))
- DataManager::SetValue("tw_partition_vfat", 1);
- else
- DataManager::SetValue("tw_partition_vfat", 0);
- if (TWFunc::Path_Exists("/sbin/mkfs.exfat"))
- DataManager::SetValue("tw_partition_exfat", 1);
- else
- DataManager::SetValue("tw_partition_exfat", 0);
- if (TWFunc::Path_Exists("/sbin/mkfs.f2fs"))
- DataManager::SetValue("tw_partition_f2fs", 1);
- else
- DataManager::SetValue("tw_partition_f2fs", 0);
- if (TWFunc::Path_Exists("/sbin/mke2fs"))
- DataManager::SetValue("tw_partition_ext", 1);
- else
- DataManager::SetValue("tw_partition_ext", 0);
- return 0;
- } else {
- LOGERR("Unable to locate partition: '%s'\n", wipe_path.c_str());
- }
+ start_pos = end_pos + 1;
+ end_pos = Wipe_List.find(";", start_pos);
+ }
+ if (!wipe_path.empty()) {
+ TWPartition* Part = PartitionManager.Find_Partition_By_Path(wipe_path);
+ if (Part) {
+ unsigned long long mb = 1048576;
+
+ DataManager::SetValue("tw_partition_name", Part->Display_Name);
+ DataManager::SetValue("tw_partition_mount_point", Part->Mount_Point);
+ DataManager::SetValue("tw_partition_file_system", Part->Current_File_System);
+ DataManager::SetValue("tw_partition_size", Part->Size / mb);
+ DataManager::SetValue("tw_partition_used", Part->Used / mb);
+ DataManager::SetValue("tw_partition_free", Part->Free / mb);
+ DataManager::SetValue("tw_partition_backup_size", Part->Backup_Size / mb);
+ DataManager::SetValue("tw_partition_removable", Part->Removable);
+ DataManager::SetValue("tw_partition_is_present", Part->Is_Present);
+
+ if (Part->Can_Repair())
+ DataManager::SetValue("tw_partition_can_repair", 1);
+ else
+ DataManager::SetValue("tw_partition_can_repair", 0);
+ if (TWFunc::Path_Exists("/sbin/mkdosfs"))
+ DataManager::SetValue("tw_partition_vfat", 1);
+ else
+ DataManager::SetValue("tw_partition_vfat", 0);
+ if (TWFunc::Path_Exists("/sbin/mkfs.exfat"))
+ DataManager::SetValue("tw_partition_exfat", 1);
+ else
+ DataManager::SetValue("tw_partition_exfat", 0);
+ if (TWFunc::Path_Exists("/sbin/mkfs.f2fs"))
+ DataManager::SetValue("tw_partition_f2fs", 1);
+ else
+ DataManager::SetValue("tw_partition_f2fs", 0);
+ if (TWFunc::Path_Exists("/sbin/mke2fs"))
+ DataManager::SetValue("tw_partition_ext", 1);
+ else
+ DataManager::SetValue("tw_partition_ext", 0);
+ return 0;
+ } else {
+ LOGERR("Unable to locate partition: '%s'\n", wipe_path.c_str());
}
}
- DataManager::SetValue("tw_partition_name", "");
- DataManager::SetValue("tw_partition_file_system", "");
- return 0;
}
+ DataManager::SetValue("tw_partition_name", "");
+ DataManager::SetValue("tw_partition_file_system", "");
+ return 0;
+}
- if (function == "screenshot")
- {
- time_t tm;
- char path[256];
- int path_len;
- uid_t uid = -1;
- gid_t gid = -1;
-
- struct passwd *pwd = getpwnam("media_rw");
- if(pwd) {
- uid = pwd->pw_uid;
- gid = pwd->pw_gid;
- }
+int GUIAction::screenshot(std::string arg)
+{
+ time_t tm;
+ char path[256];
+ int path_len;
+ uid_t uid = -1;
+ gid_t gid = -1;
+
+ struct passwd *pwd = getpwnam("media_rw");
+ if(pwd) {
+ uid = pwd->pw_uid;
+ gid = pwd->pw_gid;
+ }
- const std::string storage = DataManager::GetCurrentStoragePath();
- if(PartitionManager.Is_Mounted_By_Path(storage)) {
- snprintf(path, sizeof(path), "%s/Pictures/Screenshots/", storage.c_str());
- } else {
- strcpy(path, "/tmp/");
- }
+ const std::string storage = DataManager::GetCurrentStoragePath();
+ if(PartitionManager.Is_Mounted_By_Path(storage)) {
+ snprintf(path, sizeof(path), "%s/Pictures/Screenshots/", storage.c_str());
+ } else {
+ strcpy(path, "/tmp/");
+ }
- if(!TWFunc::Create_Dir_Recursive(path, 0666, uid, gid))
- return 0;
+ if(!TWFunc::Create_Dir_Recursive(path, 0666, uid, gid))
+ return 0;
- tm = time(NULL);
- path_len = strlen(path);
+ tm = time(NULL);
+ path_len = strlen(path);
- // Screenshot_2014-01-01-18-21-38.png
- strftime(path+path_len, sizeof(path)-path_len, "Screenshot_%Y-%m-%d-%H-%M-%S.png", localtime(&tm));
+ // Screenshot_2014-01-01-18-21-38.png
+ strftime(path+path_len, sizeof(path)-path_len, "Screenshot_%Y-%m-%d-%H-%M-%S.png", localtime(&tm));
- int res = gr_save_screenshot(path);
- if(res == 0) {
- chmod(path, 0666);
- chown(path, uid, gid);
+ int res = gr_save_screenshot(path);
+ if(res == 0) {
+ chmod(path, 0666);
+ chown(path, uid, gid);
- gui_print("Screenshot was saved to %s\n", path);
+ gui_print("Screenshot was saved to %s\n", path);
- // blink to notify that the screenshow was taken
- gr_color(255, 255, 255, 255);
- gr_fill(0, 0, gr_fb_width(), gr_fb_height());
- gr_flip();
- gui_forceRender();
- } else {
- LOGERR("Failed to take a screenshot!\n");
- }
- return 0;
+ // blink to notify that the screenshow was taken
+ gr_color(255, 255, 255, 255);
+ gr_fill(0, 0, gr_fb_width(), gr_fb_height());
+ gr_flip();
+ gui_forceRender();
+ } else {
+ LOGERR("Failed to take a screenshot!\n");
}
+ return 0;
+}
- if (function == "setbrightness")
- {
- return TWFunc::Set_Brightness(arg);
- }
+int GUIAction::setbrightness(std::string arg)
+{
+ return TWFunc::Set_Brightness(arg);
+}
- if (isThreaded)
- {
- if (function == "fileexists")
- {
- struct stat st;
- string newpath = arg + "/.";
+int GUIAction::fileexists(std::string arg)
+{
+ struct stat st;
+ string newpath = arg + "/.";
- operation_start("FileExists");
- if (stat(arg.c_str(), &st) == 0 || stat(newpath.c_str(), &st) == 0)
- operation_end(0, simulate);
- else
- operation_end(1, simulate);
- return 0;
+ operation_start("FileExists");
+ if (stat(arg.c_str(), &st) == 0 || stat(newpath.c_str(), &st) == 0)
+ operation_end(0);
+ else
+ operation_end(1);
+ return 0;
+}
+
+int GUIAction::flash(std::string arg)
+{
+ int i, ret_val = 0, wipe_cache = 0;
+ for (i=0; i<zip_queue_index; i++) {
+ operation_start("Flashing");
+ DataManager::SetValue("tw_filename", zip_queue[i]);
+ DataManager::SetValue(TW_ZIP_INDEX, (i + 1));
+
+ TWFunc::SetPerformanceMode(true);
+ ret_val = flash_zip(zip_queue[i], arg, &wipe_cache);
+ TWFunc::SetPerformanceMode(false);
+ if (ret_val != 0) {
+ gui_print("Error flashing zip '%s'\n", zip_queue[i].c_str());
+ i = 10; // Error flashing zip - exit queue
+ ret_val = 1;
}
+ }
+ zip_queue_index = 0;
+ DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
- if (function == "flash")
- {
- int i, ret_val = 0, wipe_cache = 0;
-
- for (i=0; i<zip_queue_index; i++) {
- operation_start("Flashing");
- DataManager::SetValue("tw_filename", zip_queue[i]);
- DataManager::SetValue(TW_ZIP_INDEX, (i + 1));
-
- TWFunc::SetPerformanceMode(true);
- ret_val = flash_zip(zip_queue[i], arg, simulate, &wipe_cache);
- TWFunc::SetPerformanceMode(false);
- if (ret_val != 0) {
- gui_print("Error flashing zip '%s'\n", zip_queue[i].c_str());
- i = 10; // Error flashing zip - exit queue
- ret_val = 1;
- }
- }
- zip_queue_index = 0;
- DataManager::SetValue(TW_ZIP_QUEUE_COUNT, zip_queue_index);
-
- if (wipe_cache)
- PartitionManager.Wipe_By_Path("/cache");
-
- if (DataManager::GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager::GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
- operation_start("ReinjectTWRP");
- gui_print("Injecting TWRP into boot image...\n");
- if (simulate) {
- simulate_progress_bar();
- } else {
- TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
- if (Boot == NULL || Boot->Current_File_System != "emmc")
- TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
- else {
- string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
- TWFunc::Exec_Cmd(injectcmd);
- }
- gui_print("TWRP injection complete.\n");
- }
+ if (wipe_cache)
+ PartitionManager.Wipe_By_Path("/cache");
+
+ if (DataManager::GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager::GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
+ operation_start("ReinjectTWRP");
+ gui_print("Injecting TWRP into boot image...\n");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
+ if (Boot == NULL || Boot->Current_File_System != "emmc")
+ TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+ else {
+ string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
+ TWFunc::Exec_Cmd(injectcmd);
}
- PartitionManager.Update_System_Details();
- operation_end(ret_val, simulate);
- return 0;
+ gui_print("TWRP injection complete.\n");
}
- if (function == "wipe")
- {
- operation_start("Format");
- DataManager::SetValue("tw_partition", arg);
+ }
+ PartitionManager.Update_System_Details();
+ operation_end(ret_val);
+ return 0;
+}
+
+int GUIAction::wipe(std::string arg)
+{
+ operation_start("Format");
+ DataManager::SetValue("tw_partition", arg);
- int ret_val = false;
+ int ret_val = false;
- if (simulate) {
- simulate_progress_bar();
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ if (arg == "data")
+ ret_val = PartitionManager.Factory_Reset();
+ else if (arg == "battery")
+ ret_val = PartitionManager.Wipe_Battery_Stats();
+ else if (arg == "rotate")
+ ret_val = PartitionManager.Wipe_Rotate_Data();
+ else if (arg == "dalvik")
+ ret_val = PartitionManager.Wipe_Dalvik_Cache();
+ else if (arg == "DATAMEDIA") {
+ ret_val = PartitionManager.Format_Data();
+ } else if (arg == "INTERNAL") {
+ int has_datamedia, dual_storage;
+
+ DataManager::GetValue(TW_HAS_DATA_MEDIA, has_datamedia);
+ if (has_datamedia) {
+ ret_val = PartitionManager.Wipe_Media_From_Data();
} else {
- if (arg == "data")
- ret_val = PartitionManager.Factory_Reset();
- else if (arg == "battery")
- ret_val = PartitionManager.Wipe_Battery_Stats();
- else if (arg == "rotate")
- ret_val = PartitionManager.Wipe_Rotate_Data();
- else if (arg == "dalvik")
- ret_val = PartitionManager.Wipe_Dalvik_Cache();
- else if (arg == "DATAMEDIA") {
- ret_val = PartitionManager.Format_Data();
- } else if (arg == "INTERNAL") {
- int has_datamedia, dual_storage;
-
- DataManager::GetValue(TW_HAS_DATA_MEDIA, has_datamedia);
- if (has_datamedia) {
- ret_val = PartitionManager.Wipe_Media_From_Data();
- } else {
- ret_val = PartitionManager.Wipe_By_Path(DataManager::GetSettingsStoragePath());
- }
- } else if (arg == "EXTERNAL") {
- string External_Path;
-
- DataManager::GetValue(TW_EXTERNAL_PATH, External_Path);
- ret_val = PartitionManager.Wipe_By_Path(External_Path);
- } else if (arg == "ANDROIDSECURE") {
- ret_val = PartitionManager.Wipe_Android_Secure();
- } else if (arg == "LIST") {
- string Wipe_List, wipe_path;
- bool skip = false;
- ret_val = true;
- TWPartition* wipe_part = NULL;
-
- DataManager::GetValue("tw_wipe_list", Wipe_List);
- LOGINFO("wipe list '%s'\n", Wipe_List.c_str());
- if (!Wipe_List.empty()) {
- size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
- while (end_pos != string::npos && start_pos < Wipe_List.size()) {
- wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
- LOGINFO("wipe_path '%s'\n", wipe_path.c_str());
- if (wipe_path == "/and-sec") {
- if (!PartitionManager.Wipe_Android_Secure()) {
- LOGERR("Unable to wipe android secure\n");
- ret_val = false;
- break;
- } else {
- skip = true;
- }
- } else if (wipe_path == "DALVIK") {
- if (!PartitionManager.Wipe_Dalvik_Cache()) {
- LOGERR("Failed to wipe dalvik\n");
- ret_val = false;
- break;
- } else {
- skip = true;
- }
- } else if (wipe_path == "INTERNAL") {
- if (!PartitionManager.Wipe_Media_From_Data()) {
- ret_val = false;
- break;
- } else {
- skip = true;
- }
- }
- if (!skip) {
- if (!PartitionManager.Wipe_By_Path(wipe_path)) {
- LOGERR("Unable to wipe '%s'\n", wipe_path.c_str());
- ret_val = false;
- break;
- } else if (wipe_path == DataManager::GetSettingsStoragePath()) {
- arg = wipe_path;
- }
- } else {
- skip = false;
- }
- start_pos = end_pos + 1;
- end_pos = Wipe_List.find(";", start_pos);
+ ret_val = PartitionManager.Wipe_By_Path(DataManager::GetSettingsStoragePath());
+ }
+ } else if (arg == "EXTERNAL") {
+ string External_Path;
+
+ DataManager::GetValue(TW_EXTERNAL_PATH, External_Path);
+ ret_val = PartitionManager.Wipe_By_Path(External_Path);
+ } else if (arg == "ANDROIDSECURE") {
+ ret_val = PartitionManager.Wipe_Android_Secure();
+ } else if (arg == "LIST") {
+ string Wipe_List, wipe_path;
+ bool skip = false;
+ ret_val = true;
+ TWPartition* wipe_part = NULL;
+
+ DataManager::GetValue("tw_wipe_list", Wipe_List);
+ LOGINFO("wipe list '%s'\n", Wipe_List.c_str());
+ if (!Wipe_List.empty()) {
+ size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
+ while (end_pos != string::npos && start_pos < Wipe_List.size()) {
+ wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
+ LOGINFO("wipe_path '%s'\n", wipe_path.c_str());
+ if (wipe_path == "/and-sec") {
+ if (!PartitionManager.Wipe_Android_Secure()) {
+ LOGERR("Unable to wipe android secure\n");
+ ret_val = false;
+ break;
+ } else {
+ skip = true;
+ }
+ } else if (wipe_path == "DALVIK") {
+ if (!PartitionManager.Wipe_Dalvik_Cache()) {
+ LOGERR("Failed to wipe dalvik\n");
+ ret_val = false;
+ break;
+ } else {
+ skip = true;
+ }
+ } else if (wipe_path == "INTERNAL") {
+ if (!PartitionManager.Wipe_Media_From_Data()) {
+ ret_val = false;
+ break;
+ } else {
+ skip = true;
}
}
- } else
- ret_val = PartitionManager.Wipe_By_Path(arg);
-#ifdef TW_OEM_BUILD
- if (arg == DataManager::GetSettingsStoragePath()) {
- // If we wiped the settings storage path, recreate the TWRP folder and dump the settings
- string Storage_Path = DataManager::GetSettingsStoragePath();
-
- if (PartitionManager.Mount_By_Path(Storage_Path, true)) {
- LOGINFO("Making TWRP folder and saving settings.\n");
- Storage_Path += "/TWRP";
- mkdir(Storage_Path.c_str(), 0777);
- DataManager::Flush();
+ if (!skip) {
+ if (!PartitionManager.Wipe_By_Path(wipe_path)) {
+ LOGERR("Unable to wipe '%s'\n", wipe_path.c_str());
+ ret_val = false;
+ break;
+ } else if (wipe_path == DataManager::GetSettingsStoragePath()) {
+ arg = wipe_path;
+ }
} else {
- LOGERR("Unable to recreate TWRP folder and save settings.\n");
+ skip = false;
}
+ start_pos = end_pos + 1;
+ end_pos = Wipe_List.find(";", start_pos);
}
-#endif
}
- PartitionManager.Update_System_Details();
- if (ret_val)
- ret_val = 0; // 0 is success
- else
- ret_val = 1; // 1 is failure
- operation_end(ret_val, simulate);
- return 0;
- }
- if (function == "refreshsizes")
- {
- operation_start("Refreshing Sizes");
- if (simulate) {
- simulate_progress_bar();
- } else
- PartitionManager.Update_System_Details();
- operation_end(0, simulate);
- return 0;
+ } else
+ ret_val = PartitionManager.Wipe_By_Path(arg);
+#ifdef TW_OEM_BUILD
+ if (arg == DataManager::GetSettingsStoragePath()) {
+ // If we wiped the settings storage path, recreate the TWRP folder and dump the settings
+ string Storage_Path = DataManager::GetSettingsStoragePath();
+
+ if (PartitionManager.Mount_By_Path(Storage_Path, true)) {
+ LOGINFO("Making TWRP folder and saving settings.\n");
+ Storage_Path += "/TWRP";
+ mkdir(Storage_Path.c_str(), 0777);
+ DataManager::Flush();
+ } else {
+ LOGERR("Unable to recreate TWRP folder and save settings.\n");
+ }
}
- if (function == "nandroid")
- {
- operation_start("Nandroid");
- int ret = 0;
+#endif
+ }
+ PartitionManager.Update_System_Details();
+ if (ret_val)
+ ret_val = 0; // 0 is success
+ else
+ ret_val = 1; // 1 is failure
+ operation_end(ret_val);
+ return 0;
+}
- if (simulate) {
- DataManager::SetValue("tw_partition", "Simulation");
- simulate_progress_bar();
- } else {
- if (arg == "backup") {
- string Backup_Name;
- DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
- if (Backup_Name == "(Auto Generate)" || Backup_Name == "(Current Date)" || Backup_Name == "0" || Backup_Name == "(" || PartitionManager.Check_Backup_Name(true) == 0) {
- ret = PartitionManager.Run_Backup();
- }
- else {
- operation_end(1, simulate);
- return -1;
+int GUIAction::refreshsizes(std::string arg)
+{
+ operation_start("Refreshing Sizes");
+ if (simulate) {
+ simulate_progress_bar();
+ } else
+ PartitionManager.Update_System_Details();
+ operation_end(0);
+ return 0;
+}
- }
- DataManager::SetValue(TW_BACKUP_NAME, "(Auto Generate)");
- } else if (arg == "restore") {
- string Restore_Name;
- DataManager::GetValue("tw_restore", Restore_Name);
- ret = PartitionManager.Run_Restore(Restore_Name);
- } else {
- operation_end(1, simulate);
+int GUIAction::nandroid(std::string arg)
+{
+ operation_start("Nandroid");
+ int ret = 0;
+
+ if (simulate) {
+ DataManager::SetValue("tw_partition", "Simulation");
+ simulate_progress_bar();
+ } else {
+ if (arg == "backup") {
+ string Backup_Name;
+ DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
+ if (Backup_Name == "(Auto Generate)" || Backup_Name == "(Current Date)" || Backup_Name == "0" || Backup_Name == "(" || PartitionManager.Check_Backup_Name(true) == 0) {
+ ret = PartitionManager.Run_Backup();
+ }
+ else {
+ operation_end(1);
+ return -1;
+
+ }
+ DataManager::SetValue(TW_BACKUP_NAME, "(Auto Generate)");
+ } else if (arg == "restore") {
+ string Restore_Name;
+ DataManager::GetValue("tw_restore", Restore_Name);
+ ret = PartitionManager.Run_Restore(Restore_Name);
+ } else {
+ operation_end(1);
return -1;
}
}
@@ -1026,487 +1038,501 @@ int GUIAction::doAction(Action action, int isThreaded /* = 0 */)
ret = 1; // 1 for failure
else
ret = 0; // 0 for success
- operation_end(ret, simulate);
- return 0;
- }
- if (function == "fixpermissions")
- {
- operation_start("Fix Permissions");
- LOGINFO("fix permissions started!\n");
- if (simulate) {
- simulate_progress_bar();
- } else {
- int op_status = PartitionManager.Fix_Permissions();
- if (op_status != 0)
- op_status = 1; // failure
- operation_end(op_status, simulate);
- }
+ operation_end(ret);
return 0;
- }
- if (function == "dd")
- {
- operation_start("imaging");
+}
- if (simulate) {
- simulate_progress_bar();
- } else {
- string cmd = "dd " + arg;
- TWFunc::Exec_Cmd(cmd);
- }
- operation_end(0, simulate);
- return 0;
- }
- if (function == "partitionsd")
- {
- operation_start("Partition SD Card");
- int ret_val = 0;
+int GUIAction::fixpermissions(std::string arg)
+{
+ operation_start("Fix Permissions");
+ LOGINFO("fix permissions started!\n");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ int op_status = PartitionManager.Fix_Permissions();
+ if (op_status != 0)
+ op_status = 1; // failure
+ operation_end(op_status);
+ }
+ return 0;
+}
- if (simulate) {
- simulate_progress_bar();
- } else {
- int allow_partition;
- DataManager::GetValue(TW_ALLOW_PARTITION_SDCARD, allow_partition);
- if (allow_partition == 0) {
- gui_print("This device does not have a real SD Card!\nAborting!\n");
- } else {
- if (!PartitionManager.Partition_SDCard())
- ret_val = 1; // failed
- }
- }
- operation_end(ret_val, simulate);
- return 0;
- }
- if (function == "installhtcdumlock")
- {
- operation_start("Install HTC Dumlock");
- if (simulate) {
- simulate_progress_bar();
- } else
- TWFunc::install_htc_dumlock();
+int GUIAction::dd(std::string arg)
+{
+ operation_start("imaging");
- operation_end(0, simulate);
- return 0;
- }
- if (function == "htcdumlockrestoreboot")
- {
- operation_start("HTC Dumlock Restore Boot");
- if (simulate) {
- simulate_progress_bar();
- } else
- TWFunc::htc_dumlock_restore_original_boot();
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string cmd = "dd " + arg;
+ TWFunc::Exec_Cmd(cmd);
+ }
+ operation_end(0);
+ return 0;
+}
- operation_end(0, simulate);
- return 0;
- }
- if (function == "htcdumlockreflashrecovery")
- {
- operation_start("HTC Dumlock Reflash Recovery");
- if (simulate) {
- simulate_progress_bar();
- } else
- TWFunc::htc_dumlock_reflash_recovery_to_boot();
+int GUIAction::partitionsd(std::string arg)
+{
+ operation_start("Partition SD Card");
+ int ret_val = 0;
- operation_end(0, simulate);
- return 0;
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ int allow_partition;
+ DataManager::GetValue(TW_ALLOW_PARTITION_SDCARD, allow_partition);
+ if (allow_partition == 0) {
+ gui_print("This device does not have a real SD Card!\nAborting!\n");
+ } else {
+ if (!PartitionManager.Partition_SDCard())
+ ret_val = 1; // failed
}
- if (function == "cmd")
- {
- int op_status = 0;
+ }
+ operation_end(ret_val);
+ return 0;
- operation_start("Command");
- LOGINFO("Running command: '%s'\n", arg.c_str());
- if (simulate) {
- simulate_progress_bar();
- } else {
- op_status = TWFunc::Exec_Cmd(arg);
- if (op_status != 0)
- op_status = 1;
- }
+}
- operation_end(op_status, simulate);
- return 0;
- }
- if (function == "terminalcommand")
- {
- int op_status = 0;
- string cmdpath, command;
+int GUIAction::installhtcdumlock(std::string arg)
+{
+ operation_start("Install HTC Dumlock");
+ if (simulate) {
+ simulate_progress_bar();
+ } else
+ TWFunc::install_htc_dumlock();
- DataManager::GetValue("tw_terminal_location", cmdpath);
- operation_start("CommandOutput");
- gui_print("%s # %s\n", cmdpath.c_str(), arg.c_str());
- if (simulate) {
- simulate_progress_bar();
- operation_end(op_status, simulate);
- } else {
- command = "cd \"" + cmdpath + "\" && " + arg + " 2>&1";;
- LOGINFO("Actual command is: '%s'\n", command.c_str());
- DataManager::SetValue("tw_terminal_command_thread", command);
- DataManager::SetValue("tw_terminal_state", 1);
- DataManager::SetValue("tw_background_thread_running", 1);
- op_status = pthread_create(&terminal_command, NULL, command_thread, NULL);
- if (op_status != 0) {
- LOGERR("Error starting terminal command thread, %i.\n", op_status);
- DataManager::SetValue("tw_terminal_state", 0);
- DataManager::SetValue("tw_background_thread_running", 0);
- operation_end(1, simulate);
- }
- }
- return 0;
- }
- if (function == "killterminal")
- {
- int op_status = 0;
+ operation_end(0);
+ return 0;
+}
- LOGINFO("Sending kill command...\n");
- operation_start("KillCommand");
- DataManager::SetValue("tw_operation_status", 0);
- DataManager::SetValue("tw_operation_state", 1);
+int GUIAction::htcdumlockrestoreboot(std::string arg)
+{
+ operation_start("HTC Dumlock Restore Boot");
+ if (simulate) {
+ simulate_progress_bar();
+ } else
+ TWFunc::htc_dumlock_restore_original_boot();
+
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::htcdumlockreflashrecovery(std::string arg)
+{
+ operation_start("HTC Dumlock Reflash Recovery");
+ if (simulate) {
+ simulate_progress_bar();
+ } else
+ TWFunc::htc_dumlock_reflash_recovery_to_boot();
+
+ operation_end(0);
+ return 0;
+}
+
+int GUIAction::cmd(std::string arg)
+{
+ int op_status = 0;
+
+ operation_start("Command");
+ LOGINFO("Running command: '%s'\n", arg.c_str());
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ op_status = TWFunc::Exec_Cmd(arg);
+ if (op_status != 0)
+ op_status = 1;
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::terminalcommand(std::string arg)
+{
+ int op_status = 0;
+ string cmdpath, command;
+
+ DataManager::GetValue("tw_terminal_location", cmdpath);
+ operation_start("CommandOutput");
+ gui_print("%s # %s\n", cmdpath.c_str(), arg.c_str());
+ if (simulate) {
+ simulate_progress_bar();
+ operation_end(op_status);
+ } else {
+ command = "cd \"" + cmdpath + "\" && " + arg + " 2>&1";;
+ LOGINFO("Actual command is: '%s'\n", command.c_str());
+ DataManager::SetValue("tw_terminal_command_thread", command);
+ DataManager::SetValue("tw_terminal_state", 1);
+ DataManager::SetValue("tw_background_thread_running", 1);
+ op_status = pthread_create(&terminal_command, NULL, command_thread, NULL);
+ if (op_status != 0) {
+ LOGERR("Error starting terminal command thread, %i.\n", op_status);
DataManager::SetValue("tw_terminal_state", 0);
DataManager::SetValue("tw_background_thread_running", 0);
- DataManager::SetValue(TW_ACTION_BUSY, 0);
- return 0;
+ operation_end(1);
}
- if (function == "reinjecttwrp")
- {
- int op_status = 0;
- operation_start("ReinjectTWRP");
- gui_print("Injecting TWRP into boot image...\n");
- if (simulate) {
- simulate_progress_bar();
- } else {
- TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
- gui_print("TWRP injection complete.\n");
- }
+ }
+ return 0;
+}
- operation_end(op_status, simulate);
- return 0;
- }
- if (function == "checkbackupname")
- {
- int op_status = 0;
+int GUIAction::killterminal(std::string arg)
+{
+ int op_status = 0;
- operation_start("CheckBackupName");
- if (simulate) {
- simulate_progress_bar();
- } else {
- op_status = PartitionManager.Check_Backup_Name(true);
- if (op_status != 0)
- op_status = 1;
- }
+ LOGINFO("Sending kill command...\n");
+ operation_start("KillCommand");
+ DataManager::SetValue("tw_operation_status", 0);
+ DataManager::SetValue("tw_operation_state", 1);
+ DataManager::SetValue("tw_terminal_state", 0);
+ DataManager::SetValue("tw_background_thread_running", 0);
+ DataManager::SetValue(TW_ACTION_BUSY, 0);
+ return 0;
+}
- operation_end(op_status, simulate);
- return 0;
- }
- if (function == "decrypt")
- {
- int op_status = 0;
+int GUIAction::reinjecttwrp(std::string arg)
+{
+ int op_status = 0;
+ operation_start("ReinjectTWRP");
+ gui_print("Injecting TWRP into boot image...\n");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+ gui_print("TWRP injection complete.\n");
+ }
- operation_start("Decrypt");
- if (simulate) {
- simulate_progress_bar();
- } else {
- string Password;
- DataManager::GetValue("tw_crypto_password", Password);
- op_status = PartitionManager.Decrypt_Device(Password);
- if (op_status != 0)
- op_status = 1;
- else {
- int load_theme = 1;
+ operation_end(op_status);
+ return 0;
+}
- DataManager::SetValue(TW_IS_ENCRYPTED, 0);
+int GUIAction::checkbackupname(std::string arg)
+{
+ int op_status = 0;
- if (load_theme) {
- int has_datamedia;
+ operation_start("CheckBackupName");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ op_status = PartitionManager.Check_Backup_Name(true);
+ if (op_status != 0)
+ op_status = 1;
+ }
- // Check for a custom theme and load it if exists
- DataManager::GetValue(TW_HAS_DATA_MEDIA, has_datamedia);
- if (has_datamedia != 0) {
- struct stat st;
- int check = 0;
- std::string theme_path;
+ operation_end(op_status);
+ return 0;
+}
- if (tw_get_default_metadata(DataManager::GetSettingsStoragePath().c_str()) != 0) {
- LOGERR("Failed to get default contexts and file mode for storage files.\n");
- } else {
- LOGINFO("Got default contexts and file mode for storage files.\n");
- }
+int GUIAction::decrypt(std::string arg)
+{
+ int op_status = 0;
- 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());
- check = 1;
- }
+ operation_start("Decrypt");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string Password;
+ DataManager::GetValue("tw_crypto_password", Password);
+ op_status = PartitionManager.Decrypt_Device(Password);
+ if (op_status != 0)
+ op_status = 1;
+ else {
+ int load_theme = 1;
- theme_path += "/TWRP/theme/ui.zip";
- if (check == 0 && stat(theme_path.c_str(), &st) == 0) {
- if (PageManager::ReloadPackage("TWRP", theme_path) != 0)
- {
- // Loading the custom theme failed - try loading the stock theme
- LOGINFO("Attempting to reload stock theme...\n");
- if (PageManager::ReloadPackage("TWRP", "/res/ui.xml"))
- {
- LOGERR("Failed to load base packages.\n");
- }
- }
- }
- }
- }
- }
- }
+ DataManager::SetValue(TW_IS_ENCRYPTED, 0);
- operation_end(op_status, simulate);
- return 0;
- }
- if (function == "adbsideload")
- {
- int ret = 0;
+ if (load_theme) {
+ int has_datamedia;
- operation_start("Sideload");
- if (simulate) {
- simulate_progress_bar();
- } else {
- int wipe_cache = 0;
- int wipe_dalvik = 0;
-
- gui_print("Starting ADB sideload feature...\n");
- bool mtp_was_enabled = TWFunc::Toggle_MTP(false);
- DataManager::GetValue("tw_wipe_dalvik", wipe_dalvik);
- ret = apply_from_adb("/");
- DataManager::SetValue("tw_has_cancel", 0); // Remove cancel button from gui now that the zip install is going to start
- char file_prop[PROPERTY_VALUE_MAX];
- property_get("tw_sideload_file", file_prop, "error");
- if (ret != 0) {
- ret = 1; // failure
- if (ret == -2)
- gui_print("You need adb 1.0.32 or newer to sideload to this device.\n");
- } else {
- if (TWinstall_zip(file_prop, &wipe_cache) == 0) {
- if (wipe_cache || DataManager::GetIntValue("tw_wipe_cache"))
- PartitionManager.Wipe_By_Path("/cache");
- if (wipe_dalvik)
- PartitionManager.Wipe_Dalvik_Cache();
- } else {
- ret = 1; // failure
- }
- set_usb_driver(false);
- maybe_restart_adbd();
- }
- TWFunc::Toggle_MTP(mtp_was_enabled);
- if (strcmp(file_prop, "error") != 0) {
+ // Check for a custom theme and load it if exists
+ DataManager::GetValue(TW_HAS_DATA_MEDIA, has_datamedia);
+ if (has_datamedia != 0) {
struct stat st;
- stat("/sideload/exit", &st);
- int child_pid, status;
- char child_prop[PROPERTY_VALUE_MAX];
- property_get("tw_child_pid", child_prop, "error");
- if (strcmp(child_prop, "error") == 0) {
- LOGERR("Unable to get child ID from prop\n");
+ int check = 0;
+ std::string theme_path;
+
+ if (tw_get_default_metadata(DataManager::GetSettingsStoragePath().c_str()) != 0) {
+ LOGERR("Failed to get default contexts and file mode for storage files.\n");
} else {
- child_pid = atoi(child_prop);
- LOGINFO("Waiting for child sideload process to exit.\n");
- waitpid(child_pid, &status, 0);
+ LOGINFO("Got default contexts and file mode for storage files.\n");
}
- }
- if (DataManager::GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager::GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
- operation_start("ReinjectTWRP");
- gui_print("Injecting TWRP into boot image...\n");
- if (simulate) {
- simulate_progress_bar();
- } else {
- TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
- if (Boot == NULL || Boot->Current_File_System != "emmc")
- TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
- else {
- string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
- TWFunc::Exec_Cmd(injectcmd);
+
+ 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());
+ check = 1;
+ }
+
+ theme_path += "/TWRP/theme/ui.zip";
+ if (check == 0 && stat(theme_path.c_str(), &st) == 0) {
+ if (PageManager::ReloadPackage("TWRP", theme_path) != 0)
+ {
+ // Loading the custom theme failed - try loading the stock theme
+ LOGINFO("Attempting to reload stock theme...\n");
+ if (PageManager::ReloadPackage("TWRP", "/res/ui.xml"))
+ {
+ LOGERR("Failed to load base packages.\n");
+ }
}
- gui_print("TWRP injection complete.\n");
}
}
}
- operation_end(ret, simulate);
- return 0;
}
- if (function == "adbsideloadcancel")
- {
- int child_pid, status;
- char child_prop[PROPERTY_VALUE_MAX];
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::adbsideload(std::string arg)
+{
+ int ret = 0;
+
+ operation_start("Sideload");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ int wipe_cache = 0;
+ int wipe_dalvik = 0;
+
+ gui_print("Starting ADB sideload feature...\n");
+ bool mtp_was_enabled = TWFunc::Toggle_MTP(false);
+ DataManager::GetValue("tw_wipe_dalvik", wipe_dalvik);
+ ret = apply_from_adb("/");
+ DataManager::SetValue("tw_has_cancel", 0); // Remove cancel button from gui now that the zip install is going to start
+ char file_prop[PROPERTY_VALUE_MAX];
+ property_get("tw_sideload_file", file_prop, "error");
+ if (ret != 0) {
+ ret = 1; // failure
+ if (ret == -2)
+ gui_print("You need adb 1.0.32 or newer to sideload to this device.\n");
+ } else {
+ if (TWinstall_zip(file_prop, &wipe_cache) == 0) {
+ if (wipe_cache || DataManager::GetIntValue("tw_wipe_cache"))
+ PartitionManager.Wipe_By_Path("/cache");
+ if (wipe_dalvik)
+ PartitionManager.Wipe_Dalvik_Cache();
+ } else {
+ ret = 1; // failure
+ }
+ set_usb_driver(false);
+ maybe_restart_adbd();
+ }
+ TWFunc::Toggle_MTP(mtp_was_enabled);
+ if (strcmp(file_prop, "error") != 0) {
struct stat st;
- DataManager::SetValue("tw_has_cancel", 0); // Remove cancel button from gui
- gui_print("Cancelling ADB sideload...\n");
stat("/sideload/exit", &st);
- sleep(1);
+ int child_pid, status;
+ char child_prop[PROPERTY_VALUE_MAX];
property_get("tw_child_pid", child_prop, "error");
if (strcmp(child_prop, "error") == 0) {
LOGERR("Unable to get child ID from prop\n");
- return 0;
+ } else {
+ child_pid = atoi(child_prop);
+ LOGINFO("Waiting for child sideload process to exit.\n");
+ waitpid(child_pid, &status, 0);
}
- child_pid = atoi(child_prop);
- kill(child_pid, SIGTERM);
- DataManager::SetValue("tw_page_done", "1"); // For OpenRecoveryScript support
- return 0;
}
- if (function == "openrecoveryscript") {
- operation_start("OpenRecoveryScript");
+ if (DataManager::GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager::GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
+ operation_start("ReinjectTWRP");
+ gui_print("Injecting TWRP into boot image...\n");
if (simulate) {
simulate_progress_bar();
} else {
- // Check for the SCRIPT_FILE_TMP first as these are AOSP recovery commands
- // that we converted to ORS commands during boot in recovery.cpp.
- // Run those first.
- int reboot = 0;
- if (TWFunc::Path_Exists(SCRIPT_FILE_TMP)) {
- gui_print("Processing AOSP recovery commands...\n");
- if (OpenRecoveryScript::run_script_file() == 0) {
- reboot = 1;
- }
- }
- // Check for the ORS file in /cache and attempt to run those commands.
- if (OpenRecoveryScript::check_for_script_file()) {
- gui_print("Processing OpenRecoveryScript file...\n");
- if (OpenRecoveryScript::run_script_file() == 0) {
- reboot = 1;
- }
- }
- if (reboot) {
- usleep(2000000); // Sleep for 2 seconds before rebooting
- TWFunc::tw_reboot(rb_system);
- } else {
- DataManager::SetValue("tw_page_done", 1);
+ TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
+ if (Boot == NULL || Boot->Current_File_System != "emmc")
+ TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+ else {
+ string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
+ TWFunc::Exec_Cmd(injectcmd);
}
+ gui_print("TWRP injection complete.\n");
}
- return 0;
}
- if (function == "installsu")
- {
- int op_status = 0;
+ }
+ operation_end(ret);
+ return 0;
+}
- operation_start("Install SuperSU");
- if (simulate) {
- simulate_progress_bar();
- } else {
- if (!TWFunc::Install_SuperSU())
- op_status = 1;
- }
+int GUIAction::adbsideloadcancel(std::string arg)
+{
+ int child_pid;
+ char child_prop[PROPERTY_VALUE_MAX];
+ struct stat st;
+ DataManager::SetValue("tw_has_cancel", 0); // Remove cancel button from gui
+ gui_print("Cancelling ADB sideload...\n");
+ stat("/sideload/exit", &st);
+ ::sleep(1);
+ property_get("tw_child_pid", child_prop, "error");
+ if (strcmp(child_prop, "error") == 0) {
+ LOGERR("Unable to get child ID from prop\n");
+ return 0;
+ }
+ child_pid = atoi(child_prop);
+ kill(child_pid, SIGTERM);
+ DataManager::SetValue("tw_page_done", "1"); // For OpenRecoveryScript support
+ return 0;
+}
- operation_end(op_status, simulate);
- return 0;
+int GUIAction::openrecoveryscript(std::string arg)
+{
+ operation_start("OpenRecoveryScript");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ // Check for the SCRIPT_FILE_TMP first as these are AOSP recovery commands
+ // that we converted to ORS commands during boot in recovery.cpp.
+ // Run those first.
+ int reboot = 0;
+ if (TWFunc::Path_Exists(SCRIPT_FILE_TMP)) {
+ gui_print("Processing AOSP recovery commands...\n");
+ if (OpenRecoveryScript::run_script_file() == 0) {
+ reboot = 1;
+ }
}
- if (function == "fixsu")
- {
- int op_status = 0;
-
- operation_start("Fixing Superuser Permissions");
- if (simulate) {
- simulate_progress_bar();
- } else {
- LOGERR("Fixing su permissions was deprecated from TWRP.\n");
- LOGERR("4.3+ ROMs with SELinux will always lose su perms.\n");
+ // Check for the ORS file in /cache and attempt to run those commands.
+ if (OpenRecoveryScript::check_for_script_file()) {
+ gui_print("Processing OpenRecoveryScript file...\n");
+ if (OpenRecoveryScript::run_script_file() == 0) {
+ reboot = 1;
}
-
- operation_end(op_status, simulate);
- return 0;
}
- if (function == "decrypt_backup")
- {
- int op_status = 0;
+ if (reboot) {
+ usleep(2000000); // Sleep for 2 seconds before rebooting
+ TWFunc::tw_reboot(rb_system);
+ } else {
+ DataManager::SetValue("tw_page_done", 1);
+ }
+ }
+ return 0;
+}
- operation_start("Try Restore Decrypt");
- if (simulate) {
- simulate_progress_bar();
- } else {
- string Restore_Path, Filename, Password;
- DataManager::GetValue("tw_restore", Restore_Path);
- Restore_Path += "/";
- DataManager::GetValue("tw_restore_password", Password);
- TWFunc::SetPerformanceMode(true);
- if (TWFunc::Try_Decrypting_Backup(Restore_Path, Password))
- op_status = 0; // success
- else
- op_status = 1; // fail
- TWFunc::SetPerformanceMode(false);
- }
+int GUIAction::installsu(std::string arg)
+{
+ int op_status = 0;
- operation_end(op_status, simulate);
- return 0;
- }
- if (function == "repair")
- {
- int op_status = 0;
+ operation_start("Install SuperSU");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ if (!TWFunc::Install_SuperSU())
+ op_status = 1;
+ }
- operation_start("Repair Partition");
- if (simulate) {
- simulate_progress_bar();
- } else {
- string part_path;
- DataManager::GetValue("tw_partition_mount_point", part_path);
- if (PartitionManager.Repair_By_Path(part_path, true)) {
- op_status = 0; // success
- } else {
- LOGERR("Error repairing file system.\n");
- op_status = 1; // fail
- }
- }
+ operation_end(op_status);
+ return 0;
+}
- operation_end(op_status, simulate);
- return 0;
- }
- if (function == "changefilesystem")
- {
- int op_status = 0;
+int GUIAction::fixsu(std::string arg)
+{
+ int op_status = 0;
- operation_start("Change File System");
- if (simulate) {
- simulate_progress_bar();
- } else {
- string part_path, file_system;
- DataManager::GetValue("tw_partition_mount_point", part_path);
- DataManager::GetValue("tw_action_new_file_system", file_system);
- if (PartitionManager.Wipe_By_Path(part_path, file_system)) {
- op_status = 0; // success
- } else {
- LOGERR("Error changing file system.\n");
- op_status = 1; // fail
- }
- }
- PartitionManager.Update_System_Details();
- operation_end(op_status, simulate);
- return 0;
- }
- if (function == "startmtp")
- {
- int op_status = 0;
+ operation_start("Fixing Superuser Permissions");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ LOGERR("Fixing su permissions was deprecated from TWRP.\n");
+ LOGERR("4.3+ ROMs with SELinux will always lose su perms.\n");
+ }
- operation_start("Start MTP");
- if (PartitionManager.Enable_MTP())
- op_status = 0; // success
- else
- op_status = 1; // fail
+ operation_end(op_status);
+ return 0;
+}
- operation_end(op_status, simulate);
- return 0;
+int GUIAction::decrypt_backup(std::string arg)
+{
+ int op_status = 0;
+
+ operation_start("Try Restore Decrypt");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string Restore_Path, Filename, Password;
+ DataManager::GetValue("tw_restore", Restore_Path);
+ Restore_Path += "/";
+ DataManager::GetValue("tw_restore_password", Password);
+ TWFunc::SetPerformanceMode(true);
+ if (TWFunc::Try_Decrypting_Backup(Restore_Path, Password))
+ op_status = 0; // success
+ else
+ op_status = 1; // fail
+ TWFunc::SetPerformanceMode(false);
+ }
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::repair(std::string arg)
+{
+ int op_status = 0;
+
+ operation_start("Repair Partition");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string part_path;
+ DataManager::GetValue("tw_partition_mount_point", part_path);
+ if (PartitionManager.Repair_By_Path(part_path, true)) {
+ op_status = 0; // success
+ } else {
+ LOGERR("Error repairing file system.\n");
+ op_status = 1; // fail
}
- if (function == "stopmtp")
- {
- int op_status = 0;
+ }
- operation_start("Stop MTP");
- if (PartitionManager.Disable_MTP())
- op_status = 0; // success
- else
- op_status = 1; // fail
+ operation_end(op_status);
+ return 0;
+}
- operation_end(op_status, simulate);
- return 0;
+int GUIAction::changefilesystem(std::string arg)
+{
+ int op_status = 0;
+
+ operation_start("Change File System");
+ if (simulate) {
+ simulate_progress_bar();
+ } else {
+ string part_path, file_system;
+ DataManager::GetValue("tw_partition_mount_point", part_path);
+ DataManager::GetValue("tw_action_new_file_system", file_system);
+ if (PartitionManager.Wipe_By_Path(part_path, file_system)) {
+ op_status = 0; // success
+ } else {
+ LOGERR("Error changing file system.\n");
+ op_status = 1; // fail
}
}
+ PartitionManager.Update_System_Details();
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::startmtp(std::string arg)
+{
+ int op_status = 0;
+
+ operation_start("Start MTP");
+ if (PartitionManager.Enable_MTP())
+ op_status = 0; // success
else
- {
- pthread_t t;
- pthread_create(&t, NULL, thread_start, this);
- return 0;
- }
- LOGERR("Unknown action '%s'\n", function.c_str());
- return -1;
+ op_status = 1; // fail
+
+ operation_end(op_status);
+ return 0;
+}
+
+int GUIAction::stopmtp(std::string arg)
+{
+ int op_status = 0;
+
+ operation_start("Stop MTP");
+ if (PartitionManager.Disable_MTP())
+ op_status = 0; // success
+ else
+ op_status = 1; // fail
+
+ operation_end(op_status);
+ return 0;
}
int GUIAction::getKeyByName(std::string key)
diff --git a/gui/objects.hpp b/gui/objects.hpp
index 310ba4e26..3f12ea7f7 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -264,7 +264,8 @@ public:
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
virtual int NotifyKey(int key, bool down);
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
- virtual int doActions();
+
+ int doActions();
protected:
class Action
@@ -279,14 +280,76 @@ protected:
protected:
int getKeyByName(std::string key);
- virtual int doAction(Action action, int isThreaded = 0);
- static void* thread_start(void *cookie);
+ int doAction(Action action);
void simulate_progress_bar(void);
- int flash_zip(std::string filename, std::string pageName, const int simulate, int* wipe_cache);
+ int flash_zip(std::string filename, std::string pageName, int* wipe_cache);
void operation_start(const string operation_name);
- void operation_end(const int operation_status, const int simulate);
+ void operation_end(const int operation_status);
static void* command_thread(void *cookie);
time_t Start;
+
+ // map action name to function pointer
+ typedef int (GUIAction::*execFunction)(std::string);
+ typedef std::map<std::string, execFunction> mapFunc;
+ static mapFunc mf;
+
+ // GUI actions
+ int reboot(std::string arg);
+ int home(std::string arg);
+ int key(std::string arg);
+ int page(std::string arg);
+ int reload(std::string arg);
+ int readBackup(std::string arg);
+ int set(std::string arg);
+ int clear(std::string arg);
+ int mount(std::string arg);
+ int unmount(std::string arg);
+ int restoredefaultsettings(std::string arg);
+ int copylog(std::string arg);
+ int compute(std::string arg);
+ int setguitimezone(std::string arg);
+ int overlay(std::string arg);
+ int queuezip(std::string arg);
+ int cancelzip(std::string arg);
+ int queueclear(std::string arg);
+ int sleep(std::string arg);
+ int appenddatetobackupname(std::string arg);
+ int generatebackupname(std::string arg);
+ int checkpartitionlist(std::string arg);
+ int getpartitiondetails(std::string arg);
+ int screenshot(std::string arg);
+ int setbrightness(std::string arg);
+
+ // threaded actions
+ int fileexists(std::string arg);
+ int flash(std::string arg);
+ int wipe(std::string arg);
+ int refreshsizes(std::string arg);
+ int nandroid(std::string arg);
+ int fixpermissions(std::string arg);
+ int dd(std::string arg);
+ int partitionsd(std::string arg);
+ int installhtcdumlock(std::string arg);
+ int htcdumlockrestoreboot(std::string arg);
+ int htcdumlockreflashrecovery(std::string arg);
+ int cmd(std::string arg);
+ int terminalcommand(std::string arg);
+ int killterminal(std::string arg);
+ int reinjecttwrp(std::string arg);
+ int checkbackupname(std::string arg);
+ int decrypt(std::string arg);
+ int adbsideload(std::string arg);
+ int adbsideloadcancel(std::string arg);
+ int openrecoveryscript(std::string arg);
+ int installsu(std::string arg);
+ int fixsu(std::string arg);
+ int decrypt_backup(std::string arg);
+ int repair(std::string arg);
+ int changefilesystem(std::string arg);
+ int startmtp(std::string arg);
+ int stopmtp(std::string arg);
+
+ int simulate;
};
class GUIConsole : public GUIObject, public RenderObject, public ActionObject