You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
5.6 KiB
167 lines
5.6 KiB
/*
|
|
* Copyright 2019 The Android Open Source Project
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#define LOG_TAG "bt_shim_storage"
|
|
|
|
#include <algorithm>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <memory>
|
|
|
|
#include "gd/os/log.h"
|
|
#include "gd/storage/config_cache_helper.h"
|
|
#include "gd/storage/storage_module.h"
|
|
#include "main/shim/config.h"
|
|
#include "main/shim/entry.h"
|
|
|
|
using ::bluetooth::shim::GetStorage;
|
|
using ::bluetooth::storage::ConfigCacheHelper;
|
|
|
|
namespace bluetooth {
|
|
namespace shim {
|
|
|
|
bool BtifConfigInterface::HasSection(const std::string& section) {
|
|
return GetStorage()->GetConfigCache()->HasSection(section);
|
|
}
|
|
|
|
bool BtifConfigInterface::HasProperty(const std::string& section,
|
|
const std::string& property) {
|
|
return GetStorage()->GetConfigCache()->HasProperty(section, property);
|
|
}
|
|
|
|
bool BtifConfigInterface::GetInt(const std::string& section,
|
|
const std::string& property, int* value) {
|
|
ASSERT(value != nullptr);
|
|
auto ret = ConfigCacheHelper::FromConfigCache(*GetStorage()->GetConfigCache())
|
|
.GetInt(section, property);
|
|
if (ret) {
|
|
*value = *ret;
|
|
}
|
|
return ret.has_value();
|
|
}
|
|
|
|
bool BtifConfigInterface::SetInt(const std::string& section,
|
|
const std::string& property, int value) {
|
|
ConfigCacheHelper::FromConfigCache(*GetStorage()->GetConfigCache())
|
|
.SetInt(section, property, value);
|
|
return true;
|
|
}
|
|
|
|
bool BtifConfigInterface::GetUint64(const std::string& section,
|
|
const std::string& property,
|
|
uint64_t* value) {
|
|
ASSERT(value != nullptr);
|
|
auto ret = ConfigCacheHelper::FromConfigCache(*GetStorage()->GetConfigCache())
|
|
.GetUint64(section, property);
|
|
if (ret) {
|
|
*value = *ret;
|
|
}
|
|
return ret.has_value();
|
|
}
|
|
|
|
bool BtifConfigInterface::SetUint64(const std::string& section,
|
|
const std::string& property,
|
|
uint64_t value) {
|
|
ConfigCacheHelper::FromConfigCache(*GetStorage()->GetConfigCache())
|
|
.SetUint64(section, property, value);
|
|
return true;
|
|
}
|
|
|
|
bool BtifConfigInterface::GetStr(const std::string& section,
|
|
const std::string& property, char* value,
|
|
int* size_bytes) {
|
|
ASSERT(value != nullptr);
|
|
ASSERT(size_bytes != nullptr);
|
|
auto str = GetStorage()->GetConfigCache()->GetProperty(section, property);
|
|
if (!str) {
|
|
return false;
|
|
}
|
|
if (*size_bytes == 0) {
|
|
return true;
|
|
}
|
|
// std::string::copy does not null-terminate resultant string by default
|
|
// avoided using strlcpy to prevent extra dependency
|
|
*size_bytes = str->copy(value, (*size_bytes - 1));
|
|
value[*size_bytes] = '\0';
|
|
*size_bytes += 1;
|
|
return true;
|
|
}
|
|
|
|
std::optional<std::string> BtifConfigInterface::GetStr(
|
|
const std::string& section, const std::string& property) {
|
|
return GetStorage()->GetConfigCache()->GetProperty(section, property);
|
|
}
|
|
|
|
bool BtifConfigInterface::SetStr(const std::string& section,
|
|
const std::string& property,
|
|
const std::string& value) {
|
|
GetStorage()->GetConfigCache()->SetProperty(section, property, value);
|
|
return true;
|
|
}
|
|
|
|
// TODO: implement encrypted read
|
|
bool BtifConfigInterface::GetBin(const std::string& section,
|
|
const std::string& property, uint8_t* value,
|
|
size_t* length) {
|
|
ASSERT(value != nullptr);
|
|
ASSERT(length != nullptr);
|
|
auto value_vec =
|
|
ConfigCacheHelper::FromConfigCache(*GetStorage()->GetConfigCache())
|
|
.GetBin(section, property);
|
|
if (!value_vec) {
|
|
return false;
|
|
}
|
|
*length = std::min(value_vec->size(), *length);
|
|
std::memcpy(value, value_vec->data(), *length);
|
|
return true;
|
|
}
|
|
size_t BtifConfigInterface::GetBinLength(const std::string& section,
|
|
const std::string& property) {
|
|
auto value_vec =
|
|
ConfigCacheHelper::FromConfigCache(*GetStorage()->GetConfigCache())
|
|
.GetBin(section, property);
|
|
if (!value_vec) {
|
|
return 0;
|
|
}
|
|
return value_vec->size();
|
|
}
|
|
bool BtifConfigInterface::SetBin(const std::string& section,
|
|
const std::string& property,
|
|
const uint8_t* value, size_t length) {
|
|
ASSERT(value != nullptr);
|
|
std::vector<uint8_t> value_vec(value, value + length);
|
|
ConfigCacheHelper::FromConfigCache(*GetStorage()->GetConfigCache())
|
|
.SetBin(section, property, value_vec);
|
|
return true;
|
|
}
|
|
bool BtifConfigInterface::RemoveProperty(const std::string& section,
|
|
const std::string& property) {
|
|
return GetStorage()->GetConfigCache()->RemoveProperty(section, property);
|
|
}
|
|
|
|
std::vector<std::string> BtifConfigInterface::GetPersistentDevices() {
|
|
return GetStorage()->GetConfigCache()->GetPersistentSections();
|
|
}
|
|
|
|
void BtifConfigInterface::Save() { GetStorage()->SaveDelayed(); }
|
|
|
|
void BtifConfigInterface::Flush() { GetStorage()->SaveImmediately(); }
|
|
|
|
void BtifConfigInterface::Clear() { GetStorage()->GetConfigCache()->Clear(); }
|
|
|
|
} // namespace shim
|
|
} // namespace bluetooth
|