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