react-native-mmkv-dz 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/LICENSE +219 -0
  2. package/MMKV/CHANGELOG.md +553 -0
  3. package/MMKV/Core/CMakeLists.txt +153 -0
  4. package/MMKV/Core/CodedInputData.cpp +228 -0
  5. package/MMKV/Core/CodedInputData.h +83 -0
  6. package/MMKV/Core/CodedInputDataCrypt.cpp +280 -0
  7. package/MMKV/Core/CodedInputDataCrypt.h +87 -0
  8. package/MMKV/Core/CodedInputDataCrypt_OSX.cpp +62 -0
  9. package/MMKV/Core/CodedInputData_OSX.cpp +92 -0
  10. package/MMKV/Core/CodedOutputData.cpp +174 -0
  11. package/MMKV/Core/CodedOutputData.h +82 -0
  12. package/MMKV/Core/Core.xcodeproj/project.pbxproj +702 -0
  13. package/MMKV/Core/Core.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  14. package/MMKV/Core/Core.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  15. package/MMKV/Core/Core.xcodeproj/xcshareddata/xcschemes/Core.xcscheme +67 -0
  16. package/MMKV/Core/Core.xcodeproj/xcshareddata/xcschemes/MMKVWatchCore.xcscheme +67 -0
  17. package/MMKV/Core/InterProcessLock.cpp +186 -0
  18. package/MMKV/Core/InterProcessLock.h +119 -0
  19. package/MMKV/Core/InterProcessLock_Android.cpp +103 -0
  20. package/MMKV/Core/InterProcessLock_Win32.cpp +108 -0
  21. package/MMKV/Core/KeyValueHolder.cpp +236 -0
  22. package/MMKV/Core/KeyValueHolder.h +118 -0
  23. package/MMKV/Core/MMBuffer.cpp +185 -0
  24. package/MMKV/Core/MMBuffer.h +107 -0
  25. package/MMKV/Core/MMKV.cpp +1418 -0
  26. package/MMKV/Core/MMKV.h +386 -0
  27. package/MMKV/Core/MMKVLog.cpp +127 -0
  28. package/MMKV/Core/MMKVLog.h +86 -0
  29. package/MMKV/Core/MMKVLog_Android.cpp +79 -0
  30. package/MMKV/Core/MMKVMetaInfo.hpp +81 -0
  31. package/MMKV/Core/MMKVPredef.h +245 -0
  32. package/MMKV/Core/MMKV_Android.cpp +259 -0
  33. package/MMKV/Core/MMKV_IO.cpp +1119 -0
  34. package/MMKV/Core/MMKV_IO.h +57 -0
  35. package/MMKV/Core/MMKV_OSX.cpp +347 -0
  36. package/MMKV/Core/MMKV_OSX.h +51 -0
  37. package/MMKV/Core/MemoryFile.cpp +537 -0
  38. package/MMKV/Core/MemoryFile.h +182 -0
  39. package/MMKV/Core/MemoryFile_Android.cpp +211 -0
  40. package/MMKV/Core/MemoryFile_Linux.cpp +120 -0
  41. package/MMKV/Core/MemoryFile_OSX.cpp +142 -0
  42. package/MMKV/Core/MemoryFile_Win32.cpp +536 -0
  43. package/MMKV/Core/MiniPBCoder.cpp +366 -0
  44. package/MMKV/Core/MiniPBCoder.h +129 -0
  45. package/MMKV/Core/MiniPBCoder_OSX.cpp +228 -0
  46. package/MMKV/Core/PBEncodeItem.hpp +86 -0
  47. package/MMKV/Core/PBUtility.cpp +61 -0
  48. package/MMKV/Core/PBUtility.h +153 -0
  49. package/MMKV/Core/ScopedLock.hpp +69 -0
  50. package/MMKV/Core/ThreadLock.cpp +68 -0
  51. package/MMKV/Core/ThreadLock.h +78 -0
  52. package/MMKV/Core/ThreadLock_Win32.cpp +89 -0
  53. package/MMKV/Core/aes/AESCrypt.cpp +256 -0
  54. package/MMKV/Core/aes/AESCrypt.h +107 -0
  55. package/MMKV/Core/aes/openssl/openssl_aes-armv4.S +1231 -0
  56. package/MMKV/Core/aes/openssl/openssl_aes.h +118 -0
  57. package/MMKV/Core/aes/openssl/openssl_aes_core.cpp +1044 -0
  58. package/MMKV/Core/aes/openssl/openssl_aes_locl.h +38 -0
  59. package/MMKV/Core/aes/openssl/openssl_aesv8-armx.S +308 -0
  60. package/MMKV/Core/aes/openssl/openssl_arm_arch.h +84 -0
  61. package/MMKV/Core/aes/openssl/openssl_cfb128.cpp +97 -0
  62. package/MMKV/Core/aes/openssl/openssl_md32_common.h +254 -0
  63. package/MMKV/Core/aes/openssl/openssl_md5.h +49 -0
  64. package/MMKV/Core/aes/openssl/openssl_md5_dgst.cpp +166 -0
  65. package/MMKV/Core/aes/openssl/openssl_md5_locl.h +75 -0
  66. package/MMKV/Core/aes/openssl/openssl_md5_one.cpp +30 -0
  67. package/MMKV/Core/aes/openssl/openssl_opensslconf.h +271 -0
  68. package/MMKV/Core/core.vcxproj +186 -0
  69. package/MMKV/Core/core.vcxproj.filters +150 -0
  70. package/MMKV/Core/crc32/Checksum.h +67 -0
  71. package/MMKV/Core/crc32/crc32_armv8.cpp +132 -0
  72. package/MMKV/Core/crc32/zlib/crc32.cpp +55 -0
  73. package/MMKV/Core/crc32/zlib/crc32.h +48 -0
  74. package/MMKV/Core/crc32/zlib/zconf.h +380 -0
  75. package/MMKV/Core/crc32/zlib/zutil.h +25 -0
  76. package/MMKV/LICENSE.TXT +193 -0
  77. package/MMKV/README.md +288 -0
  78. package/README.md +221 -0
  79. package/android/CMakeLists.txt +71 -0
  80. package/android/build.gradle +371 -0
  81. package/android/gradle.properties +4 -0
  82. package/android/src/main/AndroidManifest.xml +4 -0
  83. package/android/src/main/cpp/MmkvHostObject.cpp +302 -0
  84. package/android/src/main/cpp/MmkvHostObject.h +26 -0
  85. package/android/src/main/cpp/cpp-adapter.cpp +65 -0
  86. package/android/src/main/java/com/reactnativemmkv/MmkvModule.java +49 -0
  87. package/android/src/main/java/com/reactnativemmkv/MmkvPackage.java +26 -0
  88. package/cpp/TypedArray.cpp +341 -0
  89. package/cpp/TypedArray.h +175 -0
  90. package/ios/JSIUtils.h +50 -0
  91. package/ios/JSIUtils.mm +194 -0
  92. package/ios/Mmkv.xcodeproj/project.pbxproj +291 -0
  93. package/ios/MmkvHostObject.h +27 -0
  94. package/ios/MmkvHostObject.mm +299 -0
  95. package/ios/MmkvModule.h +5 -0
  96. package/ios/MmkvModule.mm +73 -0
  97. package/lib/commonjs/MMKV.js +146 -0
  98. package/lib/commonjs/MMKV.js.map +1 -0
  99. package/lib/commonjs/PlatformChecker.js +16 -0
  100. package/lib/commonjs/PlatformChecker.js.map +1 -0
  101. package/lib/commonjs/createMMKV.js +66 -0
  102. package/lib/commonjs/createMMKV.js.map +1 -0
  103. package/lib/commonjs/createMMKV.mock.js +40 -0
  104. package/lib/commonjs/createMMKV.mock.js.map +1 -0
  105. package/lib/commonjs/createMMKV.web.js +77 -0
  106. package/lib/commonjs/createMMKV.web.js.map +1 -0
  107. package/lib/commonjs/createTextEncoder.js +24 -0
  108. package/lib/commonjs/createTextEncoder.js.map +1 -0
  109. package/lib/commonjs/hooks.js +200 -0
  110. package/lib/commonjs/hooks.js.map +1 -0
  111. package/lib/commonjs/index.js +32 -0
  112. package/lib/commonjs/index.js.map +1 -0
  113. package/lib/module/MMKV.js +134 -0
  114. package/lib/module/MMKV.js.map +1 -0
  115. package/lib/module/PlatformChecker.js +9 -0
  116. package/lib/module/PlatformChecker.js.map +1 -0
  117. package/lib/module/createMMKV.js +55 -0
  118. package/lib/module/createMMKV.js.map +1 -0
  119. package/lib/module/createMMKV.mock.js +31 -0
  120. package/lib/module/createMMKV.mock.js.map +1 -0
  121. package/lib/module/createMMKV.web.js +67 -0
  122. package/lib/module/createMMKV.web.js.map +1 -0
  123. package/lib/module/createTextEncoder.js +17 -0
  124. package/lib/module/createTextEncoder.js.map +1 -0
  125. package/lib/module/hooks.js +181 -0
  126. package/lib/module/hooks.js.map +1 -0
  127. package/lib/module/index.js +3 -0
  128. package/lib/module/index.js.map +1 -0
  129. package/lib/typescript/MMKV.d.ts +137 -0
  130. package/lib/typescript/PlatformChecker.d.ts +1 -0
  131. package/lib/typescript/createMMKV.d.ts +6 -0
  132. package/lib/typescript/createMMKV.mock.d.ts +2 -0
  133. package/lib/typescript/createMMKV.web.d.ts +2 -0
  134. package/lib/typescript/createTextEncoder.d.ts +1 -0
  135. package/lib/typescript/hooks.d.ts +81 -0
  136. package/lib/typescript/index.d.ts +2 -0
  137. package/package.json +168 -0
  138. package/react-native-mmkv.podspec +32 -0
