• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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