1 /*
2 * Copyright (C) 2021 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 "cellular_data_settings_rdb_helper.h"
17
18 #include "cellular_data_constant.h"
19 #include "cellular_data_error.h"
20 #include "cellular_data_hisysevent.h"
21 #include "telephony_log_wrapper.h"
22
23 namespace OHOS {
24 namespace Telephony {
25 static constexpr const int32_t E_ERROR = -1;
26
CellularDataSettingsRdbHelper()27 CellularDataSettingsRdbHelper::CellularDataSettingsRdbHelper() {}
28
~CellularDataSettingsRdbHelper()29 CellularDataSettingsRdbHelper::~CellularDataSettingsRdbHelper() {}
30
CreateDataShareHelper()31 std::shared_ptr<DataShare::DataShareHelper> CellularDataSettingsRdbHelper::CreateDataShareHelper()
32 {
33 sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
34 if (saManager == nullptr) {
35 TELEPHONY_LOGE("CellularDataRdbHelper GetSystemAbilityManager failed.");
36 return nullptr;
37 }
38 sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(TELEPHONY_CELLULAR_DATA_SYS_ABILITY_ID);
39 if (remoteObj == nullptr) {
40 TELEPHONY_LOGE("CellularDataRdbHelper GetSystemAbility Service Failed.");
41 return nullptr;
42 }
43 sptr<IRemoteObject> distributedData = saManager->GetSystemAbility(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
44 if (distributedData == nullptr) {
45 TELEPHONY_LOGE("CellularDataRdbHelper: distributedData is not started.");
46 return nullptr;
47 }
48 auto [ret, helper] =
49 DataShare::DataShareHelper::Create(remoteObj, CELLULAR_DATA_SETTING_URI, CELLULAR_DATA_SETTING_EXT_URI);
50 if (ret == DataShare::E_OK) {
51 return helper;
52 } else if (ret == DataShare::E_DATA_SHARE_NOT_READY) {
53 TELEPHONY_LOGE("CellularDataRdbHelper: datashare not ready.");
54 return nullptr;
55 } else {
56 TELEPHONY_LOGE("CellularDataRdbHelper: create datashare fail, ret = %{public}d.", ret);
57 return nullptr;
58 }
59 }
60
UnRegisterSettingsObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)61 void CellularDataSettingsRdbHelper::UnRegisterSettingsObserver(
62 const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
63 {
64 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
65 if (settingHelper == nullptr) {
66 TELEPHONY_LOGE("UnRegister settings observer failed by nullptr");
67 return;
68 }
69 settingHelper->UnregisterObserver(uri, dataObserver);
70 settingHelper->Release();
71 TELEPHONY_LOGE("UnRegisterSettingsObserver success");
72 }
73
RegisterSettingsObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)74 void CellularDataSettingsRdbHelper::RegisterSettingsObserver(
75 const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
76 {
77 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
78 if (settingHelper == nullptr) {
79 TELEPHONY_LOGE("Register settings observer by nullptr");
80 return;
81 }
82 settingHelper->RegisterObserver(uri, dataObserver);
83 settingHelper->Release();
84 TELEPHONY_LOGE("RegisterSettingsObserver success");
85 }
86
NotifyChange(const Uri & uri)87 void CellularDataSettingsRdbHelper::NotifyChange(const Uri &uri)
88 {
89 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
90 if (settingHelper == nullptr) {
91 TELEPHONY_LOGE("notify settings changed fail by nullptr");
92 return;
93 }
94 settingHelper->NotifyChange(uri);
95 settingHelper->Release();
96 }
97
GetValue(Uri & uri,const std::string & column,int32_t & value)98 int32_t CellularDataSettingsRdbHelper::GetValue(Uri &uri, const std::string &column, int32_t &value)
99 {
100 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
101 if (settingHelper == nullptr) {
102 TELEPHONY_LOGE("helper_ is null");
103 return TELEPHONY_ERR_LOCAL_PTR_NULL;
104 }
105 DataShare::DataSharePredicates predicates;
106 std::vector<std::string> columns;
107 predicates.EqualTo(CELLULAR_DATA_COLUMN_KEYWORD, column);
108 auto result = settingHelper->Query(uri, predicates, columns);
109 if (result == nullptr) {
110 TELEPHONY_LOGE("setting DB: query error");
111 settingHelper->Release();
112 return TELEPHONY_ERR_DATABASE_READ_FAIL;
113 }
114 result->GoToFirstRow();
115 int32_t columnIndex;
116 std::string resultValue;
117 result->GetColumnIndex(CELLULAR_DATA_COLUMN_VALUE, columnIndex);
118 result->GetString(columnIndex, resultValue);
119 result->Close();
120 settingHelper->Release();
121 TELEPHONY_LOGD("Query end resultValue is %{public}s", resultValue.c_str());
122 if (resultValue.empty()) {
123 TELEPHONY_LOGE("resultValue is empty");
124 return TELEPHONY_ERR_DATABASE_READ_FAIL;
125 }
126 value = atoi(resultValue.c_str());
127 return TELEPHONY_ERR_SUCCESS;
128 }
129
PutValue(Uri & uri,const std::string & column,int value)130 int32_t CellularDataSettingsRdbHelper::PutValue(Uri &uri, const std::string &column, int value)
131 {
132 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
133 if (settingHelper == nullptr) {
134 TELEPHONY_LOGE("helper_ is null");
135 return TELEPHONY_ERR_LOCAL_PTR_NULL;
136 }
137 int32_t existValue = 0;
138 int32_t getValueRet = GetValue(uri, column, existValue);
139 DataShare::DataShareValueObject keyObj(column);
140 DataShare::DataShareValueObject valueObj(std::to_string(value));
141 DataShare::DataShareValuesBucket bucket;
142 bucket.Put(CELLULAR_DATA_COLUMN_VALUE, valueObj);
143 bucket.Put(CELLULAR_DATA_COLUMN_KEYWORD, keyObj);
144 int32_t result;
145 if (getValueRet != TELEPHONY_ERR_SUCCESS) {
146 result = settingHelper->Insert(uri, bucket);
147 } else {
148 DataShare::DataSharePredicates predicates;
149 predicates.EqualTo(CELLULAR_DATA_COLUMN_KEYWORD, column);
150 result = settingHelper->Update(uri, predicates, bucket);
151 }
152 TELEPHONY_LOGI("put value return %{public}d", result);
153 if (result == E_ERROR) {
154 Uri userDataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
155 Uri userDataRoamingUri(CELLULAR_DATA_SETTING_DATA_ROAMING_URI);
156 if (uri == userDataEnableUri) {
157 CellularDataHiSysEvent::WriteDataActivateFaultEvent(INVALID_PARAMETER, value,
158 CellularDataErrorCode::DATA_ERROR_DATABASE_WRITE_ERROR,
159 "SetCellularDataEnable " + std::to_string(value) + " fail");
160 } else if (uri == userDataRoamingUri) {
161 CellularDataHiSysEvent::WriteDataActivateFaultEvent(INVALID_PARAMETER, value,
162 CellularDataErrorCode::DATA_ERROR_DATABASE_WRITE_ERROR,
163 "SetUserDataRoamingOn " + std::to_string(value) + " fail");
164 } else {
165 TELEPHONY_LOGI("result is %{public}d, do not handle.", result);
166 }
167 settingHelper->Release();
168 return TELEPHONY_ERR_DATABASE_WRITE_FAIL;
169 }
170 settingHelper->NotifyChange(uri);
171 settingHelper->Release();
172 return TELEPHONY_ERR_SUCCESS;
173 }
174 } // namespace Telephony
175 } // namespace OHOS
176