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,IHRilReporter & hrilReporter)23 HRilModem::HRilModem(int32_t slotId, IHRilReporter &hrilReporter) : HRilBase(slotId, hrilReporter)
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
GetMeid(int32_t serialId)48 int32_t HRilModem::GetMeid(int32_t serialId)
49 {
50 return RequestVendor(serialId, HREQ_MODEM_GET_MEID, modemFuncs_, &HRilModemReq::GetMeid);
51 }
52
GetVoiceRadioTechnology(int32_t serialId)53 int32_t HRilModem::GetVoiceRadioTechnology(int32_t serialId)
54 {
55 return RequestVendor(serialId, HREQ_MODEM_GET_VOICE_RADIO, modemFuncs_, &HRilModemReq::GetVoiceRadioTechnology);
56 }
57
GetBasebandVersion(int32_t serialId)58 int32_t HRilModem::GetBasebandVersion(int32_t serialId)
59 {
60 return RequestVendor(serialId, HREQ_MODEM_GET_BASEBAND_VERSION, modemFuncs_, &HRilModemReq::GetBasebandVersion);
61 }
62
RadioStateUpdated(const int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)63 int32_t HRilModem::RadioStateUpdated(
64 const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
65 {
66 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
67 TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
68 return HRIL_ERR_INVALID_PARAMETER;
69 }
70 if (response == nullptr) {
71 TELEPHONY_LOGE("response is null");
72 return HRIL_ERR_NULL_POINT;
73 }
74 return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::RadioStateUpdated, *(const int32_t *)response);
75 }
76
VoiceRadioTechUpdated(const int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)77 int32_t HRilModem::VoiceRadioTechUpdated(
78 const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
79 {
80 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilVoiceRadioInfo)) != 0) {
81 TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
82 return HRIL_ERR_INVALID_PARAMETER;
83 }
84 if (response == nullptr) {
85 TELEPHONY_LOGE("response is null");
86 return HRIL_ERR_NULL_POINT;
87 }
88 HDI::Ril::V1_1::VoiceRadioTechnology voiceRadioTech = {};
89 BuildIVoiceRadioTechnology(voiceRadioTech, *(const HRilVoiceRadioInfo *)response);
90 return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::VoiceRadioTechUpdated, voiceRadioTech);
91 }
92
DsdsModeUpdated(const int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)93 int32_t HRilModem::DsdsModeUpdated(
94 const int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
95 {
96 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
97 TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
98 return HRIL_ERR_INVALID_PARAMETER;
99 }
100 if (response == nullptr) {
101 TELEPHONY_LOGE("response is null");
102 return HRIL_ERR_NULL_POINT;
103 }
104 return Notify(
105 indType, error, &HDI::Ril::V1_1::IRilCallback::DsdsModeUpdated, *(static_cast<const int32_t *>(response)));
106 }
107
ShutDownResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)108 int32_t HRilModem::ShutDownResponse(
109 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
110 {
111 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::ShutDownResponse);
112 }
113
SetRadioStateResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)114 int32_t HRilModem::SetRadioStateResponse(
115 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
116 {
117 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetRadioStateResponse);
118 }
119
GetRadioStateResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)120 int32_t HRilModem::GetRadioStateResponse(
121 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
122 {
123 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
124 TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
125 return HRIL_ERR_INVALID_PARAMETER;
126 }
127 if (response == nullptr) {
128 TELEPHONY_LOGE("response is null");
129 return HRIL_ERR_NULL_POINT;
130 }
131 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetRadioStateResponse, *(const int32_t *)response);
132 }
133
GetImeiResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)134 int32_t HRilModem::GetImeiResponse(
135 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
136 {
137 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
138 TELEPHONY_LOGE("GetImeiResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
139 return HRIL_ERR_INVALID_PARAMETER;
140 }
141 if (response == nullptr) {
142 TELEPHONY_LOGE("response is null");
143 return HRIL_ERR_NULL_POINT;
144 }
145 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetImeiResponse, std::string((const char *)response));
146 }
147
GetMeidResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)148 int32_t HRilModem::GetMeidResponse(
149 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
150 {
151 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
152 TELEPHONY_LOGE("GetMeidResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
153 return HRIL_ERR_INVALID_PARAMETER;
154 }
155 if (response == nullptr) {
156 TELEPHONY_LOGE("response is null");
157 return HRIL_ERR_NULL_POINT;
158 }
159 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetMeidResponse, std::string((const char *)response));
160 }
161
GetVoiceRadioTechnologyResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)162 int32_t HRilModem::GetVoiceRadioTechnologyResponse(
163 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
164 {
165 HDI::Ril::V1_1::VoiceRadioTechnology voiceRadioTech = {};
166 if (response == nullptr) {
167 TELEPHONY_LOGE("GetVoiceRadioTechnologyResponse Invalid response: nullptr");
168 if (responseInfo.error == HRilErrType::NONE) {
169 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
170 }
171 } else {
172 BuildIVoiceRadioTechnology(voiceRadioTech, *(const HRilVoiceRadioInfo *)response);
173 }
174 return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetVoiceRadioTechnologyResponse, voiceRadioTech);
175 }
176
BuildIVoiceRadioTechnology(HDI::Ril::V1_1::VoiceRadioTechnology & voiceRadioTech,const HRilVoiceRadioInfo & hRiadioInfo)177 void HRilModem::BuildIVoiceRadioTechnology(
178 HDI::Ril::V1_1::VoiceRadioTechnology &voiceRadioTech, const HRilVoiceRadioInfo &hRiadioInfo)
179 {
180 voiceRadioTech.srvStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSrvStatus>(hRiadioInfo.srvStatus);
181 voiceRadioTech.srvDomain = static_cast<OHOS::HDI::Ril::V1_1::RilSrvDomain>(hRiadioInfo.srvDomain);
182 voiceRadioTech.roamStatus = static_cast<OHOS::HDI::Ril::V1_1::RilRoamStatus>(hRiadioInfo.roamStatus);
183 voiceRadioTech.simStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSimStatus>(hRiadioInfo.simStatus);
184 voiceRadioTech.lockStatus = static_cast<OHOS::HDI::Ril::V1_1::RilSimLockStatus>(hRiadioInfo.lockStatus);
185 voiceRadioTech.sysMode = static_cast<OHOS::HDI::Ril::V1_1::RilSysMode>(hRiadioInfo.sysMode);
186 voiceRadioTech.sysModeName = (hRiadioInfo.sysModeName == nullptr) ? "" : hRiadioInfo.sysModeName;
187 voiceRadioTech.actType = static_cast<OHOS::HDI::Ril::V1_1::RilRadioTech>(hRiadioInfo.actType);
188 voiceRadioTech.actName = (hRiadioInfo.actName == nullptr) ? "" : hRiadioInfo.actName;
189 }
190
GetBasebandVersionResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)191 int32_t HRilModem::GetBasebandVersionResponse(
192 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
193 {
194 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
195 TELEPHONY_LOGE("GetBasebandVersionResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
196 return HRIL_ERR_INVALID_PARAMETER;
197 }
198 if (response == nullptr) {
199 TELEPHONY_LOGE("response is null");
200 return HRIL_ERR_NULL_POINT;
201 }
202 return Response(
203 responseInfo, &HDI::Ril::V1_1::IRilCallback::GetBasebandVersionResponse, std::string((const char *)response));
204 }
205
IsModemResponse(uint32_t code)206 bool HRilModem::IsModemResponse(uint32_t code)
207 {
208 return ((code >= HREQ_COMMON_BASE) && (code <= HREQ_MODEM_GET_VOICE_RADIO));
209 }
210
IsModemNotification(uint32_t code)211 bool HRilModem::IsModemNotification(uint32_t code)
212 {
213 return ((code >= HNOTI_COMMON_BASE) && (code <= HNOTI_COMMON_END));
214 }
215
IsModemRespOrNotify(uint32_t code)216 bool HRilModem::IsModemRespOrNotify(uint32_t code)
217 {
218 return IsModemResponse(code) || IsModemNotification(code);
219 }
220
AddHandlerToMap()221 void HRilModem::AddHandlerToMap()
222 {
223 // indication
224 notiMemberFuncMap_[HNOTI_MODEM_RADIO_STATE_UPDATED] = &HRilModem::RadioStateUpdated;
225 notiMemberFuncMap_[HNOTI_MODEM_VOICE_TECH_UPDATED] = &HRilModem::VoiceRadioTechUpdated;
226 notiMemberFuncMap_[HNOTI_MODEM_DSDS_MODE_UPDATED] = &HRilModem::DsdsModeUpdated;
227 // response
228 respMemberFuncMap_[HREQ_MODEM_SHUT_DOWN] = &HRilModem::ShutDownResponse;
229 respMemberFuncMap_[HREQ_MODEM_SET_RADIO_STATUS] = &HRilModem::SetRadioStateResponse;
230 respMemberFuncMap_[HREQ_MODEM_GET_RADIO_STATUS] = &HRilModem::GetRadioStateResponse;
231 respMemberFuncMap_[HREQ_MODEM_GET_IMEI] = &HRilModem::GetImeiResponse;
232 respMemberFuncMap_[HREQ_MODEM_GET_MEID] = &HRilModem::GetMeidResponse;
233 respMemberFuncMap_[HREQ_MODEM_GET_VOICE_RADIO] = &HRilModem::GetVoiceRadioTechnologyResponse;
234 respMemberFuncMap_[HREQ_MODEM_GET_BASEBAND_VERSION] = &HRilModem::GetBasebandVersionResponse;
235 }
236
RegisterModemFuncs(const HRilModemReq * modemFuncs)237 void HRilModem::RegisterModemFuncs(const HRilModemReq *modemFuncs)
238 {
239 modemFuncs_ = modemFuncs;
240 }
241 } // namespace Telephony
242 } // namespace OHOS