• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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