blob: 64e812e11753e331d50c602d608f37015c25784c [file] [log] [blame]
Dees_Troy51a0e822012-09-05 15:24:24 -04001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <linux/input.h>
18#include <pthread.h>
19#include <stdarg.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23#include <fcntl.h>
24#include <sys/stat.h>
25#include <sys/time.h>
26#include <sys/mman.h>
27#include <sys/types.h>
28#include <sys/ioctl.h>
29#include <time.h>
30#include <unistd.h>
31#include <stdlib.h>
32
33#include <string>
34#include <utility>
35#include <map>
36#include <fstream>
37#include <sstream>
38
39#include "variables.h"
40#include "data.hpp"
41#include "partitions.hpp"
42
43extern "C"
44{
45 #include "common.h"
46 #include "data.h"
47 #include "tw_reboot.h"
48 #include "roots.h"
49
50 int get_battery_level(void);
51 void get_device_id(void);
52
53 extern char device_id[15];
54
55 void gui_notifyVarChange(const char *name, const char* value);
56
57 int __system(const char *command);
58}
59
60#define FILE_VERSION 0x00010001
61
62using namespace std;
63
64map<string, DataManager::TStrIntPair> DataManager::mValues;
65map<string, string> DataManager::mConstValues;
66string DataManager::mBackingFile;
67int DataManager::mInitialized = 0;
68
69int DataManager::ResetDefaults()
70{
71 mValues.clear();
72 mConstValues.clear();
73 SetDefaultValues();
74 return 0;
75}
76
77int DataManager::LoadValues(const string filename)
78{
79 string str;
80
81 if (!mInitialized)
82 SetDefaultValues();
83
84 // Save off the backing file for set operations
85 mBackingFile = filename;
86
87 // Read in the file, if possible
88 FILE* in = fopen(filename.c_str(), "rb");
89 if (!in) return 0;
90
91 int file_version;
92 if (fread(&file_version, 1, sizeof(int), in) != sizeof(int)) goto error;
93 if (file_version != FILE_VERSION) goto error;
94
95 while (!feof(in))
96 {
97 string Name;
98 string Value;
99 unsigned short length;
100 char array[512];
101
102 if (fread(&length, 1, sizeof(unsigned short), in) != sizeof(unsigned short)) goto error;
103 if (length >= 512) goto error;
104 if (fread(array, 1, length, in) != length) goto error;
105 Name = array;
106
107 if (fread(&length, 1, sizeof(unsigned short), in) != sizeof(unsigned short)) goto error;
108 if (length >= 512) goto error;
109 if (fread(array, 1, length, in) != length) goto error;
110 Value = array;
111
112 map<string, TStrIntPair>::iterator pos;
113
114 pos = mValues.find(Name);
115 if (pos != mValues.end())
116 {
117 pos->second.first = Value;
118 pos->second.second = 1;
119 }
120 else
121 mValues.insert(TNameValuePair(Name, TStrIntPair(Value, 1)));
122 }
123 fclose(in);
124
125 str = GetCurrentStoragePath();
126 str += "/TWRP/BACKUPS/";
127 str += device_id;
128 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
129
130 return 0;
131
132error:
133 // File version mismatch. Use defaults.
134 fclose(in);
135 str = GetCurrentStoragePath();
136 str += "/TWRP/BACKUPS/";
137 str += device_id;
138 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
139 return -1;
140}
141
142int DataManager::Flush()
143{
144 return SaveValues();
145}
146
147int DataManager::SaveValues()
148{
149 if (mBackingFile.empty()) return -1;
150
151 string mount_path = GetSettingsStoragePath();
152 TWPartitionManager::Mount_By_Path(mount_path.c_str(), 1);
153
154 FILE* out = fopen(mBackingFile.c_str(), "wb");
155 if (!out) return -1;
156
157 int file_version = FILE_VERSION;
158 fwrite(&file_version, 1, sizeof(int), out);
159
160 map<string, TStrIntPair>::iterator iter;
161 for (iter = mValues.begin(); iter != mValues.end(); ++iter)
162 {
163 // Save only the persisted data
164 if (iter->second.second != 0)
165 {
166 unsigned short length = (unsigned short) iter->first.length() + 1;
167 fwrite(&length, 1, sizeof(unsigned short), out);
168 fwrite(iter->first.c_str(), 1, length, out);
169 length = (unsigned short) iter->second.first.length() + 1;
170 fwrite(&length, 1, sizeof(unsigned short), out);
171 fwrite(iter->second.first.c_str(), 1, length, out);
172 }
173 }
174 fclose(out);
175 return 0;
176}
177
178int DataManager::GetValue(const string varName, string& value)
179{
180 string localStr = varName;
181
182 if (!mInitialized)
183 SetDefaultValues();
184
185 // Strip off leading and trailing '%' if provided
186 if (localStr.length() > 2 && localStr[0] == '%' && localStr[localStr.length()-1] == '%')
187 {
188 localStr.erase(0, 1);
189 localStr.erase(localStr.length() - 1, 1);
190 }
191
192 // Handle magic values
193 if (GetMagicValue(localStr, value) == 0) return 0;
194
195 map<string, string>::iterator constPos;
196 constPos = mConstValues.find(localStr);
197 if (constPos != mConstValues.end())
198 {
199 value = constPos->second;
200 return 0;
201 }
202
203 map<string, TStrIntPair>::iterator pos;
204 pos = mValues.find(localStr);
205 if (pos == mValues.end())
206 return -1;
207
208 value = pos->second.first;
209 return 0;
210}
211
212int DataManager::GetValue(const string varName, int& value)
213{
214 string data;
215
216 if (GetValue(varName,data) != 0)
217 return -1;
218
219 value = atoi(data.c_str());
220 return 0;
221}
222
223// This is a dangerous function. It will create the value if it doesn't exist so it has a valid c_str
224string& DataManager::GetValueRef(const string varName)
225{
226 if (!mInitialized)
227 SetDefaultValues();
228
229 map<string, string>::iterator constPos;
230 constPos = mConstValues.find(varName);
231 if (constPos != mConstValues.end())
232 return constPos->second;
233
234 map<string, TStrIntPair>::iterator pos;
235 pos = mValues.find(varName);
236 if (pos == mValues.end())
237 pos = (mValues.insert(TNameValuePair(varName, TStrIntPair("", 0)))).first;
238
239 return pos->second.first;
240}
241
242// This function will return an empty string if the value doesn't exist
243string DataManager::GetStrValue(const string varName)
244{
245 string retVal;
246
247 GetValue(varName, retVal);
248 return retVal;
249}
250
251// This function will return 0 if the value doesn't exist
252int DataManager::GetIntValue(const string varName)
253{
254 string retVal;
255
256 GetValue(varName, retVal);
257 return atoi(retVal.c_str());
258}
259
260int DataManager::SetValue(const string varName, string value, int persist /* = 0 */)
261{
262 if (!mInitialized)
263 SetDefaultValues();
264
265 // Don't allow empty values or numerical starting values
266 if (varName.empty() || (varName[0] >= '0' && varName[0] <= '9'))
267 return -1;
268
269 map<string, string>::iterator constChk;
270 constChk = mConstValues.find(varName);
271 if (constChk != mConstValues.end())
272 return -1;
273
274 map<string, TStrIntPair>::iterator pos;
275 pos = mValues.find(varName);
276 if (pos == mValues.end())
277 pos = (mValues.insert(TNameValuePair(varName, TStrIntPair(value, persist)))).first;
278 else
279 pos->second.first = value;
280
281 if (pos->second.second != 0)
282 SaveValues();
283
284 gui_notifyVarChange(varName.c_str(), value.c_str());
285 return 0;
286}
287
288int DataManager::SetValue(const string varName, int value, int persist /* = 0 */)
289{
290 ostringstream valStr;
291 valStr << value;
292 if (varName == "tw_use_external_storage") {
293 string str;
294
295 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
296 if (value == 0) {
297 str = GetStrValue(TW_INTERNAL_PATH);
298 if (GetIntValue(TW_HAS_DATA_MEDIA) == 1) {
299 LOGE("TODO: Fix storage size code!\n"); //SetValue(TW_STORAGE_FREE_SIZE, (int)((dat.sze - dat.used) / 1048576LLU));
300 } else {
301 LOGE("TODO: Fix storage size code!\n"); //SetValue(TW_STORAGE_FREE_SIZE, (int)((sdcint.sze - sdcint.used) / 1048576LLU));
302 }
303 } else {
304 str = GetStrValue(TW_EXTERNAL_PATH);
305 LOGE("TODO: Fix storage size code!\n"); //SetValue(TW_STORAGE_FREE_SIZE, (int)((sdcext.sze - sdcext.used) / 1048576LLU));
306 }
307 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
308 str = GetStrValue(TW_INTERNAL_PATH);
309 else
310 str = GetStrValue(TW_EXTERNAL_PATH);
311
312 str += "/TWRP/BACKUPS/";
313 str += device_id;
314
315 SetValue(TW_BACKUPS_FOLDER_VAR, str);
316 }
317 return SetValue(varName, valStr.str(), persist);;
318}
319
320int DataManager::SetValue(const string varName, float value, int persist /* = 0 */)
321{
322 ostringstream valStr;
323 valStr << value;
324 return SetValue(varName, valStr.str(), persist);;
325}
326
327void DataManager::DumpValues()
328{
329 map<string, TStrIntPair>::iterator iter;
330 ui_print("Data Manager dump - Values with leading X are persisted.\n");
331 for (iter = mValues.begin(); iter != mValues.end(); ++iter)
332 {
333 ui_print("%c %s=%s\n", iter->second.second ? 'X' : ' ', iter->first.c_str(), iter->second.first.c_str());
334 }
335}
336
337void DataManager::SetDefaultValues()
338{
339 string str, path;
340
341 get_device_id();
342
343 mInitialized = 1;
344
345 mConstValues.insert(make_pair("true", "1"));
346 mConstValues.insert(make_pair("false", "0"));
347
348 mConstValues.insert(make_pair(TW_VERSION_VAR, TW_VERSION_STR));
349
350#ifdef BOARD_HAS_NO_REAL_SDCARD
351 mConstValues.insert(make_pair(TW_ALLOW_PARTITION_SDCARD, "0"));
352#else
353 mConstValues.insert(make_pair(TW_ALLOW_PARTITION_SDCARD, "1"));
354#endif
355
356#ifdef TW_INCLUDE_DUMLOCK
357 mConstValues.insert(make_pair(TW_SHOW_DUMLOCK, "1"));
358#else
359 mConstValues.insert(make_pair(TW_SHOW_DUMLOCK, "0"));
360#endif
361
362#ifdef TW_INTERNAL_STORAGE_PATH
363 LOGI("Internal path defined: '%s'\n", EXPAND(TW_INTERNAL_STORAGE_PATH));
364 mValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, make_pair("0", 1)));
365 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "1"));
366 mConstValues.insert(make_pair(TW_INTERNAL_PATH, EXPAND(TW_INTERNAL_STORAGE_PATH)));
367 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT)));
368 path.clear();
369 path = "/";
370 path += EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT);
371 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, path));
372 #ifdef TW_EXTERNAL_STORAGE_PATH
373 LOGI("External path defined: '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
374 // Device has dual storage
375 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "1"));
376 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
377 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, EXPAND(TW_EXTERNAL_STORAGE_PATH)));
378 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT)));
379 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1)));
380 path.clear();
381 path = "/";
382 path += EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT);
383 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, path));
384 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
385 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/emmc", 1)));
386 } else {
387 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
388 }
389 #else
390 LOGI("Just has internal storage.\n");
391 // Just has internal storage
392 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
393 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
394 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "0"));
395 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, "0"));
396 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, "0"));
397 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, "0"));
398 #endif
399#else
400 #ifdef RECOVERY_SDCARD_ON_DATA
401 #ifdef TW_EXTERNAL_STORAGE_PATH
402 LOGI("Has /data/media + external storage in '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
403 // Device has /data/media + external storage
404 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "1"));
405 #else
406 LOGI("Single storage only -- data/media.\n");
407 // Device just has external storage
408 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
409 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "0"));
410 #endif
411 #else
412 LOGI("Single storage only.\n");
413 // Device just has external storage
414 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
415 #endif
416 #ifdef RECOVERY_SDCARD_ON_DATA
417 LOGI("Device has /data/media defined.\n");
418 // Device has /data/media
419 mConstValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, "0"));
420 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "1"));
421 mConstValues.insert(make_pair(TW_INTERNAL_PATH, "/data/media"));
422 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, "/data"));
423 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, "data"));
424 #ifdef TW_EXTERNAL_STORAGE_PATH
425 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
426 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/emmc", 1)));
427 } else {
428 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
429 }
430 #else
431 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
432 #endif
433 #else
434 LOGI("No internal storage defined.\n");
435 // Device has no internal storage
436 mConstValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, "1"));
437 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "0"));
438 mConstValues.insert(make_pair(TW_INTERNAL_PATH, "0"));
439 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, "0"));
440 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, "0"));
441 #endif
442 #ifdef TW_EXTERNAL_STORAGE_PATH
443 LOGI("Only external path defined: '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
444 // External has custom definition
445 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
446 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, EXPAND(TW_EXTERNAL_STORAGE_PATH)));
447 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT)));
448 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1)));
449 path.clear();
450 path = "/";
451 path += EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT);
452 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, path));
453 #else
454 #ifndef RECOVERY_SDCARD_ON_DATA
455 LOGI("No storage defined, defaulting to /sdcard.\n");
456 // Standard external definition
457 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
458 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, "/sdcard"));
459 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, "/sdcard"));
460 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, "sdcard"));
461 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair("/sdcard", 1)));
462 #endif
463 #endif
464#endif
465
466#ifdef TW_DEFAULT_EXTERNAL_STORAGE
467 SetValue(TW_USE_EXTERNAL_STORAGE, 1);
468 LOGI("Defaulting to external storage.\n");
469#endif
470
471 str = GetCurrentStoragePath();
472#ifdef RECOVERY_SDCARD_ON_DATA
473 #ifndef TW_EXTERNAL_STORAGE_PATH
474 SetValue(TW_ZIP_LOCATION_VAR, "/sdcard", 1);
475 #else
476 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
477 SetValue(TW_ZIP_LOCATION_VAR, "/emmc", 1);
478 } else {
479 SetValue(TW_ZIP_LOCATION_VAR, "/sdcard", 1);
480 }
481 #endif
482#else
483 SetValue(TW_ZIP_LOCATION_VAR, str.c_str(), 1);
484#endif
485 str += "/TWRP/BACKUPS/";
486 str += device_id;
487 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
488
489 if (strlen(EXPAND(SP1_DISPLAY_NAME))) mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP1_DISPLAY_NAME)));
490 if (strlen(EXPAND(SP2_DISPLAY_NAME))) mConstValues.insert(make_pair(TW_SP2_PARTITION_NAME_VAR, EXPAND(SP2_DISPLAY_NAME)));
491 if (strlen(EXPAND(SP3_DISPLAY_NAME))) mConstValues.insert(make_pair(TW_SP3_PARTITION_NAME_VAR, EXPAND(SP3_DISPLAY_NAME)));
492
493 mConstValues.insert(make_pair(TW_REBOOT_SYSTEM, tw_isRebootCommandSupported(rb_system) ? "1" : "0"));
494#ifdef TW_NO_REBOOT_RECOVERY
495 mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "0"));
496#else
497 mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, tw_isRebootCommandSupported(rb_recovery) ? "1" : "0"));
498#endif
499 mConstValues.insert(make_pair(TW_REBOOT_POWEROFF, tw_isRebootCommandSupported(rb_poweroff) ? "1" : "0"));
500#ifdef TW_NO_REBOOT_BOOTLOADER
501 mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "0"));
502#else
503 mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, tw_isRebootCommandSupported(rb_bootloader) ? "1" : "0"));
504#endif
505#ifdef RECOVERY_SDCARD_ON_DATA
506 mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "1"));
507#else
508 mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "0"));
509#endif
510#ifdef TW_NO_BATT_PERCENT
511 mConstValues.insert(make_pair(TW_NO_BATTERY_PERCENT, "1"));
512#else
513 mConstValues.insert(make_pair(TW_NO_BATTERY_PERCENT, "0"));
514#endif
515#ifdef TW_CUSTOM_POWER_BUTTON
516 mConstValues.insert(make_pair(TW_POWER_BUTTON, EXPAND(TW_CUSTOM_POWER_BUTTON)));
517#else
518 mConstValues.insert(make_pair(TW_POWER_BUTTON, "0"));
519#endif
520#ifdef TW_ALWAYS_RMRF
521 mConstValues.insert(make_pair(TW_RM_RF_VAR, "1"));
522#endif
523#ifdef TW_NEVER_UNMOUNT_SYSTEM
524 mConstValues.insert(make_pair(TW_DONT_UNMOUNT_SYSTEM, "1"));
525#else
526 mConstValues.insert(make_pair(TW_DONT_UNMOUNT_SYSTEM, "0"));
527#endif
528#ifdef TW_NO_USB_STORAGE
529 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "0"));
530#else
531 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "1"));
532#endif
533#ifdef TW_INCLUDE_INJECTTWRP
534 mConstValues.insert(make_pair(TW_HAS_INJECTTWRP, "1"));
535 mValues.insert(make_pair(TW_INJECT_AFTER_ZIP, make_pair("1", 1)));
536#else
537 mConstValues.insert(make_pair(TW_HAS_INJECTTWRP, "0"));
538 mValues.insert(make_pair(TW_INJECT_AFTER_ZIP, make_pair("0", 1)));
539#endif
540#ifdef TW_FLASH_FROM_STORAGE
541 mConstValues.insert(make_pair(TW_FLASH_ZIP_IN_PLACE, "1"));
542#endif
543#ifdef TW_HAS_DOWNLOAD_MODE
544 mConstValues.insert(make_pair(TW_DOWNLOAD_MODE, "1"));
545#endif
546#ifdef TW_INCLUDE_CRYPTO
547 mConstValues.insert(make_pair(TW_HAS_CRYPTO, "1"));
548 LOGI("Device has crypto support compiled into recovery.\n");
549#endif
550#ifdef TW_SDEXT_NO_EXT4
551 mConstValues.insert(make_pair(TW_SDEXT_DISABLE_EXT4, "1"));
552#else
553 mConstValues.insert(make_pair(TW_SDEXT_DISABLE_EXT4, "0"));
554#endif
555
556 mConstValues.insert(make_pair(TW_MIN_SYSTEM_VAR, TW_MIN_SYSTEM_SIZE));
557 mValues.insert(make_pair(TW_BACKUP_NAME, make_pair("(Current Date)", 0)));
558 mValues.insert(make_pair(TW_BACKUP_SYSTEM_VAR, make_pair("1", 1)));
559 mValues.insert(make_pair(TW_BACKUP_DATA_VAR, make_pair("1", 1)));
560 mValues.insert(make_pair(TW_BACKUP_BOOT_VAR, make_pair("1", 1)));
561 mValues.insert(make_pair(TW_BACKUP_RECOVERY_VAR, make_pair("0", 1)));
562 mValues.insert(make_pair(TW_BACKUP_CACHE_VAR, make_pair("0", 1)));
563 mValues.insert(make_pair(TW_BACKUP_SP1_VAR, make_pair("0", 1)));
564 mValues.insert(make_pair(TW_BACKUP_SP2_VAR, make_pair("0", 1)));
565 mValues.insert(make_pair(TW_BACKUP_SP3_VAR, make_pair("0", 1)));
566 mValues.insert(make_pair(TW_BACKUP_ANDSEC_VAR, make_pair("0", 1)));
567 mValues.insert(make_pair(TW_BACKUP_SDEXT_VAR, make_pair("0", 1)));
568 mValues.insert(make_pair(TW_BACKUP_SYSTEM_SIZE, make_pair("0", 0)));
569 mValues.insert(make_pair(TW_BACKUP_DATA_SIZE, make_pair("0", 0)));
570 mValues.insert(make_pair(TW_BACKUP_BOOT_SIZE, make_pair("0", 0)));
571 mValues.insert(make_pair(TW_BACKUP_RECOVERY_SIZE, make_pair("0", 0)));
572 mValues.insert(make_pair(TW_BACKUP_CACHE_SIZE, make_pair("0", 0)));
573 mValues.insert(make_pair(TW_BACKUP_ANDSEC_SIZE, make_pair("0", 0)));
574 mValues.insert(make_pair(TW_BACKUP_SDEXT_SIZE, make_pair("0", 0)));
575 mValues.insert(make_pair(TW_BACKUP_SP1_SIZE, make_pair("0", 0)));
576 mValues.insert(make_pair(TW_BACKUP_SP2_SIZE, make_pair("0", 0)));
577 mValues.insert(make_pair(TW_BACKUP_SP3_SIZE, make_pair("0", 0)));
578 mValues.insert(make_pair(TW_STORAGE_FREE_SIZE, make_pair("0", 0)));
579
580 mValues.insert(make_pair(TW_REBOOT_AFTER_FLASH_VAR, make_pair("0", 1)));
581 mValues.insert(make_pair(TW_SIGNED_ZIP_VERIFY_VAR, make_pair("0", 1)));
582 mValues.insert(make_pair(TW_FORCE_MD5_CHECK_VAR, make_pair("0", 1)));
583 mValues.insert(make_pair(TW_COLOR_THEME_VAR, make_pair("0", 1)));
584 mValues.insert(make_pair(TW_USE_COMPRESSION_VAR, make_pair("0", 1)));
585 mValues.insert(make_pair(TW_IGNORE_IMAGE_SIZE, make_pair("0", 1)));
586 mValues.insert(make_pair(TW_SHOW_SPAM_VAR, make_pair("0", 1)));
587 mValues.insert(make_pair(TW_TIME_ZONE_VAR, make_pair("CST6CDT", 1)));
588 mValues.insert(make_pair(TW_SORT_FILES_BY_DATE_VAR, make_pair("0", 1)));
589 mValues.insert(make_pair(TW_GUI_SORT_ORDER, make_pair("1", 1)));
590 mValues.insert(make_pair(TW_RM_RF_VAR, make_pair("0", 1)));
591 mValues.insert(make_pair(TW_SKIP_MD5_CHECK_VAR, make_pair("0", 1)));
592 mValues.insert(make_pair(TW_SKIP_MD5_GENERATE_VAR, make_pair("0", 1)));
593 mValues.insert(make_pair(TW_SDEXT_SIZE, make_pair("512", 1)));
594 mValues.insert(make_pair(TW_SWAP_SIZE, make_pair("32", 1)));
595 mValues.insert(make_pair(TW_SDPART_FILE_SYSTEM, make_pair("ext3", 1)));
596 mValues.insert(make_pair(TW_TIME_ZONE_GUISEL, make_pair("CST6;CDT", 1)));
597 mValues.insert(make_pair(TW_TIME_ZONE_GUIOFFSET, make_pair("0", 1)));
598 mValues.insert(make_pair(TW_TIME_ZONE_GUIDST, make_pair("1", 1)));
599 mValues.insert(make_pair(TW_ACTION_BUSY, make_pair("0", 0)));
600 mValues.insert(make_pair(TW_BACKUP_AVG_IMG_RATE, make_pair("15000000", 1)));
601 mValues.insert(make_pair(TW_BACKUP_AVG_FILE_RATE, make_pair("3000000", 1)));
602 mValues.insert(make_pair(TW_BACKUP_AVG_FILE_COMP_RATE, make_pair("2000000", 1)));
603 mValues.insert(make_pair(TW_RESTORE_AVG_IMG_RATE, make_pair("15000000", 1)));
604 mValues.insert(make_pair(TW_RESTORE_AVG_FILE_RATE, make_pair("3000000", 1)));
605 mValues.insert(make_pair(TW_RESTORE_AVG_FILE_COMP_RATE, make_pair("2000000", 1)));
606 if (GetIntValue(TW_HAS_INTERNAL) == 1 && GetIntValue(TW_HAS_DATA_MEDIA) == 1 && GetIntValue(TW_HAS_EXTERNAL) == 0)
607 SetValue(TW_HAS_USB_STORAGE, 0, 0);
608 else
609 SetValue(TW_HAS_USB_STORAGE, 1, 0);
610 mValues.insert(make_pair(TW_ZIP_INDEX, make_pair("0", 0)));
611 mValues.insert(make_pair(TW_ZIP_QUEUE_COUNT, make_pair("0", 0)));
612 mValues.insert(make_pair(TW_FILENAME, make_pair("/sdcard", 0)));
613 mValues.insert(make_pair(TW_SIMULATE_ACTIONS, make_pair("0", 1)));
614 mValues.insert(make_pair(TW_SIMULATE_FAIL, make_pair("0", 1)));
615 mValues.insert(make_pair(TW_IS_ENCRYPTED, make_pair("0", 0)));
616 mValues.insert(make_pair(TW_IS_DECRYPTED, make_pair("0", 0)));
617 mValues.insert(make_pair(TW_CRYPTO_PASSWORD, make_pair("0", 0)));
618 mValues.insert(make_pair(TW_DATA_BLK_DEVICE, make_pair("0", 0)));
619 mValues.insert(make_pair("tw_terminal_state", make_pair("0", 0)));
620 mValues.insert(make_pair("tw_background_thread_running", make_pair("0", 0)));
621 mValues.insert(make_pair(TW_RESTORE_FILE_DATE, make_pair("0", 0)));
622}
623
624// Magic Values
625int DataManager::GetMagicValue(const string varName, string& value)
626{
627 // Handle special dynamic cases
628 if (varName == "tw_time")
629 {
630 char tmp[32];
631
632 struct tm *current;
633 time_t now;
634 now = time(0);
635 current = localtime(&now);
636
637 if (current->tm_hour >= 12)
638 sprintf(tmp, "%d:%02d PM", current->tm_hour == 12 ? 12 : current->tm_hour - 12, current->tm_min);
639 else
640 sprintf(tmp, "%d:%02d AM", current->tm_hour == 0 ? 12 : current->tm_hour, current->tm_min);
641
642 value = tmp;
643 return 0;
644 }
645 if (varName == "tw_battery")
646 {
647 char tmp[16];
648
649 sprintf(tmp, "%i%%", get_battery_level());
650 value = tmp;
651 return 0;
652 }
653 return -1;
654}
655
656void DataManager::ReadSettingsFile(void)
657{
658 // Load up the values for TWRP - Sleep to let the card be ready
659 char mkdir_path[255], settings_file[255];
660 int is_enc, has_dual, use_ext, has_data_media, has_ext;
661
662 GetValue(TW_IS_ENCRYPTED, is_enc);
663 GetValue(TW_HAS_DATA_MEDIA, has_data_media);
664 if (is_enc == 1 && has_data_media == 1) {
665 LOGI("Cannot load settings -- encrypted.\n");
666 return;
667 }
668
669 memset(mkdir_path, 0, sizeof(mkdir_path));
670 memset(settings_file, 0, sizeof(settings_file));
671 sprintf(mkdir_path, "%s/TWRP", DataManager_GetSettingsStoragePath());
672 sprintf(settings_file, "%s/.twrps", mkdir_path);
673
674 if (TWPartitionManager::Mount_By_Path(DataManager_GetSettingsStorageMount(), 0) < 0)
675 {
676 usleep(500000);
677 if (TWPartitionManager::Mount_By_Path(DataManager_GetSettingsStorageMount(), 0) < 0)
678 LOGE("Unable to mount %s when trying to read settings file.\n", DataManager_GetSettingsStorageMount());
679 }
680
681 mkdir(mkdir_path, 0777);
682
683 LOGI("Attempt to load settings from settings file...\n");
684 LoadValues(settings_file);
685 GetValue(TW_HAS_DUAL_STORAGE, has_dual);
686 GetValue(TW_USE_EXTERNAL_STORAGE, use_ext);
687 GetValue(TW_HAS_EXTERNAL, has_ext);
688 if (has_dual != 0 && use_ext == 1) {
689 // Attempt to sdcard using external storage
690 if (TWPartitionManager::Mount_Current_Storage()) {
691 LOGE("Failed to mount external storage, using internal storage.\n");
692 // Remount failed, default back to internal storage
693 SetValue(TW_USE_EXTERNAL_STORAGE, 0);
694 TWPartitionManager::Mount_Current_Storage();
695 }
696 } else {
697 TWPartitionManager::Mount_Current_Storage();
698 }
699 if (has_data_media == 1) {
700 if (has_dual == 0) {
701 LOGI("Mounting /data/media to /sdcard\n");
702 system("umount /sdcard");
703 system("mount /data/media /sdcard");
704 } else {
705 string ext_path;
706
707 GetValue(TW_EXTERNAL_PATH, ext_path);
708 if (ext_path == "/sdcard") {
709 LOGI("Mounting /data/media to /emmc\n");
710 system("cd / && mkdir emmc");
711 system("umount /emmc");
712 system("mount /data/media /emmc");
713 } else {
714 LOGI("Mounting /data/media to /sdcard\n");
715 system("umount /sdcard");
716 system("mount /data/media /sdcard");
717 }
718 }
719 }
720
721 // Update storage free space after settings file is loaded
722 if (use_ext == 1)
723 LOGE("TODO: Fix storage size code!\n"); //SetValue(TW_STORAGE_FREE_SIZE, (int)((sdcext.sze - sdcext.used) / 1048576LLU));
724 else if (has_data_media == 1)
725 LOGE("TODO: Fix storage size code!\n"); //SetValue(TW_STORAGE_FREE_SIZE, (int)((dat.sze - dat.used) / 1048576LLU));
726 else
727 LOGE("TODO: Fix storage size code!\n"); //SetValue(TW_STORAGE_FREE_SIZE, (int)((sdcint.sze - sdcint.used) / 1048576LLU));
728
729 if (has_ext) {
730 string ext_path;
731
732 GetValue(TW_EXTERNAL_PATH, ext_path);
733 TWPartitionManager::Mount_By_Path(ext_path, 0);
734 }
735}
736
737string DataManager::GetCurrentStoragePath(void)
738{
739 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
740 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
741 return GetStrValue(TW_INTERNAL_PATH);
742 else
743 return GetStrValue(TW_EXTERNAL_PATH);
744 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
745 return GetStrValue(TW_INTERNAL_PATH);
746 else
747 return GetStrValue(TW_EXTERNAL_PATH);
748}
749
750string& DataManager::CGetCurrentStoragePath()
751{
752 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
753 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
754 return GetValueRef(TW_INTERNAL_PATH);
755 else
756 return GetValueRef(TW_EXTERNAL_PATH);
757 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
758 return GetValueRef(TW_INTERNAL_PATH);
759 else
760 return GetValueRef(TW_EXTERNAL_PATH);
761}
762
763string DataManager::GetCurrentStorageMount(void)
764{
765 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
766 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
767 return GetStrValue(TW_INTERNAL_MOUNT);
768 else
769 return GetStrValue(TW_EXTERNAL_MOUNT);
770 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
771 return GetStrValue(TW_INTERNAL_MOUNT);
772 else
773 return GetStrValue(TW_EXTERNAL_MOUNT);
774}
775
776string& DataManager::CGetCurrentStorageMount()
777{
778 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
779 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
780 return GetValueRef(TW_INTERNAL_MOUNT);
781 else
782 return GetValueRef(TW_EXTERNAL_MOUNT);
783 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
784 return GetValueRef(TW_INTERNAL_MOUNT);
785 else
786 return GetValueRef(TW_EXTERNAL_MOUNT);
787}
788
789string DataManager::GetSettingsStoragePath(void)
790{
791 if (GetIntValue(TW_HAS_INTERNAL) == 1)
792 return GetStrValue(TW_INTERNAL_PATH);
793 else
794 return GetStrValue(TW_EXTERNAL_PATH);
795}
796
797string& DataManager::CGetSettingsStoragePath()
798{
799 if (GetIntValue(TW_HAS_INTERNAL) == 1)
800 return GetValueRef(TW_INTERNAL_PATH);
801 else
802 return GetValueRef(TW_EXTERNAL_PATH);
803}
804
805string DataManager::GetSettingsStorageMount(void)
806{
807 if (GetIntValue(TW_HAS_INTERNAL) == 1)
808 return GetStrValue(TW_INTERNAL_MOUNT);
809 else
810 return GetStrValue(TW_EXTERNAL_MOUNT);
811}
812
813string& DataManager::CGetSettingsStorageMount()
814{
815 if (GetIntValue(TW_HAS_INTERNAL) == 1)
816 return GetValueRef(TW_INTERNAL_MOUNT);
817 else
818 return GetValueRef(TW_EXTERNAL_MOUNT);
819}
820
821extern "C" int DataManager_ResetDefaults()
822{
823 return DataManager::ResetDefaults();
824}
825
826extern "C" void DataManager_LoadDefaults()
827{
828 return DataManager::SetDefaultValues();
829}
830
831extern "C" int DataManager_LoadValues(const char* filename)
832{
833 return DataManager::LoadValues(filename);
834}
835
836extern "C" int DataManager_Flush()
837{
838 return DataManager::Flush();
839}
840
841extern "C" int DataManager_GetValue(const char* varName, char* value)
842{
843 int ret;
844 string str;
845
846 ret = DataManager::GetValue(varName, str);
847 if (ret == 0)
848 strcpy(value, str.c_str());
849 return ret;
850}
851
852extern "C" const char* DataManager_GetStrValue(const char* varName)
853{
854 string& str = DataManager::GetValueRef(varName);
855 return str.c_str();
856}
857
858extern "C" const char* DataManager_GetCurrentStoragePath(void)
859{
860 string& str = DataManager::CGetCurrentStoragePath();
861 return str.c_str();
862}
863
864extern "C" const char* DataManager_GetSettingsStoragePath(void)
865{
866 string& str = DataManager::CGetSettingsStoragePath();
867 return str.c_str();
868}
869
870extern "C" const char* DataManager_GetCurrentStorageMount(void)
871{
872 string& str = DataManager::CGetCurrentStorageMount();
873 return str.c_str();
874}
875
876extern "C" const char* DataManager_GetSettingsStorageMount(void)
877{
878 string& str = DataManager::CGetSettingsStorageMount();
879 return str.c_str();
880}
881
882extern "C" int DataManager_GetIntValue(const char* varName)
883{
884 return DataManager::GetIntValue(varName);
885}
886
887extern "C" int DataManager_SetStrValue(const char* varName, char* value)
888{
889 return DataManager::SetValue(varName, value, 0);
890}
891
892extern "C" int DataManager_SetIntValue(const char* varName, int value)
893{
894 return DataManager::SetValue(varName, value, 0);
895}
896
897extern "C" int DataManager_SetFloatValue(const char* varName, float value)
898{
899 return DataManager::SetValue(varName, value, 0);
900}
901
902extern "C" int DataManager_ToggleIntValue(const char* varName)
903{
904 if (DataManager::GetIntValue(varName))
905 return DataManager::SetValue(varName, 0);
906 else
907 return DataManager::SetValue(varName, 1);
908}
909
910extern "C" void DataManager_DumpValues()
911{
912 return DataManager::DumpValues();
913}
914
915extern "C" void DataManager_ReadSettingsFile()
916{
917 return DataManager::ReadSettingsFile();
918}