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