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 std::string imeiResponse = "";
174 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
175 TELEPHONY_LOGE("GetImeiResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
176 if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
177 responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
178 }
179 }
180 if (response == nullptr) {
181 TELEPHONY_LOGE("response is null");
182 if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
183 responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_NULL_POINT;
184 }
185 } else {
186 imeiResponse = std::string((const char *)response);
187 }
188 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetImeiResponse, imeiResponse);
189 }
190
GetImeiSvResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)191 int32_t HRilModem::GetImeiSvResponse(
192 int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
193 {
194 std::string imeiSvResponse = "";
195 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
196 TELEPHONY_LOGE("GetImeiSvResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
197 if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
198 responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
199 }
200 }
201 if (response == nullptr) {
202 TELEPHONY_LOGE("response is null");
203 if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
204 responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_NULL_POINT;
205 }
206 } else {
207 imeiSvResponse = std::string((const char *)response);
208 }
209 return Response(
210 responseInfo, &HDI::Ril::V1_3::IRilCallback::GetImeiSvResponse, imeiSvResponse);
211 }
212
GetMeidResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)213 int32_t HRilModem::GetMeidResponse(
214 int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
215 {
216 std::string meidResponse = "";
217 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
218 TELEPHONY_LOGE("GetMeidResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
219 if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
220 responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
221 }
222 }
223 if (response == nullptr) {
224 TELEPHONY_LOGE("response is null");
225 if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
226 responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_NULL_POINT;
227 }
228 } else {
229 meidResponse = std::string((const char *)response);
230 }
231 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetMeidResponse, meidResponse);
232 }
233
GetVoiceRadioTechnologyResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)234 int32_t HRilModem::GetVoiceRadioTechnologyResponse(
235 int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
236 {
237 HDI::Ril::V1_1::VoiceRadioTechnology voiceRadioTech = {};
238 if (response == nullptr) {
239 TELEPHONY_LOGE("GetVoiceRadioTechnologyResponse Invalid response: nullptr");
240 if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
241 responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
242 }
243 } else {
244 BuildIVoiceRadioTechnology(voiceRadioTech, *(const HRilVoiceRadioInfo *)response);
245 }
246 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetVoiceRadioTechnologyResponse, voiceRadioTech);
247 }
248
BuildIVoiceRadioTechnology(HDI::Ril::V1_1::VoiceRadioTechnology & voiceRadioTech,const HRilVoiceRadioInfo & hRiadioInfo)249 void HRilModem::BuildIVoiceRadioTechnology(
250 HDI::Ril::V1_1::VoiceRadioTechnology &voiceRadioTech, const HRilVoiceRadioInfo &hRiadioInfo)
251 {
252 voiceRadioTech.srvStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSrvStatus>(hRiadioInfo.srvStatus);
253 voiceRadioTech.srvDomain = static_cast<OHOS::HDI::Ril::V1_1::RilSrvDomain>(hRiadioInfo.srvDomain);
254 voiceRadioTech.roamStatus = static_cast<OHOS::HDI::Ril::V1_1::RilRoamStatus>(hRiadioInfo.roamStatus);
255 voiceRadioTech.simStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSimStatus>(hRiadioInfo.simStatus);
256 voiceRadioTech.lockStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSimLockStatus>(hRiadioInfo.lockStatus);
257 voiceRadioTech.sysMode = static_cast<OHOS::HDI::Ril::V1_1::RilSysMode>(hRiadioInfo.sysMode);
258 voiceRadioTech.sysModeName = (hRiadioInfo.sysModeName == nullptr) ? "" : hRiadioInfo.sysModeName;
259 voiceRadioTech.actType = static_cast<OHOS::HDI::Ril::V1_1::RilRadioTech>(hRiadioInfo.actType);
260 voiceRadioTech.actName = (hRiadioInfo.actName == nullptr) ? "" : hRiadioInfo.actName;
261 }
262
GetBasebandVersionResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)263 int32_t HRilModem::GetBasebandVersionResponse(
264 int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
265 {
266 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
267 TELEPHONY_LOGE("GetBasebandVersionResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
268 return HRIL_ERR_INVALID_PARAMETER;
269 }
270 if (response == nullptr) {
271 TELEPHONY_LOGE("response is null");
272 return HRIL_ERR_NULL_POINT;
273 }
274 return Response(
275 responseInfo, &HDI::Ril::V1_1::IRilCallback::GetBasebandVersionResponse, std::string((const char *)response));
276 }
277
IsModemResponse(uint32_t code)278 bool HRilModem::IsModemResponse(uint32_t code)
279 {
280 return ((code >= HREQ_COMMON_BASE) && (code <= HREQ_MODEM_GET_VOICE_RADIO));
281 }
282
IsModemNotification(uint32_t code)283 bool HRilModem::IsModemNotification(uint32_t code)
284 {
285 return ((code >= HNOTI_COMMON_BASE) && (code <= HNOTI_COMMON_END));
286 }
287
IsModemRespOrNotify(uint32_t code)288 bool HRilModem::IsModemRespOrNotify(uint32_t code)
289 {
290 return IsModemResponse(code) || IsModemNotification(code);
291 }
292
SetActiveSimResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)293 int32_t HRilModem::SetActiveSimResponse(
294 int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
295 {
296 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetActiveSimResponse);
297 }
298
AddHandlerToMap()299 void HRilModem::AddHandlerToMap()
300 {
301 // indication
302 notiMemberFuncMap_[HNOTI_MODEM_RADIO_STATE_UPDATED] =
303 [this](int32_t notifyType, HRilErrNumber error, const void *response,
304 size_t responseLen) { return RadioStateUpdated(notifyType, error, response, responseLen); };
305 notiMemberFuncMap_[HNOTI_MODEM_VOICE_TECH_UPDATED] =
306 [this](int32_t notifyType, HRilErrNumber error, const void *response,
307 size_t responseLen) { return VoiceRadioTechUpdated(notifyType, error, response, responseLen); };
308 notiMemberFuncMap_[HNOTI_MODEM_DSDS_MODE_UPDATED] =
309 [this](int32_t notifyType, HRilErrNumber error, const void *response,
310 size_t responseLen) { return DsdsModeUpdated(notifyType, error, response, responseLen); };
311 notiMemberFuncMap_[HNOTI_MODEM_NCFG_FINISHED_RESULT] =
312 [this](int32_t notifyType, HRilErrNumber error, const void *response,
313 size_t responseLen) { return NcfgFinishedResult(notifyType, error, response, responseLen); };
314 notiMemberFuncMap_[HNOTI_MODEM_RESTART_RILD_NV_MATCH] =
315 [this](int32_t notifyType, HRilErrNumber error, const void *response,
316 size_t responseLen) { return RestartRildNvMatch(notifyType, error, response, responseLen); };
317 // response
318 respMemberFuncMap_[HREQ_MODEM_SHUT_DOWN] =
319 [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
320 size_t responseLen) { return ShutDownResponse(requestNum, responseInfo, response, responseLen); };
321 respMemberFuncMap_[HREQ_MODEM_SET_RADIO_STATUS] =
322 [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
323 size_t responseLen) { return SetRadioStateResponse(requestNum, responseInfo, response, responseLen); };
324 respMemberFuncMap_[HREQ_SIM_SET_ACTIVE_SIM] =
325 [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
326 size_t responseLen) { return SetActiveSimResponse(requestNum, responseInfo, response, responseLen); };
327 respMemberFuncMap_[HREQ_MODEM_GET_RADIO_STATUS] =
328 [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
329 size_t responseLen) { return GetRadioStateResponse(requestNum, responseInfo, response, responseLen); };
330 respMemberFuncMap_[HREQ_MODEM_GET_IMEI] =
331 [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
332 size_t responseLen) { return GetImeiResponse(requestNum, responseInfo, response, responseLen); };
333 respMemberFuncMap_[HREQ_MODEM_GET_IMEISV] =
334 [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
335 size_t responseLen) { return GetImeiSvResponse(requestNum, responseInfo, response, responseLen); };
336 respMemberFuncMap_[HREQ_MODEM_GET_MEID] =
337 [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
338 size_t responseLen) { return GetMeidResponse(requestNum, responseInfo, response, responseLen); };
339 respMemberFuncMap_[HREQ_MODEM_GET_VOICE_RADIO] = [this](int32_t requestNum,
340 HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen) {
341 return GetVoiceRadioTechnologyResponse(requestNum, responseInfo, response, responseLen);
342 };
343 respMemberFuncMap_[HREQ_MODEM_GET_BASEBAND_VERSION] =
344 [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
345 size_t responseLen) { return GetBasebandVersionResponse(requestNum, responseInfo, response, responseLen); };
346 }
347
RegisterModemFuncs(const HRilModemReq * modemFuncs)348 void HRilModem::RegisterModemFuncs(const HRilModemReq *modemFuncs)
349 {
350 modemFuncs_ = modemFuncs;
351 }
352
GetLastRadioState()353 int32_t HRilModem::GetLastRadioState()
354 {
355 return radioState_;
356 }
357 } // namespace Telephony
358 } // namespace OHOS