1 /*
2  * Copyright (c) 2023 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 <dlfcn.h>
17 #include "telephony_ext_wrapper.h"
18 #include "telephony_log_wrapper.h"
19 
20 namespace OHOS {
21 namespace Telephony {
22 namespace {
23 const std::string TELEPHONY_EXT_WRAPPER_PATH = "libtelephony_ext_service.z.so";
24 const std::string TELEPHONY_VSIM_WRAPPER_PATH = "libtel_vsim_symbol.z.so";
25 } // namespace
26 
TelephonyExtWrapper()27 TelephonyExtWrapper::TelephonyExtWrapper() {}
~TelephonyExtWrapper()28 TelephonyExtWrapper::~TelephonyExtWrapper()
29 {
30     TELEPHONY_LOGD("TelephonyExtWrapper::~TelephonyExtWrapper() start");
31     if (telephonyExtWrapperHandle_ != nullptr) {
32         dlclose(telephonyExtWrapperHandle_);
33         telephonyExtWrapperHandle_ = nullptr;
34     }
35     if (telephonyVSimWrapperHandle_ != nullptr) {
36         dlclose(telephonyVSimWrapperHandle_);
37         telephonyVSimWrapperHandle_ = nullptr;
38     }
39 }
40 
InitTelephonyExtWrapper()41 void TelephonyExtWrapper::InitTelephonyExtWrapper()
42 {
43     TELEPHONY_LOGD("TelephonyExtWrapper::InitTelephonyExtWrapper() start");
44     InitTelephonyExtWrapperForCellularData();
45     InitTelephonyExtWrapperForVSim();
46     TELEPHONY_LOGI("telephony ext wrapper init success");
47 }
48 
InitTelephonyExtWrapperForCellularData()49 void TelephonyExtWrapper::InitTelephonyExtWrapperForCellularData()
50 {
51     telephonyExtWrapperHandle_ = dlopen(TELEPHONY_EXT_WRAPPER_PATH.c_str(), RTLD_NOW);
52     if (telephonyExtWrapperHandle_ == nullptr) {
53         TELEPHONY_LOGE("libtelephony_ext_service.z.so was not loaded, error: %{public}s", dlerror());
54         return;
55     }
56     InitDataEndSelfCure();
57     InitIsApnAllowedActive();
58     InitSendDataSwitchChangeInfo();
59     InitIsAllCellularDataAllowed();
60     InitIsDualCellularCardAllowed();
61 }
62 
InitDataEndSelfCure()63 void TelephonyExtWrapper::InitDataEndSelfCure()
64 {
65     dataEndSelfCure_ = (DATA_EDN_SELF_CURE)dlsym(telephonyExtWrapperHandle_, "DataEndSelfCure");
66     if (dataEndSelfCure_ == nullptr) {
67         TELEPHONY_LOGE("telephony ext wrapper symbol DataEndSelfCure failed, error: %{public}s", dlerror());
68         return;
69     }
70     TELEPHONY_LOGD("telephony ext wrapper init DataEndSelfCure success");
71 }
72 
InitIsApnAllowedActive()73 void TelephonyExtWrapper::InitIsApnAllowedActive()
74 {
75     isApnAllowedActive_ = (IS_APN_ALLOWED_ACTIVE)dlsym(telephonyExtWrapperHandle_, "IsApnAllowedActive");
76     if (isApnAllowedActive_ == nullptr) {
77         TELEPHONY_LOGE("telephony ext wrapper symbol InitIsApnAllowedActive failed, error: %{public}s", dlerror());
78         return;
79     }
80     TELEPHONY_LOGD("telephony ext wrapper init InitIsApnAllowedActive success");
81 }
82 
InitTelephonyExtWrapperForVSim()83 void TelephonyExtWrapper::InitTelephonyExtWrapperForVSim()
84 {
85     TELEPHONY_LOGI("[VSIM] telephony ext wrapper init begin");
86     telephonyVSimWrapperHandle_ = dlopen(TELEPHONY_VSIM_WRAPPER_PATH.c_str(), RTLD_NOW);
87     if (telephonyVSimWrapperHandle_ == nullptr) {
88         TELEPHONY_LOGE("libtel_vsim_symbol.z.so was not loaded, error: %{public}s", dlerror());
89         return;
90     }
91     getVSimSlotId_ = (GET_VSIM_SLOT_ID) dlsym(telephonyVSimWrapperHandle_, "GetVSimSlotId");
92     createAllApnItemExt_ = (CREATE_ALL_APN_ITEM_EXT) dlsym(telephonyVSimWrapperHandle_, "CreateAllApnItemExt");
93     isCardAllowData_ = (IS_CARD_ALLOW_DATA) dlsym(telephonyVSimWrapperHandle_, "IsCardAllowData");
94     if (getVSimSlotId_ == nullptr || createAllApnItemExt_ == nullptr || isCardAllowData_ == nullptr) {
95         TELEPHONY_LOGE("[VSIM] telephony ext wrapper symbol failed, error: %{public}s", dlerror());
96         return;
97     }
98     TELEPHONY_LOGI("[VSIM] telephony ext wrapper init success");
99 }
100 
InitSendDataSwitchChangeInfo()101 void TelephonyExtWrapper::InitSendDataSwitchChangeInfo()
102 {
103     sendDataSwitchChangeInfo_ =
104         (SEND_DATA_SWITCH_CHANGE_INFO)dlsym(telephonyExtWrapperHandle_, "SendDataSwitchChangeInfo");
105     if (sendDataSwitchChangeInfo_ == nullptr) {
106         TELEPHONY_LOGE("telephony ext wrapper symbol SendDataSwitchChangeInfo failed, error: %{public}s", dlerror());
107         return;
108     }
109     TELEPHONY_LOGD("telephony ext wrapper init SendDataSwitchChangeInfo success");
110 }
111 
InitIsAllCellularDataAllowed()112 void TelephonyExtWrapper::InitIsAllCellularDataAllowed()
113 {
114     isAllCellularDataAllowed_ =
115         (IS_ALL_CELLULAR_DATA_ALLOWED)dlsym(telephonyExtWrapperHandle_, "IsAllCellularDataAllowed");
116     if (isAllCellularDataAllowed_ == nullptr) {
117         TELEPHONY_LOGE("telephony ext wrapper symbol IsAllCellularDataAllowed failed, error: %{public}s", dlerror());
118         return;
119     }
120     TELEPHONY_LOGD("telephony ext wrapper init IsAllCellularDataAllowed success");
121 }
122 
InitIsDualCellularCardAllowed()123 void TelephonyExtWrapper::InitIsDualCellularCardAllowed()
124 {
125     isDualCellularCardAllowed_ =
126         (IS_DUAL_CELLULAR_CARD_ALLOWED)dlsym(telephonyExtWrapperHandle_, "IsDualCellularCardAllowed");
127     if (isDualCellularCardAllowed_ == nullptr) {
128         TELEPHONY_LOGE("telephony ext wrapper symbol IsDualCellularCardAllowed failed,\
129             error: %{public}s", dlerror());
130         return;
131     }
132     TELEPHONY_LOGD("telephony ext wrapper init IsDualCellularCardAllowed success");
133 }
134 
135 } // namespace Telephony
136 } // namespace OHOS