| /** |
| * |
| * Copyright (c) 2020 Project CHIP Authors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * 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. |
| */ |
| |
| #import "MTRPersistentStorageDelegateBridge.h" |
| |
| #import "MTRLogging_Internal.h" |
| |
| #define LOG_DEBUG_PERSISTENT_STORAGE_DELEGATE 0 |
| |
| MTRPersistentStorageDelegateBridge::MTRPersistentStorageDelegateBridge(id<MTRStorage> delegate) |
| : mDelegate(delegate) |
| , mWorkQueue(dispatch_queue_create("com.csa.matter.framework.storage.workqueue", DISPATCH_QUEUE_SERIAL)) |
| { |
| } |
| |
| MTRPersistentStorageDelegateBridge::~MTRPersistentStorageDelegateBridge(void) {} |
| |
| CHIP_ERROR MTRPersistentStorageDelegateBridge::SyncGetKeyValue(const char * key, void * buffer, uint16_t & size) |
| { |
| if (buffer == nullptr && size != 0) { |
| return CHIP_ERROR_INVALID_ARGUMENT; |
| } |
| |
| __block CHIP_ERROR error = CHIP_NO_ERROR; |
| NSString * keyString = [NSString stringWithUTF8String:key]; |
| |
| dispatch_sync(mWorkQueue, ^{ |
| #if LOG_DEBUG_PERSISTENT_STORAGE_DELEGATE |
| MTR_LOG_DEBUG("PersistentStorageDelegate Sync Get Value for Key: %@", keyString); |
| #endif |
| |
| NSData * value = [mDelegate storageDataForKey:keyString]; |
| |
| if (value == nil) { |
| error = CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND; |
| return; |
| } |
| |
| if ([value length] > UINT16_MAX) { |
| error = CHIP_ERROR_PERSISTED_STORAGE_FAILED; |
| return; |
| } |
| |
| uint16_t valueSize = static_cast<uint16_t>([value length]); |
| if (valueSize > size) { |
| error = CHIP_ERROR_BUFFER_TOO_SMALL; |
| } else { |
| size = valueSize; |
| } |
| |
| if (size != 0) { |
| // buffer is known to be non-null here. |
| memcpy(buffer, [value bytes], size); |
| } |
| }); |
| |
| return error; |
| } |
| |
| CHIP_ERROR MTRPersistentStorageDelegateBridge::SyncSetKeyValue(const char * key, const void * value, uint16_t size) |
| { |
| if (value == nullptr && size != 0) { |
| return CHIP_ERROR_INVALID_ARGUMENT; |
| } |
| |
| NSString * keyString = [NSString stringWithUTF8String:key]; |
| NSData * valueData = (value == nullptr) ? [NSData data] : [NSData dataWithBytes:value length:size]; |
| |
| __block CHIP_ERROR error = CHIP_NO_ERROR; |
| dispatch_sync(mWorkQueue, ^{ |
| #if LOG_DEBUG_PERSISTENT_STORAGE_DELEGATE |
| MTR_LOG_DEBUG("PersistentStorageDelegate Set Key %@", keyString); |
| #endif |
| |
| if ([mDelegate setStorageData:valueData forKey:keyString] == NO) { |
| error = CHIP_ERROR_PERSISTED_STORAGE_FAILED; |
| } |
| }); |
| |
| return error; |
| } |
| |
| CHIP_ERROR MTRPersistentStorageDelegateBridge::SyncDeleteKeyValue(const char * key) |
| { |
| NSString * keyString = [NSString stringWithUTF8String:key]; |
| |
| __block CHIP_ERROR error = CHIP_NO_ERROR; |
| dispatch_sync(mWorkQueue, ^{ |
| #if LOG_DEBUG_PERSISTENT_STORAGE_DELEGATE |
| MTR_LOG_DEBUG("PersistentStorageDelegate Delete Key: %@", keyString); |
| #endif |
| |
| if ([mDelegate removeStorageDataForKey:keyString] == NO) { |
| error = CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND; |
| } |
| }); |
| |
| return error; |
| } |