Merge changes Ia75c34ab,I5743d9b9 into android-4.4
* changes: Support Qualcomm overlay graphics in recovery Improve USB Storage handling
This commit is contained in:
+61
-30
@@ -1510,21 +1510,43 @@ int TWPartitionManager::Fix_Permissions(void) {
|
||||
return result;
|
||||
}
|
||||
|
||||
TWPartition* TWPartitionManager::Find_Next_Storage(string Path, string Exclude) {
|
||||
std::vector<TWPartition*>::iterator iter = Partitions.begin();
|
||||
|
||||
if (!Path.empty()) {
|
||||
string Search_Path = TWFunc::Get_Root_Path(Path);
|
||||
for (; iter != Partitions.end(); iter++) {
|
||||
if ((*iter)->Mount_Point == Search_Path) {
|
||||
iter++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (; iter != Partitions.end(); iter++) {
|
||||
if ((*iter)->Is_Storage && (*iter)->Is_Present && (*iter)->Mount_Point != Exclude) {
|
||||
return (*iter);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int TWPartitionManager::Open_Lun_File(string Partition_Path, string Lun_File) {
|
||||
TWPartition* Part = Find_Partition_By_Path(Partition_Path);
|
||||
|
||||
if (Part == NULL) {
|
||||
LOGERR("Unable to locate volume information for USB storage mode.");
|
||||
LOGERR("Unable to locate '%s' for USB storage mode.", Partition_Path.c_str());
|
||||
return false;
|
||||
}
|
||||
if (!Part->UnMount(true))
|
||||
LOGINFO("USB mount '%s', '%s' > '%s'\n", Partition_Path.c_str(), Part->Actual_Block_Device.c_str(), Lun_File.c_str());
|
||||
if (!Part->UnMount(true) || !Part->Is_Present)
|
||||
return false;
|
||||
|
||||
if (TWFunc::write_file(Lun_File, Part->Actual_Block_Device)) {
|
||||
LOGERR("Unable to write to ums lunfile '%s': (%s)\n", Lun_File.c_str(), strerror(errno));
|
||||
return false;
|
||||
}
|
||||
property_set("sys.storage.ums_enabled", "1");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1534,37 +1556,48 @@ int TWPartitionManager::usb_storage_enable(void) {
|
||||
string ext_path;
|
||||
bool has_multiple_lun = false;
|
||||
|
||||
DataManager::GetValue(TW_HAS_DUAL_STORAGE, has_dual);
|
||||
DataManager::GetValue(TW_HAS_DATA_MEDIA, has_data_media);
|
||||
if (has_dual == 1 && has_data_media == 0) {
|
||||
string Lun_File_str = CUSTOM_LUN_FILE;
|
||||
size_t found = Lun_File_str.find("%");
|
||||
if (found != string::npos) {
|
||||
sprintf(lun_file, CUSTOM_LUN_FILE, 1);
|
||||
if (TWFunc::Path_Exists(lun_file))
|
||||
has_multiple_lun = true;
|
||||
}
|
||||
if (!has_multiple_lun) {
|
||||
// Device doesn't have multiple lun files, mount current storage
|
||||
sprintf(lun_file, CUSTOM_LUN_FILE, 0);
|
||||
return Open_Lun_File(DataManager::GetCurrentStoragePath(), lun_file);
|
||||
} else {
|
||||
// Device has multiple lun files
|
||||
sprintf(lun_file, CUSTOM_LUN_FILE, 0);
|
||||
if (!Open_Lun_File(DataManager::GetSettingsStoragePath(), lun_file))
|
||||
string Lun_File_str = CUSTOM_LUN_FILE;
|
||||
size_t found = Lun_File_str.find("%");
|
||||
if (found != string::npos) {
|
||||
sprintf(lun_file, CUSTOM_LUN_FILE, 1);
|
||||
if (TWFunc::Path_Exists(lun_file))
|
||||
has_multiple_lun = true;
|
||||
}
|
||||
if (!has_multiple_lun) {
|
||||
LOGINFO("Device doesn't have multiple lun files, mount current storage\n");
|
||||
sprintf(lun_file, CUSTOM_LUN_FILE, 0);
|
||||
if (TWFunc::Get_Root_Path(DataManager::GetCurrentStoragePath()) == "/data") {
|
||||
TWPartition* Mount = Find_Next_Storage("", "/data");
|
||||
if (Mount) {
|
||||
if (!Open_Lun_File(Mount->Mount_Point, lun_file))
|
||||
return false;
|
||||
} else {
|
||||
LOGERR("Unable to find storage partition to mount to USB\n");
|
||||
return false;
|
||||
DataManager::GetValue(TW_EXTERNAL_PATH, ext_path);
|
||||
sprintf(lun_file, CUSTOM_LUN_FILE, 1);
|
||||
return Open_Lun_File(ext_path, lun_file);
|
||||
}
|
||||
} else if (!Open_Lun_File(DataManager::GetCurrentStoragePath(), lun_file)) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (has_data_media == 0)
|
||||
ext_path = DataManager::GetCurrentStoragePath();
|
||||
else
|
||||
DataManager::GetValue(TW_EXTERNAL_PATH, ext_path);
|
||||
LOGINFO("Device has multiple lun files\n");
|
||||
TWPartition* Mount1;
|
||||
TWPartition* Mount2;
|
||||
sprintf(lun_file, CUSTOM_LUN_FILE, 0);
|
||||
return Open_Lun_File(ext_path, lun_file);
|
||||
Mount1 = Find_Next_Storage("", "/data");
|
||||
if (Mount1) {
|
||||
if (!Open_Lun_File(Mount1->Mount_Point, lun_file))
|
||||
return false;
|
||||
Mount2 = Find_Next_Storage(Mount1->Mount_Point, "/data");
|
||||
if (Mount2) {
|
||||
Open_Lun_File(ext_path, lun_file);
|
||||
}
|
||||
} else {
|
||||
LOGERR("Unable to find storage partition to mount to USB\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
property_set("sys.storage.ums_enabled", "1");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1576,8 +1609,6 @@ int TWPartitionManager::usb_storage_disable(void) {
|
||||
for (index=0; index<2; index++) {
|
||||
sprintf(lun_file, CUSTOM_LUN_FILE, index);
|
||||
ret = TWFunc::write_file(lun_file, str);
|
||||
Mount_All_Storage();
|
||||
Update_System_Details();
|
||||
if (ret < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user