• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &regState)
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