@@ -0,0 +1,366 @@
1
+ /*
2
+ * Tencent is pleased to support the open source community by making
3
+ * MMKV available.
4
+ *
5
+ * Copyright (C) 2018 THL A29 Limited, a Tencent company.
6
+ * All rights reserved.
7
+ *
8
+ * Licensed under the BSD 3-Clause License (the "License"); you may not use
9
+ * this file except in compliance with the License. You may obtain a copy of
10
+ * the License at
11
+ *
12
+ * https://opensource.org/licenses/BSD-3-Clause
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */
20
+
21
+ #include "MiniPBCoder.h"
22
+ #include "CodedInputData.h"
23
+ #include "CodedInputDataCrypt.h"
24
+ #include "CodedOutputData.h"
25
+ #include "PBEncodeItem.hpp"
26
+
27
+ #ifdef MMKV_APPLE
28
+ # if __has_feature(objc_arc)
29
+ # error This file must be compiled with MRC. Use -fno-objc-arc flag.
30
+ # endif
31
+ #endif // MMKV_APPLE
32
+
33
+ using namespace std;
34
+
35
+ namespace mmkv {
36
+
37
+ MiniPBCoder::MiniPBCoder() : m_encodeItems(new std::vector<PBEncodeItem>()) {
38
+ }
39
+
40
+ MiniPBCoder::MiniPBCoder(const MMBuffer *inputBuffer, AESCrypt *crypter) : MiniPBCoder() {
41
+ m_inputBuffer = inputBuffer;
42
+ #ifndef MMKV_DISABLE_CRYPT
43
+ if (crypter) {
44
+ m_inputDataDecrpt = new CodedInputDataCrypt(m_inputBuffer->getPtr(), m_inputBuffer->length(), *crypter);
45
+ } else {
46
+ m_inputData = new CodedInputData(m_inputBuffer->getPtr(), m_inputBuffer->length());
47
+ }
48
+ #else
49
+ m_inputData = new CodedInputData(m_inputBuffer->getPtr(), m_inputBuffer->length());
50
+ #endif // MMKV_DISABLE_CRYPT
51
+ }
52
+
53
+ MiniPBCoder::~MiniPBCoder() {
54
+ delete m_inputData;
55
+ #ifndef MMKV_DISABLE_CRYPT
56
+ delete m_inputDataDecrpt;
57
+ #endif
58
+ delete m_outputBuffer;
59
+ delete m_outputData;
60
+ delete m_encodeItems;
61
+ }
62
+
63
+ // encode
64
+
65
+ // write object using prepared m_encodeItems[]
66
+ void MiniPBCoder::writeRootObject() {
67
+ for (size_t index = 0, total = m_encodeItems->size(); index < total; index++) {
68
+ PBEncodeItem *encodeItem = &(*m_encodeItems)[index];
69
+ switch (encodeItem->type) {
70
+ case PBEncodeItemType_Data: {
71
+ m_outputData->writeData(*(encodeItem->value.bufferValue));
72
+ break;
73
+ }
74
+ case PBEncodeItemType_Container: {
75
+ m_outputData->writeUInt32(encodeItem->valueSize);
76
+ break;
77
+ }
78
+ #ifndef MMKV_APPLE
79
+ case PBEncodeItemType_String: {
80
+ m_outputData->writeString(*(encodeItem->value.strValue));
81
+ break;
82
+ }
83
+ #else
84
+ case PBEncodeItemType_NSString: {
85
+ m_outputData->writeUInt32(encodeItem->valueSize);
86
+ if (encodeItem->valueSize > 0 && encodeItem->value.tmpObjectValue != nullptr) {
87
+ auto obj = (__bridge NSData *) encodeItem->value.tmpObjectValue;
88
+ MMBuffer buffer(obj, MMBufferNoCopy);
89
+ m_outputData->writeRawData(buffer);
90
+ }
91
+ break;
92
+ }
93
+ case PBEncodeItemType_NSData: {
94
+ m_outputData->writeUInt32(encodeItem->valueSize);
95
+ if (encodeItem->valueSize > 0 && encodeItem->value.objectValue != nullptr) {
96
+ auto obj = (__bridge NSData *) encodeItem->value.objectValue;
97
+ MMBuffer buffer(obj, MMBufferNoCopy);
98
+ m_outputData->writeRawData(buffer);
99
+ }
100
+ break;
101
+ }
102
+ case PBEncodeItemType_NSDate: {
103
+ NSDate *oDate = (__bridge NSDate *) encodeItem->value.objectValue;
104
+ m_outputData->writeDouble(oDate.timeIntervalSince1970);
105
+ break;
106
+ }
107
+ #endif // MMKV_APPLE
108
+ case PBEncodeItemType_None: {
109
+ MMKVError("%d", encodeItem->type);
110
+ break;
111
+ }
112
+ }
113
+ }
114
+ }
115
+
116
+ size_t MiniPBCoder::prepareObjectForEncode(const MMBuffer &buffer) {
117
+ m_encodeItems->push_back(PBEncodeItem());
118
+ PBEncodeItem *encodeItem = &(m_encodeItems->back());
119
+ size_t index = m_encodeItems->size() - 1;
120
+ {
121
+ encodeItem->type = PBEncodeItemType_Data;
122
+ encodeItem->value.bufferValue = &buffer;
123
+ encodeItem->valueSize = static_cast<uint32_t>(buffer.length());
124
+ }
125
+ encodeItem->compiledSize = pbRawVarint32Size(encodeItem->valueSize) + encodeItem->valueSize;
126
+
127
+ return index;
128
+ }
129
+
130
+ #ifndef MMKV_DISABLE_CRYPT
131
+
132
+ size_t MiniPBCoder::prepareObjectForEncode(const MMKVVector &vec) {
133
+ m_encodeItems->push_back(PBEncodeItem());
134
+ PBEncodeItem *encodeItem = &(m_encodeItems->back());
135
+ size_t index = m_encodeItems->size() - 1;
136
+ {
137
+ encodeItem->type = PBEncodeItemType_Container;
138
+ encodeItem->value.bufferValue = nullptr;
139
+
140
+ for (const auto &itr : vec) {
141
+ const auto &key = itr.first;
142
+ const auto &value = itr.second;
143
+ # ifdef MMKV_APPLE
144
+ if (key.length <= 0) {
145
+ # else
146
+ if (key.length() <= 0) {
147
+ # endif
148
+ continue;
149
+ }
150
+
151
+ size_t keyIndex = prepareObjectForEncode(key);
152
+ if (keyIndex < m_encodeItems->size()) {
153
+ size_t valueIndex = prepareObjectForEncode(value);
154
+ if (valueIndex < m_encodeItems->size()) {
155
+ (*m_encodeItems)[index].valueSize += (*m_encodeItems)[keyIndex].compiledSize;
156
+ (*m_encodeItems)[index].valueSize += (*m_encodeItems)[valueIndex].compiledSize;
157
+ } else {
158
+ m_encodeItems->pop_back(); // pop key
159
+ }
160
+ }
161
+ }
162
+
163
+ encodeItem = &(*m_encodeItems)[index];
164
+ }
165
+ encodeItem->compiledSize = pbRawVarint32Size(encodeItem->valueSize) + encodeItem->valueSize;
166
+
167
+ return index;
168
+ }
169
+
170
+ #endif // MMKV_DISABLE_CRYPT
171
+
172
+ MMBuffer MiniPBCoder::writePreparedItems(size_t index) {
173
+ PBEncodeItem *oItem = (index < m_encodeItems->size()) ? &(*m_encodeItems)[index] : nullptr;
174
+ if (oItem && oItem->compiledSize > 0) {
175
+ m_outputBuffer = new MMBuffer(oItem->compiledSize);
176
+ m_outputData = new CodedOutputData(m_outputBuffer->getPtr(), m_outputBuffer->length());
177
+
178
+ writeRootObject();
179
+ }
180
+
181
+ return std::move(*m_outputBuffer);
182
+ }
183
+
184
+ MMBuffer MiniPBCoder::encodeDataWithObject(const MMBuffer &obj) {
185
+ try {
186
+ auto valueSize = static_cast<uint32_t>(obj.length());
187
+ auto compiledSize = pbRawVarint32Size(valueSize) + valueSize;
188
+ MMBuffer result(compiledSize);
189
+ CodedOutputData output(result.getPtr(), result.length());
190
+ output.writeData(obj);
191
+ return result;
192
+ } catch (const std::exception &exception) {
193
+ MMKVError("%s", exception.what());
194
+ return MMBuffer();
195
+ }
196
+ }
197
+
198
+ #ifndef MMKV_APPLE
199
+
200
+ size_t MiniPBCoder::prepareObjectForEncode(const string &str) {
201
+ m_encodeItems->push_back(PBEncodeItem());
202
+ PBEncodeItem *encodeItem = &(m_encodeItems->back());
203
+ size_t index = m_encodeItems->size() - 1;
204
+ {
205
+ encodeItem->type = PBEncodeItemType_String;
206
+ encodeItem->value.strValue = &str;
207
+ encodeItem->valueSize = static_cast<int32_t>(str.size());
208
+ }
209
+ encodeItem->compiledSize = pbRawVarint32Size(encodeItem->valueSize) + encodeItem->valueSize;
210
+
211
+ return index;
212
+ }
213
+
214
+ size_t MiniPBCoder::prepareObjectForEncode(const vector<string> &v) {
215
+ m_encodeItems->push_back(PBEncodeItem());
216
+ PBEncodeItem *encodeItem = &(m_encodeItems->back());
217
+ size_t index = m_encodeItems->size() - 1;
218
+ {
219
+ encodeItem->type = PBEncodeItemType_Container;
220
+ encodeItem->value.bufferValue = nullptr;
221
+
222
+ for (const auto &str : v) {
223
+ size_t itemIndex = prepareObjectForEncode(str);
224
+ if (itemIndex < m_encodeItems->size()) {
225
+ (*m_encodeItems)[index].valueSize += (*m_encodeItems)[itemIndex].compiledSize;
226
+ }
227
+ }
228
+
229
+ encodeItem = &(*m_encodeItems)[index];
230
+ }
231
+ encodeItem->compiledSize = pbRawVarint32Size(encodeItem->valueSize) + encodeItem->valueSize;
232
+
233
+ return index;
234
+ }
235
+
236
+ vector<string> MiniPBCoder::decodeOneVector() {
237
+ vector<string> v;
238
+
239
+ m_inputData->readInt32();
240
+
241
+ while (!m_inputData->isAtEnd()) {
242
+ auto value = m_inputData->readString();
243
+ v.push_back(move(value));
244
+ }
245
+
246
+ return v;
247
+ }
248
+
249
+ void MiniPBCoder::decodeOneMap(MMKVMap &dic, size_t position, bool greedy) {
250
+ auto block = [position, this](MMKVMap &dictionary) {
251
+ if (position) {
252
+ m_inputData->seek(position);
253
+ } else {
254
+ m_inputData->readInt32();
255
+ }
256
+ while (!m_inputData->isAtEnd()) {
257
+ KeyValueHolder kvHolder;
258
+ const auto &key = m_inputData->readString(kvHolder);
259
+ if (key.length() > 0) {
260
+ m_inputData->readData(kvHolder);
261
+ if (kvHolder.valueSize > 0) {
262
+ dictionary[key] = move(kvHolder);
263
+ } else {
264
+ auto itr = dictionary.find(key);
265
+ if (itr != dictionary.end()) {
266
+ dictionary.erase(itr);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ };
272
+
273
+ if (greedy) {
274
+ try {
275
+ block(dic);
276
+ } catch (std::exception &exception) {
277
+ MMKVError("%s", exception.what());
278
+ }
279
+ } else {
280
+ try {
281
+ MMKVMap tmpDic;
282
+ block(tmpDic);
283
+ dic.swap(tmpDic);
284
+ } catch (std::exception &exception) {
285
+ MMKVError("%s", exception.what());
286
+ }
287
+ }
288
+ }
289
+
290
+ # ifndef MMKV_DISABLE_CRYPT
291
+
292
+ void MiniPBCoder::decodeOneMap(MMKVMapCrypt &dic, size_t position, bool greedy) {
293
+ auto block = [position, this](MMKVMapCrypt &dictionary) {
294
+ if (position) {
295
+ m_inputDataDecrpt->seek(position);
296
+ } else {
297
+ m_inputDataDecrpt->readInt32();
298
+ }
299
+ while (!m_inputDataDecrpt->isAtEnd()) {
300
+ KeyValueHolderCrypt kvHolder;
301
+ const auto &key = m_inputDataDecrpt->readString(kvHolder);
302
+ if (key.length() > 0) {
303
+ m_inputDataDecrpt->readData(kvHolder);
304
+ if (kvHolder.realValueSize() > 0) {
305
+ dictionary[key] = move(kvHolder);
306
+ } else {
307
+ auto itr = dictionary.find(key);
308
+ if (itr != dictionary.end()) {
309
+ dictionary.erase(itr);
310
+ }
311
+ }
312
+ }
313
+ }
314
+ };
315
+
316
+ if (greedy) {
317
+ try {
318
+ block(dic);
319
+ } catch (std::exception &exception) {
320
+ MMKVError("%s", exception.what());
321
+ }
322
+ } else {
323
+ try {
324
+ MMKVMapCrypt tmpDic;
325
+ block(tmpDic);
326
+ dic.swap(tmpDic);
327
+ } catch (std::exception &exception) {
328
+ MMKVError("%s", exception.what());
329
+ }
330
+ }
331
+ }
332
+
333
+ # endif // MMKV_DISABLE_CRYPT
334
+
335
+ vector<string> MiniPBCoder::decodeVector(const MMBuffer &oData) {
336
+ MiniPBCoder oCoder(&oData);
337
+ return oCoder.decodeOneVector();
338
+ }
339
+
340
+ #endif // MMKV_APPLE
341
+
342
+ void MiniPBCoder::decodeMap(MMKVMap &dic, const MMBuffer &oData, size_t position) {
343
+ MiniPBCoder oCoder(&oData);
344
+ oCoder.decodeOneMap(dic, position, false);
345
+ }
346
+
347
+ void MiniPBCoder::greedyDecodeMap(MMKVMap &dic, const MMBuffer &oData, size_t position) {
348
+ MiniPBCoder oCoder(&oData);
349
+ oCoder.decodeOneMap(dic, position, true);
350
+ }
351
+
352
+ #ifndef MMKV_DISABLE_CRYPT
353
+
354
+ void MiniPBCoder::decodeMap(MMKVMapCrypt &dic, const MMBuffer &oData, AESCrypt *crypter, size_t position) {
355
+ MiniPBCoder oCoder(&oData, crypter);
356
+ oCoder.decodeOneMap(dic, position, false);
357
+ }
358
+
359
+ void MiniPBCoder::greedyDecodeMap(MMKVMapCrypt &dic, const MMBuffer &oData, AESCrypt *crypter, size_t position) {
360
+ MiniPBCoder oCoder(&oData, crypter);
361
+ oCoder.decodeOneMap(dic, position, true);
362
+ }
363
+
364
+ #endif
365
+
366
+ } // namespace mmkv
@@ -0,0 +1,129 @@
1
+ /*
2
+ * Tencent is pleased to support the open source community by making
3
+ * MMKV available.
4
+ *
5
+ * Copyright (C) 2018 THL A29 Limited, a Tencent company.
6
+ * All rights reserved.
7
+ *
8
+ * Licensed under the BSD 3-Clause License (the "License"); you may not use
9
+ * this file except in compliance with the License. You may obtain a copy of
10
+ * the License at
11
+ *
12
+ * https://opensource.org/licenses/BSD-3-Clause
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */
20
+
21
+ #ifndef MMKV_MINIPBCODER_H
22
+ #define MMKV_MINIPBCODER_H
23
+ #ifdef __cplusplus
24
+
25
+ #include "MMKVPredef.h"
26
+
27
+ #include "KeyValueHolder.h"
28
+ #include "MMBuffer.h"
29
+ #include "MMBuffer.h"
30
+ #include "MMKVLog.h"
31
+ #include "PBUtility.h"
32
+ #include <cstdint>
33
+
34
+ namespace mmkv {
35
+
36
+ class CodedInputData;
37
+ class CodedOutputData;
38
+ class AESCrypt;
39
+ class CodedInputDataCrypt;
40
+ struct PBEncodeItem;
41
+
42
+ class MiniPBCoder {
43
+ const MMBuffer *m_inputBuffer = nullptr;
44
+ CodedInputData *m_inputData = nullptr;
45
+ CodedInputDataCrypt *m_inputDataDecrpt = nullptr;
46
+
47
+ MMBuffer *m_outputBuffer = nullptr;
48
+ CodedOutputData *m_outputData = nullptr;
49
+ std::vector<PBEncodeItem> *m_encodeItems = nullptr;
50
+
51
+ MiniPBCoder();
52
+ explicit MiniPBCoder(const MMBuffer *inputBuffer, AESCrypt *crypter = nullptr);
53
+ ~MiniPBCoder();
54
+
55
+ void writeRootObject();
56
+
57
+ size_t prepareObjectForEncode(const MMKVVector &vec);
58
+ size_t prepareObjectForEncode(const MMBuffer &buffer);
59
+
60
+ template <typename T>
61
+ MMBuffer getEncodeData(const T &obj) {
62
+ size_t index = prepareObjectForEncode(obj);
63
+ return writePreparedItems(index);
64
+ }
65
+
66
+ MMBuffer writePreparedItems(size_t index);
67
+
68
+ void decodeOneMap(MMKVMap &dic, size_t position, bool greedy);
69
+ #ifndef MMKV_DISABLE_CRYPT
70
+ void decodeOneMap(MMKVMapCrypt &dic, size_t position, bool greedy);
71
+ #endif
72
+
73
+ #ifndef MMKV_APPLE
74
+ size_t prepareObjectForEncode(const std::string &str);
75
+ size_t prepareObjectForEncode(const std::vector<std::string> &vector);
76
+
77
+ std::vector<std::string> decodeOneVector();
78
+ #else
79
+ // NSString, NSData, NSDate
80
+ size_t prepareObjectForEncode(__unsafe_unretained NSObject *obj);
81
+ #endif
82
+
83
+ public:
84
+ template <typename T>
85
+ static MMBuffer encodeDataWithObject(const T &obj) {
86
+ try {
87
+ MiniPBCoder pbcoder;
88
+ return pbcoder.getEncodeData(obj);
89
+ } catch (const std::exception &exception) {
90
+ MMKVError("%s", exception.what());
91
+ return MMBuffer();
92
+ }
93
+ }
94
+
95
+ // opt encoding a single MMBuffer
96
+ static MMBuffer encodeDataWithObject(const MMBuffer &obj);
97
+
98
+ // return empty result if there's any error
99
+ static void decodeMap(MMKVMap &dic, const MMBuffer &oData, size_t position = 0);
100
+
101
+ // decode as much data as possible before any error happens
102
+ static void greedyDecodeMap(MMKVMap &dic, const MMBuffer &oData, size_t position = 0);
103
+
104
+ #ifndef MMKV_DISABLE_CRYPT
105
+ // return empty result if there's any error
106
+ static void decodeMap(MMKVMapCrypt &dic, const MMBuffer &oData, AESCrypt *crypter, size_t position = 0);
107
+
108
+ // decode as much data as possible before any error happens
109
+ static void greedyDecodeMap(MMKVMapCrypt &dic, const MMBuffer &oData, AESCrypt *crypter, size_t position = 0);
110
+ #endif // MMKV_DISABLE_CRYPT
111
+
112
+ #ifndef MMKV_APPLE
113
+ static std::vector<std::string> decodeVector(const MMBuffer &oData);
114
+ #else
115
+ // NSString, NSData, NSDate
116
+ static NSObject *decodeObject(const MMBuffer &oData, Class cls);
117
+
118
+ static bool isCompatibleClass(Class cls);
119
+ #endif
120
+
121
+ // just forbid it for possibly misuse
122
+ explicit MiniPBCoder(const MiniPBCoder &other) = delete;
123
+ MiniPBCoder &operator=(const MiniPBCoder &other) = delete;
124
+ };
125
+
126
+ } // namespace mmkv
127
+
128
+ #endif
129
+ #endif //MMKV_MINIPBCODER_H