1 /*
2  * Copyright (c) 2023-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 <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     telephonyExtWrapperHandle_ = dlopen(TELEPHONY_EXT_WRAPPER_PATH.c_str(), RTLD_NOW);
45     if (telephonyExtWrapperHandle_ == nullptr) {
46         TELEPHONY_LOGE("libtelephony_ext_service.z.so was not loaded, error: %{public}s", dlerror());
47         return;
48     }
49     InitTelephonyExtWrapperForSim();
50     InitTelephonyExtWrapperForNetWork();
51     InitTelephonyExtWrapperForVoiceMail();
52     InitTelephonyExtWrapperForCust();
53     InitTelephonyExtWrapperForVSim();
54     InitTelephonyExtWrapperForOpkeyVersion();
55     TELEPHONY_LOGI("telephony ext wrapper init success");
56 }
57 
InitTelephonyExtWrapperForNetWork()58 void TelephonyExtWrapper::InitTelephonyExtWrapperForNetWork()
59 {
60     checkOpcVersionIsUpdate_ = (CHECK_OPC_VERSION_IS_UPDATE)dlsym(telephonyExtWrapperHandle_,
61         "CheckOpcVersionIsUpdate");
62     updateOpcVersion_ = (UPDATE_OPC_VERSION)dlsym(telephonyExtWrapperHandle_, "UpdateOpcVersion");
63     getCellInfoList_ = (GET_CELL_INFO_LIST)dlsym(telephonyExtWrapperHandle_, "GetCellInfoListExt");
64     getRadioTechExt_ = (GET_RADIO_TECH_EXT)dlsym(telephonyExtWrapperHandle_, "GetRadioTechExt");
65     getNrOptionModeExt_ = (GET_NR_OPTION_MODE_EXT)dlsym(telephonyExtWrapperHandle_, "GetNrOptionModeExt");
66     getNrOptionModeExtend_ = (GET_NR_OPTION_MODE_EXTEND)dlsym(telephonyExtWrapperHandle_, "GetNrOptionModeExtend");
67     getPreferredNetworkExt_ = (GET_PREFERRED_NETWORK_EXT)dlsym(telephonyExtWrapperHandle_, "GetPreferredNetworkExt");
68     isNrSupportedNative_ = (IS_NR_SUPPORTED_NATIVE)dlsym(telephonyExtWrapperHandle_, "IsNrSupportedNativeExt");
69     getSignalInfoListExt_ = (GET_SIGNAL_INFO_LIST_EXT)dlsym(telephonyExtWrapperHandle_, "GetSignalInfoListExt");
70     getNetworkCapabilityExt_ = (GET_NETWORK_CAPABILITY_EXT)dlsym(telephonyExtWrapperHandle_, "GetNetworkCapabilityExt");
71     onGetNetworkSearchInformationExt_ = (ON_GET_NETWORK_SEARCH_INFORMATION_EXT)dlsym(telephonyExtWrapperHandle_,
72         "OnGetNetworkSearchInformationExt");
73     getNetworkStatusExt_ = (GET_NETWORK_STATUS_EXT)dlsym(telephonyExtWrapperHandle_, "GetNetworkStatusExt");
74     if (checkOpcVersionIsUpdate_ == nullptr || updateOpcVersion_ == nullptr || getCellInfoList_ == nullptr ||
75         getRadioTechExt_ == nullptr || getNrOptionModeExt_ == nullptr || getSignalInfoListExt_ == nullptr ||
76         getNetworkCapabilityExt_ == nullptr || onGetNetworkSearchInformationExt_ == nullptr ||
77         getNetworkStatusExt_ == nullptr || isNrSupportedNative_ == nullptr ||
78         getNrOptionModeExtend_ == nullptr || getPreferredNetworkExt_ == nullptr) {
79         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
80     }
81     updateCountryCodeExt_ = (UPDATE_COUNTRY_CODE_EXT)dlsym(telephonyExtWrapperHandle_, "UpdateCountryCodeExt");
82     updateTimeZoneOffsetExt_ =
83         (UPDATE_TIME_ZONE_OFFSET_EXT)dlsym(telephonyExtWrapperHandle_, "UpdateTimeZoneOffsetExt");
84     if (updateCountryCodeExt_ == nullptr || updateTimeZoneOffsetExt_ == nullptr) {
85         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
86     }
87 
88     sortSignalInfoListExt_ = (SORT_SIGNAL_INFO_LIST_EXT)dlsym(telephonyExtWrapperHandle_, "SortSignalInfoListExt");
89     if (sortSignalInfoListExt_ == nullptr) {
90         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
91     }
92     updateNsaStateExt_ = (UPDATE_NSA_STATE_EXT)dlsym(telephonyExtWrapperHandle_, "UpdateNsaStateExt");
93     if (updateNsaStateExt_ == nullptr) {
94         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
95     }
96     processSignalInfos_ = (PROCESS_SIGNAL_INFOS)dlsym(telephonyExtWrapperHandle_, "ProcessSignalInfosExt");
97     if (processSignalInfos_ == nullptr) {
98         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
99     }
100     processStateChangeExt_ = (PROCESS_STATE_CHANGE_EXT)dlsym(telephonyExtWrapperHandle_, "ProcessStateChangeExt");
101     if (processStateChangeExt_ == nullptr) {
102         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
103     }
104     publishSpnInfoChangedExt_ = (PUBLISH_SPN_INFO_CHANGED_EXT)dlsym(telephonyExtWrapperHandle_,
105         "PublishSpnInfoChangedExt");
106     if (publishSpnInfoChangedExt_ == nullptr) {
107         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
108     }
109 }
110 
InitTelephonyExtWrapperForVoiceMail()111 void TelephonyExtWrapper::InitTelephonyExtWrapperForVoiceMail()
112 {
113     getVoiceMailIccidParameter_ = (GET_VOICE_MAIL_ICCID_PARAMETER)dlsym(telephonyExtWrapperHandle_,
114         "GetVoiceMailIccidParameter");
115     setVoiceMailIccidParameter_ = (SET_VOICE_MAIL_ICCID_PARAMETER)dlsym(telephonyExtWrapperHandle_,
116         "SetVoiceMailIccidParameter");
117     initVoiceMailManagerExt_ = (INIT_VOICE_MAIL_MANAGER_EXT)dlsym(telephonyExtWrapperHandle_,
118         "InitVoiceMailManagerExt");
119     deinitVoiceMailManagerExt_ = (DEINIT_VOICE_MAIL_MANAGER_EXT)dlsym(telephonyExtWrapperHandle_,
120         "DeinitVoiceMailManagerExt");
121     resetVoiceMailLoadedFlagExt_ = (RESET_VOICE_MAIL_LOADED_FLAG_EXT)dlsym(telephonyExtWrapperHandle_,
122         "ResetVoiceMailLoadedFlagExt");
123     setVoiceMailOnSimExt_ = (SET_VOICE_MAIL_ON_SIM_EXT)dlsym(telephonyExtWrapperHandle_,
124         "SetVoiceMailOnSimExt");
125     getVoiceMailFixedExt_ = (GET_VOICE_MAIL_FIXED_EXT)dlsym(telephonyExtWrapperHandle_,
126         "GetVoiceMailFixedExt");
127     getVoiceMailNumberExt_ = (GET_VOICE_MAIL_NUMBER_EXT)dlsym(telephonyExtWrapperHandle_,
128         "GetVoiceMailNumberExt");
129     getVoiceMailTagExt_ = (GET_VOICE_MAIL_TAG_EXT)dlsym(telephonyExtWrapperHandle_,
130         "GetVoiceMailTagExt");
131     resetVoiceMailManagerExt_ = (RESET_VOICE_MAIL_MANAGER_EXT)dlsym(telephonyExtWrapperHandle_,
132         "ResetVoiceMailManagerExt");
133     getNetworkStatusExt_ = (GET_NETWORK_STATUS_EXT)dlsym(telephonyExtWrapperHandle_, "GetNetworkStatusExt");
134     if (getVoiceMailIccidParameter_ == nullptr || setVoiceMailIccidParameter_ == nullptr ||
135         initVoiceMailManagerExt_ == nullptr || deinitVoiceMailManagerExt_ == nullptr ||
136         resetVoiceMailLoadedFlagExt_ == nullptr || setVoiceMailOnSimExt_ == nullptr ||
137         getVoiceMailFixedExt_ == nullptr || getVoiceMailNumberExt_ == nullptr ||
138         getVoiceMailTagExt_ == nullptr || resetVoiceMailManagerExt_ == nullptr ||
139         getNetworkStatusExt_ == nullptr) {
140         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
141         return;
142     }
143 }
144 
InitTelephonyExtWrapperForCust()145 void TelephonyExtWrapper::InitTelephonyExtWrapperForCust()
146 {
147     updateNetworkStateExt_ = (UPDATE_NETWORK_STATE_EXT)dlsym(telephonyExtWrapperHandle_, "UpdateNetworkStateExt");
148     if (updateNetworkStateExt_ == nullptr) {
149         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
150     }
151     InitTelephonyExtWrapperForApnCust();
152 }
153 
InitTelephonyExtWrapperForVSim()154 void TelephonyExtWrapper::InitTelephonyExtWrapperForVSim()
155 {
156     TELEPHONY_LOGI("[VSIM] telephony ext wrapper init begin");
157     telephonyVSimWrapperHandle_ = dlopen(TELEPHONY_VSIM_WRAPPER_PATH.c_str(), RTLD_NOW);
158     if (telephonyVSimWrapperHandle_ == nullptr) {
159         TELEPHONY_LOGE("libtel_vsim_symbol.z.so was not loaded, error: %{public}s", dlerror());
160         return;
161     }
162     isVSimInStatus_ = (IS_VSIM_IN_STATUS) dlsym(telephonyVSimWrapperHandle_, "IsVSimInStatus");
163     getVSimSlotId_ = (GET_VSIM_SLOT_ID) dlsym(telephonyVSimWrapperHandle_, "GetVSimSlotId");
164     onAllFilesFetchedExt_ = (ON_ALL_FILES_FETCHED_EXT) dlsym(telephonyVSimWrapperHandle_, "OnAllFilesFetchedExt");
165     putVSimExtraInfo_ = (PUT_VSIM_EXTRA_INFO) dlsym(telephonyVSimWrapperHandle_, "PutVSimExtraInfo");
166     changeSpnAndRuleExt_ = (CHANGE_SPN_AND_RULE_EXT) dlsym(telephonyVSimWrapperHandle_, "ChangeSpnAndRuleExt");
167     getVSimCardState_ = (GET_VSIM_CARD_STATE) dlsym(telephonyVSimWrapperHandle_, "GetVSimCardState");
168     getSimIdExt_ = (GET_SIM_ID_EXT) dlsym(telephonyVSimWrapperHandle_, "GetSimIdExt");
169     getSlotIdExt_ = (GET_SLOT_ID_EXT) dlsym(telephonyVSimWrapperHandle_, "GetSlotIdExt");
170     isHandleVSim_ = (IS_HANDLE_VSIM) dlsym(telephonyVSimWrapperHandle_, "IsHandleVSim");
171 
172     bool hasFuncNull = (isVSimInStatus_ == nullptr || getVSimSlotId_ == nullptr || onAllFilesFetchedExt_ == nullptr ||
173         putVSimExtraInfo_ == nullptr || changeSpnAndRuleExt_ == nullptr || getVSimCardState_ == nullptr ||
174         getSimIdExt_ == nullptr || getSlotIdExt_ == nullptr || isHandleVSim_ == nullptr);
175     if (hasFuncNull) {
176         TELEPHONY_LOGE("[VSIM] telephony ext wrapper symbol failed, error: %{public}s", dlerror());
177         return;
178     }
179     TELEPHONY_LOGI("[VSIM] telephony ext wrapper init success");
180 }
181 
InitTelephonyExtWrapperForApnCust()182 void TelephonyExtWrapper::InitTelephonyExtWrapperForApnCust()
183 {
184     isAllowedInsertApn_ = (IS_ALLOWED_INSERT_APN)dlsym(telephonyExtWrapperHandle_, "IsAllowedInsertApn");
185     getTargetOpkey_ = (GET_TARGET_OPKEY)dlsym(telephonyExtWrapperHandle_, "GetTargetOpkey");
186     if (isAllowedInsertApn_ == nullptr || getTargetOpkey_ == nullptr) {
187         TELEPHONY_LOGE("telephony ext wrapper symbol failed, error: %{public}s", dlerror());
188     }
189 }
190 
InitTelephonyExtWrapperForSim()191 void TelephonyExtWrapper::InitTelephonyExtWrapperForSim()
192 {
193     TELEPHONY_LOGI("[SIM] telephony ext wrapper init begin");
194     createIccFileExt_ = (CREATE_ICC_FILE_EXT)dlsym(telephonyExtWrapperHandle_, "CreateIccFileExt");
195     getRoamingBrokerNumeric_ = (GET_ROAMINGBROKER_NUMERIC)dlsym(telephonyExtWrapperHandle_, "GetRoamingBrokerNumeric");
196     getRoamingBrokerImsi_ = (GET_ROAMINGBROKER_IMSI)dlsym(telephonyExtWrapperHandle_, "GetRoamingBrokerImsi");
197     sendEvent_ = (SEND_EVENT) dlsym(telephonyExtWrapperHandle_, "SendEvent");
198     initBip_ = (INIT_BIP) dlsym(telephonyExtWrapperHandle_, "InitBip");
199     if (createIccFileExt_ == nullptr || getRoamingBrokerNumeric_ == nullptr || getRoamingBrokerImsi_ == nullptr ||
200         sendEvent_ == nullptr || initBip_ == nullptr) {
201         TELEPHONY_LOGE("[SIM]telephony ext wrapper symbol failed, error: %{public}s", dlerror());
202         return;
203     }
204 }
205 
InitTelephonyExtWrapperForOpkeyVersion()206 void TelephonyExtWrapper::InitTelephonyExtWrapperForOpkeyVersion()
207 {
208     getOpkeyVersion_ = (GET_OPKEY_VERSION)dlsym(telephonyExtWrapperHandle_, "GetOpkeyVersion");
209     if (getOpkeyVersion_ == nullptr) {
210         TELEPHONY_LOGE("[OpkeyVersion]telephony ext wrapper symbol failed, error: %{public}s", dlerror());
211         return;
212     }
213 }
214 } // namespace Telephony
215 } // namespace OHOS
216