1 /*
2 * Copyright (C) 2021-2023 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
16 #include <vector>
17 #include "iremote_stub.h"
18 #include "wifi_datashare_utils.h"
19 #ifdef HAS_ACCOUNT_PART
20 #include "os_account_manager.h"
21 #endif
22 #include "wifi_log.h"
23 #include "wifi_logger.h"
24
25 DEFINE_WIFILOG_LABEL("WifiDataShareHelperUtils");
26
27 namespace OHOS {
28 namespace Wifi {
29 namespace {
30 constexpr const char *SETTINGS_DATASHARE_URI =
31 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
32 constexpr const char *SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
33 constexpr const char *SETTINGS_DATA_COLUMN_KEYWORD = "KEYWORD";
34 constexpr const char *SETTINGS_DATA_COLUMN_VALUE = "VALUE";
35 }
36
WifiCreateDataShareHelper(bool onlySettingsData)37 std::shared_ptr<DataShare::DataShareHelper> WifiDataShareHelperUtils::WifiCreateDataShareHelper(bool onlySettingsData)
38 {
39 auto remote = sptr<IWifiDataShareRemoteBroker>(new (std::nothrow) IRemoteStub<IWifiDataShareRemoteBroker>());
40 if (remote == nullptr) {
41 WIFI_LOGE("%{public}s remote is nullptr", __func__);
42 return nullptr;
43 }
44 auto remoteObj = remote->AsObject();
45 if (remoteObj == nullptr) {
46 WIFI_LOGE("%{public}s remoteObj_ is nullptr", __func__);
47 return nullptr;
48 }
49 if (onlySettingsData) {
50 return DataShare::DataShareHelper::Creator(remoteObj, SETTINGS_DATA_EXT_URI);
51 }
52 return DataShare::DataShareHelper::Creator(remoteObj, SETTINGS_DATASHARE_URI, SETTINGS_DATA_EXT_URI);
53 }
54
Query(Uri & uri,const std::string & key,std::string & value,bool onlySettingsData)55 ErrCode WifiDataShareHelperUtils::Query(Uri &uri, const std::string &key, std::string &value, bool onlySettingsData)
56 {
57 std::shared_ptr<DataShare::DataShareHelper> queryHelper = WifiCreateDataShareHelper(onlySettingsData);
58 CHECK_NULL_AND_RETURN(queryHelper, WIFI_OPT_FAILED);
59
60 DataShare::DataSharePredicates predicates;
61 std::vector<std::string> columns;
62 predicates.EqualTo(SETTINGS_DATA_COLUMN_KEYWORD, key);
63 auto result = queryHelper->Query(uri, predicates, columns);
64 if (result == nullptr) {
65 WIFI_LOGE("WifiDataShareHelper query error, result is null");
66 ClearResources(queryHelper, result);
67 return WIFI_OPT_FAILED;
68 }
69
70 if (result->GoToFirstRow() != DataShare::E_OK) {
71 WIFI_LOGE("WifiDataShareHelper query failed,go to first row error");
72 ClearResources(queryHelper, result);
73 return WIFI_OPT_FAILED;
74 }
75
76 int columnIndex;
77 result->GetColumnIndex(SETTINGS_DATA_COLUMN_VALUE, columnIndex);
78 result->GetString(columnIndex, value);
79 ClearResources(queryHelper, result);
80 WIFI_LOGI("WifiDataShareHelper query success,value[%{public}s]", value.c_str());
81 return WIFI_OPT_SUCCESS;
82 }
83
Insert(Uri & uri,const std::string & key,const std::string & value)84 ErrCode WifiDataShareHelperUtils::Insert(Uri &uri, const std::string &key, const std::string &value)
85 {
86 std::shared_ptr<DataShare::DataShareHelper> insertHelper = WifiCreateDataShareHelper();
87 CHECK_NULL_AND_RETURN(insertHelper, WIFI_OPT_FAILED);
88
89 DataShare::DataShareValuesBucket valuesBucket;
90 DataShare::DataShareValueObject keyObj(key);
91 DataShare::DataShareValueObject valueObj(value);
92 valuesBucket.Put(SETTINGS_DATA_COLUMN_KEYWORD, keyObj);
93 valuesBucket.Put(SETTINGS_DATA_COLUMN_VALUE, valueObj);
94 int result = insertHelper->Insert(uri, valuesBucket);
95 if (result <= 0) {
96 WIFI_LOGE("WifiDataShareHelper insert failed, resultCode=%{public}d", result);
97 ClearResources(insertHelper, nullptr);
98 return WIFI_OPT_FAILED;
99 }
100 insertHelper->NotifyChange(uri);
101 ClearResources(insertHelper, nullptr);
102 WIFI_LOGE("DataShareHelper insert success");
103 return WIFI_OPT_SUCCESS;
104 }
105
Update(Uri & uri,const std::string & key,const std::string & value)106 ErrCode WifiDataShareHelperUtils::Update(Uri &uri, const std::string &key, const std::string &value)
107 {
108 std::shared_ptr<DataShare::DataShareHelper> updateHelper = WifiCreateDataShareHelper();
109 CHECK_NULL_AND_RETURN(updateHelper, WIFI_OPT_FAILED);
110
111 DataShare::DataShareValuesBucket valuesBucket;
112 DataShare::DataShareValueObject valueObj(value);
113 valuesBucket.Put(SETTINGS_DATA_COLUMN_VALUE, valueObj);
114 DataShare::DataSharePredicates predicates;
115 predicates.EqualTo(SETTINGS_DATA_COLUMN_KEYWORD, key);
116 int result = updateHelper->Update(uri, predicates, valuesBucket);
117 if (result <= 0) {
118 WIFI_LOGE("WifiDataShareHelper update failed, resultCode=%{public}d", result);
119 ClearResources(updateHelper, nullptr);
120 return WIFI_OPT_FAILED;
121 }
122 updateHelper->NotifyChange(uri);
123 ClearResources(updateHelper, nullptr);
124 WIFI_LOGE("DataShareHelper update success");
125 return WIFI_OPT_SUCCESS;
126 }
127
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & observer)128 ErrCode WifiDataShareHelperUtils::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &observer)
129 {
130 std::shared_ptr<DataShare::DataShareHelper> registerHelper = WifiCreateDataShareHelper();
131 CHECK_NULL_AND_RETURN(registerHelper, WIFI_OPT_FAILED);
132 CHECK_NULL_AND_RETURN(observer, WIFI_OPT_FAILED);
133 registerHelper->RegisterObserver(uri, observer);
134 ClearResources(registerHelper, nullptr);
135 return WIFI_OPT_SUCCESS;
136 }
137
UnRegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & observer)138 ErrCode WifiDataShareHelperUtils::UnRegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &observer)
139 {
140 std::shared_ptr<DataShare::DataShareHelper> unregisterHelper = WifiCreateDataShareHelper();
141 CHECK_NULL_AND_RETURN(unregisterHelper, WIFI_OPT_FAILED);
142 CHECK_NULL_AND_RETURN(observer, WIFI_OPT_FAILED);
143 unregisterHelper->UnregisterObserver(uri, observer);
144 ClearResources(unregisterHelper, nullptr);
145 return WIFI_OPT_SUCCESS;
146 }
147
GetLoactionDataShareUri()148 std::string WifiDataShareHelperUtils::GetLoactionDataShareUri()
149 {
150 std::vector<int> accountIds;
151 #ifdef HAS_ACCOUNT_PART
152 OHOS::AccountSA::OsAccountManager::QueryActiveOsAccountIds(accountIds);
153 #endif
154 std::string userId = "100";
155 if (!accountIds.empty()) {
156 userId = std::to_string(accountIds[0]);
157 }
158
159 std::string uri = "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_"
160 + userId + "?Proxy=true&key=location_enable";
161 return uri;
162 }
163
ClearResources(std::shared_ptr<DataShare::DataShareHelper> operatrPtr,std::shared_ptr<DataShare::DataShareResultSet> result)164 void WifiDataShareHelperUtils::ClearResources(std::shared_ptr<DataShare::DataShareHelper> operatrPtr,
165 std::shared_ptr<DataShare::DataShareResultSet> result)
166 {
167 if (result != nullptr) {
168 result->Close();
169 result = nullptr;
170 }
171 if (operatrPtr != nullptr) {
172 operatrPtr->Release();
173 operatrPtr = nullptr;
174 }
175 }
176 } // namespace Wifi
177 } // namespace OHOS