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.
- package/LICENSE +219 -0
- package/MMKV/CHANGELOG.md +553 -0
- package/MMKV/Core/CMakeLists.txt +153 -0
- package/MMKV/Core/CodedInputData.cpp +228 -0
- package/MMKV/Core/CodedInputData.h +83 -0
- package/MMKV/Core/CodedInputDataCrypt.cpp +280 -0
- package/MMKV/Core/CodedInputDataCrypt.h +87 -0
- package/MMKV/Core/CodedInputDataCrypt_OSX.cpp +62 -0
- package/MMKV/Core/CodedInputData_OSX.cpp +92 -0
- package/MMKV/Core/CodedOutputData.cpp +174 -0
- package/MMKV/Core/CodedOutputData.h +82 -0
- package/MMKV/Core/Core.xcodeproj/project.pbxproj +702 -0
- package/MMKV/Core/Core.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/MMKV/Core/Core.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/MMKV/Core/Core.xcodeproj/xcshareddata/xcschemes/Core.xcscheme +67 -0
- package/MMKV/Core/Core.xcodeproj/xcshareddata/xcschemes/MMKVWatchCore.xcscheme +67 -0
- package/MMKV/Core/InterProcessLock.cpp +186 -0
- package/MMKV/Core/InterProcessLock.h +119 -0
- package/MMKV/Core/InterProcessLock_Android.cpp +103 -0
- package/MMKV/Core/InterProcessLock_Win32.cpp +108 -0
- package/MMKV/Core/KeyValueHolder.cpp +236 -0
- package/MMKV/Core/KeyValueHolder.h +118 -0
- package/MMKV/Core/MMBuffer.cpp +185 -0
- package/MMKV/Core/MMBuffer.h +107 -0
- package/MMKV/Core/MMKV.cpp +1418 -0
- package/MMKV/Core/MMKV.h +386 -0
- package/MMKV/Core/MMKVLog.cpp +127 -0
- package/MMKV/Core/MMKVLog.h +86 -0
- package/MMKV/Core/MMKVLog_Android.cpp +79 -0
- package/MMKV/Core/MMKVMetaInfo.hpp +81 -0
- package/MMKV/Core/MMKVPredef.h +245 -0
- package/MMKV/Core/MMKV_Android.cpp +259 -0
- package/MMKV/Core/MMKV_IO.cpp +1119 -0
- package/MMKV/Core/MMKV_IO.h +57 -0
- package/MMKV/Core/MMKV_OSX.cpp +347 -0
- package/MMKV/Core/MMKV_OSX.h +51 -0
- package/MMKV/Core/MemoryFile.cpp +537 -0
- package/MMKV/Core/MemoryFile.h +182 -0
- package/MMKV/Core/MemoryFile_Android.cpp +211 -0
- package/MMKV/Core/MemoryFile_Linux.cpp +120 -0
- package/MMKV/Core/MemoryFile_OSX.cpp +142 -0
- package/MMKV/Core/MemoryFile_Win32.cpp +536 -0
- package/MMKV/Core/MiniPBCoder.cpp +366 -0
- package/MMKV/Core/MiniPBCoder.h +129 -0
- package/MMKV/Core/MiniPBCoder_OSX.cpp +228 -0
- package/MMKV/Core/PBEncodeItem.hpp +86 -0
- package/MMKV/Core/PBUtility.cpp +61 -0
- package/MMKV/Core/PBUtility.h +153 -0
- package/MMKV/Core/ScopedLock.hpp +69 -0
- package/MMKV/Core/ThreadLock.cpp +68 -0
- package/MMKV/Core/ThreadLock.h +78 -0
- package/MMKV/Core/ThreadLock_Win32.cpp +89 -0
- package/MMKV/Core/aes/AESCrypt.cpp +256 -0
- package/MMKV/Core/aes/AESCrypt.h +107 -0
- package/MMKV/Core/aes/openssl/openssl_aes-armv4.S +1231 -0
- package/MMKV/Core/aes/openssl/openssl_aes.h +118 -0
- package/MMKV/Core/aes/openssl/openssl_aes_core.cpp +1044 -0
- package/MMKV/Core/aes/openssl/openssl_aes_locl.h +38 -0
- package/MMKV/Core/aes/openssl/openssl_aesv8-armx.S +308 -0
- package/MMKV/Core/aes/openssl/openssl_arm_arch.h +84 -0
- package/MMKV/Core/aes/openssl/openssl_cfb128.cpp +97 -0
- package/MMKV/Core/aes/openssl/openssl_md32_common.h +254 -0
- package/MMKV/Core/aes/openssl/openssl_md5.h +49 -0
- package/MMKV/Core/aes/openssl/openssl_md5_dgst.cpp +166 -0
- package/MMKV/Core/aes/openssl/openssl_md5_locl.h +75 -0
- package/MMKV/Core/aes/openssl/openssl_md5_one.cpp +30 -0
- package/MMKV/Core/aes/openssl/openssl_opensslconf.h +271 -0
- package/MMKV/Core/core.vcxproj +186 -0
- package/MMKV/Core/core.vcxproj.filters +150 -0
- package/MMKV/Core/crc32/Checksum.h +67 -0
- package/MMKV/Core/crc32/crc32_armv8.cpp +132 -0
- package/MMKV/Core/crc32/zlib/crc32.cpp +55 -0
- package/MMKV/Core/crc32/zlib/crc32.h +48 -0
- package/MMKV/Core/crc32/zlib/zconf.h +380 -0
- package/MMKV/Core/crc32/zlib/zutil.h +25 -0
- package/MMKV/LICENSE.TXT +193 -0
- package/MMKV/README.md +288 -0
- package/README.md +221 -0
- package/android/CMakeLists.txt +71 -0
- package/android/build.gradle +371 -0
- package/android/gradle.properties +4 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/cpp/MmkvHostObject.cpp +302 -0
- package/android/src/main/cpp/MmkvHostObject.h +26 -0
- package/android/src/main/cpp/cpp-adapter.cpp +65 -0
- package/android/src/main/java/com/reactnativemmkv/MmkvModule.java +49 -0
- package/android/src/main/java/com/reactnativemmkv/MmkvPackage.java +26 -0
- package/cpp/TypedArray.cpp +341 -0
- package/cpp/TypedArray.h +175 -0
- package/ios/JSIUtils.h +50 -0
- package/ios/JSIUtils.mm +194 -0
- package/ios/Mmkv.xcodeproj/project.pbxproj +291 -0
- package/ios/MmkvHostObject.h +27 -0
- package/ios/MmkvHostObject.mm +299 -0
- package/ios/MmkvModule.h +5 -0
- package/ios/MmkvModule.mm +73 -0
- package/lib/commonjs/MMKV.js +146 -0
- package/lib/commonjs/MMKV.js.map +1 -0
- package/lib/commonjs/PlatformChecker.js +16 -0
- package/lib/commonjs/PlatformChecker.js.map +1 -0
- package/lib/commonjs/createMMKV.js +66 -0
- package/lib/commonjs/createMMKV.js.map +1 -0
- package/lib/commonjs/createMMKV.mock.js +40 -0
- package/lib/commonjs/createMMKV.mock.js.map +1 -0
- package/lib/commonjs/createMMKV.web.js +77 -0
- package/lib/commonjs/createMMKV.web.js.map +1 -0
- package/lib/commonjs/createTextEncoder.js +24 -0
- package/lib/commonjs/createTextEncoder.js.map +1 -0
- package/lib/commonjs/hooks.js +200 -0
- package/lib/commonjs/hooks.js.map +1 -0
- package/lib/commonjs/index.js +32 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/module/MMKV.js +134 -0
- package/lib/module/MMKV.js.map +1 -0
- package/lib/module/PlatformChecker.js +9 -0
- package/lib/module/PlatformChecker.js.map +1 -0
- package/lib/module/createMMKV.js +55 -0
- package/lib/module/createMMKV.js.map +1 -0
- package/lib/module/createMMKV.mock.js +31 -0
- package/lib/module/createMMKV.mock.js.map +1 -0
- package/lib/module/createMMKV.web.js +67 -0
- package/lib/module/createMMKV.web.js.map +1 -0
- package/lib/module/createTextEncoder.js +17 -0
- package/lib/module/createTextEncoder.js.map +1 -0
- package/lib/module/hooks.js +181 -0
- package/lib/module/hooks.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -0
- package/lib/typescript/MMKV.d.ts +137 -0
- package/lib/typescript/PlatformChecker.d.ts +1 -0
- package/lib/typescript/createMMKV.d.ts +6 -0
- package/lib/typescript/createMMKV.mock.d.ts +2 -0
- package/lib/typescript/createMMKV.web.d.ts +2 -0
- package/lib/typescript/createTextEncoder.d.ts +1 -0
- package/lib/typescript/hooks.d.ts +81 -0
- package/lib/typescript/index.d.ts +2 -0
- package/package.json +168 -0
- 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
|