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_0::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_0::VoiceRadioTechnology voiceRadioTech = {};
89 BuildIVoiceRadioTechnology(voiceRadioTech, *(const HRilVoiceRadioInfo *)response);
90 return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::VoiceRadioTechUpdated, voiceRadioTech);
91 }
92
ShutDownResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)93 int32_t HRilModem::ShutDownResponse(
94 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
95 {
96 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::ShutDownResponse);
97 }
98
SetRadioStateResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)99 int32_t HRilModem::SetRadioStateResponse(
100 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
101 {
102 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SetRadioStateResponse);
103 }
104
GetRadioStateResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)105 int32_t HRilModem::GetRadioStateResponse(
106 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
107 {
108 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
109 TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
110 return HRIL_ERR_INVALID_PARAMETER;
111 }
112 if (response == nullptr) {
113 TELEPHONY_LOGE("response is null");
114 return HRIL_ERR_NULL_POINT;
115 }
116 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetRadioStateResponse, *(const int32_t *)response);
117 }
118
GetImeiResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)119 int32_t HRilModem::GetImeiResponse(
120 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
121 {
122 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
123 TELEPHONY_LOGE("GetImeiResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
124 return HRIL_ERR_INVALID_PARAMETER;
125 }
126 if (response == nullptr) {
127 TELEPHONY_LOGE("response is null");
128 return HRIL_ERR_NULL_POINT;
129 }
130 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetImeiResponse, std::string((const char *)response));
131 }
132
GetMeidResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)133 int32_t HRilModem::GetMeidResponse(
134 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
135 {
136 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
137 TELEPHONY_LOGE("GetMeidResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
138 return HRIL_ERR_INVALID_PARAMETER;
139 }
140 if (response == nullptr) {
141 TELEPHONY_LOGE("response is null");
142 return HRIL_ERR_NULL_POINT;
143 }
144 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetMeidResponse, std::string((const char *)response));
145 }
146
GetVoiceRadioTechnologyResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)147 int32_t HRilModem::GetVoiceRadioTechnologyResponse(
148 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
149 {
150 HDI::Ril::V1_0::VoiceRadioTechnology voiceRadioTech = {};
151 if (response == nullptr) {
152 TELEPHONY_LOGE("GetVoiceRadioTechnologyResponse Invalid response: nullptr");
153 if (responseInfo.error == HRilErrType::NONE) {
154 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
155 }
156 } else {
157 BuildIVoiceRadioTechnology(voiceRadioTech, *(const HRilVoiceRadioInfo *)response);
158 }
159 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetVoiceRadioTechnologyResponse, voiceRadioTech);
160 }
161
BuildIVoiceRadioTechnology(HDI::Ril::V1_0::VoiceRadioTechnology & voiceRadioTech,const HRilVoiceRadioInfo & hRiadioInfo)162 void HRilModem::BuildIVoiceRadioTechnology(
163 HDI::Ril::V1_0::VoiceRadioTechnology &voiceRadioTech, const HRilVoiceRadioInfo &hRiadioInfo)
164 {
165 voiceRadioTech.srvStatus = static_cast<OHOS::HDI::Ril::V1_0::RilSrvStatus>(hRiadioInfo.srvStatus);
166 voiceRadioTech.srvDomain = static_cast<OHOS::HDI::Ril::V1_0::RilSrvDomain>(hRiadioInfo.srvDomain);
167 voiceRadioTech.roamStatus = static_cast<OHOS::HDI::Ril::V1_0::RilRoamStatus>(hRiadioInfo.roamStatus);
168 voiceRadioTech.simStatus = static_cast<OHOS::HDI::Ril::V1_0::RilSimStatus>(hRiadioInfo.simStatus);
169 voiceRadioTech.lockStatus = static_cast<OHOS::HDI::Ril::V1_0::RilSimLockStatus>(hRiadioInfo.lockStatus);
170 voiceRadioTech.sysMode = static_cast<OHOS::HDI::Ril::V1_0::RilSysMode>(hRiadioInfo.sysMode);
171 voiceRadioTech.sysModeName = (hRiadioInfo.sysModeName == nullptr) ? "" : hRiadioInfo.sysModeName;
172 voiceRadioTech.actType = static_cast<OHOS::HDI::Ril::V1_0::RilRadioTech>(hRiadioInfo.actType);
173 voiceRadioTech.actName = (hRiadioInfo.actName == nullptr) ? "" : hRiadioInfo.actName;
174 }
175
GetBasebandVersionResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)176 int32_t HRilModem::GetBasebandVersionResponse(
177 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
178 {
179 if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
180 TELEPHONY_LOGE("GetBasebandVersionResponse:Invalid parameter, responseLen:%{public}zu", responseLen);
181 return HRIL_ERR_INVALID_PARAMETER;
182 }
183 if (response == nullptr) {
184 TELEPHONY_LOGE("response is null");
185 return HRIL_ERR_NULL_POINT;
186 }
187 return Response(
188 responseInfo, &HDI::Ril::V1_0::IRilCallback::GetBasebandVersionResponse, std::string((const char *)response));
189 }
190
IsModemResponse(uint32_t code)191 bool HRilModem::IsModemResponse(uint32_t code)
192 {
193 return ((code >= HREQ_COMMON_BASE) && (code <= HREQ_MODEM_GET_VOICE_RADIO));
194 }
195
IsModemNotification(uint32_t code)196 bool HRilModem::IsModemNotification(uint32_t code)
197 {
198 return ((code >= HNOTI_COMMON_BASE) && (code <= HNOTI_MODEM_VOICE_TECH_UPDATED));
199 }
200
IsModemRespOrNotify(uint32_t code)201 bool HRilModem::IsModemRespOrNotify(uint32_t code)
202 {
203 return IsModemResponse(code) || IsModemNotification(code);
204 }
205
AddHandlerToMap()206 void HRilModem::AddHandlerToMap()
207 {
208 // indication
209 notiMemberFuncMap_[HNOTI_MODEM_RADIO_STATE_UPDATED] = &HRilModem::RadioStateUpdated;
210 notiMemberFuncMap_[HNOTI_MODEM_VOICE_TECH_UPDATED] = &HRilModem::VoiceRadioTechUpdated;
211 // response
212 respMemberFuncMap_[HREQ_MODEM_SHUT_DOWN] = &HRilModem::ShutDownResponse;
213 respMemberFuncMap_[HREQ_MODEM_SET_RADIO_STATUS] = &HRilModem::SetRadioStateResponse;
214 respMemberFuncMap_[HREQ_MODEM_GET_RADIO_STATUS] = &HRilModem::GetRadioStateResponse;
215 respMemberFuncMap_[HREQ_MODEM_GET_IMEI] = &HRilModem::GetImeiResponse;
216 respMemberFuncMap_[HREQ_MODEM_GET_MEID] = &HRilModem::GetMeidResponse;
217 respMemberFuncMap_[HREQ_MODEM_GET_VOICE_RADIO] = &HRilModem::GetVoiceRadioTechnologyResponse;
218 respMemberFuncMap_[HREQ_MODEM_GET_BASEBAND_VERSION] = &HRilModem::GetBasebandVersionResponse;
219 }
220
RegisterModemFuncs(const HRilModemReq * modemFuncs)221 void HRilModem::RegisterModemFuncs(const HRilModemReq *modemFuncs)
222 {
223 modemFuncs_ = modemFuncs;
224 }
225 } // namespace Telephony
226 } // namespace OHOS