Line data Source code
1 : /* 2 : * 3 : * Copyright (c) 2022 Project CHIP Authors 4 : * 5 : * Licensed under the Apache License, Version 2.0 (the "License"); 6 : * you may not use this file except in compliance with the License. 7 : * You may obtain a copy of the License at 8 : * 9 : * http://www.apache.org/licenses/LICENSE-2.0 10 : * 11 : * Unless required by applicable law or agreed to in writing, software 12 : * distributed under the License is distributed on an "AS IS" BASIS, 13 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 : * See the License for the specific language governing permissions and 15 : * limitations under the License. 16 : */ 17 : 18 : #pragma once 19 : 20 : #include <cstdint> 21 : 22 : #include <lib/core/CHIPError.h> 23 : #include <lib/core/CHIPPersistentStorageDelegate.h> 24 : #include <lib/support/CodeUtils.h> 25 : #include <lib/support/SafeInt.h> 26 : #include <platform/KeyValueStoreManager.h> 27 : 28 : namespace chip { 29 : 30 : // Sample version of PersistentStorageDelegate that relies only on a KeyValueStoreManager 31 : class KvsPersistentStorageDelegate : public PersistentStorageDelegate 32 : { 33 : public: 34 : KvsPersistentStorageDelegate() = default; 35 1 : virtual ~KvsPersistentStorageDelegate() = default; 36 : 37 : // No copy, move or assignment. 38 : KvsPersistentStorageDelegate(const KvsPersistentStorageDelegate &) = delete; 39 : KvsPersistentStorageDelegate(const KvsPersistentStorageDelegate &&) = delete; 40 : KvsPersistentStorageDelegate & operator=(const KvsPersistentStorageDelegate &) = delete; 41 : 42 : CHIP_ERROR Init(DeviceLayer::PersistedStorage::KeyValueStoreManager * kvsManager) 43 : { 44 : if (kvsManager == nullptr) 45 : { 46 : return CHIP_ERROR_INVALID_ARGUMENT; 47 : } 48 : mKvsManager = kvsManager; 49 : 50 : return CHIP_NO_ERROR; 51 : } 52 : 53 55 : CHIP_ERROR SyncGetKeyValue(const char * key, void * buffer, uint16_t & size) override 54 : { 55 55 : VerifyOrReturnError(mKvsManager != nullptr, CHIP_ERROR_INCORRECT_STATE); 56 : 57 55 : uint8_t emptyPlaceholder = 0; 58 55 : if (buffer == nullptr) 59 : { 60 0 : if (size != 0) 61 : { 62 0 : return CHIP_ERROR_INVALID_ARGUMENT; 63 : } 64 : 65 : // When size is zero, let's give a non-nullptr to the KVS backend 66 0 : buffer = &emptyPlaceholder; 67 : } 68 : 69 55 : size_t bytesRead = 0; 70 55 : CHIP_ERROR err = mKvsManager->Get(key, buffer, size, &bytesRead); 71 : 72 : // Update size only if it made sense 73 55 : if ((CHIP_ERROR_BUFFER_TOO_SMALL == err) || (CHIP_NO_ERROR == err)) 74 : { 75 0 : size = CanCastTo<uint16_t>(bytesRead) ? static_cast<uint16_t>(bytesRead) : 0; 76 : } 77 : 78 55 : return err; 79 : } 80 : 81 5 : CHIP_ERROR SyncSetKeyValue(const char * key, const void * value, uint16_t size) override 82 : { 83 5 : VerifyOrReturnError(mKvsManager != nullptr, CHIP_ERROR_INCORRECT_STATE); 84 : 85 5 : uint8_t placeholderForEmpty = 0; 86 5 : if (value == nullptr) 87 : { 88 0 : if (size == 0) 89 : { 90 0 : value = &placeholderForEmpty; 91 : } 92 : else 93 : { 94 0 : return CHIP_ERROR_INVALID_ARGUMENT; 95 : } 96 : } 97 5 : return mKvsManager->Put(key, value, size); 98 : } 99 : 100 0 : CHIP_ERROR SyncDeleteKeyValue(const char * key) override 101 : { 102 0 : VerifyOrReturnError(mKvsManager != nullptr, CHIP_ERROR_INCORRECT_STATE); 103 0 : return mKvsManager->Delete(key); 104 : } 105 : 106 : protected: 107 : DeviceLayer::PersistedStorage::KeyValueStoreManager * mKvsManager = nullptr; 108 : }; 109 : 110 : } // namespace chip