1 /*
2  * Copyright (C) 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 "net_datashare_utils.h"
17 
18 #include <vector>
19 
20 #include "net_manager_constants.h"
21 #include "net_mgr_log_wrapper.h"
22 
23 namespace OHOS {
24 namespace NetManagerStandard {
25 namespace {
26 constexpr const char *SETTINGS_DATASHARE_URI =
27     "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
28 constexpr const char *SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
29 constexpr const char *SETTINGS_DATA_COLUMN_KEYWORD = "KEYWORD";
30 constexpr const char *SETTINGS_DATA_COLUMN_VALUE = "VALUE";
31 
32 constexpr int INVALID_VALUE = -1;
33 } // namespace
34 
NetDataShareHelperUtils()35 NetDataShareHelperUtils::NetDataShareHelperUtils() {}
36 
CreateDataShareHelper()37 std::shared_ptr<DataShare::DataShareHelper> NetDataShareHelperUtils::CreateDataShareHelper()
38 {
39     sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
40     if (saManager == nullptr) {
41         NETMGR_LOG_E("NetDataShareHelperUtils GetSystemAbilityManager failed.");
42         return nullptr;
43     }
44     sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(COMM_NET_CONN_MANAGER_SYS_ABILITY_ID);
45     if (remoteObj == nullptr) {
46         NETMGR_LOG_E("NetDataShareHelperUtils GetSystemAbility Service Failed.");
47         return nullptr;
48     }
49     return DataShare::DataShareHelper::Creator(remoteObj, SETTINGS_DATASHARE_URI, SETTINGS_DATA_EXT_URI);
50 }
51 
Query(Uri & uri,const std::string & key,std::string & value)52 int32_t NetDataShareHelperUtils::Query(Uri &uri, const std::string &key, std::string &value)
53 {
54     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper();
55     if (dataShareHelper == nullptr) {
56         NETMGR_LOG_E("dataShareHelper is nullptr");
57         return NETMANAGER_ERROR;
58     }
59     DataShare::DataSharePredicates predicates;
60     std::vector<std::string> columns;
61     predicates.EqualTo(SETTINGS_DATA_COLUMN_KEYWORD, key);
62     auto result = dataShareHelper->Query(uri, predicates, columns);
63     if (result == nullptr) {
64         NETMGR_LOG_E("DataShareHelper query error, result is null");
65         dataShareHelper->Release();
66         return NETMANAGER_ERROR;
67     }
68 
69     if (result->GoToFirstRow() != DataShare::E_OK) {
70         result->Close();
71         dataShareHelper->Release();
72         return NETMANAGER_ERROR;
73     }
74 
75     int columnIndex;
76     result->GetColumnIndex(SETTINGS_DATA_COLUMN_VALUE, columnIndex);
77     result->GetString(columnIndex, value);
78     result->Close();
79     dataShareHelper->Release();
80     NETMGR_LOG_I("DataShareHelper query success,value[%{public}s]", value.c_str());
81     return NETMANAGER_SUCCESS;
82 }
83 
Insert(Uri & uri,const std::string & key,const std::string & value)84 int32_t NetDataShareHelperUtils::Insert(Uri &uri, const std::string &key, const std::string &value)
85 {
86     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper();
87     if (dataShareHelper == nullptr) {
88         NETMGR_LOG_E("dataShareHelper is nullptr");
89         return NETMANAGER_ERROR;
90     }
91     DataShare::DataShareValuesBucket valuesBucket;
92     DataShare::DataShareValueObject keyObj(key);
93     DataShare::DataShareValueObject valueObj(value);
94     valuesBucket.Put(SETTINGS_DATA_COLUMN_KEYWORD, keyObj);
95     valuesBucket.Put(SETTINGS_DATA_COLUMN_VALUE, valueObj);
96     int32_t result = dataShareHelper->Insert(uri, valuesBucket);
97     if (result == INVALID_VALUE) {
98         NETMGR_LOG_E("DataShareHelper insert failed, insert result:%{public}d", result);
99         dataShareHelper->Release();
100         return NETMANAGER_ERROR;
101     }
102     dataShareHelper->NotifyChange(uri);
103     dataShareHelper->Release();
104     NETMGR_LOG_I("DataShareHelper insert success");
105     return NETMANAGER_SUCCESS;
106 }
107 
Update(Uri & uri,const std::string & key,const std::string & value)108 int32_t NetDataShareHelperUtils::Update(Uri &uri, const std::string &key, const std::string &value)
109 {
110     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper();
111     if (dataShareHelper == nullptr) {
112         NETMGR_LOG_E("dataShareHelper is nullptr");
113         return NETMANAGER_ERROR;
114     }
115     std::string queryValue;
116     int32_t ret = Query(uri, key, queryValue);
117     if (ret == NETMANAGER_ERROR) {
118         dataShareHelper->Release();
119         return Insert(uri, key, value);
120     }
121 
122     DataShare::DataShareValuesBucket valuesBucket;
123     DataShare::DataShareValueObject valueObj(value);
124     valuesBucket.Put(SETTINGS_DATA_COLUMN_VALUE, valueObj);
125     DataShare::DataSharePredicates predicates;
126     predicates.EqualTo(SETTINGS_DATA_COLUMN_KEYWORD, key);
127     int32_t result = dataShareHelper->Update(uri, predicates, valuesBucket);
128     if (result == INVALID_VALUE) {
129         dataShareHelper->Release();
130         return NETMANAGER_ERROR;
131     }
132     dataShareHelper->NotifyChange(uri);
133     dataShareHelper->Release();
134     NETMGR_LOG_I("DataShareHelper update success");
135     return NETMANAGER_SUCCESS;
136 }
137 } // namespace NetManagerStandard
138 } // namespace OHOS
139