1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "hril_modem.h"
17 
18 #include "hril_notification.h"
19 #include "hril_request.h"
20 
21 namespace OHOS {
22 namespace Telephony {
HRilModem(int32_t slotId)23 HRilModem::HRilModem(int32_t slotId) : HRilBase(slotId)
24 {
25     AddHandlerToMap();
26 }
27 
ShutDown(int32_t serialId)28 int32_t HRilModem::ShutDown(int32_t serialId)
29 {
30     return RequestVendor(serialId, HREQ_MODEM_SHUT_DOWN, modemFuncs_, &HRilModemReq::ShutDown);
31 }
32 
SetRadioState(int32_t serialId, int32_t fun, int32_t rst)33 int32_t HRilModem::SetRadioState(int32_t serialId, int32_t fun, int32_t rst)
34 {
35     return RequestVendor(serialId, HREQ_MODEM_SET_RADIO_STATUS, modemFuncs_, &HRilModemReq::SetRadioState, fun, rst);
36 }
37 
GetRadioState(int32_t serialId)38 int32_t HRilModem::GetRadioState(int32_t serialId)
39 {
40     return RequestVendor(serialId, HREQ_MODEM_GET_RADIO_STATUS, modemFuncs_, &HRilModemReq::GetRadioState);
41 }
42 
GetImei(int32_t serialId)43 int32_t HRilModem::GetImei(int32_t serialId)
44 {
45     return RequestVendor(serialId, HREQ_MODEM_GET_IMEI, modemFuncs_, &HRilModemReq::GetImei);
46 }
47 
GetImeiSv(int32_t serialId)48 int32_t HRilModem::GetImeiSv(int32_t serialId)
49 {
50     return RequestVendor(serialId, HREQ_MODEM_GET_IMEISV, modemFuncs_, &HRilModemReq::GetImeiSv);
51 }
52 
GetMeid(int32_t serialId)53 int32_t HRilModem::GetMeid(int32_t serialId)
54 {
55     return RequestVendor(serialId, HREQ_MODEM_GET_MEID, modemFuncs_, &HRilModemReq::GetMeid);
56 }
57 
GetVoiceRadioTechnology(int32_t serialId)58 int32_t HRilModem::GetVoiceRadioTechnology(int32_t serialId)
59 {
60     return RequestVendor(serialId, HREQ_MODEM_GET_VOICE_RADIO, modemFuncs_, &HRilModemReq::GetVoiceRadioTechnology);
61 }
62 
GetBasebandVersion(int32_t serialId)63 int32_t HRilModem::GetBasebandVersion(int32_t serialId)
64 {
65     return RequestVendor(serialId, HREQ_MODEM_GET_BASEBAND_VERSION, modemFuncs_, &HRilModemReq::GetBasebandVersion);
66 }
67 
RadioStateUpdated( const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)68 int32_t HRilModem::RadioStateUpdated(
69     const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
70 {
71     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
72         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
73         return HRIL_ERR_INVALID_PARAMETER;
74     }
75     if (response == nullptr) {
76         TELEPHONY_LOGE("response is null");
77         return HRIL_ERR_NULL_POINT;
78     }
79     radioState_ = *(const int32_t *)response;
80     return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::RadioStateUpdated, radioState_);
81 }
82 
VoiceRadioTechUpdated( const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)83 int32_t HRilModem::VoiceRadioTechUpdated(
84     const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
85 {
86     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilVoiceRadioInfo)) != 0) {
87         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
88         return HRIL_ERR_INVALID_PARAMETER;
89     }
90     if (response == nullptr) {
91         TELEPHONY_LOGE("response is null");
92         return HRIL_ERR_NULL_POINT;
93     }
94     HDI::Ril::V1_1::VoiceRadioTechnology voiceRadioTech = {};
95     BuildIVoiceRadioTechnology(voiceRadioTech, *(const HRilVoiceRadioInfo *)response);
96     return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::VoiceRadioTechUpdated, voiceRadioTech);
97 }
98 
DsdsModeUpdated( const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)99 int32_t HRilModem::DsdsModeUpdated(
100     const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
101 {
102     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
103         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
104         return HRIL_ERR_INVALID_PARAMETER;
105     }
106     if (response == nullptr) {
107         TELEPHONY_LOGE("response is null");
108         return HRIL_ERR_NULL_POINT;
109     }
110     return Notify(
111         indType, error, &HDI::Ril::V1_1::IRilCallback::DsdsModeUpdated, *(static_cast<const int32_t *>(response)));
112 }
113 
NcfgFinishedResult( int32_t indType, HRilErrNumber error, const void *response, size_t responseLen)114 int32_t HRilModem::NcfgFinishedResult(
115     int32_t indType, HRilErrNumber error, const void *response, size_t responseLen)
116 {
117     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
118         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
119         return HRIL_ERR_INVALID_PARAMETER;
120     }
121     if (response == nullptr) {
122         TELEPHONY_LOGE("response is null");
123         return HRIL_ERR_NULL_POINT;
124     }
125     return Notify(
126         indType, error, &HDI::Ril::V1_3::IRilCallback::NcfgFinishedResult, *(static_cast<const int32_t *>(response)));
127 }
128 
RestartRildNvMatch( int32_t indType, HRilErrNumber error, const void *response, size_t responseLen)129 int32_t HRilModem::RestartRildNvMatch(
130     int32_t indType, HRilErrNumber error, const void *response, size_t responseLen)
131 {
132     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
133         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
134         return HRIL_ERR_INVALID_PARAMETER;
135     }
136     if (response == nullptr) {
137         TELEPHONY_LOGE("response is null");
138         return HRIL_ERR_NULL_POINT;
139     }
140     return Notify(
141         indType, error, &HDI::Ril::V1_3::IRilCallback::RestartRildNvMatch, *(static_cast<const int32_t *>(response)));
142 }
143 
ShutDownResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)144 int32_t HRilModem::ShutDownResponse(
145     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
146 {
147     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::ShutDownResponse);
148 }
149 
SetRadioStateResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)150 int32_t HRilModem::SetRadioStateResponse(
151     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
152 {
153     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetRadioStateResponse);
154 }
155 
GetRadioStateResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)156 int32_t HRilModem::GetRadioStateResponse(
157     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
158 {
159     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
160         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
161         return HRIL_ERR_INVALID_PARAMETER;
162     }
163     if (response == nullptr) {
164         TELEPHONY_LOGE("response is null");
165         return HRIL_ERR_NULL_POINT;
166     }
167     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetRadioStateResponse, *(const int32_t *)response);
168 }
169 
GetImeiResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)170 int32_t HRilModem::GetImeiResponse(
171     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
172 {
173     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
174         TELEPHONY_LOGE("GetImeiResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
175         return HRIL_ERR_INVALID_PARAMETER;
176     }
177     if (response == nullptr) {
178         TELEPHONY_LOGE("response is null");
179         return HRIL_ERR_NULL_POINT;
180     }
181     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetImeiResponse, std::string((const char *)response));
182 }
183 
GetImeiSvResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)184 int32_t HRilModem::GetImeiSvResponse(
185     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
186 {
187     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
188         TELEPHONY_LOGE("GetImeiSvResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
189         return HRIL_ERR_INVALID_PARAMETER;
190     }
191     if (response == nullptr) {
192         TELEPHONY_LOGE("response is null");
193         return HRIL_ERR_NULL_POINT;
194     }
195     return Response(
196         responseInfo, &HDI::Ril::V1_3::IRilCallback::GetImeiSvResponse, std::string((const char *)response));
197 }
198 
GetMeidResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)199 int32_t HRilModem::GetMeidResponse(
200     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
201 {
202     std::string meidResponse = "";
203     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
204         TELEPHONY_LOGE("GetMeidResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
205         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
206             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
207         }
208     }
209     if (response == nullptr) {
210         TELEPHONY_LOGE("response is null");
211         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
212             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_NULL_POINT;
213         }
214     } else {
215         meidResponse = std::string((const char *)response);
216     }
217     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetMeidResponse, meidResponse);
218 }
219 
GetVoiceRadioTechnologyResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)220 int32_t HRilModem::GetVoiceRadioTechnologyResponse(
221     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
222 {
223     HDI::Ril::V1_1::VoiceRadioTechnology voiceRadioTech = {};
224     if (response == nullptr) {
225         TELEPHONY_LOGE("GetVoiceRadioTechnologyResponse Invalid response: nullptr");
226         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
227             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
228         }
229     } else {
230         BuildIVoiceRadioTechnology(voiceRadioTech, *(const HRilVoiceRadioInfo *)response);
231     }
232     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetVoiceRadioTechnologyResponse, voiceRadioTech);
233 }
234 
BuildIVoiceRadioTechnology( HDI::Ril::V1_1::VoiceRadioTechnology &voiceRadioTech, const HRilVoiceRadioInfo &hRiadioInfo)235 void HRilModem::BuildIVoiceRadioTechnology(
236     HDI::Ril::V1_1::VoiceRadioTechnology &voiceRadioTech, const HRilVoiceRadioInfo &hRiadioInfo)
237 {
238     voiceRadioTech.srvStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSrvStatus>(hRiadioInfo.srvStatus);
239     voiceRadioTech.srvDomain = static_cast<OHOS::HDI::Ril::V1_1::RilSrvDomain>(hRiadioInfo.srvDomain);
240     voiceRadioTech.roamStatus = static_cast<OHOS::HDI::Ril::V1_1::RilRoamStatus>(hRiadioInfo.roamStatus);
241     voiceRadioTech.simStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSimStatus>(hRiadioInfo.simStatus);
242     voiceRadioTech.lockStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSimLockStatus>(hRiadioInfo.lockStatus);
243     voiceRadioTech.sysMode = static_cast<OHOS::HDI::Ril::V1_1::RilSysMode>(hRiadioInfo.sysMode);
244     voiceRadioTech.sysModeName = (hRiadioInfo.sysModeName == nullptr) ? "" : hRiadioInfo.sysModeName;
245     voiceRadioTech.actType = static_cast<OHOS::HDI::Ril::V1_1::RilRadioTech>(hRiadioInfo.actType);
246     voiceRadioTech.actName = (hRiadioInfo.actName == nullptr) ? "" : hRiadioInfo.actName;
247 }
248 
GetBasebandVersionResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)249 int32_t HRilModem::GetBasebandVersionResponse(
250     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
251 {
252     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
253         TELEPHONY_LOGE("GetBasebandVersionResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
254         return HRIL_ERR_INVALID_PARAMETER;
255     }
256     if (response == nullptr) {
257         TELEPHONY_LOGE("response is null");
258         return HRIL_ERR_NULL_POINT;
259     }
260     return Response(
261         responseInfo, &HDI::Ril::V1_1::IRilCallback::GetBasebandVersionResponse, std::string((const char *)response));
262 }
263 
IsModemResponse(uint32_t code)264 bool HRilModem::IsModemResponse(uint32_t code)
265 {
266     return ((code >= HREQ_COMMON_BASE) && (code <= HREQ_MODEM_GET_VOICE_RADIO));
267 }
268 
IsModemNotification(uint32_t code)269 bool HRilModem::IsModemNotification(uint32_t code)
270 {
271     return ((code >= HNOTI_COMMON_BASE) && (code <= HNOTI_COMMON_END));
272 }
273 
IsModemRespOrNotify(uint32_t code)274 bool HRilModem::IsModemRespOrNotify(uint32_t code)
275 {
276     return IsModemResponse(code) || IsModemNotification(code);
277 }
278 
SetActiveSimResponse( int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)279 int32_t HRilModem::SetActiveSimResponse(
280     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
281 {
282     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetActiveSimResponse);
283 }
284 
AddHandlerToMap()285 void HRilModem::AddHandlerToMap()
286 {
287     // indication
288     notiMemberFuncMap_[HNOTI_MODEM_RADIO_STATE_UPDATED] =
289         [this](int32_t notifyType, HRilErrNumber error, const void *response,
290         size_t responseLen) { return RadioStateUpdated(notifyType, error, response, responseLen); };
291     notiMemberFuncMap_[HNOTI_MODEM_VOICE_TECH_UPDATED] =
292         [this](int32_t notifyType, HRilErrNumber error, const void *response,
293         size_t responseLen) { return VoiceRadioTechUpdated(notifyType, error, response, responseLen); };
294     notiMemberFuncMap_[HNOTI_MODEM_DSDS_MODE_UPDATED] =
295         [this](int32_t notifyType, HRilErrNumber error, const void *response,
296         size_t responseLen) { return DsdsModeUpdated(notifyType, error, response, responseLen); };
297     notiMemberFuncMap_[HNOTI_MODEM_NCFG_FINISHED_RESULT] =
298         [this](int32_t notifyType, HRilErrNumber error, const void *response,
299         size_t responseLen) { return NcfgFinishedResult(notifyType, error, response, responseLen); };
300     notiMemberFuncMap_[HNOTI_MODEM_RESTART_RILD_NV_MATCH] =
301         [this](int32_t notifyType, HRilErrNumber error, const void *response,
302         size_t responseLen) { return RestartRildNvMatch(notifyType, error, response, responseLen); };
303     // response
304     respMemberFuncMap_[HREQ_MODEM_SHUT_DOWN] =
305         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
306         size_t responseLen) { return ShutDownResponse(requestNum, responseInfo, response, responseLen); };
307     respMemberFuncMap_[HREQ_MODEM_SET_RADIO_STATUS] =
308         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
309         size_t responseLen) { return SetRadioStateResponse(requestNum, responseInfo, response, responseLen); };
310     respMemberFuncMap_[HREQ_SIM_SET_ACTIVE_SIM] =
311         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
312         size_t responseLen) { return SetActiveSimResponse(requestNum, responseInfo, response, responseLen); };
313     respMemberFuncMap_[HREQ_MODEM_GET_RADIO_STATUS] =
314         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
315         size_t responseLen) { return GetRadioStateResponse(requestNum, responseInfo, response, responseLen); };
316     respMemberFuncMap_[HREQ_MODEM_GET_IMEI] =
317         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
318         size_t responseLen) { return GetImeiResponse(requestNum, responseInfo, response, responseLen); };
319     respMemberFuncMap_[HREQ_MODEM_GET_IMEISV] =
320         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
321         size_t responseLen) { return GetImeiSvResponse(requestNum, responseInfo, response, responseLen); };
322     respMemberFuncMap_[HREQ_MODEM_GET_MEID] =
323         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
324         size_t responseLen) { return GetMeidResponse(requestNum, responseInfo, response, responseLen); };
325     respMemberFuncMap_[HREQ_MODEM_GET_VOICE_RADIO] = [this](int32_t requestNum,
326         HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen) {
327         return GetVoiceRadioTechnologyResponse(requestNum, responseInfo, response, responseLen);
328     };
329     respMemberFuncMap_[HREQ_MODEM_GET_BASEBAND_VERSION] =
330         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
331         size_t responseLen) { return GetBasebandVersionResponse(requestNum, responseInfo, response, responseLen); };
332 }
333 
RegisterModemFuncs(const HRilModemReq *modemFuncs)334 void HRilModem::RegisterModemFuncs(const HRilModemReq *modemFuncs)
335 {
336     modemFuncs_ = modemFuncs;
337 }
338 
GetLastRadioState()339 int32_t HRilModem::GetLastRadioState()
340 {
341     return radioState_;
342 }
343 } // namespace Telephony
344 } // namespace OHOS