1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "datashare_delegate.h"
16
17 #include "iservice_registry.h"
18 #include "pasteboard_error.h"
19 #include "pasteboard_hilog.h"
20
21 #if defined(PB_VIXL_ENABLE)
22 #include "src/utils-vixl.h"
23 #endif
24
25 namespace OHOS::MiscServices {
26 const constexpr char *SETTING_COLUMN_KEYWORD = "KEYWORD";
27 const constexpr char *SETTING_COLUMN_VALUE = "VALUE";
28 const constexpr char *SETTING_URI_PROXY_PREFIX = "datashare:///com.ohos.settingsdata/entry/settingsdata/"
29 "USER_SETTINGSDATA_SECURE_";
30 const constexpr char *SETTING_URI_PROXY_SUFFIX = "?Proxy=true";
31 constexpr const char *SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
32 constexpr const int32_t PASTEBOARD_SA_ID = 3701;
33
34 std::mutex DataShareDelegate::mutex_;
35 sptr<IRemoteObject> DataShareDelegate::remoteObj_ = nullptr;
36 DataShareDelegate *DataShareDelegate::instance_ = nullptr;
GetInstance()37 DataShareDelegate &DataShareDelegate::GetInstance()
38 {
39 if (instance_ == nullptr) {
40 std::lock_guard<std::mutex> lock(mutex_);
41 if (instance_ == nullptr) {
42 instance_ = new DataShareDelegate();
43 Initialize();
44 }
45 }
46 return *instance_;
47 }
48
Initialize()49 void DataShareDelegate::Initialize()
50 {
51 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
52 if (samgr == nullptr) {
53 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "get sa manager return nullptr");
54 return;
55 }
56 auto remoteObj = samgr->GetSystemAbility(PASTEBOARD_SA_ID);
57 if (remoteObj == nullptr) {
58 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "get system ability failed, id=%{public}d", PASTEBOARD_SA_ID);
59 return;
60 }
61 remoteObj_ = remoteObj;
62 }
63
CreateDataShareHelper()64 std::shared_ptr<DataShare::DataShareHelper> DataShareDelegate::CreateDataShareHelper()
65 {
66 auto SETTING_URI_PROXY = std::string(SETTING_URI_PROXY_PREFIX) + userId_ + std::string(SETTING_URI_PROXY_SUFFIX);
67 auto [ret, helper] = DataShare::DataShareHelper::Create(remoteObj_, SETTING_URI_PROXY, SETTINGS_DATA_EXT_URI);
68 if (ret != 0) {
69 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "create helper failed ret %{public}d", ret);
70 return nullptr;
71 }
72 return helper;
73 }
74
SetUserId(int32_t userId)75 void DataShareDelegate::SetUserId(int32_t userId)
76 {
77 this->userId_ = std::to_string(userId);
78 }
79
ReleaseDataShareHelper(std::shared_ptr<DataShare::DataShareHelper> helper)80 bool DataShareDelegate::ReleaseDataShareHelper(std::shared_ptr<DataShare::DataShareHelper> helper)
81 {
82 if (helper == nullptr) {
83 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "helper is nullptr");
84 return false;
85 }
86 if (!helper->Release()) {
87 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "release helper fail");
88 return false;
89 }
90 return true;
91 }
92
GetValue(const std::string & key,std::string & value)93 int32_t DataShareDelegate::GetValue(const std::string &key, std::string &value)
94 {
95 auto helper = CreateDataShareHelper();
96 if (helper == nullptr) {
97 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "helper is nullptr");
98 return static_cast<int32_t>(PasteboardError::CREATE_DATASHARE_SERVICE_ERROR);
99 }
100 std::vector<std::string> columns = { SETTING_COLUMN_VALUE };
101 DataShare::DataSharePredicates predicates;
102 predicates.EqualTo(SETTING_COLUMN_KEYWORD, key);
103 Uri uri = MakeUri(key);
104 auto resultSet = helper->Query(uri, predicates, columns);
105 ReleaseDataShareHelper(helper);
106 if (resultSet == nullptr) {
107 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Query failed key=%{public}s", key.c_str());
108 return static_cast<int32_t>(PasteboardError::INVALID_RETURN_VALUE_ERROR);
109 }
110 int32_t count;
111 resultSet->GetRowCount(count);
112 if (count == 0) {
113 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "no value, key=%{public}s", key.c_str());
114 resultSet->Close();
115 return static_cast<int32_t>(PasteboardError::QUERY_SETTING_NO_DATA_ERROR);
116 }
117 int32_t index = 0;
118 resultSet->GoToRow(index);
119 int32_t ret = resultSet->GetString(index, value);
120 if (ret != DataShare::E_OK) {
121 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "get value failed, ret=%{public}d", ret);
122 resultSet->Close();
123 return ret;
124 }
125 resultSet->Close();
126 return static_cast<int32_t>(PasteboardError::E_OK);
127 }
128
MakeUri(const std::string & key)129 Uri DataShareDelegate::MakeUri(const std::string &key)
130 {
131 Uri uri(std::string(SETTING_URI_PROXY_PREFIX) + userId_ + std::string(SETTING_URI_PROXY_SUFFIX) + "&key=" + key);
132 return uri;
133 }
134
RegisterObserver(const std::string & key,sptr<AAFwk::IDataAbilityObserver> observer)135 int32_t DataShareDelegate::RegisterObserver(const std::string &key, sptr<AAFwk::IDataAbilityObserver> observer)
136 {
137 auto uri = MakeUri(key);
138 auto helper = CreateDataShareHelper();
139 if (helper == nullptr) {
140 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "helper is nullptr");
141 return ERR_NO_INIT;
142 }
143 helper->RegisterObserver(uri, observer);
144 ReleaseDataShareHelper(helper);
145 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "register observer %{public}s", uri.ToString().c_str());
146 return ERR_OK;
147 }
148
UnregisterObserver(const std::string & key,sptr<AAFwk::IDataAbilityObserver> observer)149 int32_t DataShareDelegate::UnregisterObserver(const std::string &key, sptr<AAFwk::IDataAbilityObserver> observer)
150 {
151 auto uri = MakeUri(key);
152 auto helper = CreateDataShareHelper();
153 if (helper == nullptr) {
154 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "helper is nullptr");
155 return ERR_NO_INIT;
156 }
157 helper->UnregisterObserver(uri, observer);
158 ReleaseDataShareHelper(helper);
159 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "unregister observer %{public}s", uri.ToString().c_str());
160 return ERR_OK;
161 }
162 } // namespace OHOS::MiscServices