blob: 6566bcd229dddb19b0d4f9e6d7ab32795dc93f20 [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"
Dees_Troy01a9b7a2012-10-01 09:01:03 -040042#include "twrp-functions.hpp"
Dees_Troy51a0e822012-09-05 15:24:24 -040043
Anatoly Smaznov10c11f62013-02-12 13:33:40 +070044#ifdef TW_USE_MODEL_HARDWARE_ID_FOR_DEVICE_ID
45 #include "cutils/properties.h"
46#endif
47
Dees_Troy51a0e822012-09-05 15:24:24 -040048extern "C"
49{
50 #include "common.h"
51 #include "data.h"
Dees_Troy7d15c252012-09-05 20:47:21 -040052 #include "gui/pages.h"
53
54 void gui_notifyVarChange(const char *name, const char* value);
Dees_Troy51a0e822012-09-05 15:24:24 -040055}
56
57#define FILE_VERSION 0x00010001
58
59using namespace std;
60
61map<string, DataManager::TStrIntPair> DataManager::mValues;
62map<string, string> DataManager::mConstValues;
63string DataManager::mBackingFile;
64int DataManager::mInitialized = 0;
65
Dees_Troyfdf5fcc2012-09-11 10:27:01 -040066// Device ID functions
67void DataManager::sanitize_device_id(char* device_id) {
68 const char* whitelist ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-._";
69 char str[50];
70 char* c = str;
71
72 strcpy(str, device_id);
73 memset(device_id, 0, sizeof(device_id));
74 while (*c) {
75 if (strchr(whitelist, *c))
76 strncat(device_id, c, 1);
77 c++;
78 }
79 return;
80}
81
82#define CMDLINE_SERIALNO "androidboot.serialno="
83#define CMDLINE_SERIALNO_LEN (strlen(CMDLINE_SERIALNO))
84#define CPUINFO_SERIALNO "Serial"
85#define CPUINFO_SERIALNO_LEN (strlen(CPUINFO_SERIALNO))
86#define CPUINFO_HARDWARE "Hardware"
87#define CPUINFO_HARDWARE_LEN (strlen(CPUINFO_HARDWARE))
88
89void DataManager::get_device_id(void) {
90 FILE *fp;
91 char line[2048];
92 char hardware_id[32], device_id[64];
93 char* token;
94
95 // Assign a blank device_id to start with
96 device_id[0] = 0;
Anatoly Smaznov10c11f62013-02-12 13:33:40 +070097
98#ifdef TW_USE_MODEL_HARDWARE_ID_FOR_DEVICE_ID
99 // Now we'll use product_model_hardwareid as device id
100 char model_id[PROPERTY_VALUE_MAX];
101 property_get("ro.product.model", model_id, "error");
102 if (strcmp(model_id,"error") != 0) {
103 LOGI("=> product model: '%s'\n", model_id);
104 // Replace spaces with underscores
105 for(int i = 0; i < strlen(model_id); i++) {
106 if(model_id[i] == ' ')
107 model_id[i] = '_';
108 }
109 strcpy(device_id, model_id);
110 if (hardware_id[0] != 0) {
111 strcat(device_id, "_");
112 strcat(device_id, hardware_id);
113 }
114 sanitize_device_id((char *)device_id);
115 mConstValues.insert(make_pair("device_id", device_id));
116 LOGI("=> using device id: '%s'\n", device_id);
117 return;
118 }
119#endif
120
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400121#ifndef TW_FORCE_CPUINFO_FOR_DEVICE_ID
122 // First, try the cmdline to see if the serial number was supplied
123 fp = fopen("/proc/cmdline", "rt");
124 if (fp != NULL)
125 {
126 // First step, read the line. For cmdline, it's one long line
127 fgets(line, sizeof(line), fp);
128 fclose(fp);
129
130 // Now, let's tokenize the string
131 token = strtok(line, " ");
132
133 // Let's walk through the line, looking for the CMDLINE_SERIALNO token
134 while (token)
135 {
136 // We don't need to verify the length of token, because if it's too short, it will mismatch CMDLINE_SERIALNO at the NULL
137 if (memcmp(token, CMDLINE_SERIALNO, CMDLINE_SERIALNO_LEN) == 0)
138 {
139 // We found the serial number!
140 strcpy(device_id, token + CMDLINE_SERIALNO_LEN);
141 sanitize_device_id((char *)device_id);
142 mConstValues.insert(make_pair("device_id", device_id));
143 return;
144 }
145 token = strtok(NULL, " ");
146 }
147 }
148#endif
149 // Now we'll try cpuinfo for a serial number
150 fp = fopen("/proc/cpuinfo", "rt");
151 if (fp != NULL)
152 {
153 while (fgets(line, sizeof(line), fp) != NULL) { // First step, read the line.
154 if (memcmp(line, CPUINFO_SERIALNO, CPUINFO_SERIALNO_LEN) == 0) // check the beginning of the line for "Serial"
155 {
156 // We found the serial number!
157 token = line + CPUINFO_SERIALNO_LEN; // skip past "Serial"
158 while ((*token > 0 && *token <= 32 ) || *token == ':') token++; // skip over all spaces and the colon
159 if (*token != 0) {
160 token[30] = 0;
161 if (token[strlen(token)-1] == 10) { // checking for endline chars and dropping them from the end of the string if needed
162 memset(device_id, 0, sizeof(device_id));
163 strncpy(device_id, token, strlen(token) - 1);
164 } else {
165 strcpy(device_id, token);
166 }
167 LOGI("=> serial from cpuinfo: '%s'\n", device_id);
168 fclose(fp);
169 sanitize_device_id((char *)device_id);
170 mConstValues.insert(make_pair("device_id", device_id));
171 return;
172 }
173 } else if (memcmp(line, CPUINFO_HARDWARE, CPUINFO_HARDWARE_LEN) == 0) {// We're also going to look for the hardware line in cpuinfo and save it for later in case we don't find the device ID
174 // We found the hardware ID
175 token = line + CPUINFO_HARDWARE_LEN; // skip past "Hardware"
176 while ((*token > 0 && *token <= 32 ) || *token == ':') token++; // skip over all spaces and the colon
177 if (*token != 0) {
178 token[30] = 0;
179 if (token[strlen(token)-1] == 10) { // checking for endline chars and dropping them from the end of the string if needed
180 memset(hardware_id, 0, sizeof(hardware_id));
181 strncpy(hardware_id, token, strlen(token) - 1);
182 } else {
183 strcpy(hardware_id, token);
184 }
185 LOGI("=> hardware id from cpuinfo: '%s'\n", hardware_id);
186 }
187 }
188 }
189 fclose(fp);
190 }
191
192 if (hardware_id[0] != 0) {
193 LOGW("\nusing hardware id for device id: '%s'\n", hardware_id);
194 strcpy(device_id, hardware_id);
195 sanitize_device_id((char *)device_id);
196 mConstValues.insert(make_pair("device_id", device_id));
197 return;
198 }
199
200 strcpy(device_id, "serialno");
201 LOGE("=> device id not found, using '%s'.", device_id);
202 mConstValues.insert(make_pair("device_id", device_id));
203 return;
204}
205
Dees_Troy51a0e822012-09-05 15:24:24 -0400206int DataManager::ResetDefaults()
207{
208 mValues.clear();
209 mConstValues.clear();
210 SetDefaultValues();
211 return 0;
212}
213
214int DataManager::LoadValues(const string filename)
215{
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400216 string str, dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400217
218 if (!mInitialized)
219 SetDefaultValues();
220
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400221 GetValue("device_id", dev_id);
222 // Save off the backing file for set operations
Dees_Troy51a0e822012-09-05 15:24:24 -0400223 mBackingFile = filename;
224
225 // Read in the file, if possible
226 FILE* in = fopen(filename.c_str(), "rb");
227 if (!in) return 0;
228
229 int file_version;
230 if (fread(&file_version, 1, sizeof(int), in) != sizeof(int)) goto error;
231 if (file_version != FILE_VERSION) goto error;
232
233 while (!feof(in))
234 {
235 string Name;
236 string Value;
237 unsigned short length;
238 char array[512];
239
240 if (fread(&length, 1, sizeof(unsigned short), in) != sizeof(unsigned short)) goto error;
241 if (length >= 512) goto error;
242 if (fread(array, 1, length, in) != length) goto error;
243 Name = array;
244
245 if (fread(&length, 1, sizeof(unsigned short), in) != sizeof(unsigned short)) goto error;
246 if (length >= 512) goto error;
247 if (fread(array, 1, length, in) != length) goto error;
248 Value = array;
249
250 map<string, TStrIntPair>::iterator pos;
251
252 pos = mValues.find(Name);
253 if (pos != mValues.end())
254 {
255 pos->second.first = Value;
256 pos->second.second = 1;
257 }
258 else
259 mValues.insert(TNameValuePair(Name, TStrIntPair(Value, 1)));
260 }
261 fclose(in);
262
263 str = GetCurrentStoragePath();
264 str += "/TWRP/BACKUPS/";
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400265 str += dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400266 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
267
268 return 0;
269
270error:
271 // File version mismatch. Use defaults.
272 fclose(in);
273 str = GetCurrentStoragePath();
274 str += "/TWRP/BACKUPS/";
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400275 str += dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400276 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
277 return -1;
278}
279
280int DataManager::Flush()
281{
282 return SaveValues();
283}
284
285int DataManager::SaveValues()
286{
287 if (mBackingFile.empty()) return -1;
288
289 string mount_path = GetSettingsStoragePath();
Dees_Troy5bf43922012-09-07 16:07:55 -0400290 PartitionManager.Mount_By_Path(mount_path.c_str(), 1);
Dees_Troy51a0e822012-09-05 15:24:24 -0400291
292 FILE* out = fopen(mBackingFile.c_str(), "wb");
293 if (!out) return -1;
294
295 int file_version = FILE_VERSION;
296 fwrite(&file_version, 1, sizeof(int), out);
297
298 map<string, TStrIntPair>::iterator iter;
299 for (iter = mValues.begin(); iter != mValues.end(); ++iter)
300 {
301 // Save only the persisted data
302 if (iter->second.second != 0)
303 {
304 unsigned short length = (unsigned short) iter->first.length() + 1;
305 fwrite(&length, 1, sizeof(unsigned short), out);
306 fwrite(iter->first.c_str(), 1, length, out);
307 length = (unsigned short) iter->second.first.length() + 1;
308 fwrite(&length, 1, sizeof(unsigned short), out);
309 fwrite(iter->second.first.c_str(), 1, length, out);
310 }
311 }
312 fclose(out);
313 return 0;
314}
315
316int DataManager::GetValue(const string varName, string& value)
317{
318 string localStr = varName;
319
320 if (!mInitialized)
321 SetDefaultValues();
322
323 // Strip off leading and trailing '%' if provided
324 if (localStr.length() > 2 && localStr[0] == '%' && localStr[localStr.length()-1] == '%')
325 {
326 localStr.erase(0, 1);
327 localStr.erase(localStr.length() - 1, 1);
328 }
329
330 // Handle magic values
331 if (GetMagicValue(localStr, value) == 0) return 0;
332
333 map<string, string>::iterator constPos;
334 constPos = mConstValues.find(localStr);
335 if (constPos != mConstValues.end())
336 {
337 value = constPos->second;
338 return 0;
339 }
340
341 map<string, TStrIntPair>::iterator pos;
342 pos = mValues.find(localStr);
343 if (pos == mValues.end())
344 return -1;
345
346 value = pos->second.first;
347 return 0;
348}
349
350int DataManager::GetValue(const string varName, int& value)
351{
352 string data;
353
354 if (GetValue(varName,data) != 0)
355 return -1;
356
357 value = atoi(data.c_str());
358 return 0;
359}
360
bigbiff bigbiff2c57d782013-02-19 10:09:21 -0500361unsigned long long DataManager::GetValue(const string varName, unsigned long long& value)
362{
363 string data;
364
365 if (GetValue(varName,data) != 0)
366 return -1;
367
368 value = strtoull(data.c_str(), NULL, 10);
369 return 0;
370}
371
Dees_Troy51a0e822012-09-05 15:24:24 -0400372// This is a dangerous function. It will create the value if it doesn't exist so it has a valid c_str
373string& DataManager::GetValueRef(const string varName)
374{
375 if (!mInitialized)
376 SetDefaultValues();
377
378 map<string, string>::iterator constPos;
379 constPos = mConstValues.find(varName);
380 if (constPos != mConstValues.end())
381 return constPos->second;
382
383 map<string, TStrIntPair>::iterator pos;
384 pos = mValues.find(varName);
385 if (pos == mValues.end())
386 pos = (mValues.insert(TNameValuePair(varName, TStrIntPair("", 0)))).first;
387
388 return pos->second.first;
389}
390
391// This function will return an empty string if the value doesn't exist
392string DataManager::GetStrValue(const string varName)
393{
394 string retVal;
395
396 GetValue(varName, retVal);
397 return retVal;
398}
399
400// This function will return 0 if the value doesn't exist
401int DataManager::GetIntValue(const string varName)
402{
403 string retVal;
404
405 GetValue(varName, retVal);
406 return atoi(retVal.c_str());
407}
408
409int DataManager::SetValue(const string varName, string value, int persist /* = 0 */)
410{
411 if (!mInitialized)
412 SetDefaultValues();
413
414 // Don't allow empty values or numerical starting values
415 if (varName.empty() || (varName[0] >= '0' && varName[0] <= '9'))
416 return -1;
417
418 map<string, string>::iterator constChk;
419 constChk = mConstValues.find(varName);
420 if (constChk != mConstValues.end())
421 return -1;
422
423 map<string, TStrIntPair>::iterator pos;
424 pos = mValues.find(varName);
425 if (pos == mValues.end())
426 pos = (mValues.insert(TNameValuePair(varName, TStrIntPair(value, persist)))).first;
427 else
428 pos->second.first = value;
429
430 if (pos->second.second != 0)
431 SaveValues();
Dees_Troy51a0e822012-09-05 15:24:24 -0400432 gui_notifyVarChange(varName.c_str(), value.c_str());
433 return 0;
434}
435
436int DataManager::SetValue(const string varName, int value, int persist /* = 0 */)
437{
438 ostringstream valStr;
439 valStr << value;
440 if (varName == "tw_use_external_storage") {
441 string str;
442
443 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
444 if (value == 0) {
445 str = GetStrValue(TW_INTERNAL_PATH);
Dees_Troy51a0e822012-09-05 15:24:24 -0400446 } else {
447 str = GetStrValue(TW_EXTERNAL_PATH);
Dees_Troy51a0e822012-09-05 15:24:24 -0400448 }
449 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
450 str = GetStrValue(TW_INTERNAL_PATH);
451 else
452 str = GetStrValue(TW_EXTERNAL_PATH);
453
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400454 string dev_id;
455
456 GetValue("device_id", dev_id);
Dees_Troy51a0e822012-09-05 15:24:24 -0400457 str += "/TWRP/BACKUPS/";
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400458 str += dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400459
460 SetValue(TW_BACKUPS_FOLDER_VAR, str);
461 }
462 return SetValue(varName, valStr.str(), persist);;
463}
464
465int DataManager::SetValue(const string varName, float value, int persist /* = 0 */)
466{
467 ostringstream valStr;
468 valStr << value;
469 return SetValue(varName, valStr.str(), persist);;
470}
471
bigbiff bigbiff2c57d782013-02-19 10:09:21 -0500472int DataManager::SetValue(const string varName, unsigned long long value, int persist /* = 0 */)
473{
474 ostringstream valStr;
475 valStr << value;
476 return SetValue(varName, valStr.str(), persist);;
477}
478
Dees_Troy51a0e822012-09-05 15:24:24 -0400479void DataManager::DumpValues()
480{
481 map<string, TStrIntPair>::iterator iter;
482 ui_print("Data Manager dump - Values with leading X are persisted.\n");
483 for (iter = mValues.begin(); iter != mValues.end(); ++iter)
484 {
485 ui_print("%c %s=%s\n", iter->second.second ? 'X' : ' ', iter->first.c_str(), iter->second.first.c_str());
486 }
487}
488
Dees_Troy8170a922012-09-18 15:40:25 -0400489void DataManager::update_tz_environment_variables(void) {
490 setenv("TZ", DataManager_GetStrValue(TW_TIME_ZONE_VAR), 1);
491 tzset();
492}
493
Dees_Troy16b74352012-11-14 22:27:31 +0000494void DataManager::SetBackupFolder()
495{
496 string str = GetCurrentStoragePath();
497 str += "/TWRP/BACKUPS/";
498
499 string dev_id;
500 GetValue("device_id", dev_id);
501
502 str += dev_id;
503 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
504}
505
Dees_Troy51a0e822012-09-05 15:24:24 -0400506void DataManager::SetDefaultValues()
507{
508 string str, path;
509
510 get_device_id();
511
512 mInitialized = 1;
513
514 mConstValues.insert(make_pair("true", "1"));
515 mConstValues.insert(make_pair("false", "0"));
516
517 mConstValues.insert(make_pair(TW_VERSION_VAR, TW_VERSION_STR));
518
Dees_Troyf4499812013-01-23 19:07:38 +0000519#ifdef TW_FORCE_CPUINFO_FOR_DEVICE_ID
520 printf("TW_FORCE_CPUINFO_FOR_DEVICE_ID := true\n");
521#endif
522
Dees_Troy51a0e822012-09-05 15:24:24 -0400523#ifdef BOARD_HAS_NO_REAL_SDCARD
Dees_Troyf4499812013-01-23 19:07:38 +0000524 printf("BOARD_HAS_NO_REAL_SDCARD := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400525 mConstValues.insert(make_pair(TW_ALLOW_PARTITION_SDCARD, "0"));
526#else
527 mConstValues.insert(make_pair(TW_ALLOW_PARTITION_SDCARD, "1"));
528#endif
529
530#ifdef TW_INCLUDE_DUMLOCK
Dees_Troyf4499812013-01-23 19:07:38 +0000531 printf("TW_INCLUDE_DUMLOCK := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400532 mConstValues.insert(make_pair(TW_SHOW_DUMLOCK, "1"));
533#else
534 mConstValues.insert(make_pair(TW_SHOW_DUMLOCK, "0"));
535#endif
536
537#ifdef TW_INTERNAL_STORAGE_PATH
538 LOGI("Internal path defined: '%s'\n", EXPAND(TW_INTERNAL_STORAGE_PATH));
539 mValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, make_pair("0", 1)));
540 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "1"));
Dees_Troy16b74352012-11-14 22:27:31 +0000541 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair(EXPAND(TW_INTERNAL_STORAGE_PATH), 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400542 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT)));
543 path.clear();
544 path = "/";
545 path += EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT);
546 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, path));
547 #ifdef TW_EXTERNAL_STORAGE_PATH
548 LOGI("External path defined: '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
549 // Device has dual storage
550 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "1"));
551 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
552 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, EXPAND(TW_EXTERNAL_STORAGE_PATH)));
553 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT)));
554 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1)));
555 path.clear();
556 path = "/";
557 path += EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT);
558 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, path));
559 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
560 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/emmc", 1)));
561 } else {
562 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
563 }
564 #else
565 LOGI("Just has internal storage.\n");
566 // Just has internal storage
567 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
568 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
569 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "0"));
570 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, "0"));
571 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, "0"));
572 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, "0"));
573 #endif
574#else
575 #ifdef RECOVERY_SDCARD_ON_DATA
576 #ifdef TW_EXTERNAL_STORAGE_PATH
577 LOGI("Has /data/media + external storage in '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
578 // Device has /data/media + external storage
579 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "1"));
580 #else
581 LOGI("Single storage only -- data/media.\n");
582 // Device just has external storage
583 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
584 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "0"));
585 #endif
586 #else
587 LOGI("Single storage only.\n");
588 // Device just has external storage
589 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
590 #endif
591 #ifdef RECOVERY_SDCARD_ON_DATA
592 LOGI("Device has /data/media defined.\n");
593 // Device has /data/media
594 mConstValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, "0"));
595 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "1"));
Dees_Troy16b74352012-11-14 22:27:31 +0000596 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair("/data/media", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400597 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, "/data"));
598 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, "data"));
599 #ifdef TW_EXTERNAL_STORAGE_PATH
600 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
601 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/emmc", 1)));
602 } else {
603 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
604 }
605 #else
606 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
607 #endif
608 #else
609 LOGI("No internal storage defined.\n");
610 // Device has no internal storage
611 mConstValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, "1"));
612 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "0"));
Dees_Troy16b74352012-11-14 22:27:31 +0000613 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair("0", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400614 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, "0"));
615 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, "0"));
616 #endif
617 #ifdef TW_EXTERNAL_STORAGE_PATH
618 LOGI("Only external path defined: '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
619 // External has custom definition
620 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
621 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, EXPAND(TW_EXTERNAL_STORAGE_PATH)));
622 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT)));
623 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1)));
624 path.clear();
625 path = "/";
626 path += EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT);
627 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, path));
628 #else
629 #ifndef RECOVERY_SDCARD_ON_DATA
630 LOGI("No storage defined, defaulting to /sdcard.\n");
631 // Standard external definition
632 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
633 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, "/sdcard"));
634 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, "/sdcard"));
635 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, "sdcard"));
636 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair("/sdcard", 1)));
637 #endif
638 #endif
639#endif
640
641#ifdef TW_DEFAULT_EXTERNAL_STORAGE
642 SetValue(TW_USE_EXTERNAL_STORAGE, 1);
Dees_Troyf4499812013-01-23 19:07:38 +0000643 printf("TW_DEFAULT_EXTERNAL_STORAGE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400644#endif
645
Dees_Troy16b74352012-11-14 22:27:31 +0000646#ifdef RECOVERY_SDCARD_ON_DATA
647 if (PartitionManager.Mount_By_Path("/data", false) && TWFunc::Path_Exists("/data/media/0"))
648 SetValue(TW_INTERNAL_PATH, "/data/media/0");
649#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400650 str = GetCurrentStoragePath();
651#ifdef RECOVERY_SDCARD_ON_DATA
652 #ifndef TW_EXTERNAL_STORAGE_PATH
653 SetValue(TW_ZIP_LOCATION_VAR, "/sdcard", 1);
654 #else
655 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
656 SetValue(TW_ZIP_LOCATION_VAR, "/emmc", 1);
657 } else {
658 SetValue(TW_ZIP_LOCATION_VAR, "/sdcard", 1);
659 }
660 #endif
661#else
662 SetValue(TW_ZIP_LOCATION_VAR, str.c_str(), 1);
663#endif
664 str += "/TWRP/BACKUPS/";
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400665
666 string dev_id;
667 GetValue("device_id", dev_id);
668
669 str += dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400670 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
671
Dees_Troy8170a922012-09-18 15:40:25 -0400672#ifdef SP1_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000673 printf("SP1_DISPLAY_NAME := %s\n", EXPAND(SP1_DISPLAY_NAME));
Dees_Troy51a0e822012-09-05 15:24:24 -0400674 if (strlen(EXPAND(SP1_DISPLAY_NAME))) mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP1_DISPLAY_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400675#else
676 #ifdef SP1_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000677 printf("SP1_NAME := %s\n", EXPAND(SP1_NAME));
Dees_Troyb46a6842012-09-25 11:06:46 -0400678 if (strlen(EXPAND(SP1_NAME))) mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP1_NAME)));
679 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400680#endif
681#ifdef SP2_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000682 printf("SP2_DISPLAY_NAME := %s\n", EXPAND(SP2_DISPLAY_NAME));
Dees_Troy51a0e822012-09-05 15:24:24 -0400683 if (strlen(EXPAND(SP2_DISPLAY_NAME))) mConstValues.insert(make_pair(TW_SP2_PARTITION_NAME_VAR, EXPAND(SP2_DISPLAY_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400684#else
685 #ifdef SP2_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000686 printf("SP2_NAME := %s\n", EXPAND(SP2_NAME));
bigbiff bigbiff20ef6e32012-11-23 20:22:11 -0500687 if (strlen(EXPAND(SP2_NAME))) mConstValues.insert(make_pair(TW_SP2_PARTITION_NAME_VAR, EXPAND(SP2_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400688 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400689#endif
690#ifdef SP3_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000691 printf("SP3_DISPLAY_NAME := %s\n", EXPAND(SP3_DISPLAY_NAME));
Dees_Troy51a0e822012-09-05 15:24:24 -0400692 if (strlen(EXPAND(SP3_DISPLAY_NAME))) mConstValues.insert(make_pair(TW_SP3_PARTITION_NAME_VAR, EXPAND(SP3_DISPLAY_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400693#else
694 #ifdef SP3_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000695 printf("SP3_NAME := %s\n", EXPAND(SP3_NAME));
bigbiff bigbiff20ef6e32012-11-23 20:22:11 -0500696 if (strlen(EXPAND(SP3_NAME))) mConstValues.insert(make_pair(TW_SP3_PARTITION_NAME_VAR, EXPAND(SP3_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400697 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400698#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400699
Dees_Troya58bead2012-09-27 09:49:29 -0400700 mConstValues.insert(make_pair(TW_REBOOT_SYSTEM, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400701#ifdef TW_NO_REBOOT_RECOVERY
Talustus33ebf932013-02-02 14:11:14 +0100702 printf("TW_NO_REBOOT_RECOVERY := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400703 mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "0"));
704#else
Dees_Troya58bead2012-09-27 09:49:29 -0400705 mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400706#endif
Dees_Troya58bead2012-09-27 09:49:29 -0400707 mConstValues.insert(make_pair(TW_REBOOT_POWEROFF, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400708#ifdef TW_NO_REBOOT_BOOTLOADER
Talustus33ebf932013-02-02 14:11:14 +0100709 printf("TW_NO_REBOOT_BOOTLOADER := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400710 mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "0"));
711#else
Dees_Troya58bead2012-09-27 09:49:29 -0400712 mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400713#endif
714#ifdef RECOVERY_SDCARD_ON_DATA
Dees_Troyf4499812013-01-23 19:07:38 +0000715 printf("RECOVERY_SDCARD_ON_DATA := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400716 mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "1"));
717#else
718 mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "0"));
719#endif
720#ifdef TW_NO_BATT_PERCENT
Dees_Troyf4499812013-01-23 19:07:38 +0000721 printf("TW_NO_BATT_PERCENT := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400722 mConstValues.insert(make_pair(TW_NO_BATTERY_PERCENT, "1"));
723#else
724 mConstValues.insert(make_pair(TW_NO_BATTERY_PERCENT, "0"));
725#endif
726#ifdef TW_CUSTOM_POWER_BUTTON
Dees_Troyf4499812013-01-23 19:07:38 +0000727 printf("TW_POWER_BUTTON := %s\n", EXPAND(TW_CUSTOM_POWER_BUTTON));
Dees_Troy51a0e822012-09-05 15:24:24 -0400728 mConstValues.insert(make_pair(TW_POWER_BUTTON, EXPAND(TW_CUSTOM_POWER_BUTTON)));
729#else
730 mConstValues.insert(make_pair(TW_POWER_BUTTON, "0"));
731#endif
732#ifdef TW_ALWAYS_RMRF
Dees_Troyf4499812013-01-23 19:07:38 +0000733 printf("TW_ALWAYS_RMRF := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400734 mConstValues.insert(make_pair(TW_RM_RF_VAR, "1"));
735#endif
736#ifdef TW_NEVER_UNMOUNT_SYSTEM
Dees_Troyf4499812013-01-23 19:07:38 +0000737 printf("TW_NEVER_UNMOUNT_SYSTEM := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400738 mConstValues.insert(make_pair(TW_DONT_UNMOUNT_SYSTEM, "1"));
739#else
740 mConstValues.insert(make_pair(TW_DONT_UNMOUNT_SYSTEM, "0"));
741#endif
742#ifdef TW_NO_USB_STORAGE
Dees_Troy6a042c82013-01-23 18:50:52 +0000743 printf("TW_NO_USB_STORAGE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400744 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "0"));
745#else
Dees_Troy6a042c82013-01-23 18:50:52 +0000746 char lun_file[255];
747 string Lun_File_str = CUSTOM_LUN_FILE;
748 size_t found = Lun_File_str.find("%");
749 if (found != string::npos) {
750 sprintf(lun_file, CUSTOM_LUN_FILE, 0);
751 Lun_File_str = lun_file;
752 }
753 if (!TWFunc::Path_Exists(Lun_File_str)) {
754 LOGI("Lun file '%s' does not exist, USB storage mode disabled\n", Lun_File_str.c_str());
755 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "0"));
756 } else {
757 LOGI("Lun file '%s'\n", Lun_File_str.c_str());
758 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "1"));
759 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400760#endif
761#ifdef TW_INCLUDE_INJECTTWRP
Dees_Troyf4499812013-01-23 19:07:38 +0000762 printf("TW_INCLUDE_INJECTTWRP := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400763 mConstValues.insert(make_pair(TW_HAS_INJECTTWRP, "1"));
764 mValues.insert(make_pair(TW_INJECT_AFTER_ZIP, make_pair("1", 1)));
765#else
766 mConstValues.insert(make_pair(TW_HAS_INJECTTWRP, "0"));
767 mValues.insert(make_pair(TW_INJECT_AFTER_ZIP, make_pair("0", 1)));
768#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400769#ifdef TW_HAS_DOWNLOAD_MODE
Dees_Troyf4499812013-01-23 19:07:38 +0000770 printf("TW_HAS_DOWNLOAD_MODE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400771 mConstValues.insert(make_pair(TW_DOWNLOAD_MODE, "1"));
772#endif
773#ifdef TW_INCLUDE_CRYPTO
774 mConstValues.insert(make_pair(TW_HAS_CRYPTO, "1"));
Dees_Troyf4499812013-01-23 19:07:38 +0000775 printf("TW_INCLUDE_CRYPTO := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400776#endif
777#ifdef TW_SDEXT_NO_EXT4
Dees_Troyf4499812013-01-23 19:07:38 +0000778 printf("TW_SDEXT_NO_EXT4 := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400779 mConstValues.insert(make_pair(TW_SDEXT_DISABLE_EXT4, "1"));
780#else
781 mConstValues.insert(make_pair(TW_SDEXT_DISABLE_EXT4, "0"));
782#endif
783
784 mConstValues.insert(make_pair(TW_MIN_SYSTEM_VAR, TW_MIN_SYSTEM_SIZE));
785 mValues.insert(make_pair(TW_BACKUP_NAME, make_pair("(Current Date)", 0)));
786 mValues.insert(make_pair(TW_BACKUP_SYSTEM_VAR, make_pair("1", 1)));
787 mValues.insert(make_pair(TW_BACKUP_DATA_VAR, make_pair("1", 1)));
788 mValues.insert(make_pair(TW_BACKUP_BOOT_VAR, make_pair("1", 1)));
789 mValues.insert(make_pair(TW_BACKUP_RECOVERY_VAR, make_pair("0", 1)));
790 mValues.insert(make_pair(TW_BACKUP_CACHE_VAR, make_pair("0", 1)));
791 mValues.insert(make_pair(TW_BACKUP_SP1_VAR, make_pair("0", 1)));
792 mValues.insert(make_pair(TW_BACKUP_SP2_VAR, make_pair("0", 1)));
793 mValues.insert(make_pair(TW_BACKUP_SP3_VAR, make_pair("0", 1)));
794 mValues.insert(make_pair(TW_BACKUP_ANDSEC_VAR, make_pair("0", 1)));
795 mValues.insert(make_pair(TW_BACKUP_SDEXT_VAR, make_pair("0", 1)));
796 mValues.insert(make_pair(TW_BACKUP_SYSTEM_SIZE, make_pair("0", 0)));
797 mValues.insert(make_pair(TW_BACKUP_DATA_SIZE, make_pair("0", 0)));
798 mValues.insert(make_pair(TW_BACKUP_BOOT_SIZE, make_pair("0", 0)));
799 mValues.insert(make_pair(TW_BACKUP_RECOVERY_SIZE, make_pair("0", 0)));
800 mValues.insert(make_pair(TW_BACKUP_CACHE_SIZE, make_pair("0", 0)));
801 mValues.insert(make_pair(TW_BACKUP_ANDSEC_SIZE, make_pair("0", 0)));
802 mValues.insert(make_pair(TW_BACKUP_SDEXT_SIZE, make_pair("0", 0)));
803 mValues.insert(make_pair(TW_BACKUP_SP1_SIZE, make_pair("0", 0)));
804 mValues.insert(make_pair(TW_BACKUP_SP2_SIZE, make_pair("0", 0)));
805 mValues.insert(make_pair(TW_BACKUP_SP3_SIZE, make_pair("0", 0)));
806 mValues.insert(make_pair(TW_STORAGE_FREE_SIZE, make_pair("0", 0)));
bigbiff bigbiff7ce7f0c2013-01-25 09:54:04 -0500807
Dees_Troy51a0e822012-09-05 15:24:24 -0400808 mValues.insert(make_pair(TW_REBOOT_AFTER_FLASH_VAR, make_pair("0", 1)));
809 mValues.insert(make_pair(TW_SIGNED_ZIP_VERIFY_VAR, make_pair("0", 1)));
810 mValues.insert(make_pair(TW_FORCE_MD5_CHECK_VAR, make_pair("0", 1)));
811 mValues.insert(make_pair(TW_COLOR_THEME_VAR, make_pair("0", 1)));
812 mValues.insert(make_pair(TW_USE_COMPRESSION_VAR, make_pair("0", 1)));
813 mValues.insert(make_pair(TW_IGNORE_IMAGE_SIZE, make_pair("0", 1)));
814 mValues.insert(make_pair(TW_SHOW_SPAM_VAR, make_pair("0", 1)));
815 mValues.insert(make_pair(TW_TIME_ZONE_VAR, make_pair("CST6CDT", 1)));
816 mValues.insert(make_pair(TW_SORT_FILES_BY_DATE_VAR, make_pair("0", 1)));
817 mValues.insert(make_pair(TW_GUI_SORT_ORDER, make_pair("1", 1)));
818 mValues.insert(make_pair(TW_RM_RF_VAR, make_pair("0", 1)));
819 mValues.insert(make_pair(TW_SKIP_MD5_CHECK_VAR, make_pair("0", 1)));
820 mValues.insert(make_pair(TW_SKIP_MD5_GENERATE_VAR, make_pair("0", 1)));
821 mValues.insert(make_pair(TW_SDEXT_SIZE, make_pair("512", 1)));
822 mValues.insert(make_pair(TW_SWAP_SIZE, make_pair("32", 1)));
823 mValues.insert(make_pair(TW_SDPART_FILE_SYSTEM, make_pair("ext3", 1)));
824 mValues.insert(make_pair(TW_TIME_ZONE_GUISEL, make_pair("CST6;CDT", 1)));
825 mValues.insert(make_pair(TW_TIME_ZONE_GUIOFFSET, make_pair("0", 1)));
826 mValues.insert(make_pair(TW_TIME_ZONE_GUIDST, make_pair("1", 1)));
827 mValues.insert(make_pair(TW_ACTION_BUSY, make_pair("0", 0)));
828 mValues.insert(make_pair(TW_BACKUP_AVG_IMG_RATE, make_pair("15000000", 1)));
829 mValues.insert(make_pair(TW_BACKUP_AVG_FILE_RATE, make_pair("3000000", 1)));
830 mValues.insert(make_pair(TW_BACKUP_AVG_FILE_COMP_RATE, make_pair("2000000", 1)));
831 mValues.insert(make_pair(TW_RESTORE_AVG_IMG_RATE, make_pair("15000000", 1)));
832 mValues.insert(make_pair(TW_RESTORE_AVG_FILE_RATE, make_pair("3000000", 1)));
833 mValues.insert(make_pair(TW_RESTORE_AVG_FILE_COMP_RATE, make_pair("2000000", 1)));
bigbiff bigbiff7ce7f0c2013-01-25 09:54:04 -0500834 mValues.insert(make_pair("tw_wipe_cache", make_pair("0", 0)));
835 mValues.insert(make_pair("tw_wipe_dalvik", make_pair("0", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400836 if (GetIntValue(TW_HAS_INTERNAL) == 1 && GetIntValue(TW_HAS_DATA_MEDIA) == 1 && GetIntValue(TW_HAS_EXTERNAL) == 0)
837 SetValue(TW_HAS_USB_STORAGE, 0, 0);
838 else
839 SetValue(TW_HAS_USB_STORAGE, 1, 0);
840 mValues.insert(make_pair(TW_ZIP_INDEX, make_pair("0", 0)));
841 mValues.insert(make_pair(TW_ZIP_QUEUE_COUNT, make_pair("0", 0)));
842 mValues.insert(make_pair(TW_FILENAME, make_pair("/sdcard", 0)));
843 mValues.insert(make_pair(TW_SIMULATE_ACTIONS, make_pair("0", 1)));
844 mValues.insert(make_pair(TW_SIMULATE_FAIL, make_pair("0", 1)));
845 mValues.insert(make_pair(TW_IS_ENCRYPTED, make_pair("0", 0)));
846 mValues.insert(make_pair(TW_IS_DECRYPTED, make_pair("0", 0)));
847 mValues.insert(make_pair(TW_CRYPTO_PASSWORD, make_pair("0", 0)));
848 mValues.insert(make_pair(TW_DATA_BLK_DEVICE, make_pair("0", 0)));
849 mValues.insert(make_pair("tw_terminal_state", make_pair("0", 0)));
850 mValues.insert(make_pair("tw_background_thread_running", make_pair("0", 0)));
851 mValues.insert(make_pair(TW_RESTORE_FILE_DATE, make_pair("0", 0)));
852}
853
854// Magic Values
855int DataManager::GetMagicValue(const string varName, string& value)
856{
857 // Handle special dynamic cases
858 if (varName == "tw_time")
859 {
860 char tmp[32];
861
862 struct tm *current;
863 time_t now;
864 now = time(0);
865 current = localtime(&now);
866
867 if (current->tm_hour >= 12)
868 sprintf(tmp, "%d:%02d PM", current->tm_hour == 12 ? 12 : current->tm_hour - 12, current->tm_min);
869 else
870 sprintf(tmp, "%d:%02d AM", current->tm_hour == 0 ? 12 : current->tm_hour, current->tm_min);
871
872 value = tmp;
873 return 0;
874 }
875 if (varName == "tw_battery")
876 {
877 char tmp[16];
Dees_Troy38bd7602012-09-14 13:33:53 -0400878 static char charging = ' ';
879 static int lastVal = -1;
880 static time_t nextSecCheck = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400881
Dees_Troy38bd7602012-09-14 13:33:53 -0400882 struct timeval curTime;
883 gettimeofday(&curTime, NULL);
884 if (curTime.tv_sec > nextSecCheck)
885 {
886 char cap_s[4];
887 FILE * cap = fopen("/sys/class/power_supply/battery/capacity","rt");
888 if (cap){
889 fgets(cap_s, 4, cap);
890 fclose(cap);
891 lastVal = atoi(cap_s);
892 if (lastVal > 100) lastVal = 101;
893 if (lastVal < 0) lastVal = 0;
894 }
895 cap = fopen("/sys/class/power_supply/battery/status","rt");
896 if (cap) {
897 fgets(cap_s, 2, cap);
898 fclose(cap);
899 if (cap_s[0] == 'C')
900 charging = '+';
901 else
902 charging = ' ';
903 }
904 nextSecCheck = curTime.tv_sec + 60;
905 }
906
907 sprintf(tmp, "%i%%%c", lastVal, charging);
Dees_Troy51a0e822012-09-05 15:24:24 -0400908 value = tmp;
909 return 0;
910 }
911 return -1;
912}
913
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400914void DataManager::Output_Version(void) {
Dees_Troy1c1ac442013-01-17 21:42:14 +0000915 string Path;
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400916 char version[255];
917
Dees_Troy1c1ac442013-01-17 21:42:14 +0000918 if (!PartitionManager.Mount_By_Path("/cache", false)) {
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400919 LOGI("Unable to mount '%s' to write version number.\n", Path.c_str());
920 return;
921 }
Dees_Troy1c1ac442013-01-17 21:42:14 +0000922 if (!TWFunc::Path_Exists("/cache/recovery/.")) {
923 LOGI("Recreating /cache/recovery folder.\n");
924 if (mkdir("/cache/recovery", S_IRWXU | S_IRWXG | S_IWGRP | S_IXGRP) != 0) {
925 LOGE("DataManager::Output_Version -- Unable to make /cache/recovery\n");
926 return;
927 }
928 }
929 Path = "/cache/recovery/.version";
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400930 if (TWFunc::Path_Exists(Path)) {
bigbiff bigbiff9c754052013-01-09 09:09:08 -0500931 unlink(Path.c_str());
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400932 }
933 FILE *fp = fopen(Path.c_str(), "w");
934 if (fp == NULL) {
935 LOGE("Unable to open '%s'.\n", Path.c_str());
936 return;
937 }
938 strcpy(version, TW_VERSION_STR);
939 fwrite(version, sizeof(version[0]), strlen(version) / sizeof(version[0]), fp);
940 fclose(fp);
941 sync();
942 LOGI("Version number saved to '%s'\n", Path.c_str());
943}
944
Dees_Troy51a0e822012-09-05 15:24:24 -0400945void DataManager::ReadSettingsFile(void)
946{
947 // Load up the values for TWRP - Sleep to let the card be ready
948 char mkdir_path[255], settings_file[255];
949 int is_enc, has_dual, use_ext, has_data_media, has_ext;
950
951 GetValue(TW_IS_ENCRYPTED, is_enc);
952 GetValue(TW_HAS_DATA_MEDIA, has_data_media);
953 if (is_enc == 1 && has_data_media == 1) {
954 LOGI("Cannot load settings -- encrypted.\n");
955 return;
956 }
957
958 memset(mkdir_path, 0, sizeof(mkdir_path));
959 memset(settings_file, 0, sizeof(settings_file));
960 sprintf(mkdir_path, "%s/TWRP", DataManager_GetSettingsStoragePath());
961 sprintf(settings_file, "%s/.twrps", mkdir_path);
962
Dees_Troy5bf43922012-09-07 16:07:55 -0400963 if (!PartitionManager.Mount_Settings_Storage(false))
Dees_Troy51a0e822012-09-05 15:24:24 -0400964 {
965 usleep(500000);
Dees_Troy5bf43922012-09-07 16:07:55 -0400966 if (!PartitionManager.Mount_Settings_Storage(false))
Dees_Troy51a0e822012-09-05 15:24:24 -0400967 LOGE("Unable to mount %s when trying to read settings file.\n", DataManager_GetSettingsStorageMount());
968 }
969
970 mkdir(mkdir_path, 0777);
971
972 LOGI("Attempt to load settings from settings file...\n");
973 LoadValues(settings_file);
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400974 Output_Version();
Dees_Troy51a0e822012-09-05 15:24:24 -0400975 GetValue(TW_HAS_DUAL_STORAGE, has_dual);
976 GetValue(TW_USE_EXTERNAL_STORAGE, use_ext);
977 GetValue(TW_HAS_EXTERNAL, has_ext);
978 if (has_dual != 0 && use_ext == 1) {
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400979 // Attempt to switch to using external storage
Dees_Troye2920fa2012-09-19 16:18:00 -0400980 if (!PartitionManager.Mount_Current_Storage(false)) {
Dees_Troy51a0e822012-09-05 15:24:24 -0400981 LOGE("Failed to mount external storage, using internal storage.\n");
982 // Remount failed, default back to internal storage
983 SetValue(TW_USE_EXTERNAL_STORAGE, 0);
Dees_Troy5bf43922012-09-07 16:07:55 -0400984 PartitionManager.Mount_Current_Storage(true);
Dees_Troye2920fa2012-09-19 16:18:00 -0400985 string int_zip_path;
986 GetValue(TW_ZIP_INTERNAL_VAR, int_zip_path);
987 SetValue(TW_USE_EXTERNAL_STORAGE, 0);
988 SetValue(TW_ZIP_LOCATION_VAR, int_zip_path);
Dees_Troy51a0e822012-09-05 15:24:24 -0400989 }
990 } else {
Dees_Troy5bf43922012-09-07 16:07:55 -0400991 PartitionManager.Mount_Current_Storage(true);
Dees_Troy51a0e822012-09-05 15:24:24 -0400992 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400993
Dees_Troy51a0e822012-09-05 15:24:24 -0400994 if (has_ext) {
995 string ext_path;
996
997 GetValue(TW_EXTERNAL_PATH, ext_path);
Dees_Troy5bf43922012-09-07 16:07:55 -0400998 PartitionManager.Mount_By_Path(ext_path, 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400999 }
Dees_Troy8170a922012-09-18 15:40:25 -04001000 update_tz_environment_variables();
Dees_Troy51a0e822012-09-05 15:24:24 -04001001}
1002
1003string DataManager::GetCurrentStoragePath(void)
1004{
1005 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
1006 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
1007 return GetStrValue(TW_INTERNAL_PATH);
1008 else
1009 return GetStrValue(TW_EXTERNAL_PATH);
1010 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
1011 return GetStrValue(TW_INTERNAL_PATH);
1012 else
1013 return GetStrValue(TW_EXTERNAL_PATH);
1014}
1015
1016string& DataManager::CGetCurrentStoragePath()
1017{
1018 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
1019 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
1020 return GetValueRef(TW_INTERNAL_PATH);
1021 else
1022 return GetValueRef(TW_EXTERNAL_PATH);
1023 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
1024 return GetValueRef(TW_INTERNAL_PATH);
1025 else
1026 return GetValueRef(TW_EXTERNAL_PATH);
1027}
1028
1029string DataManager::GetCurrentStorageMount(void)
1030{
1031 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
1032 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
1033 return GetStrValue(TW_INTERNAL_MOUNT);
1034 else
1035 return GetStrValue(TW_EXTERNAL_MOUNT);
1036 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
1037 return GetStrValue(TW_INTERNAL_MOUNT);
1038 else
1039 return GetStrValue(TW_EXTERNAL_MOUNT);
1040}
1041
1042string& DataManager::CGetCurrentStorageMount()
1043{
1044 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
1045 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
1046 return GetValueRef(TW_INTERNAL_MOUNT);
1047 else
1048 return GetValueRef(TW_EXTERNAL_MOUNT);
1049 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
1050 return GetValueRef(TW_INTERNAL_MOUNT);
1051 else
1052 return GetValueRef(TW_EXTERNAL_MOUNT);
1053}
1054
1055string DataManager::GetSettingsStoragePath(void)
1056{
1057 if (GetIntValue(TW_HAS_INTERNAL) == 1)
1058 return GetStrValue(TW_INTERNAL_PATH);
1059 else
1060 return GetStrValue(TW_EXTERNAL_PATH);
1061}
1062
1063string& DataManager::CGetSettingsStoragePath()
1064{
1065 if (GetIntValue(TW_HAS_INTERNAL) == 1)
1066 return GetValueRef(TW_INTERNAL_PATH);
1067 else
1068 return GetValueRef(TW_EXTERNAL_PATH);
1069}
1070
1071string DataManager::GetSettingsStorageMount(void)
1072{
1073 if (GetIntValue(TW_HAS_INTERNAL) == 1)
1074 return GetStrValue(TW_INTERNAL_MOUNT);
1075 else
1076 return GetStrValue(TW_EXTERNAL_MOUNT);
1077}
1078
1079string& DataManager::CGetSettingsStorageMount()
1080{
1081 if (GetIntValue(TW_HAS_INTERNAL) == 1)
1082 return GetValueRef(TW_INTERNAL_MOUNT);
1083 else
1084 return GetValueRef(TW_EXTERNAL_MOUNT);
1085}
1086
1087extern "C" int DataManager_ResetDefaults()
1088{
1089 return DataManager::ResetDefaults();
1090}
1091
1092extern "C" void DataManager_LoadDefaults()
1093{
1094 return DataManager::SetDefaultValues();
1095}
1096
1097extern "C" int DataManager_LoadValues(const char* filename)
1098{
1099 return DataManager::LoadValues(filename);
1100}
1101
1102extern "C" int DataManager_Flush()
1103{
1104 return DataManager::Flush();
1105}
1106
1107extern "C" int DataManager_GetValue(const char* varName, char* value)
1108{
1109 int ret;
1110 string str;
1111
1112 ret = DataManager::GetValue(varName, str);
1113 if (ret == 0)
1114 strcpy(value, str.c_str());
1115 return ret;
1116}
1117
1118extern "C" const char* DataManager_GetStrValue(const char* varName)
1119{
1120 string& str = DataManager::GetValueRef(varName);
1121 return str.c_str();
1122}
1123
1124extern "C" const char* DataManager_GetCurrentStoragePath(void)
1125{
1126 string& str = DataManager::CGetCurrentStoragePath();
1127 return str.c_str();
1128}
1129
1130extern "C" const char* DataManager_GetSettingsStoragePath(void)
1131{
1132 string& str = DataManager::CGetSettingsStoragePath();
1133 return str.c_str();
1134}
1135
1136extern "C" const char* DataManager_GetCurrentStorageMount(void)
1137{
1138 string& str = DataManager::CGetCurrentStorageMount();
1139 return str.c_str();
1140}
1141
1142extern "C" const char* DataManager_GetSettingsStorageMount(void)
1143{
1144 string& str = DataManager::CGetSettingsStorageMount();
1145 return str.c_str();
1146}
1147
1148extern "C" int DataManager_GetIntValue(const char* varName)
1149{
1150 return DataManager::GetIntValue(varName);
1151}
1152
1153extern "C" int DataManager_SetStrValue(const char* varName, char* value)
1154{
1155 return DataManager::SetValue(varName, value, 0);
1156}
1157
1158extern "C" int DataManager_SetIntValue(const char* varName, int value)
1159{
1160 return DataManager::SetValue(varName, value, 0);
1161}
1162
1163extern "C" int DataManager_SetFloatValue(const char* varName, float value)
1164{
1165 return DataManager::SetValue(varName, value, 0);
1166}
1167
1168extern "C" int DataManager_ToggleIntValue(const char* varName)
1169{
1170 if (DataManager::GetIntValue(varName))
1171 return DataManager::SetValue(varName, 0);
1172 else
1173 return DataManager::SetValue(varName, 1);
1174}
1175
1176extern "C" void DataManager_DumpValues()
1177{
1178 return DataManager::DumpValues();
1179}
1180
1181extern "C" void DataManager_ReadSettingsFile()
1182{
1183 return DataManager::ReadSettingsFile();
1184}