mtp: cleanup, fixes and performance improvements

- use std::map instead of linked list
- read directories on demand
- fix writing zip files to storage root
- fix creating directories
- lots of minor fixes
- simplify generation of storage IDs and make them spec compliant

Change-Id: I2137c27549ddbdc58466f2e3aeda464fac70a3c5
diff --git a/partition.cpp b/partition.cpp
index 31a3f8f..add9460 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -108,8 +108,7 @@
 	{ 0,            0 },
 };
 
-TWPartition::TWPartition(int *id) {
-	initmtpid = id;
+TWPartition::TWPartition() {
 	Can_Be_Mounted = false;
 	Can_Be_Wiped = false;
 	Can_Be_Backed_Up = false;
@@ -161,7 +160,6 @@
 #ifdef TW_INCLUDE_CRYPTO_SAMSUNG
 	EcryptFS_Password = "";
 #endif
-	mtpid = 0;
 }
 
 TWPartition::~TWPartition(void) {
@@ -275,7 +273,7 @@
 			Can_Encrypt_Backup = true;
 			Use_Userdata_Encryption = true;
 			if (datamedia)
-				Setup_Data_Media(0);
+				Setup_Data_Media();
 #ifdef TW_INCLUDE_CRYPTO
 			Can_Be_Encrypted = true;
 			char crypto_blkdev[255];
@@ -411,12 +409,6 @@
 		}
 	}
 
-	// Generate MTP ID
-	if (Is_Storage) {
-		(*initmtpid)++;
-		mtpid = *initmtpid;
-	}
-
 	// Process any custom flags
 	if (Flags.size() > 0)
 		Process_Flags(Flags, Display_Error);
@@ -682,7 +674,7 @@
 	Mount_Storage_Retry();
 }
 
-void TWPartition::Setup_Data_Media(int mtp) {
+void TWPartition::Setup_Data_Media() {
 	LOGINFO("Setting up '%s' as data/media emulated storage.\n", Mount_Point.c_str());
 	Storage_Name = "Internal Storage";
 	Has_Data_Media = true;
@@ -703,8 +695,6 @@
 		DataManager::SetValue(TW_INTERNAL_PATH, "/data/media/0");
 		UnMount(true);
 	}
-	if (mtp)
-		mtpid = mtp;
 	DataManager::SetValue("tw_has_internal", 1);
 	DataManager::SetValue("tw_has_data_media", 1);
 	du.add_absolute_dir("/data/media");