1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "setting_datashare.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include <thread> 19c29fa5a6Sopenharmony_ci 20c29fa5a6Sopenharmony_ci#include "datashare_predicates.h" 21c29fa5a6Sopenharmony_ci#include "datashare_result_set.h" 22c29fa5a6Sopenharmony_ci#include "datashare_values_bucket.h" 23c29fa5a6Sopenharmony_ci#include "ipc_skeleton.h" 24c29fa5a6Sopenharmony_ci#include "iservice_registry.h" 25c29fa5a6Sopenharmony_ci#include "mmi_log.h" 26c29fa5a6Sopenharmony_ci#include "rdb_errno.h" 27c29fa5a6Sopenharmony_ci#include "result_set.h" 28c29fa5a6Sopenharmony_ci#include "system_ability_definition.h" 29c29fa5a6Sopenharmony_ci#include "uri.h" 30c29fa5a6Sopenharmony_ci 31c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN 32c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_HANDLER 33c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG 34c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "setting_DataShare" 35c29fa5a6Sopenharmony_ci 36c29fa5a6Sopenharmony_cinamespace OHOS { 37c29fa5a6Sopenharmony_cinamespace MMI { 38c29fa5a6Sopenharmony_cistd::shared_ptr<SettingDataShare> SettingDataShare::instance_ = nullptr; 39c29fa5a6Sopenharmony_cistd::mutex SettingDataShare::mutex_; 40c29fa5a6Sopenharmony_cisptr<IRemoteObject> SettingDataShare::remoteObj_; 41c29fa5a6Sopenharmony_cinamespace { 42c29fa5a6Sopenharmony_ciconst std::string SETTING_COLUMN_KEYWORD { "KEYWORD" }; 43c29fa5a6Sopenharmony_ciconst std::string SETTING_COLUMN_VALUE { "VALUE" }; 44c29fa5a6Sopenharmony_ciconst std::string SETTING_URI_PROXY { "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true" }; 45c29fa5a6Sopenharmony_ciconst std::string SETTING_URI_USER_PROXY { 46c29fa5a6Sopenharmony_ci "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_SECURE_100?Proxy=true" }; 47c29fa5a6Sopenharmony_ciconst std::string SETTINGS_DATA_EXT_URI { "datashare:///com.ohos.settingsdata.DataAbility" }; 48c29fa5a6Sopenharmony_ciconstexpr int32_t DECIMAL_BASE { 10 }; 49c29fa5a6Sopenharmony_ciconstexpr const int32_t E_OK{ 0 }; 50c29fa5a6Sopenharmony_ciconstexpr const int32_t E_DATA_SHARE_NOT_READY { 1055 }; 51c29fa5a6Sopenharmony_ci} // namespace 52c29fa5a6Sopenharmony_ci 53c29fa5a6Sopenharmony_ciSettingDataShare::~SettingDataShare() {} 54c29fa5a6Sopenharmony_ci 55c29fa5a6Sopenharmony_ciSettingDataShare& SettingDataShare::GetInstance(int32_t systemAbilityId) 56c29fa5a6Sopenharmony_ci{ 57c29fa5a6Sopenharmony_ci if (instance_ == nullptr) { 58c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 59c29fa5a6Sopenharmony_ci if (instance_ == nullptr) { 60c29fa5a6Sopenharmony_ci instance_ = std::make_shared<SettingDataShare>(); 61c29fa5a6Sopenharmony_ci } 62c29fa5a6Sopenharmony_ci } 63c29fa5a6Sopenharmony_ci return *instance_; 64c29fa5a6Sopenharmony_ci} 65c29fa5a6Sopenharmony_ci 66c29fa5a6Sopenharmony_ciErrCode SettingDataShare::GetIntValue(const std::string& key, int32_t& value, const std::string &strUri) 67c29fa5a6Sopenharmony_ci{ 68c29fa5a6Sopenharmony_ci int64_t valueLong; 69c29fa5a6Sopenharmony_ci ErrCode ret = GetLongValue(key, valueLong, strUri); 70c29fa5a6Sopenharmony_ci if (ret != ERR_OK) { 71c29fa5a6Sopenharmony_ci MMI_HILOGE("Get int value fail"); 72c29fa5a6Sopenharmony_ci return ret; 73c29fa5a6Sopenharmony_ci } 74c29fa5a6Sopenharmony_ci value = static_cast<int32_t>(valueLong); 75c29fa5a6Sopenharmony_ci return ERR_OK; 76c29fa5a6Sopenharmony_ci} 77c29fa5a6Sopenharmony_ci 78c29fa5a6Sopenharmony_ciErrCode SettingDataShare::GetLongValue(const std::string& key, int64_t& value, const std::string &strUri) 79c29fa5a6Sopenharmony_ci{ 80c29fa5a6Sopenharmony_ci std::string valueStr; 81c29fa5a6Sopenharmony_ci ErrCode ret = GetStringValue(key, valueStr, strUri); 82c29fa5a6Sopenharmony_ci if (ret == ERR_NAME_NOT_FOUND) { 83c29fa5a6Sopenharmony_ci MMI_HILOGW("Not found this property"); 84c29fa5a6Sopenharmony_ci return ERR_OK; 85c29fa5a6Sopenharmony_ci } 86c29fa5a6Sopenharmony_ci if (ret != ERR_OK) { 87c29fa5a6Sopenharmony_ci MMI_HILOGE("Get long value fail, ret:%{public}d", ret); 88c29fa5a6Sopenharmony_ci return ret; 89c29fa5a6Sopenharmony_ci } 90c29fa5a6Sopenharmony_ci value = static_cast<int64_t>(strtoll(valueStr.c_str(), nullptr, DECIMAL_BASE)); 91c29fa5a6Sopenharmony_ci return ERR_OK; 92c29fa5a6Sopenharmony_ci} 93c29fa5a6Sopenharmony_ci 94c29fa5a6Sopenharmony_ciErrCode SettingDataShare::GetBoolValue(const std::string& key, bool& value, const std::string &strUri) 95c29fa5a6Sopenharmony_ci{ 96c29fa5a6Sopenharmony_ci std::string valueStr; 97c29fa5a6Sopenharmony_ci ErrCode ret = GetStringValue(key, valueStr, strUri); 98c29fa5a6Sopenharmony_ci if (ret == ERR_NAME_NOT_FOUND) { 99c29fa5a6Sopenharmony_ci MMI_HILOGW("Not found this property"); 100c29fa5a6Sopenharmony_ci return ERR_OK; 101c29fa5a6Sopenharmony_ci } 102c29fa5a6Sopenharmony_ci if (ret != ERR_OK) { 103c29fa5a6Sopenharmony_ci MMI_HILOGE("Get bool value fail, ret:%{public}d", ret); 104c29fa5a6Sopenharmony_ci return ret; 105c29fa5a6Sopenharmony_ci } 106c29fa5a6Sopenharmony_ci value = ((valueStr == "true") || (valueStr == "1")); 107c29fa5a6Sopenharmony_ci return ERR_OK; 108c29fa5a6Sopenharmony_ci} 109c29fa5a6Sopenharmony_ci 110c29fa5a6Sopenharmony_ciErrCode SettingDataShare::PutIntValue( 111c29fa5a6Sopenharmony_ci const std::string& key, int32_t value, bool needNotify, const std::string &strUri) 112c29fa5a6Sopenharmony_ci{ 113c29fa5a6Sopenharmony_ci return PutStringValue(key, std::to_string(value), needNotify, strUri); 114c29fa5a6Sopenharmony_ci} 115c29fa5a6Sopenharmony_ci 116c29fa5a6Sopenharmony_ciErrCode SettingDataShare::PutLongValue( 117c29fa5a6Sopenharmony_ci const std::string& key, int64_t value, bool needNotify, const std::string &strUri) 118c29fa5a6Sopenharmony_ci{ 119c29fa5a6Sopenharmony_ci return PutStringValue(key, std::to_string(value), needNotify, strUri); 120c29fa5a6Sopenharmony_ci} 121c29fa5a6Sopenharmony_ci 122c29fa5a6Sopenharmony_ciErrCode SettingDataShare::PutBoolValue( 123c29fa5a6Sopenharmony_ci const std::string& key, bool value, bool needNotify, const std::string &strUri) 124c29fa5a6Sopenharmony_ci{ 125c29fa5a6Sopenharmony_ci std::string valueStr = value ? "true" : "false"; 126c29fa5a6Sopenharmony_ci return PutStringValue(key, valueStr, needNotify, strUri); 127c29fa5a6Sopenharmony_ci} 128c29fa5a6Sopenharmony_ci 129c29fa5a6Sopenharmony_cibool SettingDataShare::IsValidKey(const std::string& key, const std::string &strUri) 130c29fa5a6Sopenharmony_ci{ 131c29fa5a6Sopenharmony_ci std::string value; 132c29fa5a6Sopenharmony_ci ErrCode ret = GetStringValue(key, value, strUri); 133c29fa5a6Sopenharmony_ci return (ret != ERR_NAME_NOT_FOUND) && (!value.empty()); 134c29fa5a6Sopenharmony_ci} 135c29fa5a6Sopenharmony_ci 136c29fa5a6Sopenharmony_cisptr<SettingObserver> SettingDataShare::CreateObserver(const std::string& key, SettingObserver::UpdateFunc& func) 137c29fa5a6Sopenharmony_ci{ 138c29fa5a6Sopenharmony_ci sptr<SettingObserver> observer = new (std::nothrow) SettingObserver(); 139c29fa5a6Sopenharmony_ci CHKPP(observer); 140c29fa5a6Sopenharmony_ci observer->SetKey(key); 141c29fa5a6Sopenharmony_ci observer->SetUpdateFunc(func); 142c29fa5a6Sopenharmony_ci return observer; 143c29fa5a6Sopenharmony_ci} 144c29fa5a6Sopenharmony_ci 145c29fa5a6Sopenharmony_civoid SettingDataShare::ExecRegisterCb(const sptr<SettingObserver>& observer) 146c29fa5a6Sopenharmony_ci{ 147c29fa5a6Sopenharmony_ci CHKPV(observer); 148c29fa5a6Sopenharmony_ci observer->OnChange(); 149c29fa5a6Sopenharmony_ci} 150c29fa5a6Sopenharmony_ci 151c29fa5a6Sopenharmony_ciErrCode SettingDataShare::RegisterObserver(const sptr<SettingObserver>& observer, const std::string &strUri) 152c29fa5a6Sopenharmony_ci{ 153c29fa5a6Sopenharmony_ci if (!isDataShareReady_) { 154c29fa5a6Sopenharmony_ci MMI_HILOGI("Data share not ready!"); 155c29fa5a6Sopenharmony_ci return RET_ERR; 156c29fa5a6Sopenharmony_ci } 157c29fa5a6Sopenharmony_ci CHKPR(observer, RET_ERR); 158c29fa5a6Sopenharmony_ci std::string callingIdentity = IPCSkeleton::ResetCallingIdentity(); 159c29fa5a6Sopenharmony_ci auto uri = AssembleUri(observer->GetKey(), strUri); 160c29fa5a6Sopenharmony_ci auto helper = CreateDataShareHelper(strUri); 161c29fa5a6Sopenharmony_ci if (helper == nullptr) { 162c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 163c29fa5a6Sopenharmony_ci return ERR_NO_INIT; 164c29fa5a6Sopenharmony_ci } 165c29fa5a6Sopenharmony_ci helper->RegisterObserver(uri, observer); 166c29fa5a6Sopenharmony_ci helper->NotifyChange(uri); 167c29fa5a6Sopenharmony_ci std::thread execCb([this, observer] { this->ExecRegisterCb(observer); }); 168c29fa5a6Sopenharmony_ci execCb.detach(); 169c29fa5a6Sopenharmony_ci ReleaseDataShareHelper(helper); 170c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 171c29fa5a6Sopenharmony_ci return ERR_OK; 172c29fa5a6Sopenharmony_ci} 173c29fa5a6Sopenharmony_ci 174c29fa5a6Sopenharmony_ciErrCode SettingDataShare::UnregisterObserver(const sptr<SettingObserver>& observer, const std::string &strUri) 175c29fa5a6Sopenharmony_ci{ 176c29fa5a6Sopenharmony_ci if (!isDataShareReady_) { 177c29fa5a6Sopenharmony_ci MMI_HILOGI("Data share not ready!"); 178c29fa5a6Sopenharmony_ci return RET_ERR; 179c29fa5a6Sopenharmony_ci } 180c29fa5a6Sopenharmony_ci CHKPR(observer, RET_ERR); 181c29fa5a6Sopenharmony_ci std::string callingIdentity = IPCSkeleton::ResetCallingIdentity(); 182c29fa5a6Sopenharmony_ci auto uri = AssembleUri(observer->GetKey(), strUri); 183c29fa5a6Sopenharmony_ci auto helper = CreateDataShareHelper(strUri); 184c29fa5a6Sopenharmony_ci if (helper == nullptr) { 185c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 186c29fa5a6Sopenharmony_ci return ERR_NO_INIT; 187c29fa5a6Sopenharmony_ci } 188c29fa5a6Sopenharmony_ci helper->UnregisterObserver(uri, observer); 189c29fa5a6Sopenharmony_ci ReleaseDataShareHelper(helper); 190c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 191c29fa5a6Sopenharmony_ci return ERR_OK; 192c29fa5a6Sopenharmony_ci} 193c29fa5a6Sopenharmony_ci 194c29fa5a6Sopenharmony_ciErrCode SettingDataShare::GetStringValue(const std::string& key, std::string& value, const std::string &strUri) 195c29fa5a6Sopenharmony_ci{ 196c29fa5a6Sopenharmony_ci if (!isDataShareReady_) { 197c29fa5a6Sopenharmony_ci MMI_HILOGI("Data share not ready!"); 198c29fa5a6Sopenharmony_ci return RET_ERR; 199c29fa5a6Sopenharmony_ci } 200c29fa5a6Sopenharmony_ci std::string callingIdentity = IPCSkeleton::ResetCallingIdentity(); 201c29fa5a6Sopenharmony_ci auto helper = CreateDataShareHelper(strUri); 202c29fa5a6Sopenharmony_ci if (helper == nullptr) { 203c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 204c29fa5a6Sopenharmony_ci return ERR_NO_INIT; 205c29fa5a6Sopenharmony_ci } 206c29fa5a6Sopenharmony_ci std::vector<std::string> columns = {SETTING_COLUMN_VALUE}; 207c29fa5a6Sopenharmony_ci DataShare::DataSharePredicates predicates; 208c29fa5a6Sopenharmony_ci predicates.EqualTo(SETTING_COLUMN_KEYWORD, key); 209c29fa5a6Sopenharmony_ci Uri uri(AssembleUri(key, strUri)); 210c29fa5a6Sopenharmony_ci auto resultSet = helper->Query(uri, predicates, columns); 211c29fa5a6Sopenharmony_ci ReleaseDataShareHelper(helper); 212c29fa5a6Sopenharmony_ci if (resultSet == nullptr) { 213c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 214c29fa5a6Sopenharmony_ci return ERR_INVALID_OPERATION; 215c29fa5a6Sopenharmony_ci } 216c29fa5a6Sopenharmony_ci int32_t count = 0; 217c29fa5a6Sopenharmony_ci resultSet->GetRowCount(count); 218c29fa5a6Sopenharmony_ci if (count == 0) { 219c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 220c29fa5a6Sopenharmony_ci return ERR_NAME_NOT_FOUND; 221c29fa5a6Sopenharmony_ci } 222c29fa5a6Sopenharmony_ci const int32_t tmpRow = 0; 223c29fa5a6Sopenharmony_ci resultSet->GoToRow(tmpRow); 224c29fa5a6Sopenharmony_ci int32_t ret = resultSet->GetString(tmpRow, value); 225c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 226c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 227c29fa5a6Sopenharmony_ci return ERR_INVALID_VALUE; 228c29fa5a6Sopenharmony_ci } 229c29fa5a6Sopenharmony_ci resultSet->Close(); 230c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 231c29fa5a6Sopenharmony_ci return ERR_OK; 232c29fa5a6Sopenharmony_ci} 233c29fa5a6Sopenharmony_ci 234c29fa5a6Sopenharmony_ciErrCode SettingDataShare::PutStringValue( 235c29fa5a6Sopenharmony_ci const std::string& key, const std::string& value, bool needNotify, const std::string &strUri) 236c29fa5a6Sopenharmony_ci{ 237c29fa5a6Sopenharmony_ci if (!isDataShareReady_) { 238c29fa5a6Sopenharmony_ci MMI_HILOGI("Data share not ready!"); 239c29fa5a6Sopenharmony_ci return RET_ERR; 240c29fa5a6Sopenharmony_ci } 241c29fa5a6Sopenharmony_ci std::string callingIdentity = IPCSkeleton::ResetCallingIdentity(); 242c29fa5a6Sopenharmony_ci auto helper = CreateDataShareHelper(strUri); 243c29fa5a6Sopenharmony_ci if (helper == nullptr) { 244c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 245c29fa5a6Sopenharmony_ci return ERR_NO_INIT; 246c29fa5a6Sopenharmony_ci } 247c29fa5a6Sopenharmony_ci DataShare::DataShareValueObject keyObj(key); 248c29fa5a6Sopenharmony_ci DataShare::DataShareValueObject valueObj(value); 249c29fa5a6Sopenharmony_ci DataShare::DataShareValuesBucket bucket; 250c29fa5a6Sopenharmony_ci bucket.Put(SETTING_COLUMN_KEYWORD, keyObj); 251c29fa5a6Sopenharmony_ci bucket.Put(SETTING_COLUMN_VALUE, valueObj); 252c29fa5a6Sopenharmony_ci DataShare::DataSharePredicates predicates; 253c29fa5a6Sopenharmony_ci predicates.EqualTo(SETTING_COLUMN_KEYWORD, key); 254c29fa5a6Sopenharmony_ci Uri uri(AssembleUri(key, strUri)); 255c29fa5a6Sopenharmony_ci if (helper->Update(uri, predicates, bucket) <= 0) { 256c29fa5a6Sopenharmony_ci helper->Insert(uri, bucket); 257c29fa5a6Sopenharmony_ci } 258c29fa5a6Sopenharmony_ci if (needNotify) { 259c29fa5a6Sopenharmony_ci helper->NotifyChange(AssembleUri(key, strUri)); 260c29fa5a6Sopenharmony_ci } 261c29fa5a6Sopenharmony_ci ReleaseDataShareHelper(helper); 262c29fa5a6Sopenharmony_ci IPCSkeleton::SetCallingIdentity(callingIdentity); 263c29fa5a6Sopenharmony_ci return ERR_OK; 264c29fa5a6Sopenharmony_ci} 265c29fa5a6Sopenharmony_ci 266c29fa5a6Sopenharmony_cistd::shared_ptr<DataShare::DataShareHelper> SettingDataShare::CreateDataShareHelper(const std::string &strUri) 267c29fa5a6Sopenharmony_ci{ 268c29fa5a6Sopenharmony_ci if (remoteObj_ == nullptr) { 269c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 270c29fa5a6Sopenharmony_ci if (remoteObj_ == nullptr) { 271c29fa5a6Sopenharmony_ci auto sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 272c29fa5a6Sopenharmony_ci CHKPP(sam); 273c29fa5a6Sopenharmony_ci remoteObj_ = sam->CheckSystemAbility(MULTIMODAL_INPUT_SERVICE_ID); 274c29fa5a6Sopenharmony_ci } 275c29fa5a6Sopenharmony_ci } 276c29fa5a6Sopenharmony_ci std::pair<int, std::shared_ptr<DataShare::DataShareHelper>> ret; 277c29fa5a6Sopenharmony_ci if (strUri.empty()) { 278c29fa5a6Sopenharmony_ci ret = DataShare::DataShareHelper::Create(remoteObj_, SETTING_URI_PROXY, SETTINGS_DATA_EXT_URI.c_str()); 279c29fa5a6Sopenharmony_ci } else { 280c29fa5a6Sopenharmony_ci ret = DataShare::DataShareHelper::Create(remoteObj_, strUri, ""); 281c29fa5a6Sopenharmony_ci } 282c29fa5a6Sopenharmony_ci return ret.second; 283c29fa5a6Sopenharmony_ci} 284c29fa5a6Sopenharmony_ci 285c29fa5a6Sopenharmony_cibool SettingDataShare::ReleaseDataShareHelper(std::shared_ptr<DataShare::DataShareHelper>& helper) 286c29fa5a6Sopenharmony_ci{ 287c29fa5a6Sopenharmony_ci if (!helper->Release()) { 288c29fa5a6Sopenharmony_ci return false; 289c29fa5a6Sopenharmony_ci } 290c29fa5a6Sopenharmony_ci return true; 291c29fa5a6Sopenharmony_ci} 292c29fa5a6Sopenharmony_ci 293c29fa5a6Sopenharmony_ciUri SettingDataShare::AssembleUri(const std::string& key, const std::string &strUri) 294c29fa5a6Sopenharmony_ci{ 295c29fa5a6Sopenharmony_ci if (strUri.empty()) { 296c29fa5a6Sopenharmony_ci if (key == "close_fingerprint_nav_event_key" || key == "close_fingerprint_event_key") { 297c29fa5a6Sopenharmony_ci return Uri(SETTING_URI_USER_PROXY + "&key=" + key); 298c29fa5a6Sopenharmony_ci } 299c29fa5a6Sopenharmony_ci return Uri(SETTING_URI_PROXY + "&key=" + key); 300c29fa5a6Sopenharmony_ci } else { 301c29fa5a6Sopenharmony_ci return Uri(strUri + "&key=" + key); 302c29fa5a6Sopenharmony_ci } 303c29fa5a6Sopenharmony_ci} 304c29fa5a6Sopenharmony_ci 305c29fa5a6Sopenharmony_cibool SettingDataShare::CheckIfSettingsDataReady() 306c29fa5a6Sopenharmony_ci{ 307c29fa5a6Sopenharmony_ci if (isDataShareReady_) { 308c29fa5a6Sopenharmony_ci return true; 309c29fa5a6Sopenharmony_ci } 310c29fa5a6Sopenharmony_ci if (remoteObj_ == nullptr) { 311c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 312c29fa5a6Sopenharmony_ci if (remoteObj_ == nullptr) { 313c29fa5a6Sopenharmony_ci auto sam = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 314c29fa5a6Sopenharmony_ci CHKPF(sam); 315c29fa5a6Sopenharmony_ci remoteObj_ = sam->CheckSystemAbility(MULTIMODAL_INPUT_SERVICE_ID); 316c29fa5a6Sopenharmony_ci } 317c29fa5a6Sopenharmony_ci } 318c29fa5a6Sopenharmony_ci CHKPF(remoteObj_); 319c29fa5a6Sopenharmony_ci std::pair<int, std::shared_ptr<DataShare::DataShareHelper>> ret = 320c29fa5a6Sopenharmony_ci DataShare::DataShareHelper::Create(remoteObj_, SETTING_URI_PROXY, SETTINGS_DATA_EXT_URI); 321c29fa5a6Sopenharmony_ci MMI_HILOGD("Create data_share helper, ret=%{public}d", ret.first); 322c29fa5a6Sopenharmony_ci if (ret.first == E_OK) { 323c29fa5a6Sopenharmony_ci MMI_HILOGD("Create data_share helper success"); 324c29fa5a6Sopenharmony_ci auto helper = ret.second; 325c29fa5a6Sopenharmony_ci if (helper != nullptr) { 326c29fa5a6Sopenharmony_ci bool releaseRet = helper->Release(); 327c29fa5a6Sopenharmony_ci MMI_HILOGD("Release data_share helper, releaseRet=%{public}d", releaseRet); 328c29fa5a6Sopenharmony_ci } 329c29fa5a6Sopenharmony_ci isDataShareReady_ = true; 330c29fa5a6Sopenharmony_ci return true; 331c29fa5a6Sopenharmony_ci } else if (ret.first == E_DATA_SHARE_NOT_READY) { 332c29fa5a6Sopenharmony_ci MMI_HILOGE("Create data_share helper failed"); 333c29fa5a6Sopenharmony_ci isDataShareReady_ = false; 334c29fa5a6Sopenharmony_ci return false; 335c29fa5a6Sopenharmony_ci } 336c29fa5a6Sopenharmony_ci MMI_HILOGE("data_share unknown"); 337c29fa5a6Sopenharmony_ci return true; 338c29fa5a6Sopenharmony_ci} 339c29fa5a6Sopenharmony_ci} 340c29fa5a6Sopenharmony_ci} // namespace OHOS