blob: 9e9120cb81219c9e82770c57825aedc981f18d6d [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
361// This is a dangerous function. It will create the value if it doesn't exist so it has a valid c_str
362string& DataManager::GetValueRef(const string varName)
363{
364 if (!mInitialized)
365 SetDefaultValues();
366
367 map<string, string>::iterator constPos;
368 constPos = mConstValues.find(varName);
369 if (constPos != mConstValues.end())
370 return constPos->second;
371
372 map<string, TStrIntPair>::iterator pos;
373 pos = mValues.find(varName);
374 if (pos == mValues.end())
375 pos = (mValues.insert(TNameValuePair(varName, TStrIntPair("", 0)))).first;
376
377 return pos->second.first;
378}
379
380// This function will return an empty string if the value doesn't exist
381string DataManager::GetStrValue(const string varName)
382{
383 string retVal;
384
385 GetValue(varName, retVal);
386 return retVal;
387}
388
389// This function will return 0 if the value doesn't exist
390int DataManager::GetIntValue(const string varName)
391{
392 string retVal;
393
394 GetValue(varName, retVal);
395 return atoi(retVal.c_str());
396}
397
398int DataManager::SetValue(const string varName, string value, int persist /* = 0 */)
399{
400 if (!mInitialized)
401 SetDefaultValues();
402
403 // Don't allow empty values or numerical starting values
404 if (varName.empty() || (varName[0] >= '0' && varName[0] <= '9'))
405 return -1;
406
407 map<string, string>::iterator constChk;
408 constChk = mConstValues.find(varName);
409 if (constChk != mConstValues.end())
410 return -1;
411
412 map<string, TStrIntPair>::iterator pos;
413 pos = mValues.find(varName);
414 if (pos == mValues.end())
415 pos = (mValues.insert(TNameValuePair(varName, TStrIntPair(value, persist)))).first;
416 else
417 pos->second.first = value;
418
419 if (pos->second.second != 0)
420 SaveValues();
Dees_Troy51a0e822012-09-05 15:24:24 -0400421 gui_notifyVarChange(varName.c_str(), value.c_str());
422 return 0;
423}
424
425int DataManager::SetValue(const string varName, int value, int persist /* = 0 */)
426{
427 ostringstream valStr;
428 valStr << value;
429 if (varName == "tw_use_external_storage") {
430 string str;
431
432 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
433 if (value == 0) {
434 str = GetStrValue(TW_INTERNAL_PATH);
Dees_Troy51a0e822012-09-05 15:24:24 -0400435 } else {
436 str = GetStrValue(TW_EXTERNAL_PATH);
Dees_Troy51a0e822012-09-05 15:24:24 -0400437 }
438 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
439 str = GetStrValue(TW_INTERNAL_PATH);
440 else
441 str = GetStrValue(TW_EXTERNAL_PATH);
442
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400443 string dev_id;
444
445 GetValue("device_id", dev_id);
Dees_Troy51a0e822012-09-05 15:24:24 -0400446 str += "/TWRP/BACKUPS/";
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400447 str += dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400448
449 SetValue(TW_BACKUPS_FOLDER_VAR, str);
450 }
451 return SetValue(varName, valStr.str(), persist);;
452}
453
454int DataManager::SetValue(const string varName, float value, int persist /* = 0 */)
455{
456 ostringstream valStr;
457 valStr << value;
458 return SetValue(varName, valStr.str(), persist);;
459}
460
461void DataManager::DumpValues()
462{
463 map<string, TStrIntPair>::iterator iter;
464 ui_print("Data Manager dump - Values with leading X are persisted.\n");
465 for (iter = mValues.begin(); iter != mValues.end(); ++iter)
466 {
467 ui_print("%c %s=%s\n", iter->second.second ? 'X' : ' ', iter->first.c_str(), iter->second.first.c_str());
468 }
469}
470
Dees_Troy8170a922012-09-18 15:40:25 -0400471void DataManager::update_tz_environment_variables(void) {
472 setenv("TZ", DataManager_GetStrValue(TW_TIME_ZONE_VAR), 1);
473 tzset();
474}
475
Dees_Troy16b74352012-11-14 22:27:31 +0000476void DataManager::SetBackupFolder()
477{
478 string str = GetCurrentStoragePath();
479 str += "/TWRP/BACKUPS/";
480
481 string dev_id;
482 GetValue("device_id", dev_id);
483
484 str += dev_id;
485 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
486}
487
Dees_Troy51a0e822012-09-05 15:24:24 -0400488void DataManager::SetDefaultValues()
489{
490 string str, path;
491
492 get_device_id();
493
494 mInitialized = 1;
495
496 mConstValues.insert(make_pair("true", "1"));
497 mConstValues.insert(make_pair("false", "0"));
498
499 mConstValues.insert(make_pair(TW_VERSION_VAR, TW_VERSION_STR));
500
Dees_Troyf4499812013-01-23 19:07:38 +0000501#ifdef TW_FORCE_CPUINFO_FOR_DEVICE_ID
502 printf("TW_FORCE_CPUINFO_FOR_DEVICE_ID := true\n");
503#endif
504
Dees_Troy51a0e822012-09-05 15:24:24 -0400505#ifdef BOARD_HAS_NO_REAL_SDCARD
Dees_Troyf4499812013-01-23 19:07:38 +0000506 printf("BOARD_HAS_NO_REAL_SDCARD := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400507 mConstValues.insert(make_pair(TW_ALLOW_PARTITION_SDCARD, "0"));
508#else
509 mConstValues.insert(make_pair(TW_ALLOW_PARTITION_SDCARD, "1"));
510#endif
511
512#ifdef TW_INCLUDE_DUMLOCK
Dees_Troyf4499812013-01-23 19:07:38 +0000513 printf("TW_INCLUDE_DUMLOCK := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400514 mConstValues.insert(make_pair(TW_SHOW_DUMLOCK, "1"));
515#else
516 mConstValues.insert(make_pair(TW_SHOW_DUMLOCK, "0"));
517#endif
518
519#ifdef TW_INTERNAL_STORAGE_PATH
520 LOGI("Internal path defined: '%s'\n", EXPAND(TW_INTERNAL_STORAGE_PATH));
521 mValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, make_pair("0", 1)));
522 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "1"));
Dees_Troy16b74352012-11-14 22:27:31 +0000523 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair(EXPAND(TW_INTERNAL_STORAGE_PATH), 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400524 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT)));
525 path.clear();
526 path = "/";
527 path += EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT);
528 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, path));
529 #ifdef TW_EXTERNAL_STORAGE_PATH
530 LOGI("External path defined: '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
531 // Device has dual storage
532 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "1"));
533 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
534 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, EXPAND(TW_EXTERNAL_STORAGE_PATH)));
535 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT)));
536 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1)));
537 path.clear();
538 path = "/";
539 path += EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT);
540 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, path));
541 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
542 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/emmc", 1)));
543 } else {
544 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
545 }
546 #else
547 LOGI("Just has internal storage.\n");
548 // Just has internal storage
549 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
550 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
551 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "0"));
552 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, "0"));
553 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, "0"));
554 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, "0"));
555 #endif
556#else
557 #ifdef RECOVERY_SDCARD_ON_DATA
558 #ifdef TW_EXTERNAL_STORAGE_PATH
559 LOGI("Has /data/media + external storage in '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
560 // Device has /data/media + external storage
561 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "1"));
562 #else
563 LOGI("Single storage only -- data/media.\n");
564 // Device just has external storage
565 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
566 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "0"));
567 #endif
568 #else
569 LOGI("Single storage only.\n");
570 // Device just has external storage
571 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
572 #endif
573 #ifdef RECOVERY_SDCARD_ON_DATA
574 LOGI("Device has /data/media defined.\n");
575 // Device has /data/media
576 mConstValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, "0"));
577 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "1"));
Dees_Troy16b74352012-11-14 22:27:31 +0000578 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair("/data/media", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400579 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, "/data"));
580 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, "data"));
581 #ifdef TW_EXTERNAL_STORAGE_PATH
582 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
583 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/emmc", 1)));
584 } else {
585 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
586 }
587 #else
588 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
589 #endif
590 #else
591 LOGI("No internal storage defined.\n");
592 // Device has no internal storage
593 mConstValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, "1"));
594 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "0"));
Dees_Troy16b74352012-11-14 22:27:31 +0000595 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair("0", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400596 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, "0"));
597 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, "0"));
598 #endif
599 #ifdef TW_EXTERNAL_STORAGE_PATH
600 LOGI("Only external path defined: '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
601 // External has custom definition
602 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
603 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, EXPAND(TW_EXTERNAL_STORAGE_PATH)));
604 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT)));
605 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1)));
606 path.clear();
607 path = "/";
608 path += EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT);
609 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, path));
610 #else
611 #ifndef RECOVERY_SDCARD_ON_DATA
612 LOGI("No storage defined, defaulting to /sdcard.\n");
613 // Standard external definition
614 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
615 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, "/sdcard"));
616 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, "/sdcard"));
617 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, "sdcard"));
618 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair("/sdcard", 1)));
619 #endif
620 #endif
621#endif
622
623#ifdef TW_DEFAULT_EXTERNAL_STORAGE
624 SetValue(TW_USE_EXTERNAL_STORAGE, 1);
Dees_Troyf4499812013-01-23 19:07:38 +0000625 printf("TW_DEFAULT_EXTERNAL_STORAGE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400626#endif
627
Dees_Troy16b74352012-11-14 22:27:31 +0000628#ifdef RECOVERY_SDCARD_ON_DATA
629 if (PartitionManager.Mount_By_Path("/data", false) && TWFunc::Path_Exists("/data/media/0"))
630 SetValue(TW_INTERNAL_PATH, "/data/media/0");
631#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400632 str = GetCurrentStoragePath();
633#ifdef RECOVERY_SDCARD_ON_DATA
634 #ifndef TW_EXTERNAL_STORAGE_PATH
635 SetValue(TW_ZIP_LOCATION_VAR, "/sdcard", 1);
636 #else
637 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
638 SetValue(TW_ZIP_LOCATION_VAR, "/emmc", 1);
639 } else {
640 SetValue(TW_ZIP_LOCATION_VAR, "/sdcard", 1);
641 }
642 #endif
643#else
644 SetValue(TW_ZIP_LOCATION_VAR, str.c_str(), 1);
645#endif
646 str += "/TWRP/BACKUPS/";
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400647
648 string dev_id;
649 GetValue("device_id", dev_id);
650
651 str += dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400652 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
653
Dees_Troy8170a922012-09-18 15:40:25 -0400654#ifdef SP1_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000655 printf("SP1_DISPLAY_NAME := %s\n", EXPAND(SP1_DISPLAY_NAME));
Dees_Troy51a0e822012-09-05 15:24:24 -0400656 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 -0400657#else
658 #ifdef SP1_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000659 printf("SP1_NAME := %s\n", EXPAND(SP1_NAME));
Dees_Troyb46a6842012-09-25 11:06:46 -0400660 if (strlen(EXPAND(SP1_NAME))) mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP1_NAME)));
661 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400662#endif
663#ifdef SP2_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000664 printf("SP2_DISPLAY_NAME := %s\n", EXPAND(SP2_DISPLAY_NAME));
Dees_Troy51a0e822012-09-05 15:24:24 -0400665 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 -0400666#else
667 #ifdef SP2_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000668 printf("SP2_NAME := %s\n", EXPAND(SP2_NAME));
bigbiff bigbiff20ef6e32012-11-23 20:22:11 -0500669 if (strlen(EXPAND(SP2_NAME))) mConstValues.insert(make_pair(TW_SP2_PARTITION_NAME_VAR, EXPAND(SP2_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400670 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400671#endif
672#ifdef SP3_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000673 printf("SP3_DISPLAY_NAME := %s\n", EXPAND(SP3_DISPLAY_NAME));
Dees_Troy51a0e822012-09-05 15:24:24 -0400674 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 -0400675#else
676 #ifdef SP3_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000677 printf("SP3_NAME := %s\n", EXPAND(SP3_NAME));
bigbiff bigbiff20ef6e32012-11-23 20:22:11 -0500678 if (strlen(EXPAND(SP3_NAME))) mConstValues.insert(make_pair(TW_SP3_PARTITION_NAME_VAR, EXPAND(SP3_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400679 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400680#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400681
Dees_Troya58bead2012-09-27 09:49:29 -0400682 mConstValues.insert(make_pair(TW_REBOOT_SYSTEM, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400683#ifdef TW_NO_REBOOT_RECOVERY
Talustus33ebf932013-02-02 14:11:14 +0100684 printf("TW_NO_REBOOT_RECOVERY := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400685 mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "0"));
686#else
Dees_Troya58bead2012-09-27 09:49:29 -0400687 mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400688#endif
Dees_Troya58bead2012-09-27 09:49:29 -0400689 mConstValues.insert(make_pair(TW_REBOOT_POWEROFF, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400690#ifdef TW_NO_REBOOT_BOOTLOADER
Talustus33ebf932013-02-02 14:11:14 +0100691 printf("TW_NO_REBOOT_BOOTLOADER := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400692 mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "0"));
693#else
Dees_Troya58bead2012-09-27 09:49:29 -0400694 mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400695#endif
696#ifdef RECOVERY_SDCARD_ON_DATA
Dees_Troyf4499812013-01-23 19:07:38 +0000697 printf("RECOVERY_SDCARD_ON_DATA := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400698 mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "1"));
699#else
700 mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "0"));
701#endif
702#ifdef TW_NO_BATT_PERCENT
Dees_Troyf4499812013-01-23 19:07:38 +0000703 printf("TW_NO_BATT_PERCENT := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400704 mConstValues.insert(make_pair(TW_NO_BATTERY_PERCENT, "1"));
705#else
706 mConstValues.insert(make_pair(TW_NO_BATTERY_PERCENT, "0"));
707#endif
708#ifdef TW_CUSTOM_POWER_BUTTON
Dees_Troyf4499812013-01-23 19:07:38 +0000709 printf("TW_POWER_BUTTON := %s\n", EXPAND(TW_CUSTOM_POWER_BUTTON));
Dees_Troy51a0e822012-09-05 15:24:24 -0400710 mConstValues.insert(make_pair(TW_POWER_BUTTON, EXPAND(TW_CUSTOM_POWER_BUTTON)));
711#else
712 mConstValues.insert(make_pair(TW_POWER_BUTTON, "0"));
713#endif
714#ifdef TW_ALWAYS_RMRF
Dees_Troyf4499812013-01-23 19:07:38 +0000715 printf("TW_ALWAYS_RMRF := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400716 mConstValues.insert(make_pair(TW_RM_RF_VAR, "1"));
717#endif
718#ifdef TW_NEVER_UNMOUNT_SYSTEM
Dees_Troyf4499812013-01-23 19:07:38 +0000719 printf("TW_NEVER_UNMOUNT_SYSTEM := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400720 mConstValues.insert(make_pair(TW_DONT_UNMOUNT_SYSTEM, "1"));
721#else
722 mConstValues.insert(make_pair(TW_DONT_UNMOUNT_SYSTEM, "0"));
723#endif
724#ifdef TW_NO_USB_STORAGE
Dees_Troy6a042c82013-01-23 18:50:52 +0000725 printf("TW_NO_USB_STORAGE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400726 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "0"));
727#else
Dees_Troy6a042c82013-01-23 18:50:52 +0000728 char lun_file[255];
729 string Lun_File_str = CUSTOM_LUN_FILE;
730 size_t found = Lun_File_str.find("%");
731 if (found != string::npos) {
732 sprintf(lun_file, CUSTOM_LUN_FILE, 0);
733 Lun_File_str = lun_file;
734 }
735 if (!TWFunc::Path_Exists(Lun_File_str)) {
736 LOGI("Lun file '%s' does not exist, USB storage mode disabled\n", Lun_File_str.c_str());
737 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "0"));
738 } else {
739 LOGI("Lun file '%s'\n", Lun_File_str.c_str());
740 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "1"));
741 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400742#endif
743#ifdef TW_INCLUDE_INJECTTWRP
Dees_Troyf4499812013-01-23 19:07:38 +0000744 printf("TW_INCLUDE_INJECTTWRP := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400745 mConstValues.insert(make_pair(TW_HAS_INJECTTWRP, "1"));
746 mValues.insert(make_pair(TW_INJECT_AFTER_ZIP, make_pair("1", 1)));
747#else
748 mConstValues.insert(make_pair(TW_HAS_INJECTTWRP, "0"));
749 mValues.insert(make_pair(TW_INJECT_AFTER_ZIP, make_pair("0", 1)));
750#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400751#ifdef TW_HAS_DOWNLOAD_MODE
Dees_Troyf4499812013-01-23 19:07:38 +0000752 printf("TW_HAS_DOWNLOAD_MODE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400753 mConstValues.insert(make_pair(TW_DOWNLOAD_MODE, "1"));
754#endif
755#ifdef TW_INCLUDE_CRYPTO
756 mConstValues.insert(make_pair(TW_HAS_CRYPTO, "1"));
Dees_Troyf4499812013-01-23 19:07:38 +0000757 printf("TW_INCLUDE_CRYPTO := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400758#endif
759#ifdef TW_SDEXT_NO_EXT4
Dees_Troyf4499812013-01-23 19:07:38 +0000760 printf("TW_SDEXT_NO_EXT4 := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400761 mConstValues.insert(make_pair(TW_SDEXT_DISABLE_EXT4, "1"));
762#else
763 mConstValues.insert(make_pair(TW_SDEXT_DISABLE_EXT4, "0"));
764#endif
765
766 mConstValues.insert(make_pair(TW_MIN_SYSTEM_VAR, TW_MIN_SYSTEM_SIZE));
767 mValues.insert(make_pair(TW_BACKUP_NAME, make_pair("(Current Date)", 0)));
768 mValues.insert(make_pair(TW_BACKUP_SYSTEM_VAR, make_pair("1", 1)));
769 mValues.insert(make_pair(TW_BACKUP_DATA_VAR, make_pair("1", 1)));
770 mValues.insert(make_pair(TW_BACKUP_BOOT_VAR, make_pair("1", 1)));
771 mValues.insert(make_pair(TW_BACKUP_RECOVERY_VAR, make_pair("0", 1)));
772 mValues.insert(make_pair(TW_BACKUP_CACHE_VAR, make_pair("0", 1)));
773 mValues.insert(make_pair(TW_BACKUP_SP1_VAR, make_pair("0", 1)));
774 mValues.insert(make_pair(TW_BACKUP_SP2_VAR, make_pair("0", 1)));
775 mValues.insert(make_pair(TW_BACKUP_SP3_VAR, make_pair("0", 1)));
776 mValues.insert(make_pair(TW_BACKUP_ANDSEC_VAR, make_pair("0", 1)));
777 mValues.insert(make_pair(TW_BACKUP_SDEXT_VAR, make_pair("0", 1)));
778 mValues.insert(make_pair(TW_BACKUP_SYSTEM_SIZE, make_pair("0", 0)));
779 mValues.insert(make_pair(TW_BACKUP_DATA_SIZE, make_pair("0", 0)));
780 mValues.insert(make_pair(TW_BACKUP_BOOT_SIZE, make_pair("0", 0)));
781 mValues.insert(make_pair(TW_BACKUP_RECOVERY_SIZE, make_pair("0", 0)));
782 mValues.insert(make_pair(TW_BACKUP_CACHE_SIZE, make_pair("0", 0)));
783 mValues.insert(make_pair(TW_BACKUP_ANDSEC_SIZE, make_pair("0", 0)));
784 mValues.insert(make_pair(TW_BACKUP_SDEXT_SIZE, make_pair("0", 0)));
785 mValues.insert(make_pair(TW_BACKUP_SP1_SIZE, make_pair("0", 0)));
786 mValues.insert(make_pair(TW_BACKUP_SP2_SIZE, make_pair("0", 0)));
787 mValues.insert(make_pair(TW_BACKUP_SP3_SIZE, make_pair("0", 0)));
788 mValues.insert(make_pair(TW_STORAGE_FREE_SIZE, make_pair("0", 0)));
bigbiff bigbiff7ce7f0c2013-01-25 09:54:04 -0500789
Dees_Troy51a0e822012-09-05 15:24:24 -0400790 mValues.insert(make_pair(TW_REBOOT_AFTER_FLASH_VAR, make_pair("0", 1)));
791 mValues.insert(make_pair(TW_SIGNED_ZIP_VERIFY_VAR, make_pair("0", 1)));
792 mValues.insert(make_pair(TW_FORCE_MD5_CHECK_VAR, make_pair("0", 1)));
793 mValues.insert(make_pair(TW_COLOR_THEME_VAR, make_pair("0", 1)));
794 mValues.insert(make_pair(TW_USE_COMPRESSION_VAR, make_pair("0", 1)));
795 mValues.insert(make_pair(TW_IGNORE_IMAGE_SIZE, make_pair("0", 1)));
796 mValues.insert(make_pair(TW_SHOW_SPAM_VAR, make_pair("0", 1)));
797 mValues.insert(make_pair(TW_TIME_ZONE_VAR, make_pair("CST6CDT", 1)));
798 mValues.insert(make_pair(TW_SORT_FILES_BY_DATE_VAR, make_pair("0", 1)));
799 mValues.insert(make_pair(TW_GUI_SORT_ORDER, make_pair("1", 1)));
800 mValues.insert(make_pair(TW_RM_RF_VAR, make_pair("0", 1)));
801 mValues.insert(make_pair(TW_SKIP_MD5_CHECK_VAR, make_pair("0", 1)));
802 mValues.insert(make_pair(TW_SKIP_MD5_GENERATE_VAR, make_pair("0", 1)));
803 mValues.insert(make_pair(TW_SDEXT_SIZE, make_pair("512", 1)));
804 mValues.insert(make_pair(TW_SWAP_SIZE, make_pair("32", 1)));
805 mValues.insert(make_pair(TW_SDPART_FILE_SYSTEM, make_pair("ext3", 1)));
806 mValues.insert(make_pair(TW_TIME_ZONE_GUISEL, make_pair("CST6;CDT", 1)));
807 mValues.insert(make_pair(TW_TIME_ZONE_GUIOFFSET, make_pair("0", 1)));
808 mValues.insert(make_pair(TW_TIME_ZONE_GUIDST, make_pair("1", 1)));
809 mValues.insert(make_pair(TW_ACTION_BUSY, make_pair("0", 0)));
810 mValues.insert(make_pair(TW_BACKUP_AVG_IMG_RATE, make_pair("15000000", 1)));
811 mValues.insert(make_pair(TW_BACKUP_AVG_FILE_RATE, make_pair("3000000", 1)));
812 mValues.insert(make_pair(TW_BACKUP_AVG_FILE_COMP_RATE, make_pair("2000000", 1)));
813 mValues.insert(make_pair(TW_RESTORE_AVG_IMG_RATE, make_pair("15000000", 1)));
814 mValues.insert(make_pair(TW_RESTORE_AVG_FILE_RATE, make_pair("3000000", 1)));
815 mValues.insert(make_pair(TW_RESTORE_AVG_FILE_COMP_RATE, make_pair("2000000", 1)));
bigbiff bigbiff7ce7f0c2013-01-25 09:54:04 -0500816 mValues.insert(make_pair("tw_wipe_cache", make_pair("0", 0)));
817 mValues.insert(make_pair("tw_wipe_dalvik", make_pair("0", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400818 if (GetIntValue(TW_HAS_INTERNAL) == 1 && GetIntValue(TW_HAS_DATA_MEDIA) == 1 && GetIntValue(TW_HAS_EXTERNAL) == 0)
819 SetValue(TW_HAS_USB_STORAGE, 0, 0);
820 else
821 SetValue(TW_HAS_USB_STORAGE, 1, 0);
822 mValues.insert(make_pair(TW_ZIP_INDEX, make_pair("0", 0)));
823 mValues.insert(make_pair(TW_ZIP_QUEUE_COUNT, make_pair("0", 0)));
824 mValues.insert(make_pair(TW_FILENAME, make_pair("/sdcard", 0)));
825 mValues.insert(make_pair(TW_SIMULATE_ACTIONS, make_pair("0", 1)));
826 mValues.insert(make_pair(TW_SIMULATE_FAIL, make_pair("0", 1)));
827 mValues.insert(make_pair(TW_IS_ENCRYPTED, make_pair("0", 0)));
828 mValues.insert(make_pair(TW_IS_DECRYPTED, make_pair("0", 0)));
829 mValues.insert(make_pair(TW_CRYPTO_PASSWORD, make_pair("0", 0)));
830 mValues.insert(make_pair(TW_DATA_BLK_DEVICE, make_pair("0", 0)));
831 mValues.insert(make_pair("tw_terminal_state", make_pair("0", 0)));
832 mValues.insert(make_pair("tw_background_thread_running", make_pair("0", 0)));
833 mValues.insert(make_pair(TW_RESTORE_FILE_DATE, make_pair("0", 0)));
834}
835
836// Magic Values
837int DataManager::GetMagicValue(const string varName, string& value)
838{
839 // Handle special dynamic cases
840 if (varName == "tw_time")
841 {
842 char tmp[32];
843
844 struct tm *current;
845 time_t now;
846 now = time(0);
847 current = localtime(&now);
848
849 if (current->tm_hour >= 12)
850 sprintf(tmp, "%d:%02d PM", current->tm_hour == 12 ? 12 : current->tm_hour - 12, current->tm_min);
851 else
852 sprintf(tmp, "%d:%02d AM", current->tm_hour == 0 ? 12 : current->tm_hour, current->tm_min);
853
854 value = tmp;
855 return 0;
856 }
857 if (varName == "tw_battery")
858 {
859 char tmp[16];
Dees_Troy38bd7602012-09-14 13:33:53 -0400860 static char charging = ' ';
861 static int lastVal = -1;
862 static time_t nextSecCheck = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400863
Dees_Troy38bd7602012-09-14 13:33:53 -0400864 struct timeval curTime;
865 gettimeofday(&curTime, NULL);
866 if (curTime.tv_sec > nextSecCheck)
867 {
868 char cap_s[4];
869 FILE * cap = fopen("/sys/class/power_supply/battery/capacity","rt");
870 if (cap){
871 fgets(cap_s, 4, cap);
872 fclose(cap);
873 lastVal = atoi(cap_s);
874 if (lastVal > 100) lastVal = 101;
875 if (lastVal < 0) lastVal = 0;
876 }
877 cap = fopen("/sys/class/power_supply/battery/status","rt");
878 if (cap) {
879 fgets(cap_s, 2, cap);
880 fclose(cap);
881 if (cap_s[0] == 'C')
882 charging = '+';
883 else
884 charging = ' ';
885 }
886 nextSecCheck = curTime.tv_sec + 60;
887 }
888
889 sprintf(tmp, "%i%%%c", lastVal, charging);
Dees_Troy51a0e822012-09-05 15:24:24 -0400890 value = tmp;
891 return 0;
892 }
893 return -1;
894}
895
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400896void DataManager::Output_Version(void) {
Dees_Troy1c1ac442013-01-17 21:42:14 +0000897 string Path;
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400898 char version[255];
899
Dees_Troy1c1ac442013-01-17 21:42:14 +0000900 if (!PartitionManager.Mount_By_Path("/cache", false)) {
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400901 LOGI("Unable to mount '%s' to write version number.\n", Path.c_str());
902 return;
903 }
Dees_Troy1c1ac442013-01-17 21:42:14 +0000904 if (!TWFunc::Path_Exists("/cache/recovery/.")) {
905 LOGI("Recreating /cache/recovery folder.\n");
906 if (mkdir("/cache/recovery", S_IRWXU | S_IRWXG | S_IWGRP | S_IXGRP) != 0) {
907 LOGE("DataManager::Output_Version -- Unable to make /cache/recovery\n");
908 return;
909 }
910 }
911 Path = "/cache/recovery/.version";
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400912 if (TWFunc::Path_Exists(Path)) {
bigbiff bigbiff9c754052013-01-09 09:09:08 -0500913 unlink(Path.c_str());
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400914 }
915 FILE *fp = fopen(Path.c_str(), "w");
916 if (fp == NULL) {
917 LOGE("Unable to open '%s'.\n", Path.c_str());
918 return;
919 }
920 strcpy(version, TW_VERSION_STR);
921 fwrite(version, sizeof(version[0]), strlen(version) / sizeof(version[0]), fp);
922 fclose(fp);
923 sync();
924 LOGI("Version number saved to '%s'\n", Path.c_str());
925}
926
Dees_Troy51a0e822012-09-05 15:24:24 -0400927void DataManager::ReadSettingsFile(void)
928{
929 // Load up the values for TWRP - Sleep to let the card be ready
930 char mkdir_path[255], settings_file[255];
931 int is_enc, has_dual, use_ext, has_data_media, has_ext;
932
933 GetValue(TW_IS_ENCRYPTED, is_enc);
934 GetValue(TW_HAS_DATA_MEDIA, has_data_media);
935 if (is_enc == 1 && has_data_media == 1) {
936 LOGI("Cannot load settings -- encrypted.\n");
937 return;
938 }
939
940 memset(mkdir_path, 0, sizeof(mkdir_path));
941 memset(settings_file, 0, sizeof(settings_file));
942 sprintf(mkdir_path, "%s/TWRP", DataManager_GetSettingsStoragePath());
943 sprintf(settings_file, "%s/.twrps", mkdir_path);
944
Dees_Troy5bf43922012-09-07 16:07:55 -0400945 if (!PartitionManager.Mount_Settings_Storage(false))
Dees_Troy51a0e822012-09-05 15:24:24 -0400946 {
947 usleep(500000);
Dees_Troy5bf43922012-09-07 16:07:55 -0400948 if (!PartitionManager.Mount_Settings_Storage(false))
Dees_Troy51a0e822012-09-05 15:24:24 -0400949 LOGE("Unable to mount %s when trying to read settings file.\n", DataManager_GetSettingsStorageMount());
950 }
951
952 mkdir(mkdir_path, 0777);
953
954 LOGI("Attempt to load settings from settings file...\n");
955 LoadValues(settings_file);
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400956 Output_Version();
Dees_Troy51a0e822012-09-05 15:24:24 -0400957 GetValue(TW_HAS_DUAL_STORAGE, has_dual);
958 GetValue(TW_USE_EXTERNAL_STORAGE, use_ext);
959 GetValue(TW_HAS_EXTERNAL, has_ext);
960 if (has_dual != 0 && use_ext == 1) {
Dees_Troy01a9b7a2012-10-01 09:01:03 -0400961 // Attempt to switch to using external storage
Dees_Troye2920fa2012-09-19 16:18:00 -0400962 if (!PartitionManager.Mount_Current_Storage(false)) {
Dees_Troy51a0e822012-09-05 15:24:24 -0400963 LOGE("Failed to mount external storage, using internal storage.\n");
964 // Remount failed, default back to internal storage
965 SetValue(TW_USE_EXTERNAL_STORAGE, 0);
Dees_Troy5bf43922012-09-07 16:07:55 -0400966 PartitionManager.Mount_Current_Storage(true);
Dees_Troye2920fa2012-09-19 16:18:00 -0400967 string int_zip_path;
968 GetValue(TW_ZIP_INTERNAL_VAR, int_zip_path);
969 SetValue(TW_USE_EXTERNAL_STORAGE, 0);
970 SetValue(TW_ZIP_LOCATION_VAR, int_zip_path);
Dees_Troy51a0e822012-09-05 15:24:24 -0400971 }
972 } else {
Dees_Troy5bf43922012-09-07 16:07:55 -0400973 PartitionManager.Mount_Current_Storage(true);
Dees_Troy51a0e822012-09-05 15:24:24 -0400974 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400975
Dees_Troy51a0e822012-09-05 15:24:24 -0400976 if (has_ext) {
977 string ext_path;
978
979 GetValue(TW_EXTERNAL_PATH, ext_path);
Dees_Troy5bf43922012-09-07 16:07:55 -0400980 PartitionManager.Mount_By_Path(ext_path, 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400981 }
Dees_Troy8170a922012-09-18 15:40:25 -0400982 update_tz_environment_variables();
Dees_Troy51a0e822012-09-05 15:24:24 -0400983}
984
985string DataManager::GetCurrentStoragePath(void)
986{
987 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
988 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
989 return GetStrValue(TW_INTERNAL_PATH);
990 else
991 return GetStrValue(TW_EXTERNAL_PATH);
992 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
993 return GetStrValue(TW_INTERNAL_PATH);
994 else
995 return GetStrValue(TW_EXTERNAL_PATH);
996}
997
998string& DataManager::CGetCurrentStoragePath()
999{
1000 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
1001 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
1002 return GetValueRef(TW_INTERNAL_PATH);
1003 else
1004 return GetValueRef(TW_EXTERNAL_PATH);
1005 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
1006 return GetValueRef(TW_INTERNAL_PATH);
1007 else
1008 return GetValueRef(TW_EXTERNAL_PATH);
1009}
1010
1011string DataManager::GetCurrentStorageMount(void)
1012{
1013 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
1014 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
1015 return GetStrValue(TW_INTERNAL_MOUNT);
1016 else
1017 return GetStrValue(TW_EXTERNAL_MOUNT);
1018 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
1019 return GetStrValue(TW_INTERNAL_MOUNT);
1020 else
1021 return GetStrValue(TW_EXTERNAL_MOUNT);
1022}
1023
1024string& DataManager::CGetCurrentStorageMount()
1025{
1026 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
1027 if (GetIntValue(TW_USE_EXTERNAL_STORAGE) == 0)
1028 return GetValueRef(TW_INTERNAL_MOUNT);
1029 else
1030 return GetValueRef(TW_EXTERNAL_MOUNT);
1031 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
1032 return GetValueRef(TW_INTERNAL_MOUNT);
1033 else
1034 return GetValueRef(TW_EXTERNAL_MOUNT);
1035}
1036
1037string DataManager::GetSettingsStoragePath(void)
1038{
1039 if (GetIntValue(TW_HAS_INTERNAL) == 1)
1040 return GetStrValue(TW_INTERNAL_PATH);
1041 else
1042 return GetStrValue(TW_EXTERNAL_PATH);
1043}
1044
1045string& DataManager::CGetSettingsStoragePath()
1046{
1047 if (GetIntValue(TW_HAS_INTERNAL) == 1)
1048 return GetValueRef(TW_INTERNAL_PATH);
1049 else
1050 return GetValueRef(TW_EXTERNAL_PATH);
1051}
1052
1053string DataManager::GetSettingsStorageMount(void)
1054{
1055 if (GetIntValue(TW_HAS_INTERNAL) == 1)
1056 return GetStrValue(TW_INTERNAL_MOUNT);
1057 else
1058 return GetStrValue(TW_EXTERNAL_MOUNT);
1059}
1060
1061string& DataManager::CGetSettingsStorageMount()
1062{
1063 if (GetIntValue(TW_HAS_INTERNAL) == 1)
1064 return GetValueRef(TW_INTERNAL_MOUNT);
1065 else
1066 return GetValueRef(TW_EXTERNAL_MOUNT);
1067}
1068
1069extern "C" int DataManager_ResetDefaults()
1070{
1071 return DataManager::ResetDefaults();
1072}
1073
1074extern "C" void DataManager_LoadDefaults()
1075{
1076 return DataManager::SetDefaultValues();
1077}
1078
1079extern "C" int DataManager_LoadValues(const char* filename)
1080{
1081 return DataManager::LoadValues(filename);
1082}
1083
1084extern "C" int DataManager_Flush()
1085{
1086 return DataManager::Flush();
1087}
1088
1089extern "C" int DataManager_GetValue(const char* varName, char* value)
1090{
1091 int ret;
1092 string str;
1093
1094 ret = DataManager::GetValue(varName, str);
1095 if (ret == 0)
1096 strcpy(value, str.c_str());
1097 return ret;
1098}
1099
1100extern "C" const char* DataManager_GetStrValue(const char* varName)
1101{
1102 string& str = DataManager::GetValueRef(varName);
1103 return str.c_str();
1104}
1105
1106extern "C" const char* DataManager_GetCurrentStoragePath(void)
1107{
1108 string& str = DataManager::CGetCurrentStoragePath();
1109 return str.c_str();
1110}
1111
1112extern "C" const char* DataManager_GetSettingsStoragePath(void)
1113{
1114 string& str = DataManager::CGetSettingsStoragePath();
1115 return str.c_str();
1116}
1117
1118extern "C" const char* DataManager_GetCurrentStorageMount(void)
1119{
1120 string& str = DataManager::CGetCurrentStorageMount();
1121 return str.c_str();
1122}
1123
1124extern "C" const char* DataManager_GetSettingsStorageMount(void)
1125{
1126 string& str = DataManager::CGetSettingsStorageMount();
1127 return str.c_str();
1128}
1129
1130extern "C" int DataManager_GetIntValue(const char* varName)
1131{
1132 return DataManager::GetIntValue(varName);
1133}
1134
1135extern "C" int DataManager_SetStrValue(const char* varName, char* value)
1136{
1137 return DataManager::SetValue(varName, value, 0);
1138}
1139
1140extern "C" int DataManager_SetIntValue(const char* varName, int value)
1141{
1142 return DataManager::SetValue(varName, value, 0);
1143}
1144
1145extern "C" int DataManager_SetFloatValue(const char* varName, float value)
1146{
1147 return DataManager::SetValue(varName, value, 0);
1148}
1149
1150extern "C" int DataManager_ToggleIntValue(const char* varName)
1151{
1152 if (DataManager::GetIntValue(varName))
1153 return DataManager::SetValue(varName, 0);
1154 else
1155 return DataManager::SetValue(varName, 1);
1156}
1157
1158extern "C" void DataManager_DumpValues()
1159{
1160 return DataManager::DumpValues();
1161}
1162
1163extern "C" void DataManager_ReadSettingsFile()
1164{
1165 return DataManager::ReadSettingsFile();
1166}