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_rdb_helper.h"
17 
18 #include "cellular_data_constant.h"
19 #include "core_manager_inner.h"
20 #include "telephony_log_wrapper.h"
21 
22 static constexpr const char *SIM_ID = "simId";
23 namespace OHOS {
24 namespace Telephony {
CellularDataRdbHelper()25 CellularDataRdbHelper::CellularDataRdbHelper() : cellularDataUri_(CELLULAR_DATA_RDB_SELECTION) {}
26 
27 CellularDataRdbHelper::~CellularDataRdbHelper() = default;
28 
CreateDataAbilityHelper()29 std::shared_ptr<DataShare::DataShareHelper> CellularDataRdbHelper::CreateDataAbilityHelper()
30 {
31     TELEPHONY_LOGI("Create data ability helper");
32     sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
33     if (saManager == nullptr) {
34         TELEPHONY_LOGE("GetSystemAbilityManager failed.");
35         return nullptr;
36     }
37     sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(TELEPHONY_CELLULAR_DATA_SYS_ABILITY_ID);
38     if (remoteObj == nullptr) {
39         TELEPHONY_LOGE("GetSystemAbility Service Failed.");
40         return nullptr;
41     }
42     return DataShare::DataShareHelper::Creator(remoteObj, CELLULAR_DATA_RDB_URI);
43 }
44 
Update(const DataShare::DataShareValuesBucket & value,const DataShare::DataSharePredicates & predicates)45 int CellularDataRdbHelper::Update(
46     const DataShare::DataShareValuesBucket &value, const DataShare::DataSharePredicates &predicates)
47 {
48     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataAbilityHelper();
49     if (dataShareHelper == nullptr) {
50         TELEPHONY_LOGE("dataShareHelper is null");
51         return NULL_POINTER_EXCEPTION;
52     }
53     TELEPHONY_LOGI("Cellular data RDB helper update");
54     int32_t result = dataShareHelper->Update(cellularDataUri_, predicates, value);
55     dataShareHelper->Release();
56     return result;
57 }
58 
Insert(const DataShare::DataShareValuesBucket & values)59 int CellularDataRdbHelper::Insert(const DataShare::DataShareValuesBucket &values)
60 {
61     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataAbilityHelper();
62     if (dataShareHelper == nullptr) {
63         TELEPHONY_LOGE("dataShareHelper is null");
64         return NULL_POINTER_EXCEPTION;
65     }
66     TELEPHONY_LOGI("Cellular data RDB helper insert");
67     int32_t result = dataShareHelper->Insert(cellularDataUri_, values);
68     dataShareHelper->Release();
69     return result;
70 }
71 
ResetApns(int32_t slotId)72 bool CellularDataRdbHelper::ResetApns(int32_t slotId)
73 {
74     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataAbilityHelper();
75     if (dataShareHelper == nullptr) {
76         TELEPHONY_LOGE("dataShareHelper is null");
77         return false;
78     }
79     TELEPHONY_LOGI("Reset apns");
80     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId);
81     Uri resetApnUri(CELLULAR_DATA_RDB_RESET);
82     DataShare::DataSharePredicates predicates;
83     DataShare::DataShareValuesBucket values;
84     values.Put(SIM_ID, simId);
85     int32_t result = dataShareHelper->Update(resetApnUri, predicates, values);
86     dataShareHelper->Release();
87     return result >= 0;
88 }
89 
QueryApns(const std::string & mcc,const std::string & mnc,std::vector<PdpProfile> & apnVec,int32_t slotId)90 bool CellularDataRdbHelper::QueryApns(
91     const std::string &mcc, const std::string &mnc, std::vector<PdpProfile> &apnVec, int32_t slotId)
92 {
93     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataAbilityHelper();
94     if (dataShareHelper == nullptr) {
95         TELEPHONY_LOGE("dataShareHelper is null");
96         return false;
97     }
98     std::vector<std::string> columns;
99     DataShare::DataSharePredicates predicates;
100     predicates.EqualTo(PdpProfileData::MCCMNC, mcc + mnc);
101     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId);
102     Uri cellularDataUri(std::string(CELLULAR_DATA_RDB_SELECTION) + "?Proxy=true&simId=" + std::to_string(simId));
103     std::shared_ptr<DataShare::DataShareResultSet> result =
104         dataShareHelper->Query(cellularDataUri, predicates, columns);
105     if (result == nullptr) {
106         TELEPHONY_LOGE("query apns error");
107         dataShareHelper->Release();
108         return false;
109     }
110     ReadApnResult(result, apnVec);
111     result->Close();
112     dataShareHelper->Release();
113     return true;
114 }
115 
QueryMvnoApnsByType(const std::string & mcc,const std::string & mnc,const std::string & mvnoType,const std::string & mvnoDataFromSim,std::vector<PdpProfile> & mvnoApnVec,int32_t slotId)116 bool CellularDataRdbHelper::QueryMvnoApnsByType(const std::string &mcc, const std::string &mnc,
117     const std::string &mvnoType, const std::string &mvnoDataFromSim, std::vector<PdpProfile> &mvnoApnVec,
118     int32_t slotId)
119 {
120     if (mvnoDataFromSim.empty()) {
121         TELEPHONY_LOGE("mvnoDataFromSim is empty!");
122         return true;
123     }
124     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataAbilityHelper();
125     if (dataShareHelper == nullptr) {
126         TELEPHONY_LOGE("dataShareHelper is null");
127         return false;
128     }
129     std::vector<std::string> columns;
130     DataShare::DataSharePredicates predicates;
131     predicates.EqualTo(PdpProfileData::MVNO_TYPE, mvnoType)
132         ->EqualTo(PdpProfileData::MCCMNC, mcc + mnc);
133     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId);
134     Uri cellularDataUri(std::string(CELLULAR_DATA_RDB_SELECTION) + "?Proxy=true&simId=" + std::to_string(simId));
135     std::shared_ptr<DataShare::DataShareResultSet> result =
136         dataShareHelper->Query(cellularDataUri, predicates, columns);
137     if (result == nullptr) {
138         TELEPHONY_LOGE("Query apns error");
139         dataShareHelper->Release();
140         return false;
141     }
142     ReadMvnoApnResult(result, mvnoDataFromSim, mvnoApnVec);
143     result->Close();
144     dataShareHelper->Release();
145     return true;
146 }
147 
QueryPreferApn(int32_t slotId,std::vector<PdpProfile> & apnVec)148 bool CellularDataRdbHelper::QueryPreferApn(int32_t slotId, std::vector<PdpProfile> &apnVec)
149 {
150     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataAbilityHelper();
151     if (dataShareHelper == nullptr) {
152         TELEPHONY_LOGE("dataShareHelper is null");
153         return false;
154     }
155     std::vector<std::string> columns;
156     DataShare::DataSharePredicates predicates;
157     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId);
158     Uri preferApnUri(std::string(CELLULAR_DATA_RDB_PREFER) + "?Proxy=true&simId=" + std::to_string(simId));
159     std::shared_ptr<DataShare::DataShareResultSet> result = dataShareHelper->Query(preferApnUri, predicates, columns);
160     if (result == nullptr) {
161         TELEPHONY_LOGE("query prefer apns error");
162         dataShareHelper->Release();
163         return false;
164     }
165     ReadApnResult(result, apnVec);
166     result->Close();
167     dataShareHelper->Release();
168     if (apnVec.size() > 0) {
169         return true;
170     }
171     return false;
172 }
173 
ReadApnResult(const std::shared_ptr<DataShare::DataShareResultSet> & result,std::vector<PdpProfile> & apnVec)174 void CellularDataRdbHelper::ReadApnResult(
175     const std::shared_ptr<DataShare::DataShareResultSet> &result, std::vector<PdpProfile> &apnVec)
176 {
177     if (result == nullptr) {
178         TELEPHONY_LOGI("result is nullptr");
179         return;
180     }
181     int rowCnt = 0;
182     result->GetRowCount(rowCnt);
183     TELEPHONY_LOGI("query apns rowCnt = %{public}d", rowCnt);
184     for (int i = 0; i < rowCnt; ++i) {
185         PdpProfile apnBean;
186         MakePdpProfile(result, i, apnBean);
187         if (apnBean.mvnoType.empty()) {
188             apnVec.push_back(apnBean);
189         }
190     }
191 }
192 
ReadMvnoApnResult(const std::shared_ptr<DataShare::DataShareResultSet> & result,const std::string & mvnoDataFromSim,std::vector<PdpProfile> & apnVec)193 void CellularDataRdbHelper::ReadMvnoApnResult(const std::shared_ptr<DataShare::DataShareResultSet> &result,
194     const std::string &mvnoDataFromSim, std::vector<PdpProfile> &apnVec)
195 {
196     if (result == nullptr) {
197         TELEPHONY_LOGI("result is nullptr");
198         return;
199     }
200     int rowCnt = 0;
201     result->GetRowCount(rowCnt);
202     TELEPHONY_LOGI("query mvno apns rowCnt = %{public}d", rowCnt);
203     for (int i = 0; i < rowCnt; ++i) {
204         PdpProfile apnBean;
205         MakePdpProfile(result, i, apnBean);
206         if (IsMvnoDataMatched(mvnoDataFromSim, apnBean)) {
207             apnVec.push_back(apnBean);
208         }
209     }
210 }
211 
MakePdpProfile(const std::shared_ptr<DataShare::DataShareResultSet> & result,int i,PdpProfile & apnBean)212 void CellularDataRdbHelper::MakePdpProfile(
213     const std::shared_ptr<DataShare::DataShareResultSet> &result, int i, PdpProfile &apnBean)
214 {
215     int index = 0;
216     result->GoToRow(i);
217     result->GetColumnIndex(PdpProfileData::PROFILE_ID, index);
218     result->GetInt(index, apnBean.profileId);
219     result->GetColumnIndex(PdpProfileData::PROFILE_NAME, index);
220     result->GetString(index, apnBean.profileName);
221     result->GetColumnIndex(PdpProfileData::MCC, index);
222     result->GetString(index, apnBean.mcc);
223     result->GetColumnIndex(PdpProfileData::MNC, index);
224     result->GetString(index, apnBean.mnc);
225     result->GetColumnIndex(PdpProfileData::APN, index);
226     result->GetString(index, apnBean.apn);
227     result->GetColumnIndex(PdpProfileData::AUTH_TYPE, index);
228     result->GetInt(index, apnBean.authType);
229     result->GetColumnIndex(PdpProfileData::AUTH_USER, index);
230     result->GetString(index, apnBean.authUser);
231     result->GetColumnIndex(PdpProfileData::AUTH_PWD, index);
232     result->GetString(index, apnBean.authPwd);
233     result->GetColumnIndex(PdpProfileData::APN_TYPES, index);
234     result->GetString(index, apnBean.apnTypes);
235     result->GetColumnIndex(PdpProfileData::APN_PROTOCOL, index);
236     result->GetString(index, apnBean.pdpProtocol);
237     result->GetColumnIndex(PdpProfileData::APN_ROAM_PROTOCOL, index);
238     result->GetString(index, apnBean.roamPdpProtocol);
239     result->GetColumnIndex(PdpProfileData::MVNO_TYPE, index);
240     result->GetString(index, apnBean.mvnoType);
241     result->GetColumnIndex(PdpProfileData::MVNO_MATCH_DATA, index);
242     result->GetString(index, apnBean.mvnoMatchData);
243     result->GetColumnIndex(PdpProfileData::EDITED_STATUS, index);
244     result->GetInt(index, apnBean.edited);
245     result->GetColumnIndex(PdpProfileData::PROXY_IP_ADDRESS, index);
246     result->GetString(index, apnBean.proxyIpAddress);
247     if (apnBean.pdpProtocol.empty()) {
248         apnBean.pdpProtocol = "IP";
249     }
250     if (apnBean.roamPdpProtocol.empty()) {
251         apnBean.roamPdpProtocol = "IP";
252     }
253 }
254 
IsMvnoDataMatched(const std::string & mvnoDataFromSim,const PdpProfile & apnBean)255 bool CellularDataRdbHelper::IsMvnoDataMatched(const std::string &mvnoDataFromSim, const PdpProfile &apnBean)
256 {
257     if (mvnoDataFromSim.empty()) {
258         return false;
259     }
260     if (apnBean.mvnoType.compare(MvnoType::ICCID) == 0 ||
261         apnBean.mvnoType.compare(MvnoType::SPN) == 0 ||
262         apnBean.mvnoType.compare(MvnoType::IMSI) == 0) {
263         try {
264             return std::regex_match(mvnoDataFromSim, std::regex(apnBean.mvnoMatchData));
265         } catch (std::regex_error &e) {
266             TELEPHONY_LOGE("regex error");
267             return false;
268         }
269     }
270     if (apnBean.mvnoType.compare(MvnoType::GID1) == 0) {
271         return mvnoDataFromSim.compare(0, apnBean.mvnoMatchData.size(), apnBean.mvnoMatchData) == 0;
272     }
273     return false;
274 }
275 
RegisterObserver(const sptr<AAFwk::IDataAbilityObserver> & dataObserver)276 void CellularDataRdbHelper::RegisterObserver(const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
277 {
278     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataAbilityHelper();
279     if (dataShareHelper == nullptr) {
280         TELEPHONY_LOGE("dataShareHelper is null");
281         return;
282     }
283     Uri preferApnUri(CELLULAR_DATA_RDB_PREFER);
284     Uri resetApnUri(CELLULAR_DATA_RDB_RESET);
285     Uri initApnUri(CELLULAR_DATA_RDB_INIT);
286     dataShareHelper->RegisterObserver(resetApnUri, dataObserver);
287     dataShareHelper->RegisterObserver(preferApnUri, dataObserver);
288     dataShareHelper->RegisterObserver(initApnUri, dataObserver);
289     dataShareHelper->RegisterObserver(cellularDataUri_, dataObserver);
290     dataShareHelper->Release();
291     TELEPHONY_LOGI("RegisterObserver Success");
292 }
293 
UnRegisterObserver(const sptr<AAFwk::IDataAbilityObserver> & dataObserver)294 void CellularDataRdbHelper::UnRegisterObserver(const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
295 {
296     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataAbilityHelper();
297     if (dataShareHelper == nullptr) {
298         TELEPHONY_LOGE("dataShareHelper is null");
299         return;
300     }
301     Uri preferApnUri(CELLULAR_DATA_RDB_PREFER);
302     Uri resetApnUri(CELLULAR_DATA_RDB_RESET);
303     Uri initApnUri(CELLULAR_DATA_RDB_INIT);
304     dataShareHelper->UnregisterObserver(resetApnUri, dataObserver);
305     dataShareHelper->UnregisterObserver(preferApnUri, dataObserver);
306     dataShareHelper->UnregisterObserver(initApnUri, dataObserver);
307     dataShareHelper->UnregisterObserver(cellularDataUri_, dataObserver);
308     dataShareHelper->Release();
309     TELEPHONY_LOGI("UnRegisterObserver Success");
310 }
311 } // namespace Telephony
312 } // namespace OHOS
313