/* * Tencent is pleased to support the open source community by making * MMKV available. * * Copyright (C) 2018 THL A29 Limited, a Tencent company. * All rights reserved. * * Licensed under the BSD 3-Clause License (the "License"); you may not use * this file except in compliance with the License. You may obtain a copy of * the License at * * https://opensource.org/licenses/BSD-3-Clause * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MMKV_MINIPBCODER_H #define MMKV_MINIPBCODER_H #ifdef __cplusplus #include "MMKVPredef.h" #include "MMBuffer.h" #include #ifdef MMKV_HAS_CPP20 # include # define MMKV_STRING_CONTAINER std::span #else # define MMKV_STRING_CONTAINER std::vector #endif namespace mmkv { class CodedInputData; class CodedOutputData; class AESCrypt; class CodedInputDataCrypt; struct PBEncodeItem; class MMKV_EXPORT MiniPBCoder { const MMBuffer *m_inputBuffer = nullptr; CodedInputData *m_inputData = nullptr; CodedInputDataCrypt *m_inputDataDecrpt = nullptr; MMBuffer *m_outputBuffer = nullptr; CodedOutputData *m_outputData = nullptr; std::vector *m_encodeItems = nullptr; MiniPBCoder(); explicit MiniPBCoder(const MMBuffer *inputBuffer, AESCrypt *crypter = nullptr); ~MiniPBCoder(); void writeRootObject(); size_t prepareObjectForEncode(const MMKVVector &vec); size_t prepareObjectForEncode(const MMBuffer &buffer); template MMBuffer getEncodeData(const T &obj) { size_t index = prepareObjectForEncode(obj); return writePreparedItems(index); } MMBuffer writePreparedItems(size_t index); void decodeOneMap(MMKVMap &dic, size_t position, bool greedy); #ifndef MMKV_DISABLE_CRYPT void decodeOneMap(MMKVMapCrypt &dic, size_t position, bool greedy); #endif size_t prepareObjectForEncode(const std::string &str); size_t prepareObjectForEncode(const MMKV_STRING_CONTAINER &vector); std::vector decodeOneVector(); #ifdef MMKV_HAS_CPP20 size_t prepareObjectForEncode(const std::span &vec); size_t prepareObjectForEncode(const std::span &vec); size_t prepareObjectForEncode(const std::span &vec); size_t prepareObjectForEncode(const std::span &vec); bool decodeOneVector(std::vector &result); bool decodeOneVector(std::vector &result); bool decodeOneVector(std::vector &result); bool decodeOneVector(std::vector &result); bool decodeOneVector(std::vector &result); bool decodeOneVector(std::vector &result); bool decodeOneVector(std::vector &result); // special case for fixed size types MMBuffer getEncodeData(const std::vector &obj); MMBuffer getEncodeData(const std::span &obj); MMBuffer getEncodeData(const std::span &obj); #endif // MMKV_HAS_CPP20 #if defined(MMKV_APPLE) && defined(__OBJC__) // NSString, NSData, NSDate size_t prepareObjectForEncode(__unsafe_unretained NSObject *obj); #endif public: template static MMBuffer encodeDataWithObject(const T &obj) { MiniPBCoder pbCoder; return pbCoder.getEncodeData(obj); } // opt encoding a single MMBuffer static MMBuffer encodeDataWithObject(const MMBuffer &obj); // return empty result if there's any error static void decodeMap(MMKVMap &dic, const MMBuffer &oData, size_t position = 0); // decode as much data as possible before any error happens static void greedyDecodeMap(MMKVMap &dic, const MMBuffer &oData, size_t position = 0); #ifndef MMKV_DISABLE_CRYPT // return empty result if there's any error static void decodeMap(MMKVMapCrypt &dic, const MMBuffer &oData, AESCrypt *crypter, size_t position = 0); // decode as much data as possible before any error happens static void greedyDecodeMap(MMKVMapCrypt &dic, const MMBuffer &oData, AESCrypt *crypter, size_t position = 0); #endif // MMKV_DISABLE_CRYPT static std::vector decodeVector(const MMBuffer &oData); template static bool decodeVector(const MMBuffer &oData, std::vector &result) { MiniPBCoder oCoder(&oData); return oCoder.decodeOneVector(result); } #if defined(MMKV_APPLE) && defined(__OBJC__) // NSString, NSData, NSDate static NSObject *decodeObject(const MMBuffer &oData, Class cls); static bool isCompatibleClass(Class cls); #endif // just forbid it for possibly misuse explicit MiniPBCoder(const MiniPBCoder &other) = delete; MiniPBCoder &operator=(const MiniPBCoder &other) = delete; }; } // namespace mmkv #endif #endif //MMKV_MINIPBCODER_H