• 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 
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