blob: 1fbe0ffad9ff921e3303c380925cc276cf16bcd5 [file] [log] [blame]
Dees_Troy51a0e822012-09-05 15:24:24 -04001/*
Dees Troy3be70a82013-10-22 14:25:12 +00002 Copyright 2012 bigbiff/Dees_Troy TeamWin
3 This file is part of TWRP/TeamWin Recovery Project.
4
5 TWRP is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 TWRP is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with TWRP. If not, see <http://www.gnu.org/licenses/>.
17*/
Dees_Troy51a0e822012-09-05 15:24:24 -040018
19#include <linux/input.h>
20#include <pthread.h>
21#include <stdarg.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <fcntl.h>
26#include <sys/stat.h>
27#include <sys/time.h>
28#include <sys/mman.h>
29#include <sys/types.h>
30#include <sys/ioctl.h>
31#include <time.h>
32#include <unistd.h>
33#include <stdlib.h>
34
35#include <string>
36#include <utility>
37#include <map>
38#include <fstream>
39#include <sstream>
40
41#include "variables.h"
42#include "data.hpp"
43#include "partitions.hpp"
Dees_Troy01a9b7a2012-10-01 09:01:03 -040044#include "twrp-functions.hpp"
Ricardo Gomezc9ecd442013-07-05 16:13:52 -070045#ifndef TW_NO_SCREEN_TIMEOUT
Dees_Troy2f9117a2013-02-17 19:52:09 -060046#include "gui/blanktimer.hpp"
Ricardo Gomezc9ecd442013-07-05 16:13:52 -070047#endif
Ethan Yonker00028b42014-04-09 14:29:02 -050048#include "find_file.hpp"
Dees_Troy51a0e822012-09-05 15:24:24 -040049
Anatoly Smaznov10c11f62013-02-12 13:33:40 +070050#ifdef TW_USE_MODEL_HARDWARE_ID_FOR_DEVICE_ID
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020051 #include "cutils/properties.h"
Anatoly Smaznov10c11f62013-02-12 13:33:40 +070052#endif
53
Dees_Troy51a0e822012-09-05 15:24:24 -040054extern "C"
55{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020056 #include "twcommon.h"
57 #include "data.h"
Dees_Troy7d15c252012-09-05 20:47:21 -040058 #include "gui/pages.h"
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +000059 #include "minuitwrp/minui.h"
Dees_Troy7d15c252012-09-05 20:47:21 -040060 void gui_notifyVarChange(const char *name, const char* value);
Dees_Troy51a0e822012-09-05 15:24:24 -040061}
62
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020063#define FILE_VERSION 0x00010001
Dees_Troy51a0e822012-09-05 15:24:24 -040064
65using namespace std;
66
Ricardo Gomezc9ecd442013-07-05 16:13:52 -070067map<string, DataManager::TStrIntPair> DataManager::mValues;
68map<string, string> DataManager::mConstValues;
69string DataManager::mBackingFile;
70int DataManager::mInitialized = 0;
71#ifndef TW_NO_SCREEN_TIMEOUT
Dees_Troy2f9117a2013-02-17 19:52:09 -060072extern blanktimer blankTimer;
Ricardo Gomezc9ecd442013-07-05 16:13:52 -070073#endif
Dees_Troy51a0e822012-09-05 15:24:24 -040074
Dees_Troyfdf5fcc2012-09-11 10:27:01 -040075// Device ID functions
76void DataManager::sanitize_device_id(char* device_id) {
77 const char* whitelist ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-._";
78 char str[50];
79 char* c = str;
80
81 strcpy(str, device_id);
82 memset(device_id, 0, sizeof(device_id));
83 while (*c) {
84 if (strchr(whitelist, *c))
85 strncat(device_id, c, 1);
86 c++;
87 }
88 return;
89}
90
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020091#define CMDLINE_SERIALNO "androidboot.serialno="
92#define CMDLINE_SERIALNO_LEN (strlen(CMDLINE_SERIALNO))
93#define CPUINFO_SERIALNO "Serial"
94#define CPUINFO_SERIALNO_LEN (strlen(CPUINFO_SERIALNO))
95#define CPUINFO_HARDWARE "Hardware"
96#define CPUINFO_HARDWARE_LEN (strlen(CPUINFO_HARDWARE))
Dees_Troyfdf5fcc2012-09-11 10:27:01 -040097
98void DataManager::get_device_id(void) {
99 FILE *fp;
100 char line[2048];
101 char hardware_id[32], device_id[64];
102 char* token;
103
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200104 // Assign a blank device_id to start with
105 device_id[0] = 0;
Anatoly Smaznov10c11f62013-02-12 13:33:40 +0700106
107#ifdef TW_USE_MODEL_HARDWARE_ID_FOR_DEVICE_ID
108 // Now we'll use product_model_hardwareid as device id
109 char model_id[PROPERTY_VALUE_MAX];
110 property_get("ro.product.model", model_id, "error");
111 if (strcmp(model_id,"error") != 0) {
Dees_Troy2673cec2013-04-02 20:22:16 +0000112 LOGINFO("=> product model: '%s'\n", model_id);
Anatoly Smaznov10c11f62013-02-12 13:33:40 +0700113 // Replace spaces with underscores
114 for(int i = 0; i < strlen(model_id); i++) {
115 if(model_id[i] == ' ')
116 model_id[i] = '_';
117 }
118 strcpy(device_id, model_id);
119 if (hardware_id[0] != 0) {
120 strcat(device_id, "_");
121 strcat(device_id, hardware_id);
122 }
123 sanitize_device_id((char *)device_id);
124 mConstValues.insert(make_pair("device_id", device_id));
Dees_Troy2673cec2013-04-02 20:22:16 +0000125 LOGINFO("=> using device id: '%s'\n", device_id);
Anatoly Smaznov10c11f62013-02-12 13:33:40 +0700126 return;
127 }
128#endif
129
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400130#ifndef TW_FORCE_CPUINFO_FOR_DEVICE_ID
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200131 // First, try the cmdline to see if the serial number was supplied
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400132 fp = fopen("/proc/cmdline", "rt");
133 if (fp != NULL)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200134 {
135 // First step, read the line. For cmdline, it's one long line
136 fgets(line, sizeof(line), fp);
137 fclose(fp);
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400138
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200139 // Now, let's tokenize the string
140 token = strtok(line, " ");
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400141
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200142 // Let's walk through the line, looking for the CMDLINE_SERIALNO token
143 while (token)
144 {
145 // We don't need to verify the length of token, because if it's too short, it will mismatch CMDLINE_SERIALNO at the NULL
146 if (memcmp(token, CMDLINE_SERIALNO, CMDLINE_SERIALNO_LEN) == 0)
147 {
148 // We found the serial number!
149 strcpy(device_id, token + CMDLINE_SERIALNO_LEN);
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400150 sanitize_device_id((char *)device_id);
151 mConstValues.insert(make_pair("device_id", device_id));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200152 return;
153 }
154 token = strtok(NULL, " ");
155 }
156 }
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400157#endif
158 // Now we'll try cpuinfo for a serial number
159 fp = fopen("/proc/cpuinfo", "rt");
160 if (fp != NULL)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200161 {
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400162 while (fgets(line, sizeof(line), fp) != NULL) { // First step, read the line.
163 if (memcmp(line, CPUINFO_SERIALNO, CPUINFO_SERIALNO_LEN) == 0) // check the beginning of the line for "Serial"
164 {
165 // We found the serial number!
166 token = line + CPUINFO_SERIALNO_LEN; // skip past "Serial"
167 while ((*token > 0 && *token <= 32 ) || *token == ':') token++; // skip over all spaces and the colon
168 if (*token != 0) {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200169 token[30] = 0;
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400170 if (token[strlen(token)-1] == 10) { // checking for endline chars and dropping them from the end of the string if needed
171 memset(device_id, 0, sizeof(device_id));
172 strncpy(device_id, token, strlen(token) - 1);
173 } else {
174 strcpy(device_id, token);
175 }
Dees_Troy2673cec2013-04-02 20:22:16 +0000176 LOGINFO("=> serial from cpuinfo: '%s'\n", device_id);
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400177 fclose(fp);
178 sanitize_device_id((char *)device_id);
179 mConstValues.insert(make_pair("device_id", device_id));
180 return;
181 }
182 } 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
183 // We found the hardware ID
184 token = line + CPUINFO_HARDWARE_LEN; // skip past "Hardware"
185 while ((*token > 0 && *token <= 32 ) || *token == ':') token++; // skip over all spaces and the colon
186 if (*token != 0) {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200187 token[30] = 0;
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400188 if (token[strlen(token)-1] == 10) { // checking for endline chars and dropping them from the end of the string if needed
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200189 memset(hardware_id, 0, sizeof(hardware_id));
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400190 strncpy(hardware_id, token, strlen(token) - 1);
191 } else {
192 strcpy(hardware_id, token);
193 }
Dees_Troy2673cec2013-04-02 20:22:16 +0000194 LOGINFO("=> hardware id from cpuinfo: '%s'\n", hardware_id);
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400195 }
196 }
197 }
198 fclose(fp);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200199 }
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400200
201 if (hardware_id[0] != 0) {
Dees_Troy2673cec2013-04-02 20:22:16 +0000202 LOGINFO("\nusing hardware id for device id: '%s'\n", hardware_id);
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400203 strcpy(device_id, hardware_id);
204 sanitize_device_id((char *)device_id);
205 mConstValues.insert(make_pair("device_id", device_id));
206 return;
207 }
208
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200209 strcpy(device_id, "serialno");
Dees_Troy2673cec2013-04-02 20:22:16 +0000210 LOGERR("=> device id not found, using '%s'.", device_id);
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400211 mConstValues.insert(make_pair("device_id", device_id));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200212 return;
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400213}
214
Dees_Troy51a0e822012-09-05 15:24:24 -0400215int DataManager::ResetDefaults()
216{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200217 mValues.clear();
218 mConstValues.clear();
219 SetDefaultValues();
220 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400221}
222
223int DataManager::LoadValues(const string filename)
224{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200225 string str, dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400226
227 if (!mInitialized)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200228 SetDefaultValues();
Dees_Troy51a0e822012-09-05 15:24:24 -0400229
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200230 GetValue("device_id", dev_id);
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400231 // Save off the backing file for set operations
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200232 mBackingFile = filename;
Dees_Troy51a0e822012-09-05 15:24:24 -0400233
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200234 // Read in the file, if possible
235 FILE* in = fopen(filename.c_str(), "rb");
236 if (!in) {
Dees_Troy2673cec2013-04-02 20:22:16 +0000237 LOGINFO("Settings file '%s' not found.\n", filename.c_str());
Dees_Troya13d74f2013-03-24 08:54:55 -0500238 return 0;
239 } else {
Dees_Troy2673cec2013-04-02 20:22:16 +0000240 LOGINFO("Loading settings from '%s'.\n", filename.c_str());
Dees_Troya13d74f2013-03-24 08:54:55 -0500241 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400242
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200243 int file_version;
244 if (fread(&file_version, 1, sizeof(int), in) != sizeof(int)) goto error;
245 if (file_version != FILE_VERSION) goto error;
Dees_Troy51a0e822012-09-05 15:24:24 -0400246
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200247 while (!feof(in))
248 {
249 string Name;
250 string Value;
251 unsigned short length;
252 char array[512];
Dees_Troy51a0e822012-09-05 15:24:24 -0400253
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200254 if (fread(&length, 1, sizeof(unsigned short), in) != sizeof(unsigned short)) goto error;
255 if (length >= 512) goto error;
256 if (fread(array, 1, length, in) != length) goto error;
257 Name = array;
Dees_Troy51a0e822012-09-05 15:24:24 -0400258
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200259 if (fread(&length, 1, sizeof(unsigned short), in) != sizeof(unsigned short)) goto error;
260 if (length >= 512) goto error;
261 if (fread(array, 1, length, in) != length) goto error;
262 Value = array;
Dees_Troy51a0e822012-09-05 15:24:24 -0400263
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200264 map<string, TStrIntPair>::iterator pos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400265
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200266 pos = mValues.find(Name);
267 if (pos != mValues.end())
268 {
269 pos->second.first = Value;
270 pos->second.second = 1;
271 }
272 else
273 mValues.insert(TNameValuePair(Name, TStrIntPair(Value, 1)));
Ricardo Gomezc9ecd442013-07-05 16:13:52 -0700274#ifndef TW_NO_SCREEN_TIMEOUT
Dees_Troya13d74f2013-03-24 08:54:55 -0500275 if (Name == "tw_screen_timeout_secs")
276 blankTimer.setTime(atoi(Value.c_str()));
Ricardo Gomezc9ecd442013-07-05 16:13:52 -0700277#endif
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200278 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400279error:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200280 fclose(in);
Dees_Troya13d74f2013-03-24 08:54:55 -0500281 string current = GetCurrentStoragePath();
282 string settings = GetSettingsStoragePath();
283 if (current != settings && !PartitionManager.Mount_By_Path(current, false)) {
284 SetValue("tw_storage_path", settings);
285 } else {
286 SetBackupFolder();
287 }
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200288 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400289}
290
291int DataManager::Flush()
292{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200293 return SaveValues();
Dees_Troy51a0e822012-09-05 15:24:24 -0400294}
295
296int DataManager::SaveValues()
297{
Ethan Yonker83e82572014-04-04 10:59:28 -0500298#ifndef TW_OEM_BUILD
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200299 if (mBackingFile.empty())
300 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400301
302 string mount_path = GetSettingsStoragePath();
Dees_Troy5bf43922012-09-07 16:07:55 -0400303 PartitionManager.Mount_By_Path(mount_path.c_str(), 1);
Dees_Troy51a0e822012-09-05 15:24:24 -0400304
305 FILE* out = fopen(mBackingFile.c_str(), "wb");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200306 if (!out)
307 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400308
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200309 int file_version = FILE_VERSION;
310 fwrite(&file_version, 1, sizeof(int), out);
Dees_Troy51a0e822012-09-05 15:24:24 -0400311
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200312 map<string, TStrIntPair>::iterator iter;
313 for (iter = mValues.begin(); iter != mValues.end(); ++iter)
314 {
315 // Save only the persisted data
316 if (iter->second.second != 0)
317 {
318 unsigned short length = (unsigned short) iter->first.length() + 1;
319 fwrite(&length, 1, sizeof(unsigned short), out);
320 fwrite(iter->first.c_str(), 1, length, out);
321 length = (unsigned short) iter->second.first.length() + 1;
322 fwrite(&length, 1, sizeof(unsigned short), out);
323 fwrite(iter->second.first.c_str(), 1, length, out);
324 }
325 }
326 fclose(out);
Ethan Yonker83e82572014-04-04 10:59:28 -0500327#endif // ifdef TW_OEM_BUILD
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200328 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400329}
330
331int DataManager::GetValue(const string varName, string& value)
332{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200333 string localStr = varName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400334
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200335 if (!mInitialized)
336 SetDefaultValues();
Dees_Troy51a0e822012-09-05 15:24:24 -0400337
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200338 // Strip off leading and trailing '%' if provided
339 if (localStr.length() > 2 && localStr[0] == '%' && localStr[localStr.length()-1] == '%')
340 {
341 localStr.erase(0, 1);
342 localStr.erase(localStr.length() - 1, 1);
343 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400344
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200345 // Handle magic values
346 if (GetMagicValue(localStr, value) == 0)
347 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400348
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200349 map<string, string>::iterator constPos;
350 constPos = mConstValues.find(localStr);
351 if (constPos != mConstValues.end())
352 {
353 value = constPos->second;
354 return 0;
355 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400356
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200357 map<string, TStrIntPair>::iterator pos;
358 pos = mValues.find(localStr);
359 if (pos == mValues.end())
360 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400361
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200362 value = pos->second.first;
363 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400364}
365
366int DataManager::GetValue(const string varName, int& value)
367{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200368 string data;
Dees_Troy51a0e822012-09-05 15:24:24 -0400369
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200370 if (GetValue(varName,data) != 0)
371 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400372
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200373 value = atoi(data.c_str());
374 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400375}
376
Dees_Troy2673cec2013-04-02 20:22:16 +0000377int DataManager::GetValue(const string varName, float& value)
378{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200379 string data;
Dees_Troy2673cec2013-04-02 20:22:16 +0000380
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200381 if (GetValue(varName,data) != 0)
382 return -1;
Dees_Troy2673cec2013-04-02 20:22:16 +0000383
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200384 value = atof(data.c_str());
385 return 0;
Dees_Troy2673cec2013-04-02 20:22:16 +0000386}
387
bigbiff bigbiff2c57d782013-02-19 10:09:21 -0500388unsigned long long DataManager::GetValue(const string varName, unsigned long long& value)
389{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200390 string data;
bigbiff bigbiff2c57d782013-02-19 10:09:21 -0500391
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 if (GetValue(varName,data) != 0)
393 return -1;
bigbiff bigbiff2c57d782013-02-19 10:09:21 -0500394
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200395 value = strtoull(data.c_str(), NULL, 10);
396 return 0;
bigbiff bigbiff2c57d782013-02-19 10:09:21 -0500397}
398
Dees_Troy51a0e822012-09-05 15:24:24 -0400399// This is a dangerous function. It will create the value if it doesn't exist so it has a valid c_str
400string& DataManager::GetValueRef(const string varName)
401{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200402 if (!mInitialized)
403 SetDefaultValues();
Dees_Troy51a0e822012-09-05 15:24:24 -0400404
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200405 map<string, string>::iterator constPos;
406 constPos = mConstValues.find(varName);
407 if (constPos != mConstValues.end())
408 return constPos->second;
Dees_Troy51a0e822012-09-05 15:24:24 -0400409
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200410 map<string, TStrIntPair>::iterator pos;
411 pos = mValues.find(varName);
412 if (pos == mValues.end())
413 pos = (mValues.insert(TNameValuePair(varName, TStrIntPair("", 0)))).first;
Dees_Troy51a0e822012-09-05 15:24:24 -0400414
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200415 return pos->second.first;
Dees_Troy51a0e822012-09-05 15:24:24 -0400416}
417
418// This function will return an empty string if the value doesn't exist
419string DataManager::GetStrValue(const string varName)
420{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200421 string retVal;
Dees_Troy51a0e822012-09-05 15:24:24 -0400422
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200423 GetValue(varName, retVal);
424 return retVal;
Dees_Troy51a0e822012-09-05 15:24:24 -0400425}
426
427// This function will return 0 if the value doesn't exist
428int DataManager::GetIntValue(const string varName)
429{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200430 string retVal;
Dees_Troy51a0e822012-09-05 15:24:24 -0400431
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200432 GetValue(varName, retVal);
433 return atoi(retVal.c_str());
Dees_Troy51a0e822012-09-05 15:24:24 -0400434}
435
436int DataManager::SetValue(const string varName, string value, int persist /* = 0 */)
437{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200438 if (!mInitialized)
439 SetDefaultValues();
Dees_Troy51a0e822012-09-05 15:24:24 -0400440
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200441 // Don't allow empty values or numerical starting values
442 if (varName.empty() || (varName[0] >= '0' && varName[0] <= '9'))
443 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400444
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200445 map<string, string>::iterator constChk;
446 constChk = mConstValues.find(varName);
447 if (constChk != mConstValues.end())
448 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400449
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200450 map<string, TStrIntPair>::iterator pos;
451 pos = mValues.find(varName);
452 if (pos == mValues.end())
453 pos = (mValues.insert(TNameValuePair(varName, TStrIntPair(value, persist)))).first;
454 else
455 pos->second.first = value;
Dees_Troy51a0e822012-09-05 15:24:24 -0400456
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200457 if (pos->second.second != 0)
458 SaveValues();
Ricardo Gomezc9ecd442013-07-05 16:13:52 -0700459
460#ifndef TW_NO_SCREEN_TIMEOUT
bigbiff bigbifff8e2f372013-02-27 20:50:43 -0500461 if (varName == "tw_screen_timeout_secs") {
Dees_Troy2f9117a2013-02-17 19:52:09 -0600462 blankTimer.setTime(atoi(value.c_str()));
Ricardo Gomezc9ecd442013-07-05 16:13:52 -0700463 } else
464#endif
465 if (varName == "tw_storage_path") {
Dees_Troya13d74f2013-03-24 08:54:55 -0500466 SetBackupFolder();
bigbiff bigbifff8e2f372013-02-27 20:50:43 -0500467 }
Dees_Troya13d74f2013-03-24 08:54:55 -0500468 gui_notifyVarChange(varName.c_str(), value.c_str());
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200469 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400470}
471
472int DataManager::SetValue(const string varName, int value, int persist /* = 0 */)
473{
474 ostringstream valStr;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200475 valStr << value;
Dees_Troy51a0e822012-09-05 15:24:24 -0400476 if (varName == "tw_use_external_storage") {
477 string str;
478
479 if (GetIntValue(TW_HAS_DUAL_STORAGE) == 1) {
480 if (value == 0) {
481 str = GetStrValue(TW_INTERNAL_PATH);
Dees_Troy51a0e822012-09-05 15:24:24 -0400482 } else {
483 str = GetStrValue(TW_EXTERNAL_PATH);
Dees_Troy51a0e822012-09-05 15:24:24 -0400484 }
485 } else if (GetIntValue(TW_HAS_INTERNAL) == 1)
486 str = GetStrValue(TW_INTERNAL_PATH);
487 else
488 str = GetStrValue(TW_EXTERNAL_PATH);
489
Dees_Troya13d74f2013-03-24 08:54:55 -0500490 SetValue("tw_storage_path", str);
Dees_Troy51a0e822012-09-05 15:24:24 -0400491 }
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200492 return SetValue(varName, valStr.str(), persist);
Dees_Troy51a0e822012-09-05 15:24:24 -0400493}
494
495int DataManager::SetValue(const string varName, float value, int persist /* = 0 */)
496{
497 ostringstream valStr;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200498 valStr << value;
499 return SetValue(varName, valStr.str(), persist);;
Dees_Troy51a0e822012-09-05 15:24:24 -0400500}
501
bigbiff bigbiff2c57d782013-02-19 10:09:21 -0500502int DataManager::SetValue(const string varName, unsigned long long value, int persist /* = 0 */)
503{
504 ostringstream valStr;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200505 valStr << value;
506 return SetValue(varName, valStr.str(), persist);
bigbiff bigbiff2c57d782013-02-19 10:09:21 -0500507}
508
Dees_Troy2673cec2013-04-02 20:22:16 +0000509int DataManager::SetProgress(float Fraction) {
510 return SetValue("ui_progress", (float) (Fraction * 100.0));
511}
512
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200513int DataManager::ShowProgress(float Portion, float Seconds)
514{
Dees_Troy2673cec2013-04-02 20:22:16 +0000515 float Starting_Portion;
516 GetValue("ui_progress_portion", Starting_Portion);
517 if (SetValue("ui_progress_portion", (float)(Portion * 100.0) + Starting_Portion) != 0)
518 return -1;
519 if (SetValue("ui_progress_frames", Seconds * 30) != 0)
520 return -1;
521 return 0;
522}
523
Dees_Troy51a0e822012-09-05 15:24:24 -0400524void DataManager::DumpValues()
525{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200526 map<string, TStrIntPair>::iterator iter;
527 gui_print("Data Manager dump - Values with leading X are persisted.\n");
528 for (iter = mValues.begin(); iter != mValues.end(); ++iter)
529 gui_print("%c %s=%s\n", iter->second.second ? 'X' : ' ', iter->first.c_str(), iter->second.first.c_str());
Dees_Troy51a0e822012-09-05 15:24:24 -0400530}
531
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200532void DataManager::update_tz_environment_variables(void)
533{
Dees_Troy8170a922012-09-18 15:40:25 -0400534 setenv("TZ", DataManager_GetStrValue(TW_TIME_ZONE_VAR), 1);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200535 tzset();
Dees_Troy8170a922012-09-18 15:40:25 -0400536}
537
Dees_Troy16b74352012-11-14 22:27:31 +0000538void DataManager::SetBackupFolder()
539{
540 string str = GetCurrentStoragePath();
Dees_Troya13d74f2013-03-24 08:54:55 -0500541 TWPartition* partition = PartitionManager.Find_Partition_By_Path(str);
Dees_Troy16b74352012-11-14 22:27:31 +0000542 str += "/TWRP/BACKUPS/";
543
544 string dev_id;
545 GetValue("device_id", dev_id);
546
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200547 str += dev_id;
Dees_Troy2673cec2013-04-02 20:22:16 +0000548 LOGINFO("Backup folder set to '%s'\n", str.c_str());
Dees_Troy16b74352012-11-14 22:27:31 +0000549 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
Dees_Troya13d74f2013-03-24 08:54:55 -0500550 if (partition != NULL) {
551 SetValue("tw_storage_display_name", partition->Storage_Name);
552 char free_space[255];
553 sprintf(free_space, "%llu", partition->Free / 1024 / 1024);
554 SetValue("tw_storage_free_size", free_space);
555 string zip_path, zip_root, storage_path;
556 GetValue(TW_ZIP_LOCATION_VAR, zip_path);
557 if (partition->Has_Data_Media)
558 storage_path = partition->Symlink_Mount_Point;
559 else
560 storage_path = partition->Storage_Path;
561 if (zip_path.size() < storage_path.size()) {
562 SetValue(TW_ZIP_LOCATION_VAR, storage_path);
563 } else {
Dees Troyc2e9bc72013-09-10 00:16:24 +0000564 zip_root = TWFunc::Get_Root_Path(zip_path);
Dees_Troy18727952013-06-20 15:24:48 -0500565 if (zip_root != storage_path) {
566 LOGINFO("DataManager::SetBackupFolder zip path was %s changing to %s, %s\n", zip_path.c_str(), storage_path.c_str(), zip_root.c_str());
Dees_Troya13d74f2013-03-24 08:54:55 -0500567 SetValue(TW_ZIP_LOCATION_VAR, storage_path);
Dees_Troy18727952013-06-20 15:24:48 -0500568 }
Dees_Troya13d74f2013-03-24 08:54:55 -0500569 }
570 } else {
571 if (PartitionManager.Fstab_Processed() != 0)
Dees_Troy2673cec2013-04-02 20:22:16 +0000572 LOGERR("Storage partition '%s' not found\n", str.c_str());
Dees_Troya13d74f2013-03-24 08:54:55 -0500573 }
Dees_Troy16b74352012-11-14 22:27:31 +0000574}
575
Dees_Troy51a0e822012-09-05 15:24:24 -0400576void DataManager::SetDefaultValues()
577{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200578 string str, path;
Dees_Troy51a0e822012-09-05 15:24:24 -0400579
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200580 get_device_id();
Dees_Troy51a0e822012-09-05 15:24:24 -0400581
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200582 mInitialized = 1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400583
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200584 mConstValues.insert(make_pair("true", "1"));
585 mConstValues.insert(make_pair("false", "0"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400586
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200587 mConstValues.insert(make_pair(TW_VERSION_VAR, TW_VERSION_STR));
Dees_Troya13d74f2013-03-24 08:54:55 -0500588 mValues.insert(make_pair("tw_storage_path", make_pair("/", 1)));
Ethan Yonker03db3262014-02-05 08:02:06 -0600589 mValues.insert(make_pair("tw_button_vibrate", make_pair("80", 1)));
590 mValues.insert(make_pair("tw_keyboard_vibrate", make_pair("40", 1)));
591 mValues.insert(make_pair("tw_action_vibrate", make_pair("160", 1)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400592
Dees_Troyf4499812013-01-23 19:07:38 +0000593#ifdef TW_FORCE_CPUINFO_FOR_DEVICE_ID
594 printf("TW_FORCE_CPUINFO_FOR_DEVICE_ID := true\n");
595#endif
596
Dees_Troy51a0e822012-09-05 15:24:24 -0400597#ifdef BOARD_HAS_NO_REAL_SDCARD
Dees_Troyf4499812013-01-23 19:07:38 +0000598 printf("BOARD_HAS_NO_REAL_SDCARD := true\n");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200599 mConstValues.insert(make_pair(TW_ALLOW_PARTITION_SDCARD, "0"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400600#else
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200601 mConstValues.insert(make_pair(TW_ALLOW_PARTITION_SDCARD, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400602#endif
603
604#ifdef TW_INCLUDE_DUMLOCK
Dees_Troyf4499812013-01-23 19:07:38 +0000605 printf("TW_INCLUDE_DUMLOCK := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400606 mConstValues.insert(make_pair(TW_SHOW_DUMLOCK, "1"));
607#else
608 mConstValues.insert(make_pair(TW_SHOW_DUMLOCK, "0"));
609#endif
610
611#ifdef TW_INTERNAL_STORAGE_PATH
Dees_Troy2673cec2013-04-02 20:22:16 +0000612 LOGINFO("Internal path defined: '%s'\n", EXPAND(TW_INTERNAL_STORAGE_PATH));
Dees_Troy51a0e822012-09-05 15:24:24 -0400613 mValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, make_pair("0", 1)));
614 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "1"));
Dees_Troy16b74352012-11-14 22:27:31 +0000615 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair(EXPAND(TW_INTERNAL_STORAGE_PATH), 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400616 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT)));
617 path.clear();
618 path = "/";
619 path += EXPAND(TW_INTERNAL_STORAGE_MOUNT_POINT);
620 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, path));
621 #ifdef TW_EXTERNAL_STORAGE_PATH
Dees_Troy2673cec2013-04-02 20:22:16 +0000622 LOGINFO("External path defined: '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
Dees_Troy51a0e822012-09-05 15:24:24 -0400623 // Device has dual storage
624 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "1"));
625 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
626 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, EXPAND(TW_EXTERNAL_STORAGE_PATH)));
627 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT)));
628 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1)));
629 path.clear();
630 path = "/";
631 path += EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT);
632 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, path));
633 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
634 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/emmc", 1)));
635 } else {
636 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
637 }
638 #else
Dees_Troy2673cec2013-04-02 20:22:16 +0000639 LOGINFO("Just has internal storage.\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400640 // Just has internal storage
641 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
642 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
643 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "0"));
644 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, "0"));
645 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, "0"));
646 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, "0"));
647 #endif
648#else
649 #ifdef RECOVERY_SDCARD_ON_DATA
650 #ifdef TW_EXTERNAL_STORAGE_PATH
Dees_Troy2673cec2013-04-02 20:22:16 +0000651 LOGINFO("Has /data/media + external storage in '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
Dees_Troy51a0e822012-09-05 15:24:24 -0400652 // Device has /data/media + external storage
653 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "1"));
654 #else
Dees_Troy2673cec2013-04-02 20:22:16 +0000655 LOGINFO("Single storage only -- data/media.\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400656 // Device just has external storage
657 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
658 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "0"));
659 #endif
660 #else
Dees_Troy2673cec2013-04-02 20:22:16 +0000661 LOGINFO("Single storage only.\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400662 // Device just has external storage
663 mConstValues.insert(make_pair(TW_HAS_DUAL_STORAGE, "0"));
664 #endif
665 #ifdef RECOVERY_SDCARD_ON_DATA
Dees_Troy2673cec2013-04-02 20:22:16 +0000666 LOGINFO("Device has /data/media defined.\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400667 // Device has /data/media
668 mConstValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, "0"));
669 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "1"));
Dees_Troy16b74352012-11-14 22:27:31 +0000670 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair("/data/media", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400671 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, "/data"));
672 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, "data"));
673 #ifdef TW_EXTERNAL_STORAGE_PATH
674 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
675 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/emmc", 1)));
676 } else {
677 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
678 }
679 #else
680 mValues.insert(make_pair(TW_ZIP_INTERNAL_VAR, make_pair("/sdcard", 1)));
681 #endif
682 #else
Dees_Troy2673cec2013-04-02 20:22:16 +0000683 LOGINFO("No internal storage defined.\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400684 // Device has no internal storage
685 mConstValues.insert(make_pair(TW_USE_EXTERNAL_STORAGE, "1"));
686 mConstValues.insert(make_pair(TW_HAS_INTERNAL, "0"));
Dees_Troy16b74352012-11-14 22:27:31 +0000687 mValues.insert(make_pair(TW_INTERNAL_PATH, make_pair("0", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400688 mConstValues.insert(make_pair(TW_INTERNAL_MOUNT, "0"));
689 mConstValues.insert(make_pair(TW_INTERNAL_LABEL, "0"));
690 #endif
691 #ifdef TW_EXTERNAL_STORAGE_PATH
Dees_Troy2673cec2013-04-02 20:22:16 +0000692 LOGINFO("Only external path defined: '%s'\n", EXPAND(TW_EXTERNAL_STORAGE_PATH));
Dees_Troy51a0e822012-09-05 15:24:24 -0400693 // External has custom definition
694 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
695 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, EXPAND(TW_EXTERNAL_STORAGE_PATH)));
696 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT)));
697 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1)));
698 path.clear();
699 path = "/";
700 path += EXPAND(TW_EXTERNAL_STORAGE_MOUNT_POINT);
701 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, path));
702 #else
703 #ifndef RECOVERY_SDCARD_ON_DATA
Dees_Troy2673cec2013-04-02 20:22:16 +0000704 LOGINFO("No storage defined, defaulting to /sdcard.\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400705 // Standard external definition
706 mConstValues.insert(make_pair(TW_HAS_EXTERNAL, "1"));
707 mConstValues.insert(make_pair(TW_EXTERNAL_PATH, "/sdcard"));
708 mConstValues.insert(make_pair(TW_EXTERNAL_MOUNT, "/sdcard"));
709 mConstValues.insert(make_pair(TW_EXTERNAL_LABEL, "sdcard"));
710 mValues.insert(make_pair(TW_ZIP_EXTERNAL_VAR, make_pair("/sdcard", 1)));
711 #endif
712 #endif
713#endif
714
715#ifdef TW_DEFAULT_EXTERNAL_STORAGE
716 SetValue(TW_USE_EXTERNAL_STORAGE, 1);
Dees_Troyf4499812013-01-23 19:07:38 +0000717 printf("TW_DEFAULT_EXTERNAL_STORAGE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400718#endif
719
Dees_Troy16b74352012-11-14 22:27:31 +0000720#ifdef RECOVERY_SDCARD_ON_DATA
721 if (PartitionManager.Mount_By_Path("/data", false) && TWFunc::Path_Exists("/data/media/0"))
722 SetValue(TW_INTERNAL_PATH, "/data/media/0");
723#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400724 str = GetCurrentStoragePath();
725#ifdef RECOVERY_SDCARD_ON_DATA
726 #ifndef TW_EXTERNAL_STORAGE_PATH
727 SetValue(TW_ZIP_LOCATION_VAR, "/sdcard", 1);
728 #else
729 if (strcmp(EXPAND(TW_EXTERNAL_STORAGE_PATH), "/sdcard") == 0) {
730 SetValue(TW_ZIP_LOCATION_VAR, "/emmc", 1);
731 } else {
732 SetValue(TW_ZIP_LOCATION_VAR, "/sdcard", 1);
733 }
734 #endif
735#else
736 SetValue(TW_ZIP_LOCATION_VAR, str.c_str(), 1);
737#endif
738 str += "/TWRP/BACKUPS/";
Dees_Troyfdf5fcc2012-09-11 10:27:01 -0400739
740 string dev_id;
741 GetValue("device_id", dev_id);
742
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200743 str += dev_id;
Dees_Troy51a0e822012-09-05 15:24:24 -0400744 SetValue(TW_BACKUPS_FOLDER_VAR, str, 0);
745
Dees_Troy8170a922012-09-18 15:40:25 -0400746#ifdef SP1_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000747 printf("SP1_DISPLAY_NAME := %s\n", EXPAND(SP1_DISPLAY_NAME));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200748 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 -0400749#else
750 #ifdef SP1_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000751 printf("SP1_NAME := %s\n", EXPAND(SP1_NAME));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200752 if (strlen(EXPAND(SP1_NAME))) mConstValues.insert(make_pair(TW_SP1_PARTITION_NAME_VAR, EXPAND(SP1_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400753 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400754#endif
755#ifdef SP2_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000756 printf("SP2_DISPLAY_NAME := %s\n", EXPAND(SP2_DISPLAY_NAME));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200757 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 -0400758#else
759 #ifdef SP2_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000760 printf("SP2_NAME := %s\n", EXPAND(SP2_NAME));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200761 if (strlen(EXPAND(SP2_NAME))) mConstValues.insert(make_pair(TW_SP2_PARTITION_NAME_VAR, EXPAND(SP2_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400762 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400763#endif
764#ifdef SP3_DISPLAY_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000765 printf("SP3_DISPLAY_NAME := %s\n", EXPAND(SP3_DISPLAY_NAME));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200766 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 -0400767#else
768 #ifdef SP3_NAME
Dees_Troyf4499812013-01-23 19:07:38 +0000769 printf("SP3_NAME := %s\n", EXPAND(SP3_NAME));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200770 if (strlen(EXPAND(SP3_NAME))) mConstValues.insert(make_pair(TW_SP3_PARTITION_NAME_VAR, EXPAND(SP3_NAME)));
Dees_Troyb46a6842012-09-25 11:06:46 -0400771 #endif
Dees_Troy8170a922012-09-18 15:40:25 -0400772#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400773
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200774 mConstValues.insert(make_pair(TW_REBOOT_SYSTEM, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400775#ifdef TW_NO_REBOOT_RECOVERY
Talustus33ebf932013-02-02 14:11:14 +0100776 printf("TW_NO_REBOOT_RECOVERY := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400777 mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "0"));
778#else
Dees_Troya58bead2012-09-27 09:49:29 -0400779 mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400780#endif
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200781 mConstValues.insert(make_pair(TW_REBOOT_POWEROFF, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400782#ifdef TW_NO_REBOOT_BOOTLOADER
Talustus33ebf932013-02-02 14:11:14 +0100783 printf("TW_NO_REBOOT_BOOTLOADER := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400784 mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "0"));
785#else
Dees_Troya58bead2012-09-27 09:49:29 -0400786 mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "1"));
Dees_Troy51a0e822012-09-05 15:24:24 -0400787#endif
788#ifdef RECOVERY_SDCARD_ON_DATA
Dees_Troyf4499812013-01-23 19:07:38 +0000789 printf("RECOVERY_SDCARD_ON_DATA := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400790 mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "1"));
791#else
792 mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "0"));
793#endif
794#ifdef TW_NO_BATT_PERCENT
Dees_Troyf4499812013-01-23 19:07:38 +0000795 printf("TW_NO_BATT_PERCENT := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400796 mConstValues.insert(make_pair(TW_NO_BATTERY_PERCENT, "1"));
797#else
798 mConstValues.insert(make_pair(TW_NO_BATTERY_PERCENT, "0"));
799#endif
800#ifdef TW_CUSTOM_POWER_BUTTON
Dees_Troyf4499812013-01-23 19:07:38 +0000801 printf("TW_POWER_BUTTON := %s\n", EXPAND(TW_CUSTOM_POWER_BUTTON));
Dees_Troy51a0e822012-09-05 15:24:24 -0400802 mConstValues.insert(make_pair(TW_POWER_BUTTON, EXPAND(TW_CUSTOM_POWER_BUTTON)));
803#else
804 mConstValues.insert(make_pair(TW_POWER_BUTTON, "0"));
805#endif
806#ifdef TW_ALWAYS_RMRF
Dees_Troyf4499812013-01-23 19:07:38 +0000807 printf("TW_ALWAYS_RMRF := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400808 mConstValues.insert(make_pair(TW_RM_RF_VAR, "1"));
809#endif
810#ifdef TW_NEVER_UNMOUNT_SYSTEM
Dees_Troyf4499812013-01-23 19:07:38 +0000811 printf("TW_NEVER_UNMOUNT_SYSTEM := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400812 mConstValues.insert(make_pair(TW_DONT_UNMOUNT_SYSTEM, "1"));
813#else
814 mConstValues.insert(make_pair(TW_DONT_UNMOUNT_SYSTEM, "0"));
815#endif
816#ifdef TW_NO_USB_STORAGE
Dees_Troy6a042c82013-01-23 18:50:52 +0000817 printf("TW_NO_USB_STORAGE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400818 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "0"));
819#else
Dees_Troy6a042c82013-01-23 18:50:52 +0000820 char lun_file[255];
821 string Lun_File_str = CUSTOM_LUN_FILE;
822 size_t found = Lun_File_str.find("%");
823 if (found != string::npos) {
824 sprintf(lun_file, CUSTOM_LUN_FILE, 0);
825 Lun_File_str = lun_file;
826 }
827 if (!TWFunc::Path_Exists(Lun_File_str)) {
Dees_Troy2673cec2013-04-02 20:22:16 +0000828 LOGINFO("Lun file '%s' does not exist, USB storage mode disabled\n", Lun_File_str.c_str());
Dees_Troy6a042c82013-01-23 18:50:52 +0000829 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "0"));
830 } else {
Dees_Troy2673cec2013-04-02 20:22:16 +0000831 LOGINFO("Lun file '%s'\n", Lun_File_str.c_str());
Dees_Troy6a042c82013-01-23 18:50:52 +0000832 mConstValues.insert(make_pair(TW_HAS_USB_STORAGE, "1"));
833 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400834#endif
835#ifdef TW_INCLUDE_INJECTTWRP
Dees_Troyf4499812013-01-23 19:07:38 +0000836 printf("TW_INCLUDE_INJECTTWRP := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400837 mConstValues.insert(make_pair(TW_HAS_INJECTTWRP, "1"));
838 mValues.insert(make_pair(TW_INJECT_AFTER_ZIP, make_pair("1", 1)));
839#else
840 mConstValues.insert(make_pair(TW_HAS_INJECTTWRP, "0"));
841 mValues.insert(make_pair(TW_INJECT_AFTER_ZIP, make_pair("0", 1)));
842#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400843#ifdef TW_HAS_DOWNLOAD_MODE
Dees_Troyf4499812013-01-23 19:07:38 +0000844 printf("TW_HAS_DOWNLOAD_MODE := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400845 mConstValues.insert(make_pair(TW_DOWNLOAD_MODE, "1"));
846#endif
847#ifdef TW_INCLUDE_CRYPTO
848 mConstValues.insert(make_pair(TW_HAS_CRYPTO, "1"));
Dees_Troyf4499812013-01-23 19:07:38 +0000849 printf("TW_INCLUDE_CRYPTO := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400850#endif
851#ifdef TW_SDEXT_NO_EXT4
Dees_Troyf4499812013-01-23 19:07:38 +0000852 printf("TW_SDEXT_NO_EXT4 := true\n");
Dees_Troy51a0e822012-09-05 15:24:24 -0400853 mConstValues.insert(make_pair(TW_SDEXT_DISABLE_EXT4, "1"));
854#else
855 mConstValues.insert(make_pair(TW_SDEXT_DISABLE_EXT4, "0"));
856#endif
857
Dees_Troya13d74f2013-03-24 08:54:55 -0500858#ifdef TW_HAS_NO_BOOT_PARTITION
Dees_Troyf100c942013-06-21 08:15:31 -0500859 mValues.insert(make_pair("tw_backup_list", make_pair("/system;/data;", 1)));
Dees_Troya13d74f2013-03-24 08:54:55 -0500860#else
Dees_Troyf100c942013-06-21 08:15:31 -0500861 mValues.insert(make_pair("tw_backup_list", make_pair("/system;/data;/boot;", 1)));
Dees_Troya13d74f2013-03-24 08:54:55 -0500862#endif
863 mConstValues.insert(make_pair(TW_MIN_SYSTEM_VAR, TW_MIN_SYSTEM_SIZE));
Dees Troyb21cc642013-09-10 17:36:41 +0000864 mValues.insert(make_pair(TW_BACKUP_NAME, make_pair("(Auto Generate)", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400865 mValues.insert(make_pair(TW_BACKUP_SYSTEM_VAR, make_pair("1", 1)));
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200866 mValues.insert(make_pair(TW_BACKUP_DATA_VAR, make_pair("1", 1)));
867 mValues.insert(make_pair(TW_BACKUP_BOOT_VAR, make_pair("1", 1)));
868 mValues.insert(make_pair(TW_BACKUP_RECOVERY_VAR, make_pair("0", 1)));
869 mValues.insert(make_pair(TW_BACKUP_CACHE_VAR, make_pair("0", 1)));
870 mValues.insert(make_pair(TW_BACKUP_SP1_VAR, make_pair("0", 1)));
871 mValues.insert(make_pair(TW_BACKUP_SP2_VAR, make_pair("0", 1)));
872 mValues.insert(make_pair(TW_BACKUP_SP3_VAR, make_pair("0", 1)));
873 mValues.insert(make_pair(TW_BACKUP_ANDSEC_VAR, make_pair("0", 1)));
874 mValues.insert(make_pair(TW_BACKUP_SDEXT_VAR, make_pair("0", 1)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400875 mValues.insert(make_pair(TW_BACKUP_SYSTEM_SIZE, make_pair("0", 0)));
876 mValues.insert(make_pair(TW_BACKUP_DATA_SIZE, make_pair("0", 0)));
877 mValues.insert(make_pair(TW_BACKUP_BOOT_SIZE, make_pair("0", 0)));
878 mValues.insert(make_pair(TW_BACKUP_RECOVERY_SIZE, make_pair("0", 0)));
879 mValues.insert(make_pair(TW_BACKUP_CACHE_SIZE, make_pair("0", 0)));
880 mValues.insert(make_pair(TW_BACKUP_ANDSEC_SIZE, make_pair("0", 0)));
881 mValues.insert(make_pair(TW_BACKUP_SDEXT_SIZE, make_pair("0", 0)));
882 mValues.insert(make_pair(TW_BACKUP_SP1_SIZE, make_pair("0", 0)));
883 mValues.insert(make_pair(TW_BACKUP_SP2_SIZE, make_pair("0", 0)));
884 mValues.insert(make_pair(TW_BACKUP_SP3_SIZE, make_pair("0", 0)));
885 mValues.insert(make_pair(TW_STORAGE_FREE_SIZE, make_pair("0", 0)));
bigbiff bigbiff7ce7f0c2013-01-25 09:54:04 -0500886
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200887 mValues.insert(make_pair(TW_REBOOT_AFTER_FLASH_VAR, make_pair("0", 1)));
888 mValues.insert(make_pair(TW_SIGNED_ZIP_VERIFY_VAR, make_pair("0", 1)));
889 mValues.insert(make_pair(TW_FORCE_MD5_CHECK_VAR, make_pair("0", 1)));
890 mValues.insert(make_pair(TW_COLOR_THEME_VAR, make_pair("0", 1)));
891 mValues.insert(make_pair(TW_USE_COMPRESSION_VAR, make_pair("0", 1)));
892 mValues.insert(make_pair(TW_SHOW_SPAM_VAR, make_pair("0", 1)));
893 mValues.insert(make_pair(TW_TIME_ZONE_VAR, make_pair("CST6CDT", 1)));
894 mValues.insert(make_pair(TW_SORT_FILES_BY_DATE_VAR, make_pair("0", 1)));
895 mValues.insert(make_pair(TW_GUI_SORT_ORDER, make_pair("1", 1)));
896 mValues.insert(make_pair(TW_RM_RF_VAR, make_pair("0", 1)));
897 mValues.insert(make_pair(TW_SKIP_MD5_CHECK_VAR, make_pair("0", 1)));
898 mValues.insert(make_pair(TW_SKIP_MD5_GENERATE_VAR, make_pair("0", 1)));
899 mValues.insert(make_pair(TW_SDEXT_SIZE, make_pair("512", 1)));
900 mValues.insert(make_pair(TW_SWAP_SIZE, make_pair("32", 1)));
901 mValues.insert(make_pair(TW_SDPART_FILE_SYSTEM, make_pair("ext3", 1)));
902 mValues.insert(make_pair(TW_TIME_ZONE_GUISEL, make_pair("CST6;CDT", 1)));
903 mValues.insert(make_pair(TW_TIME_ZONE_GUIOFFSET, make_pair("0", 1)));
904 mValues.insert(make_pair(TW_TIME_ZONE_GUIDST, make_pair("1", 1)));
905 mValues.insert(make_pair(TW_ACTION_BUSY, make_pair("0", 0)));
906 mValues.insert(make_pair(TW_BACKUP_AVG_IMG_RATE, make_pair("15000000", 1)));
907 mValues.insert(make_pair(TW_BACKUP_AVG_FILE_RATE, make_pair("3000000", 1)));
908 mValues.insert(make_pair(TW_BACKUP_AVG_FILE_COMP_RATE, make_pair("2000000", 1)));
909 mValues.insert(make_pair(TW_RESTORE_AVG_IMG_RATE, make_pair("15000000", 1)));
910 mValues.insert(make_pair(TW_RESTORE_AVG_FILE_RATE, make_pair("3000000", 1)));
911 mValues.insert(make_pair(TW_RESTORE_AVG_FILE_COMP_RATE, make_pair("2000000", 1)));
912 mValues.insert(make_pair("tw_wipe_cache", make_pair("0", 0)));
913 mValues.insert(make_pair("tw_wipe_dalvik", make_pair("0", 0)));
Dees_Troy51a0e822012-09-05 15:24:24 -0400914 if (GetIntValue(TW_HAS_INTERNAL) == 1 && GetIntValue(TW_HAS_DATA_MEDIA) == 1 && GetIntValue(TW_HAS_EXTERNAL) == 0)
915 SetValue(TW_HAS_USB_STORAGE, 0, 0);
916 else
917 SetValue(TW_HAS_USB_STORAGE, 1, 0);
918 mValues.insert(make_pair(TW_ZIP_INDEX, make_pair("0", 0)));
919 mValues.insert(make_pair(TW_ZIP_QUEUE_COUNT, make_pair("0", 0)));
920 mValues.insert(make_pair(TW_FILENAME, make_pair("/sdcard", 0)));
921 mValues.insert(make_pair(TW_SIMULATE_ACTIONS, make_pair("0", 1)));
922 mValues.insert(make_pair(TW_SIMULATE_FAIL, make_pair("0", 1)));
923 mValues.insert(make_pair(TW_IS_ENCRYPTED, make_pair("0", 0)));
924 mValues.insert(make_pair(TW_IS_DECRYPTED, make_pair("0", 0)));
925 mValues.insert(make_pair(TW_CRYPTO_PASSWORD, make_pair("0", 0)));
926 mValues.insert(make_pair(TW_DATA_BLK_DEVICE, make_pair("0", 0)));
927 mValues.insert(make_pair("tw_terminal_state", make_pair("0", 0)));
928 mValues.insert(make_pair("tw_background_thread_running", make_pair("0", 0)));
929 mValues.insert(make_pair(TW_RESTORE_FILE_DATE, make_pair("0", 0)));
bigbiff bigbifff8e2f372013-02-27 20:50:43 -0500930 mValues.insert(make_pair("tw_military_time", make_pair("0", 1)));
Ricardo Gomezc9ecd442013-07-05 16:13:52 -0700931#ifdef TW_NO_SCREEN_TIMEOUT
932 mValues.insert(make_pair("tw_screen_timeout_secs", make_pair("0", 1)));
933 mValues.insert(make_pair("tw_no_screen_timeout", make_pair("1", 1)));
934#else
Dees_Troy2f9117a2013-02-17 19:52:09 -0600935 mValues.insert(make_pair("tw_screen_timeout_secs", make_pair("60", 1)));
Ricardo Gomezc9ecd442013-07-05 16:13:52 -0700936 mValues.insert(make_pair("tw_no_screen_timeout", make_pair("0", 1)));
937#endif
Dees_Troy6ef66352013-02-21 08:26:57 -0600938 mValues.insert(make_pair("tw_gui_done", make_pair("0", 0)));
Dees_Troy83bd4832013-05-04 12:39:56 +0000939 mValues.insert(make_pair("tw_encrypt_backup", make_pair("0", 0)));
Vojtech Bocek85932342013-04-01 22:11:33 +0200940#ifdef TW_BRIGHTNESS_PATH
941#ifndef TW_MAX_BRIGHTNESS
942#define TW_MAX_BRIGHTNESS 255
943#endif
Ethan Yonker00028b42014-04-09 14:29:02 -0500944 string findbright;
Dees_Troy2f9117a2013-02-17 19:52:09 -0600945 if (strcmp(EXPAND(TW_BRIGHTNESS_PATH), "/nobrightness") != 0) {
Ethan Yonker00028b42014-04-09 14:29:02 -0500946 findbright = EXPAND(TW_BRIGHTNESS_PATH);
947 LOGINFO("TW_BRIGHTNESS_PATH := %s\n", findbright.c_str());
948 if (!TWFunc::Path_Exists(findbright)) {
949 LOGINFO("Specified brightness file '%s' not found.\n", findbright.c_str());
950 findbright = "";
951 }
952 }
953 if (findbright.empty()) {
954 // Attempt to locate the brightness file
955 findbright = Find_File::Find("brightness", "/sys/class/backlight");
956 }
957 if (findbright.empty()) {
958 LOGINFO("Unable to locate brightness file\n");
959 mConstValues.insert(make_pair("tw_has_brightnesss_file", "0"));
960 } else {
961 LOGINFO("Found brightness file at '%s'\n", findbright.c_str());
Dees_Troy2f9117a2013-02-17 19:52:09 -0600962 mConstValues.insert(make_pair("tw_has_brightnesss_file", "1"));
Ethan Yonker00028b42014-04-09 14:29:02 -0500963 mConstValues.insert(make_pair("tw_brightness_file", findbright));
Vojtech Bocek85932342013-04-01 22:11:33 +0200964 ostringstream maxVal;
965 maxVal << TW_MAX_BRIGHTNESS;
966 mConstValues.insert(make_pair("tw_brightness_max", maxVal.str()));
967 mValues.insert(make_pair("tw_brightness", make_pair(maxVal.str(), 1)));
968 mValues.insert(make_pair("tw_brightness_pct", make_pair("100", 1)));
Dees_Troy2f9117a2013-02-17 19:52:09 -0600969 }
970#endif
Dees_Troya13d74f2013-03-24 08:54:55 -0500971 mValues.insert(make_pair(TW_MILITARY_TIME, make_pair("0", 1)));
Dees_Troy83bd4832013-05-04 12:39:56 +0000972#ifndef TW_EXCLUDE_ENCRYPTED_BACKUPS
973 mValues.insert(make_pair("tw_include_encrypted_backup", make_pair("1", 0)));
974#else
975 LOGINFO("TW_EXCLUDE_ENCRYPTED_BACKUPS := true\n");
976 mValues.insert(make_pair("tw_include_encrypted_backup", make_pair("0", 0)));
977#endif
Dees_Troy51a0e822012-09-05 15:24:24 -0400978}
979
980// Magic Values
981int DataManager::GetMagicValue(const string varName, string& value)
982{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200983 // Handle special dynamic cases
984 if (varName == "tw_time")
985 {
986 char tmp[32];
Dees_Troy51a0e822012-09-05 15:24:24 -0400987
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200988 struct tm *current;
989 time_t now;
990 int tw_military_time;
991 now = time(0);
992 current = localtime(&now);
993 GetValue(TW_MILITARY_TIME, tw_military_time);
994 if (current->tm_hour >= 12)
995 {
996 if (tw_military_time == 1)
997 sprintf(tmp, "%d:%02d", current->tm_hour, current->tm_min);
998 else
999 sprintf(tmp, "%d:%02d PM", current->tm_hour == 12 ? 12 : current->tm_hour - 12, current->tm_min);
bigbiff bigbiff4efe9c32013-02-20 18:58:11 -05001000 }
bigbiff bigbiff4efe9c32013-02-20 18:58:11 -05001001 else
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001002 {
1003 if (tw_military_time == 1)
1004 sprintf(tmp, "%d:%02d", current->tm_hour, current->tm_min);
1005 else
1006 sprintf(tmp, "%d:%02d AM", current->tm_hour == 0 ? 12 : current->tm_hour, current->tm_min);
1007 }
1008 value = tmp;
1009 return 0;
bigbiff bigbiff4efe9c32013-02-20 18:58:11 -05001010 }
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001011 else if (varName == "tw_battery")
1012 {
1013 char tmp[16];
Dees_Troy38bd7602012-09-14 13:33:53 -04001014 static char charging = ' ';
1015 static int lastVal = -1;
1016 static time_t nextSecCheck = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -04001017
Dees_Troy38bd7602012-09-14 13:33:53 -04001018 struct timeval curTime;
1019 gettimeofday(&curTime, NULL);
1020 if (curTime.tv_sec > nextSecCheck)
1021 {
1022 char cap_s[4];
Dees_Troyf33b4902013-03-01 00:51:39 +00001023#ifdef TW_CUSTOM_BATTERY_PATH
1024 string capacity_file = EXPAND(TW_CUSTOM_BATTERY_PATH);
1025 capacity_file += "/capacity";
1026 FILE * cap = fopen(capacity_file.c_str(),"rt");
1027#else
Dees_Troy38bd7602012-09-14 13:33:53 -04001028 FILE * cap = fopen("/sys/class/power_supply/battery/capacity","rt");
Dees_Troyf33b4902013-03-01 00:51:39 +00001029#endif
Dees_Troy38bd7602012-09-14 13:33:53 -04001030 if (cap){
1031 fgets(cap_s, 4, cap);
1032 fclose(cap);
1033 lastVal = atoi(cap_s);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001034 if (lastVal > 100) lastVal = 101;
1035 if (lastVal < 0) lastVal = 0;
Dees_Troy38bd7602012-09-14 13:33:53 -04001036 }
Dees_Troyf33b4902013-03-01 00:51:39 +00001037#ifdef TW_CUSTOM_BATTERY_PATH
1038 string status_file = EXPAND(TW_CUSTOM_BATTERY_PATH);
1039 status_file += "/status";
1040 cap = fopen(status_file.c_str(),"rt");
1041#else
Dees_Troy38bd7602012-09-14 13:33:53 -04001042 cap = fopen("/sys/class/power_supply/battery/status","rt");
Dees_Troyf33b4902013-03-01 00:51:39 +00001043#endif
Dees_Troy38bd7602012-09-14 13:33:53 -04001044 if (cap) {
1045 fgets(cap_s, 2, cap);
1046 fclose(cap);
1047 if (cap_s[0] == 'C')
1048 charging = '+';
1049 else
1050 charging = ' ';
1051 }
1052 nextSecCheck = curTime.tv_sec + 60;
1053 }
1054
1055 sprintf(tmp, "%i%%%c", lastVal, charging);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001056 value = tmp;
1057 return 0;
1058 }
1059 return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -04001060}
1061
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001062void DataManager::Output_Version(void)
1063{
Dees_Troy1c1ac442013-01-17 21:42:14 +00001064 string Path;
Dees_Troy01a9b7a2012-10-01 09:01:03 -04001065 char version[255];
1066
Dees_Troy1c1ac442013-01-17 21:42:14 +00001067 if (!PartitionManager.Mount_By_Path("/cache", false)) {
Dees_Troy2673cec2013-04-02 20:22:16 +00001068 LOGINFO("Unable to mount '%s' to write version number.\n", Path.c_str());
Dees_Troy01a9b7a2012-10-01 09:01:03 -04001069 return;
1070 }
Dees_Troy1c1ac442013-01-17 21:42:14 +00001071 if (!TWFunc::Path_Exists("/cache/recovery/.")) {
Dees_Troy2673cec2013-04-02 20:22:16 +00001072 LOGINFO("Recreating /cache/recovery folder.\n");
Dees_Troy1c1ac442013-01-17 21:42:14 +00001073 if (mkdir("/cache/recovery", S_IRWXU | S_IRWXG | S_IWGRP | S_IXGRP) != 0) {
Dees_Troy2673cec2013-04-02 20:22:16 +00001074 LOGERR("DataManager::Output_Version -- Unable to make /cache/recovery\n");
Dees_Troy1c1ac442013-01-17 21:42:14 +00001075 return;
1076 }
1077 }
1078 Path = "/cache/recovery/.version";
Dees_Troy01a9b7a2012-10-01 09:01:03 -04001079 if (TWFunc::Path_Exists(Path)) {
bigbiff bigbiff9c754052013-01-09 09:09:08 -05001080 unlink(Path.c_str());
Dees_Troy01a9b7a2012-10-01 09:01:03 -04001081 }
1082 FILE *fp = fopen(Path.c_str(), "w");
1083 if (fp == NULL) {
Dees_Troy2673cec2013-04-02 20:22:16 +00001084 LOGERR("Unable to open '%s'.\n", Path.c_str());
Dees_Troy01a9b7a2012-10-01 09:01:03 -04001085 return;
1086 }
1087 strcpy(version, TW_VERSION_STR);
1088 fwrite(version, sizeof(version[0]), strlen(version) / sizeof(version[0]), fp);
1089 fclose(fp);
Dees_Troyd93bda52013-07-03 19:55:19 +00001090 TWFunc::copy_file("/etc/recovery.fstab", "/cache/recovery/recovery.fstab", 0644);
1091 PartitionManager.Output_Storage_Fstab();
Dees_Troy01a9b7a2012-10-01 09:01:03 -04001092 sync();
Dees_Troy2673cec2013-04-02 20:22:16 +00001093 LOGINFO("Version number saved to '%s'\n", Path.c_str());
Dees_Troy01a9b7a2012-10-01 09:01:03 -04001094}
1095
Dees_Troy51a0e822012-09-05 15:24:24 -04001096void DataManager::ReadSettingsFile(void)
1097{
Ethan Yonker83e82572014-04-04 10:59:28 -05001098#ifndef TW_OEM_BUILD
Dees_Troy51a0e822012-09-05 15:24:24 -04001099 // Load up the values for TWRP - Sleep to let the card be ready
1100 char mkdir_path[255], settings_file[255];
1101 int is_enc, has_dual, use_ext, has_data_media, has_ext;
1102
1103 GetValue(TW_IS_ENCRYPTED, is_enc);
1104 GetValue(TW_HAS_DATA_MEDIA, has_data_media);
1105 if (is_enc == 1 && has_data_media == 1) {
Dees_Troy2673cec2013-04-02 20:22:16 +00001106 LOGINFO("Cannot load settings -- encrypted.\n");
Dees_Troy51a0e822012-09-05 15:24:24 -04001107 return;
1108 }
1109
1110 memset(mkdir_path, 0, sizeof(mkdir_path));
1111 memset(settings_file, 0, sizeof(settings_file));
1112 sprintf(mkdir_path, "%s/TWRP", DataManager_GetSettingsStoragePath());
1113 sprintf(settings_file, "%s/.twrps", mkdir_path);
1114
Dees_Troy5bf43922012-09-07 16:07:55 -04001115 if (!PartitionManager.Mount_Settings_Storage(false))
Dees_Troy51a0e822012-09-05 15:24:24 -04001116 {
1117 usleep(500000);
Dees_Troy5bf43922012-09-07 16:07:55 -04001118 if (!PartitionManager.Mount_Settings_Storage(false))
Dees_Troy2673cec2013-04-02 20:22:16 +00001119 LOGERR("Unable to mount %s when trying to read settings file.\n", settings_file);
Dees_Troy51a0e822012-09-05 15:24:24 -04001120 }
1121
1122 mkdir(mkdir_path, 0777);
1123
Dees_Troy2673cec2013-04-02 20:22:16 +00001124 LOGINFO("Attempt to load settings from settings file...\n");
Dees_Troy51a0e822012-09-05 15:24:24 -04001125 LoadValues(settings_file);
Dees_Troy01a9b7a2012-10-01 09:01:03 -04001126 Output_Version();
Ethan Yonker83e82572014-04-04 10:59:28 -05001127#endif // ifdef TW_OEM_BUILD
Ethan Yonker7af51ce2014-04-04 13:33:30 -05001128 PartitionManager.Mount_All_Storage();
Dees_Troy8170a922012-09-18 15:40:25 -04001129 update_tz_environment_variables();
Dees_Troy2f9117a2013-02-17 19:52:09 -06001130#ifdef TW_MAX_BRIGHTNESS
1131 if (strcmp(EXPAND(TW_BRIGHTNESS_PATH), "/nobrightness") != 0) {
1132 string brightness_path = EXPAND(TW_BRIGHTNESS_PATH);
1133 string brightness_value = GetStrValue("tw_brightness");
Dees_Troy2f9117a2013-02-17 19:52:09 -06001134 TWFunc::write_file(brightness_path, brightness_value);
1135 }
1136#endif
Dees_Troy51a0e822012-09-05 15:24:24 -04001137}
1138
1139string DataManager::GetCurrentStoragePath(void)
1140{
Dees_Troya13d74f2013-03-24 08:54:55 -05001141 return GetStrValue("tw_storage_path");
Dees_Troy51a0e822012-09-05 15:24:24 -04001142}
1143
1144string& DataManager::CGetCurrentStoragePath()
1145{
Dees_Troya13d74f2013-03-24 08:54:55 -05001146 return GetValueRef("tw_storage_path");
Dees_Troy51a0e822012-09-05 15:24:24 -04001147}
1148
1149string DataManager::GetSettingsStoragePath(void)
1150{
Dees_Troya13d74f2013-03-24 08:54:55 -05001151 return GetStrValue("tw_settings_path");
Dees_Troy51a0e822012-09-05 15:24:24 -04001152}
1153
1154string& DataManager::CGetSettingsStoragePath()
1155{
Dees_Troya13d74f2013-03-24 08:54:55 -05001156 return GetValueRef("tw_settings_path");
Dees_Troy51a0e822012-09-05 15:24:24 -04001157}
1158
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001159extern "C" int DataManager_ResetDefaults(void)
Dees_Troy51a0e822012-09-05 15:24:24 -04001160{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001161 return DataManager::ResetDefaults();
Dees_Troy51a0e822012-09-05 15:24:24 -04001162}
1163
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001164extern "C" void DataManager_LoadDefaults(void)
Dees_Troy51a0e822012-09-05 15:24:24 -04001165{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001166 return DataManager::SetDefaultValues();
Dees_Troy51a0e822012-09-05 15:24:24 -04001167}
1168
1169extern "C" int DataManager_LoadValues(const char* filename)
1170{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001171 return DataManager::LoadValues(filename);
Dees_Troy51a0e822012-09-05 15:24:24 -04001172}
1173
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001174extern "C" int DataManager_Flush(void)
Dees_Troy51a0e822012-09-05 15:24:24 -04001175{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001176 return DataManager::Flush();
Dees_Troy51a0e822012-09-05 15:24:24 -04001177}
1178
1179extern "C" int DataManager_GetValue(const char* varName, char* value)
1180{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001181 int ret;
1182 string str;
Dees_Troy51a0e822012-09-05 15:24:24 -04001183
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001184 ret = DataManager::GetValue(varName, str);
1185 if (ret == 0)
1186 strcpy(value, str.c_str());
1187 return ret;
Dees_Troy51a0e822012-09-05 15:24:24 -04001188}
1189
1190extern "C" const char* DataManager_GetStrValue(const char* varName)
1191{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001192 string& str = DataManager::GetValueRef(varName);
1193 return str.c_str();
Dees_Troy51a0e822012-09-05 15:24:24 -04001194}
1195
1196extern "C" const char* DataManager_GetCurrentStoragePath(void)
1197{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001198 string& str = DataManager::CGetCurrentStoragePath();
1199 return str.c_str();
Dees_Troy51a0e822012-09-05 15:24:24 -04001200}
1201
1202extern "C" const char* DataManager_GetSettingsStoragePath(void)
1203{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001204 string& str = DataManager::CGetSettingsStoragePath();
1205 return str.c_str();
Dees_Troy51a0e822012-09-05 15:24:24 -04001206}
1207
Dees_Troy51a0e822012-09-05 15:24:24 -04001208extern "C" int DataManager_GetIntValue(const char* varName)
1209{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001210 return DataManager::GetIntValue(varName);
Dees_Troy51a0e822012-09-05 15:24:24 -04001211}
1212
1213extern "C" int DataManager_SetStrValue(const char* varName, char* value)
1214{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001215 return DataManager::SetValue(varName, value, 0);
Dees_Troy51a0e822012-09-05 15:24:24 -04001216}
1217
1218extern "C" int DataManager_SetIntValue(const char* varName, int value)
1219{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001220 return DataManager::SetValue(varName, value, 0);
Dees_Troy51a0e822012-09-05 15:24:24 -04001221}
1222
1223extern "C" int DataManager_SetFloatValue(const char* varName, float value)
1224{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001225 return DataManager::SetValue(varName, value, 0);
Dees_Troy51a0e822012-09-05 15:24:24 -04001226}
1227
1228extern "C" int DataManager_ToggleIntValue(const char* varName)
1229{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001230 if (DataManager::GetIntValue(varName))
1231 return DataManager::SetValue(varName, 0);
1232 else
1233 return DataManager::SetValue(varName, 1);
Dees_Troy51a0e822012-09-05 15:24:24 -04001234}
1235
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001236extern "C" void DataManager_DumpValues(void)
Dees_Troy51a0e822012-09-05 15:24:24 -04001237{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001238 return DataManager::DumpValues();
Dees_Troy51a0e822012-09-05 15:24:24 -04001239}
1240
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001241extern "C" void DataManager_ReadSettingsFile(void)
Dees_Troy51a0e822012-09-05 15:24:24 -04001242{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001243 return DataManager::ReadSettingsFile();
Dees_Troy51a0e822012-09-05 15:24:24 -04001244}
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +00001245void DataManager::Vibrate(const string varName)
1246{
1247 int vib_value = 0;
1248 GetValue(varName, vib_value);
1249 if (vib_value) {
1250 vibrate(vib_value);
1251 }
1252}