• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
GetInstance()34 DataShareDelegate &DataShareDelegate::GetInstance()
35 {
36     static DataShareDelegate instance;
37     return instance;
38 }
39 
GetSystemAbilitySafe(int32_t saId)40 sptr<IRemoteObject> GetSystemAbilitySafe(int32_t saId)
41 {
42     auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
43     return samgr ? samgr->GetSystemAbility(saId) : nullptr;
44 }
45 
CreateDataShareHelper()46 std::shared_ptr<DataShare::DataShareHelper> DataShareDelegate::CreateDataShareHelper()
47 {
48     auto SETTING_URI_PROXY = std::string(SETTING_URI_PROXY_PREFIX) + userId_ + std::string(SETTING_URI_PROXY_SUFFIX);
49     auto remoteObj = GetSystemAbilitySafe(PASTEBOARD_SA_ID);
50     if (!remoteObj) {
51         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "get sa manager return nullptr");
52         return nullptr;
53     }
54 
55     auto [ret, helper] = DataShare::DataShareHelper::Create(remoteObj, SETTING_URI_PROXY, SETTINGS_DATA_EXT_URI);
56     remoteObj = nullptr;
57     return helper;
58 }
59 
SetUserId(int32_t userId)60 void DataShareDelegate::SetUserId(int32_t userId)
61 {
62     this->userId_ = std::to_string(userId);
63 }
64 
ReleaseDataShareHelper(std::shared_ptr<DataShare::DataShareHelper> helper)65 bool DataShareDelegate::ReleaseDataShareHelper(std::shared_ptr<DataShare::DataShareHelper> helper)
66 {
67     if (helper == nullptr) {
68         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "helper is nullptr");
69         return false;
70     }
71     if (!helper->Release()) {
72         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "release helper fail");
73         return false;
74     }
75     return true;
76 }
77 
GetValue(const std::string & key,std::string & value)78 int32_t DataShareDelegate::GetValue(const std::string &key, std::string &value)
79 {
80     auto helper = CreateDataShareHelper();
81     if (helper == nullptr) {
82         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "helper is nullptr");
83         return static_cast<int32_t>(PasteboardError::CREATE_DATASHARE_SERVICE_ERROR);
84     }
85     std::vector<std::string> columns = { SETTING_COLUMN_VALUE };
86     DataShare::DataSharePredicates predicates;
87     predicates.EqualTo(SETTING_COLUMN_KEYWORD, key);
88     Uri uri = MakeUri(key);
89     auto resultSet = helper->Query(uri, predicates, columns);
90     ReleaseDataShareHelper(helper);
91     if (resultSet == nullptr) {
92         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "Query failed key=%{public}s", key.c_str());
93         return static_cast<int32_t>(PasteboardError::INVALID_RETURN_VALUE_ERROR);
94     }
95     int32_t count;
96     resultSet->GetRowCount(count);
97     if (count == 0) {
98         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "no value, key=%{public}s", key.c_str());
99         resultSet->Close();
100         return static_cast<int32_t>(PasteboardError::QUERY_SETTING_NO_DATA_ERROR);
101     }
102     int32_t index = 0;
103     resultSet->GoToRow(index);
104     int32_t ret = resultSet->GetString(index, value);
105     if (ret != DataShare::E_OK) {
106         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "get value failed, ret=%{public}d", ret);
107         resultSet->Close();
108         return ret;
109     }
110     resultSet->Close();
111     return static_cast<int32_t>(PasteboardError::E_OK);
112 }
113 
MakeUri(const std::string & key)114 Uri DataShareDelegate::MakeUri(const std::string &key)
115 {
116     Uri uri(std::string(SETTING_URI_PROXY_PREFIX) + userId_ + std::string(SETTING_URI_PROXY_SUFFIX) + "&key=" + key);
117     return uri;
118 }
119 
RegisterObserver(const std::string & key,sptr<AAFwk::IDataAbilityObserver> observer)120 int32_t DataShareDelegate::RegisterObserver(const std::string &key, sptr<AAFwk::IDataAbilityObserver> observer)
121 {
122     auto uri = MakeUri(key);
123     auto helper = CreateDataShareHelper();
124     if (helper == nullptr) {
125         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "helper is nullptr");
126         return ERR_NO_INIT;
127     }
128     helper->RegisterObserver(uri, observer);
129     ReleaseDataShareHelper(helper);
130     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "register observer %{public}s", uri.ToString().c_str());
131     return ERR_OK;
132 }
133 
UnregisterObserver(const std::string & key,sptr<AAFwk::IDataAbilityObserver> observer)134 int32_t DataShareDelegate::UnregisterObserver(const std::string &key, sptr<AAFwk::IDataAbilityObserver> observer)
135 {
136     auto uri = MakeUri(key);
137     auto helper = CreateDataShareHelper();
138     if (helper == nullptr) {
139         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_SERVICE, "helper is nullptr");
140         return ERR_NO_INIT;
141     }
142     helper->UnregisterObserver(uri, observer);
143     ReleaseDataShareHelper(helper);
144     PASTEBOARD_HILOGI(PASTEBOARD_MODULE_SERVICE, "unregister observer %{public}s", uri.ToString().c_str());
145     return ERR_OK;
146 }
147 } // namespace OHOS::MiscServices