1 /*
2 * Copyright (C) 2021-2024 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_service.h"
17
18 #include <cinttypes>
19
20 #include "apn_manager.h"
21 #include "cellular_data_dump_helper.h"
22 #include "cellular_data_rdb_helper.h"
23 #include "cellular_data_error.h"
24 #include "cellular_data_hisysevent.h"
25 #include "cellular_data_net_agent.h"
26 #include "core_manager_inner.h"
27 #include "data_connection_monitor.h"
28 #include "net_specifier.h"
29 #include "string_ex.h"
30 #include "system_ability_definition.h"
31 #include "telephony_ext_wrapper.h"
32 #include "telephony_common_utils.h"
33 #include "telephony_log_wrapper.h"
34 #include "telephony_permission.h"
35 #include "data_service_ext_wrapper.h"
36 #include "pdp_profile_data.h"
37
38 namespace OHOS {
39 namespace Telephony {
40 using namespace NetManagerStandard;
41
42 constexpr const char *PERSIST_EDM_MOBILE_DATA_POLICY = "persist.edm.mobile_data_policy";
43 constexpr const char *MOBILE_DATA_POLICY_FORCE_OPEN = "force_open";
44 constexpr const char *MOBILE_DATA_POLICY_DISALLOW = "disallow";
45 bool g_registerResult = SystemAbility::MakeAndRegisterAbility(&DelayedRefSingleton<CellularDataService>::GetInstance());
CellularDataService()46 CellularDataService::CellularDataService()
47 : SystemAbility(TELEPHONY_CELLULAR_DATA_SYS_ABILITY_ID, true), registerToService_(false),
48 state_(ServiceRunningState::STATE_NOT_START)
49 {}
50
51 CellularDataService::~CellularDataService() = default;
52
OnStart()53 void CellularDataService::OnStart()
54 {
55 beginTime_ =
56 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
57 .count();
58 if (state_ == ServiceRunningState::STATE_RUNNING) {
59 TELEPHONY_LOGE("CellularDataService has already started.");
60 return;
61 }
62 if (!Init()) {
63 TELEPHONY_LOGE("failed to init CellularDataService");
64 return;
65 }
66 state_ = ServiceRunningState::STATE_RUNNING;
67 endTime_ =
68 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
69 .count();
70 TELEPHONY_LOGI("start service success.");
71 }
72
OnStop()73 void CellularDataService::OnStop()
74 {
75 TELEPHONY_LOGI("ready to stop service.");
76 state_ = ServiceRunningState::STATE_NOT_START;
77 registerToService_ = false;
78 UnRegisterAllNetSpecifier();
79 }
80
Dump(std::int32_t fd,const std::vector<std::u16string> & args)81 int32_t CellularDataService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
82 {
83 std::vector<std::string> argsInStr;
84 std::string result;
85 CellularDataDumpHelper dumpHelper;
86 if (fd < 0) {
87 TELEPHONY_LOGE("Dump fd invalid");
88 return TELEPHONY_ERR_FAIL;
89 }
90 for (const std::u16string &arg : args) {
91 TELEPHONY_LOGI("Dump args: %s", Str16ToStr8(arg).c_str());
92 argsInStr.emplace_back(Str16ToStr8(arg));
93 }
94 if (dumpHelper.Dump(argsInStr, result)) {
95 int32_t ret = dprintf(fd, "%s", result.c_str());
96 if (ret < 0) {
97 TELEPHONY_LOGE("dprintf to dump fd failed");
98 return TELEPHONY_ERR_FAIL;
99 }
100 return TELEPHONY_SUCCESS;
101 }
102 TELEPHONY_LOGW("dumpHelper failed");
103 return TELEPHONY_ERR_FAIL;
104 }
105
GetIntelligenceSwitchState(bool & switchState)106 int32_t CellularDataService::GetIntelligenceSwitchState(bool &switchState)
107 {
108 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
109 TELEPHONY_LOGE("Non-system applications use system APIs!");
110 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
111 }
112 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
113 int32_t slotId;
114 CellularDataService::GetDefaultCellularDataSlotId(slotId);
115 CellularDataHiSysEvent::WriteDataActivateFaultEvent(
116 slotId, switchState, CellularDataErrorCode::DATA_ERROR_PERMISSION_ERROR, Permission::SET_TELEPHONY_STATE);
117 return TELEPHONY_ERR_PERMISSION_ERR;
118 }
119 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(DEFAULT_SIM_SLOT_ID);
120 if (cellularDataController == nullptr) {
121 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", DEFAULT_SIM_SLOT_ID);
122 return TELEPHONY_ERR_LOCAL_PTR_NULL;
123 }
124 return cellularDataController->GetIntelligenceSwitchState(switchState);
125 }
126
Init()127 bool CellularDataService::Init()
128 {
129 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
130 TELEPHONY_EXT_WRAPPER.InitTelephonyExtWrapper();
131 #endif
132 #ifdef OHOS_BUILD_ENABLE_DATA_SERVICE_EXT
133 DATA_SERVICE_EXT_WRAPPER.InitDataServiceExtWrapper();
134 #endif
135 InitModule();
136 if (!registerToService_) {
137 bool ret = Publish(DelayedRefSingleton<CellularDataService>::GetInstance().AsObject());
138 if (!ret) {
139 TELEPHONY_LOGE("Publish failed!");
140 return false;
141 }
142 registerToService_ = true;
143 }
144 std::lock_guard<std::mutex> guard(mapLock_);
145 for (const std::pair<const int32_t, std::shared_ptr<CellularDataController>> &it : cellularDataControllers_) {
146 if (it.second != nullptr) {
147 it.second->AsynchronousRegister();
148 } else {
149 TELEPHONY_LOGE("CellularDataController is null");
150 }
151 }
152 isInitSuccess_ = true;
153 return true;
154 }
155
IsCellularDataEnabled(bool & dataEnabled)156 int32_t CellularDataService::IsCellularDataEnabled(bool &dataEnabled)
157 {
158 if (!TelephonyPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
159 return TELEPHONY_ERR_PERMISSION_ERR;
160 }
161 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(DEFAULT_SIM_SLOT_ID);
162 if (cellularDataController == nullptr) {
163 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", DEFAULT_SIM_SLOT_ID);
164 return TELEPHONY_ERR_LOCAL_PTR_NULL;
165 }
166 return cellularDataController->IsCellularDataEnabled(dataEnabled);
167 }
168
EnableCellularData(bool enable)169 int32_t CellularDataService::EnableCellularData(bool enable)
170 {
171 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
172 TELEPHONY_LOGE("Non-system applications use system APIs!");
173 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
174 }
175 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
176 int32_t slotId;
177 CellularDataService::GetDefaultCellularDataSlotId(slotId);
178 CellularDataHiSysEvent::WriteDataActivateFaultEvent(
179 slotId, enable, CellularDataErrorCode::DATA_ERROR_PERMISSION_ERROR, Permission::SET_TELEPHONY_STATE);
180 return TELEPHONY_ERR_PERMISSION_ERR;
181 }
182 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(DEFAULT_SIM_SLOT_ID);
183 if (cellularDataController == nullptr) {
184 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", DEFAULT_SIM_SLOT_ID);
185 return TELEPHONY_ERR_LOCAL_PTR_NULL;
186 }
187 std::string dataPolicy = system::GetParameter(PERSIST_EDM_MOBILE_DATA_POLICY, "");
188 if (dataPolicy == MOBILE_DATA_POLICY_FORCE_OPEN && !enable) {
189 TELEPHONY_LOGE("cellular data policy is force_open");
190 return TELEPHONY_ERR_POLICY_DISABLED;
191 }
192 if (dataPolicy == MOBILE_DATA_POLICY_DISALLOW && enable) {
193 TELEPHONY_LOGE("cellular data policy is disallow");
194 return TELEPHONY_ERR_POLICY_DISABLED;
195 }
196 return cellularDataController->SetCellularDataEnable(enable);
197 }
198
EnableIntelligenceSwitch(bool enable)199 int32_t CellularDataService::EnableIntelligenceSwitch(bool enable)
200 {
201 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
202 TELEPHONY_LOGE("Non-system applications use system APIs!");
203 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
204 }
205 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
206 int32_t slotId;
207 CellularDataService::GetDefaultCellularDataSlotId(slotId);
208 CellularDataHiSysEvent::WriteDataActivateFaultEvent(
209 slotId, enable, CellularDataErrorCode::DATA_ERROR_PERMISSION_ERROR, Permission::SET_TELEPHONY_STATE);
210 return TELEPHONY_ERR_PERMISSION_ERR;
211 }
212 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(DEFAULT_SIM_SLOT_ID);
213 if (cellularDataController == nullptr) {
214 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", DEFAULT_SIM_SLOT_ID);
215 return TELEPHONY_ERR_LOCAL_PTR_NULL;
216 }
217 return cellularDataController->SetIntelligenceSwitchEnable(enable);
218 }
219
GetCellularDataState(int32_t & state)220 int32_t CellularDataService::GetCellularDataState(int32_t &state)
221 {
222 int32_t slotId;
223 CellularDataService::GetDefaultCellularDataSlotId(slotId);
224 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
225 if (TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_()) {
226 TELEPHONY_LOGI("VSimEnabled slotId: %{public}d => %{public}d", slotId, CELLULAR_DATA_VSIM_SLOT_ID);
227 slotId = CELLULAR_DATA_VSIM_SLOT_ID;
228 }
229 #endif
230
231 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
232 if (cellularDataController == nullptr) {
233 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
234 return CELLULAR_DATA_INVALID_PARAM;
235 }
236 int32_t dataState = CellularDataStateAdapter(cellularDataController->GetCellularDataState());
237 DisConnectionReason reason = cellularDataController->GetDisConnectionReason();
238 if (reason == DisConnectionReason::REASON_GSM_AND_CALLING_ONLY && cellularDataController->IsRestrictedMode()) {
239 dataState = static_cast<int32_t>(DataConnectionStatus::DATA_STATE_SUSPENDED);
240 }
241 state = dataState;
242 return TELEPHONY_ERR_SUCCESS;
243 }
244
GetApnState(int32_t slotId,const std::string & apnType,int & state)245 int32_t CellularDataService::GetApnState(int32_t slotId, const std::string &apnType, int &state)
246 {
247 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
248 if (cellularDataController == nullptr) {
249 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
250 return CELLULAR_DATA_INVALID_PARAM;
251 }
252 state = static_cast<int32_t>(cellularDataController->GetCellularDataState(apnType));
253 return TELEPHONY_ERR_SUCCESS;
254 }
255
GetDataRecoveryState(int32_t & state)256 int32_t CellularDataService::GetDataRecoveryState(int32_t &state)
257 {
258 std::lock_guard<std::mutex> guard(mapLock_);
259 for (const auto &controller : cellularDataControllers_) {
260 auto cellularDataController = controller.second;
261 if (cellularDataController == nullptr) {
262 continue;
263 }
264 int32_t curState = cellularDataController->GetDataRecoveryState();
265 state = (curState > state) ? curState : state;
266 }
267 return TELEPHONY_ERR_SUCCESS;
268 }
269
IsCellularDataRoamingEnabled(const int32_t slotId,bool & dataRoamingEnabled)270 int32_t CellularDataService::IsCellularDataRoamingEnabled(const int32_t slotId, bool &dataRoamingEnabled)
271 {
272 if (!TelephonyPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
273 return TELEPHONY_ERR_PERMISSION_ERR;
274 }
275 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
276 if (cellularDataController == nullptr) {
277 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
278 return CELLULAR_DATA_INVALID_PARAM;
279 }
280 return cellularDataController->IsCellularDataRoamingEnabled(dataRoamingEnabled);
281 }
282
EnableCellularDataRoaming(const int32_t slotId,bool enable)283 int32_t CellularDataService::EnableCellularDataRoaming(const int32_t slotId, bool enable)
284 {
285 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
286 TELEPHONY_LOGE("Non-system applications use system APIs!");
287 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
288 }
289 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
290 return TELEPHONY_ERR_PERMISSION_ERR;
291 }
292 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
293 if (cellularDataController == nullptr) {
294 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
295 return TELEPHONY_ERR_SLOTID_INVALID;
296 }
297 int32_t result = cellularDataController->SetCellularDataRoamingEnabled(enable);
298 if (result == TELEPHONY_ERR_SUCCESS) {
299 CellularDataHiSysEvent::WriteRoamingConnectStateBehaviorEvent(enable);
300 }
301 return result;
302 }
303
ClearCellularDataControllers()304 void CellularDataService::ClearCellularDataControllers()
305 {
306 std::lock_guard<std::mutex> guard(mapLock_);
307 cellularDataControllers_.clear();
308 }
309
InitModule()310 void CellularDataService::InitModule()
311 {
312 CellularDataNetAgent &netAgent = CellularDataNetAgent::GetInstance();
313 netAgent.ClearNetSupplier();
314 ClearCellularDataControllers();
315 std::vector<uint64_t> netCapabilities;
316 netCapabilities.push_back(NetCap::NET_CAPABILITY_INTERNET);
317 netCapabilities.push_back(NetCap::NET_CAPABILITY_MMS);
318 netCapabilities.push_back(NetCap::NET_CAPABILITY_INTERNAL_DEFAULT);
319 netCapabilities.push_back(NetCap::NET_CAPABILITY_SUPL);
320 netCapabilities.push_back(NetCap::NET_CAPABILITY_DUN);
321 netCapabilities.push_back(NetCap::NET_CAPABILITY_IA);
322 netCapabilities.push_back(NetCap::NET_CAPABILITY_XCAP);
323 netCapabilities.push_back(NetCap::NET_CAPABILITY_BIP);
324 netCapabilities.push_back(NetCap::NET_CAPABILITY_SNSSAI1);
325 netCapabilities.push_back(NetCap::NET_CAPABILITY_SNSSAI2);
326 netCapabilities.push_back(NetCap::NET_CAPABILITY_SNSSAI3);
327 netCapabilities.push_back(NetCap::NET_CAPABILITY_SNSSAI4);
328 netCapabilities.push_back(NetCap::NET_CAPABILITY_SNSSAI5);
329 netCapabilities.push_back(NetCap::NET_CAPABILITY_SNSSAI6);
330 int32_t simNum = CoreManagerInner::GetInstance().GetMaxSimCount();
331 for (int32_t i = 0; i < simNum; ++i) {
332 AddNetSupplier(i, netAgent, netCapabilities);
333 }
334 }
335
AddCellularDataControllers(int32_t slotId,std::shared_ptr<CellularDataController> cellularDataController)336 void CellularDataService::AddCellularDataControllers(int32_t slotId,
337 std::shared_ptr<CellularDataController> cellularDataController)
338 {
339 std::lock_guard<std::mutex> guard(mapLock_);
340 cellularDataControllers_.insert(
341 std::pair<int32_t, std::shared_ptr<CellularDataController>>(slotId, cellularDataController));
342 if (slotId == CELLULAR_DATA_VSIM_SLOT_ID) {
343 // The SIM card is registered in the Init function. After the AsynchronousRegister function is invoked,
344 // the initialization is successful based on the delay message.
345 // The preceding functions need to be manually called because the VSIM initialization is delayed.
346 cellularDataController->AsynchronousRegister();
347 }
348 }
349
AddNetSupplier(int32_t slotId,CellularDataNetAgent & netAgent,std::vector<uint64_t> & netCapabilities)350 void CellularDataService::AddNetSupplier(int32_t slotId, CellularDataNetAgent &netAgent,
351 std::vector<uint64_t> &netCapabilities)
352 {
353 std::shared_ptr<CellularDataController> cellularDataController = std::make_shared<CellularDataController>(slotId);
354 if (cellularDataController == nullptr) {
355 TELEPHONY_LOGE("CellularDataService init module failed cellularDataController is null.");
356 return;
357 }
358 AddCellularDataControllers(slotId, cellularDataController);
359 for (uint64_t capability : netCapabilities) {
360 NetSupplier netSupplier = { 0 };
361 netSupplier.supplierId = 0;
362 netSupplier.slotId = slotId;
363 netSupplier.simId = INVALID_SIM_ID;
364 netSupplier.capability = capability;
365 netSupplier.regState = SUPPLIER_INVALID_REG_STATE;
366 netAgent.AddNetSupplier(netSupplier);
367 }
368 }
369
InitCellularDataController(int32_t slotId)370 int32_t CellularDataService::InitCellularDataController(int32_t slotId)
371 {
372 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
373 TELEPHONY_LOGE("permission denied!");
374 return TELEPHONY_ERR_PERMISSION_ERR;
375 }
376 if (slotId != CELLULAR_DATA_VSIM_SLOT_ID) {
377 return CELLULAR_DATA_INVALID_PARAM;
378 }
379 CellularDataNetAgent &netAgent = CellularDataNetAgent::GetInstance();
380 std::vector<uint64_t> netCapabilities;
381 netCapabilities.push_back(NetCap::NET_CAPABILITY_INTERNET);
382 netCapabilities.push_back(NetCap::NET_CAPABILITY_INTERNAL_DEFAULT);
383 AddNetSupplier(slotId, netAgent, netCapabilities);
384 return TELEPHONY_ERR_SUCCESS;
385 }
386
ReleaseNet(const NetRequest & request)387 int32_t CellularDataService::ReleaseNet(const NetRequest &request)
388 {
389 size_t identPreLen = strlen(IDENT_PREFIX);
390 if (request.ident.length() < identPreLen) {
391 return CELLULAR_DATA_INVALID_PARAM;
392 }
393 std::string requestIdent = request.ident.substr(identPreLen);
394 if (!IsValidDecValue(requestIdent)) {
395 return CELLULAR_DATA_INVALID_PARAM;
396 }
397 int32_t simId = std::stoi(requestIdent);
398 int32_t slotId = CoreManagerInner::GetInstance().GetSlotId(simId);
399 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
400 if (cellularDataController == nullptr) {
401 return CELLULAR_DATA_INVALID_PARAM;
402 }
403 bool result = cellularDataController->ReleaseNet(request);
404 return static_cast<int32_t>(result ? RequestNetCode::REQUEST_SUCCESS : RequestNetCode::REQUEST_FAILED);
405 }
406
RemoveUid(const NetRequest & request)407 int32_t CellularDataService::RemoveUid(const NetRequest &request)
408 {
409 size_t identPreLen = strlen(IDENT_PREFIX);
410 if (request.ident.length() < identPreLen) {
411 return CELLULAR_DATA_INVALID_PARAM;
412 }
413 std::string requestIdent = request.ident.substr(identPreLen);
414 if (!IsValidDecValue(requestIdent)) {
415 return CELLULAR_DATA_INVALID_PARAM;
416 }
417 int32_t simId = atoi(requestIdent.c_str());
418 int32_t slotId = CoreManagerInner::GetInstance().GetSlotId(simId);
419 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
420 if (cellularDataController == nullptr) {
421 return CELLULAR_DATA_INVALID_PARAM;
422 }
423 bool result = cellularDataController->RemoveUid(request);
424 return static_cast<int32_t>(result ? RequestNetCode::REQUEST_SUCCESS : RequestNetCode::REQUEST_FAILED);
425 }
426
AddUid(const NetRequest & request)427 int32_t CellularDataService::AddUid(const NetRequest &request)
428 {
429 size_t identPreLen = strlen(IDENT_PREFIX);
430 if (request.ident.length() < identPreLen) {
431 return CELLULAR_DATA_INVALID_PARAM;
432 }
433 std::string requestIdent = request.ident.substr(identPreLen);
434 if (!IsValidDecValue(requestIdent)) {
435 return CELLULAR_DATA_INVALID_PARAM;
436 }
437 int32_t simId = atoi(requestIdent.c_str());
438 int32_t slotId = CoreManagerInner::GetInstance().GetSlotId(simId);
439 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
440 if (cellularDataController == nullptr) {
441 return CELLULAR_DATA_INVALID_PARAM;
442 }
443 bool result = cellularDataController->AddUid(request);
444 return static_cast<int32_t>(result ? RequestNetCode::REQUEST_SUCCESS : RequestNetCode::REQUEST_FAILED);
445 }
446
RequestNet(const NetRequest & request)447 int32_t CellularDataService::RequestNet(const NetRequest &request)
448 {
449 size_t identPreLen = strlen(IDENT_PREFIX);
450 if (request.ident.length() < identPreLen) {
451 return CELLULAR_DATA_INVALID_PARAM;
452 }
453 std::string requestIdent = request.ident.substr(identPreLen);
454 if (!IsValidDecValue(requestIdent)) {
455 return CELLULAR_DATA_INVALID_PARAM;
456 }
457 int32_t simId = std::stoi(requestIdent);
458 if (TELEPHONY_EXT_WRAPPER.isCardAllowData_ &&
459 !TELEPHONY_EXT_WRAPPER.isCardAllowData_(simId, request.capability)) {
460 return static_cast<int32_t>(RequestNetCode::REQUEST_FAILED);
461 }
462 int32_t slotId = CoreManagerInner::GetInstance().GetSlotId(simId);
463 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
464 if (cellularDataController == nullptr) {
465 return CELLULAR_DATA_INVALID_PARAM;
466 }
467 bool result = cellularDataController->RequestNet(request);
468 return static_cast<int32_t>(result ? RequestNetCode::REQUEST_SUCCESS : RequestNetCode::REQUEST_FAILED);
469 }
470
DispatchEvent(const int32_t slotId,const AppExecFwk::InnerEvent::Pointer & event)471 void CellularDataService::DispatchEvent(const int32_t slotId, const AppExecFwk::InnerEvent::Pointer &event)
472 {
473 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
474 if (cellularDataController == nullptr) {
475 TELEPHONY_LOGI("dispatch event slotId invalid");
476 return;
477 }
478 cellularDataController->ProcessEvent(event);
479 }
480
UnRegisterAllNetSpecifier()481 void CellularDataService::UnRegisterAllNetSpecifier()
482 {
483 CellularDataNetAgent::GetInstance().UnregisterAllNetSupplier();
484 CellularDataNetAgent::GetInstance().UnregisterPolicyCallback();
485 }
486
HandleApnChanged(const int32_t slotId)487 int32_t CellularDataService::HandleApnChanged(const int32_t slotId)
488 {
489 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
490 TELEPHONY_LOGE("permission denied!");
491 return TELEPHONY_ERR_PERMISSION_ERR;
492 }
493 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
494 if (cellularDataController == nullptr) {
495 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
496 return CELLULAR_DATA_INVALID_PARAM;
497 }
498 bool result = cellularDataController->HandleApnChanged();
499 return result ? static_cast<int32_t>(DataRespondCode::SET_SUCCESS)
500 : static_cast<int32_t>(DataRespondCode::SET_FAILED);
501 }
502
GetDefaultCellularDataSlotId(int32_t & slotId)503 int32_t CellularDataService::GetDefaultCellularDataSlotId(int32_t &slotId)
504 {
505 slotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
506 return TELEPHONY_ERR_SUCCESS;
507 }
508
GetDefaultCellularDataSimId(int32_t & simId)509 int32_t CellularDataService::GetDefaultCellularDataSimId(int32_t &simId)
510 {
511 return CoreManagerInner::GetInstance().GetDefaultCellularDataSimId(simId);
512 }
513
SetDefaultCellularDataSlotId(const int32_t slotId)514 int32_t CellularDataService::SetDefaultCellularDataSlotId(const int32_t slotId)
515 {
516 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
517 TELEPHONY_LOGE("Non-system applications use system APIs!");
518 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
519 }
520 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
521 return TELEPHONY_ERR_PERMISSION_ERR;
522 }
523 bool hasSim = false;
524 CoreManagerInner::GetInstance().HasSimCard(slotId, hasSim);
525 if (!hasSim) {
526 TELEPHONY_LOGE("has no sim!");
527 return TELEPHONY_ERR_NO_SIM_CARD;
528 }
529 if (!CoreManagerInner::GetInstance().IsSimActive(slotId)) {
530 TELEPHONY_LOGE("sim is not active!");
531 return TELEPHONY_ERR_SLOTID_INVALID;
532 }
533 int32_t formerSlotId;
534 GetDefaultCellularDataSlotId(formerSlotId);
535 if (formerSlotId < 0) {
536 TELEPHONY_LOGI("No old card slot id.");
537 }
538 int32_t result = CoreManagerInner::GetInstance().SetDefaultCellularDataSlotId(slotId);
539 if (result != TELEPHONY_ERR_SUCCESS) {
540 TELEPHONY_LOGE("set slot id fail");
541 return result;
542 }
543 return TELEPHONY_ERR_SUCCESS;
544 }
545
GetCellularDataFlowType(int32_t & type)546 int32_t CellularDataService::GetCellularDataFlowType(int32_t &type)
547 {
548 int32_t slotId;
549 CellularDataService::GetDefaultCellularDataSlotId(slotId);
550 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
551 if (cellularDataController == nullptr) {
552 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
553 return CELLULAR_DATA_INVALID_PARAM;
554 }
555 DisConnectionReason reason = cellularDataController->GetDisConnectionReason();
556 if (reason == DisConnectionReason::REASON_GSM_AND_CALLING_ONLY && cellularDataController->IsRestrictedMode()) {
557 return static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DORMANT);
558 }
559 int32_t result = cellularDataController->GetCellularDataFlowType();
560 return result;
561 }
562
GetBeginTime()563 std::string CellularDataService::GetBeginTime()
564 {
565 std::ostringstream oss;
566 oss << beginTime_;
567 TELEPHONY_LOGI("bindTime := %{public}s", oss.str().c_str());
568 return oss.str();
569 }
570
GetEndTime()571 std::string CellularDataService::GetEndTime()
572 {
573 std::ostringstream oss;
574 oss << endTime_;
575 TELEPHONY_LOGI("endTime := %{public}s", oss.str().c_str());
576 return oss.str();
577 }
578
GetCellularDataSlotIdDump()579 std::string CellularDataService::GetCellularDataSlotIdDump()
580 {
581 std::ostringstream oss;
582 int32_t slotId;
583 GetDefaultCellularDataSlotId(slotId);
584 oss << "slotId:" << slotId;
585 return oss.str();
586 }
587
GetStateMachineCurrentStatusDump()588 std::string CellularDataService::GetStateMachineCurrentStatusDump()
589 {
590 std::ostringstream oss;
591 int32_t slotId;
592 GetDefaultCellularDataSlotId(slotId);
593 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
594 if (cellularDataController == nullptr) {
595 oss << "default slotId: " << slotId;
596 return oss.str();
597 }
598 ApnProfileState statusDefault = cellularDataController->GetCellularDataState(DATA_CONTEXT_ROLE_DEFAULT);
599 ApnProfileState statusIms = cellularDataController->GetCellularDataState(DATA_CONTEXT_ROLE_IMS);
600 oss << "Default connect state: " << static_cast<int32_t>(statusDefault);
601 oss << "Ims connect state: " << static_cast<int32_t>(statusIms);
602 return oss.str();
603 }
604
GetFlowDataInfoDump()605 std::string CellularDataService::GetFlowDataInfoDump()
606 {
607 std::ostringstream oss;
608 int32_t slotId;
609 GetDefaultCellularDataSlotId(slotId);
610 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
611 if (cellularDataController == nullptr) {
612 oss << "default slotId: " << slotId;
613 return oss.str();
614 }
615 int32_t dataFlowInfo = cellularDataController->GetCellularDataFlowType();
616 oss << "data flow info: " << dataFlowInfo;
617 return oss.str();
618 }
619
StrategySwitch(int32_t slotId,bool enable)620 int32_t CellularDataService::StrategySwitch(int32_t slotId, bool enable)
621 {
622 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
623 if (cellularDataController == nullptr) {
624 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
625 return CELLULAR_DATA_INVALID_PARAM;
626 }
627 int32_t result = cellularDataController->SetPolicyDataOn(enable);
628 if (result == static_cast<int32_t>(DataRespondCode::SET_SUCCESS) && enable) {
629 CellularDataHiSysEvent::WriteDataDeactiveBehaviorEvent(slotId, DataDisconnectCause::HIGN_PRIORITY_NETWORK);
630 }
631 return result;
632 }
633
HasInternetCapability(const int32_t slotId,const int32_t cid,int32_t & capability)634 int32_t CellularDataService::HasInternetCapability(const int32_t slotId, const int32_t cid, int32_t &capability)
635 {
636 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
637 if (cellularDataController == nullptr) {
638 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
639 return CELLULAR_DATA_INVALID_PARAM;
640 }
641 bool result = cellularDataController->HasInternetCapability(cid);
642 capability = result ? static_cast<int32_t>(RequestNetCode::REQUEST_SUCCESS)
643 : static_cast<int32_t>(RequestNetCode::REQUEST_FAILED);
644 return TELEPHONY_ERR_SUCCESS;
645 }
646
ClearCellularDataConnections(const int32_t slotId)647 int32_t CellularDataService::ClearCellularDataConnections(const int32_t slotId)
648 {
649 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
650 TELEPHONY_LOGE("Permission denied!");
651 return TELEPHONY_ERR_PERMISSION_ERR;
652 }
653 return ClearAllConnections(slotId, (int32_t) DisConnectionReason::REASON_CLEAR_CONNECTION);
654 }
655
ClearAllConnections(const int32_t slotId,const int32_t reason)656 int32_t CellularDataService::ClearAllConnections(const int32_t slotId, const int32_t reason)
657 {
658 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
659 TELEPHONY_LOGE("Permission denied!");
660 return TELEPHONY_ERR_PERMISSION_ERR;
661 }
662 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
663 if (cellularDataController == nullptr) {
664 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
665 return CELLULAR_DATA_INVALID_PARAM;
666 }
667 bool result = cellularDataController->ClearAllConnections((DisConnectionReason) reason);
668 return result ? static_cast<int32_t>(RequestNetCode::REQUEST_SUCCESS)
669 : static_cast<int32_t>(RequestNetCode::REQUEST_FAILED);
670 }
671
ChangeConnectionForDsds(const int32_t slotId,bool enable)672 int32_t CellularDataService::ChangeConnectionForDsds(const int32_t slotId, bool enable)
673 {
674 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
675 if (cellularDataController == nullptr) {
676 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
677 return CELLULAR_DATA_INVALID_PARAM;
678 }
679 bool result = cellularDataController->ChangeConnectionForDsds(enable);
680 return result ? static_cast<int32_t>(RequestNetCode::REQUEST_SUCCESS)
681 : static_cast<int32_t>(RequestNetCode::REQUEST_FAILED);
682 }
683
GetServiceRunningState()684 int32_t CellularDataService::GetServiceRunningState()
685 {
686 return static_cast<int32_t>(state_);
687 }
688
GetSpendTime()689 int64_t CellularDataService::GetSpendTime()
690 {
691 return endTime_ - beginTime_;
692 }
693
RegisterSimAccountCallback(const sptr<SimAccountCallback> & callback)694 int32_t CellularDataService::RegisterSimAccountCallback(const sptr<SimAccountCallback> &callback)
695 {
696 return CoreManagerInner::GetInstance().RegisterSimAccountCallback(GetTokenID(), callback);
697 }
698
UnregisterSimAccountCallback(const sptr<SimAccountCallback> & callback)699 int32_t CellularDataService::UnregisterSimAccountCallback(const sptr<SimAccountCallback> &callback)
700 {
701 return CoreManagerInner::GetInstance().UnregisterSimAccountCallback(callback);
702 }
703
GetDataConnApnAttr(int32_t slotId,ApnAttribute & apnAttr)704 int32_t CellularDataService::GetDataConnApnAttr(int32_t slotId, ApnAttribute &apnAttr)
705 {
706 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
707 TELEPHONY_LOGE("Permission denied!");
708 return TELEPHONY_ERR_PERMISSION_ERR;
709 }
710 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
711 if (cellularDataController == nullptr) {
712 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
713 return CELLULAR_DATA_INVALID_PARAM;
714 }
715 ApnItem::Attribute apn;
716 cellularDataController->GetDataConnApnAttr(apn);
717 ApnAttribute::TransferApnAttributeBeforeIpc(apn, apnAttr);
718 return TELEPHONY_ERR_SUCCESS;
719 }
720
GetDataConnIpType(int32_t slotId,std::string & ipType)721 int32_t CellularDataService::GetDataConnIpType(int32_t slotId, std::string &ipType)
722 {
723 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
724 if (cellularDataController == nullptr) {
725 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
726 return CELLULAR_DATA_INVALID_PARAM;
727 }
728 ipType = cellularDataController->GetDataConnIpType();
729 return TELEPHONY_ERR_SUCCESS;
730 }
731
IsNeedDoRecovery(int32_t slotId,bool needDoRecovery)732 int32_t CellularDataService::IsNeedDoRecovery(int32_t slotId, bool needDoRecovery)
733 {
734 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
735 if (cellularDataController == nullptr) {
736 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
737 return CELLULAR_DATA_INVALID_PARAM;
738 }
739 cellularDataController->IsNeedDoRecovery(needDoRecovery);
740 return TELEPHONY_ERR_SUCCESS;
741 }
742
GetCellularDataController(int32_t slotId)743 std::shared_ptr<CellularDataController> CellularDataService::GetCellularDataController(int32_t slotId)
744 {
745 if (slotId < 0 || !isInitSuccess_) {
746 TELEPHONY_LOGE("Invalid slotId or Init is not success. slotId=%{public}d, isInitSuccess=%{public}d",
747 slotId, (int32_t)isInitSuccess_);
748 return nullptr;
749 }
750 std::lock_guard<std::mutex> guard(mapLock_);
751 std::map<int32_t, std::shared_ptr<CellularDataController>>::const_iterator item =
752 cellularDataControllers_.find(slotId);
753 if (item == cellularDataControllers_.end() || item->second == nullptr) {
754 return nullptr;
755 }
756
757 return item->second;
758 }
759
EstablishAllApnsIfConnectable(const int32_t slotId)760 int32_t CellularDataService::EstablishAllApnsIfConnectable(const int32_t slotId)
761 {
762 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
763 TELEPHONY_LOGE("Permission denied!");
764 return TELEPHONY_ERR_PERMISSION_ERR;
765 }
766
767 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
768 if (cellularDataController == nullptr) {
769 TELEPHONY_LOGE("slot%{public}d cellularDataControllers is null", slotId);
770 return CELLULAR_DATA_INVALID_PARAM;
771 }
772
773 bool hasSim = false;
774 CoreManagerInner::GetInstance().HasSimCard(slotId, hasSim);
775 if (!hasSim) {
776 TELEPHONY_LOGE("slot%{public}d has no sim", slotId);
777 return TELEPHONY_ERR_NO_SIM_CARD;
778 }
779 if (!CoreManagerInner::GetInstance().IsSimActive(slotId)) {
780 TELEPHONY_LOGE("slot%{public}d sim not active", slotId);
781 return TELEPHONY_ERR_SLOTID_INVALID;
782 }
783
784 bool result = cellularDataController->EstablishAllApnsIfConnectable();
785 return result ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_FAIL;
786 }
787
ReleaseCellularDataConnection(int32_t slotId)788 int32_t CellularDataService::ReleaseCellularDataConnection(int32_t slotId)
789 {
790 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
791 TELEPHONY_LOGE("Permission denied!");
792 return TELEPHONY_ERR_PERMISSION_ERR;
793 }
794
795 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
796 if (cellularDataController == nullptr) {
797 TELEPHONY_LOGE("slot%{public}d cellularDataControllers is null", slotId);
798 return CELLULAR_DATA_INVALID_PARAM;
799 }
800
801 bool hasSim = false;
802 CoreManagerInner::GetInstance().HasSimCard(slotId, hasSim);
803 if (!hasSim) {
804 TELEPHONY_LOGE("slot%{public}d has no sim", slotId);
805 return TELEPHONY_ERR_NO_SIM_CARD;
806 }
807 if (!CoreManagerInner::GetInstance().IsSimActive(slotId)) {
808 TELEPHONY_LOGE("slot%{public}d sim not active", slotId);
809 return TELEPHONY_ERR_SLOTID_INVALID;
810 }
811
812 return cellularDataController->ReleaseCellularDataConnection() ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_FAIL;
813 }
814
GetCellularDataSupplierId(int32_t slotId,uint64_t capability,uint32_t & supplierId)815 int32_t CellularDataService::GetCellularDataSupplierId(int32_t slotId, uint64_t capability, uint32_t &supplierId)
816 {
817 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
818 TELEPHONY_LOGE("Permission denied!");
819 return TELEPHONY_ERR_PERMISSION_ERR;
820 }
821 if (capability < NetCap::NET_CAPABILITY_MMS || capability > NetCap::NET_CAPABILITY_SNSSAI6) {
822 TELEPHONY_LOGE("Invalid capability = (%{public}" PRIu64 ")", capability);
823 return CELLULAR_DATA_INVALID_PARAM;
824 }
825 supplierId = static_cast<uint32_t>(CellularDataNetAgent::GetInstance().GetSupplierId(slotId, capability));
826 return TELEPHONY_ERR_SUCCESS;
827 }
828
CorrectNetSupplierNoAvailable(int32_t slotId)829 int32_t CellularDataService::CorrectNetSupplierNoAvailable(int32_t slotId)
830 {
831 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
832 TELEPHONY_LOGE("Permission denied!");
833 return TELEPHONY_ERR_PERMISSION_ERR;
834 }
835 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
836 if (cellularDataController == nullptr) {
837 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
838 return CELLULAR_DATA_INVALID_PARAM;
839 }
840 int32_t apnState = static_cast<int32_t>(cellularDataController->GetCellularDataState(DATA_CONTEXT_ROLE_DEFAULT));
841 if (apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
842 TELEPHONY_LOGE("Default apn state is connected, do not set available false");
843 return TELEPHONY_ERR_FAIL;
844 }
845 TELEPHONY_LOGI("correct default supplier available is false, apn state = %{public}d", apnState);
846 bool result = cellularDataController->UpdateNetworkInfo();
847 return result ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_FAIL;
848 }
849
GetSupplierRegisterState(uint32_t supplierId,int32_t & regState)850 int32_t CellularDataService::GetSupplierRegisterState(uint32_t supplierId, int32_t ®State)
851 {
852 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
853 TELEPHONY_LOGE("Permission denied!");
854 return TELEPHONY_ERR_PERMISSION_ERR;
855 }
856 bool result = CellularDataNetAgent::GetInstance().GetSupplierRegState(supplierId, regState);
857 return result ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_FAIL;
858 }
859
GetIfSupportDunApn(bool & isSupportDun)860 int32_t CellularDataService::GetIfSupportDunApn(bool &isSupportDun)
861 {
862 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
863 TELEPHONY_LOGE("Permission denied!");
864 return TELEPHONY_ERR_PERMISSION_ERR;
865 }
866 int32_t slotId;
867 CellularDataService::GetDefaultCellularDataSlotId(slotId);
868 auto cellularDataController = GetCellularDataController(slotId);
869 if (cellularDataController == nullptr) {
870 TELEPHONY_LOGE("cellularDataControllers is null, slotId=%{public}d", slotId);
871 return CELLULAR_DATA_INVALID_PARAM;
872 }
873 isSupportDun = cellularDataController->IsSupportDunApn();
874 return TELEPHONY_ERR_SUCCESS;
875 }
876
GetDefaultActReportInfo(int32_t slotId,ApnActivateReportInfoIpc & infoIpc)877 int32_t CellularDataService::GetDefaultActReportInfo(int32_t slotId, ApnActivateReportInfoIpc &infoIpc)
878 {
879 ApnActivateReportInfo info;
880 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
881 TELEPHONY_LOGE("Permission denied!");
882 return TELEPHONY_ERR_PERMISSION_ERR;
883 }
884 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
885 if (cellularDataController == nullptr) {
886 TELEPHONY_LOGE("GetDefaultActReportInfo is null, slotId=%{public}d", slotId);
887 return CELLULAR_DATA_INVALID_PARAM;
888 }
889 bool result = cellularDataController->GetDefaultActReportInfo(info);
890 infoIpc = info;
891 return result ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_FAIL;
892 }
893
GetInternalActReportInfo(int32_t slotId,ApnActivateReportInfoIpc & infoIpc)894 int32_t CellularDataService::GetInternalActReportInfo(int32_t slotId, ApnActivateReportInfoIpc &infoIpc)
895 {
896 ApnActivateReportInfo info;
897 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
898 TELEPHONY_LOGE("Permission denied!");
899 return TELEPHONY_ERR_PERMISSION_ERR;
900 }
901 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
902 if (cellularDataController == nullptr) {
903 TELEPHONY_LOGE("GetInternalActReportInfo is null, slotId=%{public}d", slotId);
904 return CELLULAR_DATA_INVALID_PARAM;
905 }
906 bool result = cellularDataController->GetInternalActReportInfo(info);
907 return result ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_FAIL;
908 }
909
QueryApnIds(const ApnInfo & apnInfo,std::vector<uint32_t> & apnIdList)910 int32_t CellularDataService::QueryApnIds(const ApnInfo& apnInfo, std::vector<uint32_t> &apnIdList)
911 {
912 if (!TelephonyPermission::CheckPermission(Permission::MANAGE_APN_SETTING)) {
913 TELEPHONY_LOGE("Permission denied!");
914 return TELEPHONY_ERR_PERMISSION_ERR;
915 }
916 TELEPHONY_LOGI("QueryApnIds, info.type=%{public}s", Str16ToStr8(apnInfo.type).c_str());
917 auto helper = CellularDataRdbHelper::GetInstance();
918 if (helper == nullptr) {
919 TELEPHONY_LOGE("get cellularDataRdbHelper failed");
920 return TELEPHONY_ERR_FAIL;
921 }
922 helper->QueryApnIds(apnInfo, apnIdList);
923 return 0;
924 }
925
SetPreferApn(int32_t apnId)926 int32_t CellularDataService::SetPreferApn(int32_t apnId)
927 {
928 if (!TelephonyPermission::CheckPermission(Permission::MANAGE_APN_SETTING)) {
929 TELEPHONY_LOGE("Permission denied!");
930 return TELEPHONY_ERR_PERMISSION_ERR;
931 }
932 TELEPHONY_LOGI("SetPreferApn, apnId=%{public}d", apnId);
933 auto helper = CellularDataRdbHelper::GetInstance();
934 if (helper == nullptr) {
935 TELEPHONY_LOGE("get cellularDataRdbHelper failed");
936 return TELEPHONY_ERR_FAIL;
937 }
938 return helper->SetPreferApn(apnId);
939 }
940
QueryAllApnInfo(std::vector<ApnInfo> & allApnInfoList)941 int32_t CellularDataService::QueryAllApnInfo(std::vector<ApnInfo> &allApnInfoList)
942 {
943 if (!TelephonyPermission::CheckPermission(Permission::MANAGE_APN_SETTING)) {
944 TELEPHONY_LOGE("Permission denied!");
945 return TELEPHONY_ERR_PERMISSION_ERR;
946 }
947 TELEPHONY_LOGI("QueryAllApnInfo");
948 auto helper = CellularDataRdbHelper::GetInstance();
949 if (helper == nullptr) {
950 TELEPHONY_LOGE("get cellularDataRdbHelper failed");
951 return TELEPHONY_ERR_FAIL;
952 }
953 helper->QueryAllApnInfo(allApnInfoList);
954 return 0;
955 }
956
SendUrspDecodeResult(int32_t slotId,const std::vector<uint8_t> & buffer)957 int32_t CellularDataService::SendUrspDecodeResult(int32_t slotId, const std::vector<uint8_t>& buffer)
958 {
959 int32_t eventid = static_cast<int32_t>(CellularDataEventCode::MSG_SEND_UEPOLICY_COMMAND_REJECT);
960 return CoreManagerInner::GetInstance().SendUrspDecodeResult(slotId, buffer, eventid);
961 }
962
SendUePolicySectionIdentifier(int32_t slotId,const std::vector<uint8_t> & buffer)963 int32_t CellularDataService::SendUePolicySectionIdentifier(int32_t slotId, const std::vector<uint8_t>& buffer)
964 {
965 int32_t eventid = static_cast<int32_t>(CellularDataEventCode::MSG_SEND_UE_STATE_INDICATION);
966 return CoreManagerInner::GetInstance().SendUePolicySectionIdentifier(slotId, buffer, eventid);
967 }
968
SendImsRsdList(int32_t slotId,const std::vector<uint8_t> & buffer)969 int32_t CellularDataService::SendImsRsdList(int32_t slotId, const std::vector<uint8_t>& buffer)
970 {
971 int32_t eventid = static_cast<int32_t>(CellularDataEventCode::MSG_SEND_IMS_RSDLIST);
972 return CoreManagerInner::GetInstance().SendImsRsdList(slotId, buffer, eventid);
973 }
974
GetNetworkSliceAllowedNssai(int32_t slotId,const std::vector<uint8_t> & buffer)975 int32_t CellularDataService::GetNetworkSliceAllowedNssai(int32_t slotId, const std::vector<uint8_t>& buffer)
976 {
977 int32_t eventid = static_cast<int32_t>(CellularDataEventCode::MSG_SYNC_ALLOWED_NSSAI_WITH_MODEM);
978 return CoreManagerInner::GetInstance().GetNetworkSliceAllowedNssai(slotId, buffer, eventid);
979 }
980
GetNetworkSliceEhplmn(int32_t slotId)981 int32_t CellularDataService::GetNetworkSliceEhplmn(int32_t slotId)
982 {
983 int32_t eventid = static_cast<int32_t>(CellularDataEventCode::MSG_SYNC_EHPLMN_WITH_MODEM);
984 return CoreManagerInner::GetInstance().GetNetworkSliceEhplmn(slotId, eventid);
985 }
986
GetActiveApnName(std::string & apnName)987 int32_t CellularDataService::GetActiveApnName(std::string &apnName)
988 {
989 if (!TelephonyPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
990 TELEPHONY_LOGE("Permission denied!");
991 return TELEPHONY_ERR_PERMISSION_ERR;
992 }
993 apnName = "";
994 int32_t slotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
995 std::shared_ptr<CellularDataController> cellularDataController = GetCellularDataController(slotId);
996 if (cellularDataController == nullptr) {
997 return 0;
998 }
999 int32_t cellularDataState = static_cast<int32_t>(
1000 cellularDataController->GetCellularDataState(DATA_CONTEXT_ROLE_DEFAULT));
1001 if (cellularDataState != PROFILE_STATE_CONNECTED) {
1002 return 0;
1003 }
1004 auto helper = CellularDataRdbHelper::GetInstance();
1005 if (helper == nullptr) {
1006 TELEPHONY_LOGE("get cellularDataRdbHelper failed");
1007 return 0;
1008 }
1009 std::vector<PdpProfile> preferApnVec;
1010 if (!helper->QueryPreferApn(slotId, preferApnVec)) {
1011 TELEPHONY_LOGI("query prefer apn fail");
1012 return 0;
1013 }
1014 if (preferApnVec.size() > 0) {
1015 apnName = preferApnVec[0].apn;
1016 } else {
1017 ApnItem::Attribute apnAttr;
1018 cellularDataController->GetDataConnApnAttr(apnAttr);
1019 apnName = apnAttr.apn_;
1020 }
1021 return 0;
1022 }
1023 } // namespace Telephony
1024 } // namespace OHOS
1025