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
23namespace OHOS {
24namespace NetManagerStandard {
25namespace {
26constexpr const char *SETTINGS_DATASHARE_URI =
27    "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
28constexpr const char *SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
29constexpr const char *SETTINGS_DATA_COLUMN_KEYWORD = "KEYWORD";
30constexpr const char *SETTINGS_DATA_COLUMN_VALUE = "VALUE";
31
32constexpr int INVALID_VALUE = -1;
33} // namespace
34
35NetDataShareHelperUtils::NetDataShareHelperUtils() {}
36
37std::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
52int32_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
84int32_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
108int32_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