• 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_sms.h"
17 
18 #include "hril_notification.h"
19 #include "hril_request.h"
20 
21 namespace OHOS {
22 namespace Telephony {
23 namespace {
24 const size_t HEX_WIDTH = 2;
25 const size_t MAX_PDU_LEN = 255;
26 const size_t MAX_LEN = 100;
27 const size_t MAX_CHN_LEN = 50000;
28 const int32_t MSG_DEFAULT_INDEX = -1;
29 } // namespace
30 
HRilSms(int32_t slotId,IHRilReporter & hrilReporter)31 HRilSms::HRilSms(int32_t slotId, IHRilReporter &hrilReporter) : HRilBase(slotId, hrilReporter)
32 {
33     AddHandlerToMap();
34 }
35 
IsSmsRespOrNotify(uint32_t code)36 bool HRilSms::IsSmsRespOrNotify(uint32_t code)
37 {
38     return IsSmsResponse(code) || IsSmsNotification(code);
39 }
40 
RegisterSmsFuncs(const HRilSmsReq * smsFuncs)41 void HRilSms::RegisterSmsFuncs(const HRilSmsReq *smsFuncs)
42 {
43     smsFuncs_ = smsFuncs;
44 }
45 
AddHandlerToMap()46 void HRilSms::AddHandlerToMap()
47 {
48     // Response
49     respMemberFuncMap_[HREQ_SMS_SEND_GSM_SMS] = &HRilSms::SendGsmSmsResponse;
50     respMemberFuncMap_[HREQ_SMS_SEND_SMS_MORE_MODE] = &HRilSms::SendSmsMoreModeResponse;
51     respMemberFuncMap_[HREQ_SMS_SEND_SMS_ACK] = &HRilSms::SendSmsAckResponse;
52     respMemberFuncMap_[HREQ_SMS_ADD_SIM_MESSAGE] = &HRilSms::AddSimMessageResponse;
53     respMemberFuncMap_[HREQ_SMS_DEL_SIM_MESSAGE] = &HRilSms::DelSimMessageResponse;
54     respMemberFuncMap_[HREQ_SMS_UPDATE_SIM_MESSAGE] = &HRilSms::UpdateSimMessageResponse;
55     respMemberFuncMap_[HREQ_SMS_SET_SMSC_ADDR] = &HRilSms::SetSmscAddrResponse;
56     respMemberFuncMap_[HREQ_SMS_GET_SMSC_ADDR] = &HRilSms::GetSmscAddrResponse;
57     respMemberFuncMap_[HREQ_SMS_SET_CB_CONFIG] = &HRilSms::SetCBConfigResponse;
58     respMemberFuncMap_[HREQ_SMS_GET_CB_CONFIG] = &HRilSms::GetCBConfigResponse;
59     respMemberFuncMap_[HREQ_SMS_GET_CDMA_CB_CONFIG] = &HRilSms::GetCdmaCBConfigResponse;
60     respMemberFuncMap_[HREQ_SMS_SET_CDMA_CB_CONFIG] = &HRilSms::SetCdmaCBConfigResponse;
61     respMemberFuncMap_[HREQ_SMS_SEND_CDMA_SMS] = &HRilSms::SendCdmaSmsResponse;
62     respMemberFuncMap_[HREQ_SMS_ADD_CDMA_SIM_MESSAGE] = &HRilSms::AddCdmaSimMessageResponse;
63     respMemberFuncMap_[HREQ_SMS_DEL_CDMA_SIM_MESSAGE] = &HRilSms::DelCdmaSimMessageResponse;
64     respMemberFuncMap_[HREQ_SMS_UPDATE_CDMA_SIM_MESSAGE] = &HRilSms::UpdateCdmaSimMessageResponse;
65 
66     // Notification
67     notiMemberFuncMap_[HNOTI_SMS_NEW_SMS] = &HRilSms::NewSmsNotify;
68     notiMemberFuncMap_[HNOTI_SMS_NEW_CDMA_SMS] = &HRilSms::NewCdmaSmsNotify;
69     notiMemberFuncMap_[HNOTI_SMS_STATUS_REPORT] = &HRilSms::SmsStatusReportNotify;
70     notiMemberFuncMap_[HNOTI_SMS_NEW_SMS_STORED_ON_SIM] = &HRilSms::NewSmsStoredOnSimNotify;
71     notiMemberFuncMap_[HNOTI_CB_CONFIG_REPORT] = &HRilSms::CBConfigNotify;
72 }
73 
SendGsmSms(int32_t serialId,const OHOS::HDI::Ril::V1_0::GsmSmsMessageInfo & gsmSmsMessageInfo)74 int32_t HRilSms::SendGsmSms(int32_t serialId, const OHOS::HDI::Ril::V1_0::GsmSmsMessageInfo &gsmSmsMessageInfo)
75 {
76     const int32_t COUNT_STRINGS_VALUE = 2;
77     return RequestWithStrings(serialId, HREQ_SMS_SEND_GSM_SMS, COUNT_STRINGS_VALUE, gsmSmsMessageInfo.smscPdu.c_str(),
78         gsmSmsMessageInfo.pdu.c_str());
79 }
80 
SendCdmaSms(int32_t serialId,const OHOS::HDI::Ril::V1_0::SendCdmaSmsMessageInfo & cdmaSmsMessageInfo)81 int32_t HRilSms::SendCdmaSms(int32_t serialId, const OHOS::HDI::Ril::V1_0::SendCdmaSmsMessageInfo &cdmaSmsMessageInfo)
82 {
83     return RequestVendor(serialId, HREQ_SMS_SEND_CDMA_SMS, smsFuncs_, &HRilSmsReq::SendCdmaSms,
84         cdmaSmsMessageInfo.smscPdu.c_str(), cdmaSmsMessageInfo.smscPdu.size());
85 }
86 
AddSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo & message)87 int32_t HRilSms::AddSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo &message)
88 {
89     HRilSmsWriteSms msg = {};
90     msg.state = message.state;
91     msg.index = MSG_DEFAULT_INDEX;
92     size_t pduLen = message.pdu.length();
93     if (pduLen > MAX_PDU_LEN) {
94         return HRIL_ERR_INVALID_PARAMETER;
95     }
96     CopyToCharPoint(&msg.pdu, message.pdu);
97     size_t smscPduLen = message.smscPdu.length() + 1;
98     if (smscPduLen > MAX_PDU_LEN) {
99         SafeFrees(msg.pdu);
100         return HRIL_ERR_INVALID_PARAMETER;
101     }
102     CopyToCharPoint(&msg.smsc, message.smscPdu);
103     int32_t result = RequestVendor(
104         serialId, HREQ_SMS_ADD_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::AddSimMessage, &msg, sizeof(HRilSmsWriteSms));
105     TELEPHONY_LOGI("AddSimMessage result is: %{public}d", result);
106     SafeFrees(msg.pdu, msg.smsc);
107     return result;
108 }
109 
DelSimMessage(int32_t serialId,int32_t index)110 int32_t HRilSms::DelSimMessage(int32_t serialId, int32_t index)
111 {
112     if ((smsFuncs_ == nullptr) || (smsFuncs_->DelSimMessage == nullptr)) {
113         TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->DelSimMessage is null");
114         return HRIL_ERR_NULL_POINT;
115     }
116     ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_DEL_SIM_MESSAGE);
117     if (requestInfo == nullptr) {
118         return HRIL_ERR_INVALID_PARAMETER;
119     }
120     int32_t *pBuff = nullptr;
121     RequestWithInts(&pBuff, requestInfo, 1, index);
122     smsFuncs_->DelSimMessage(requestInfo, pBuff, 0);
123     if (pBuff != nullptr) {
124         SafeFrees(pBuff);
125     }
126     return HRIL_ERR_SUCCESS;
127 }
128 
UpdateSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo & message)129 int32_t HRilSms::UpdateSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo &message)
130 {
131     HRilSmsWriteSms msg = {};
132     size_t len = 0;
133     len = message.pdu.size() + 1;
134     msg.state = message.state;
135     if (len > MAX_PDU_LEN) {
136         return HRIL_ERR_INVALID_PARAMETER;
137     }
138     CopyToCharPoint(&msg.pdu, message.pdu);
139     msg.index = message.index;
140     int32_t result = RequestVendor(
141         serialId, HREQ_SMS_UPDATE_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::UpdateSimMessage, &msg, sizeof(HRilSmsWriteSms));
142     TELEPHONY_LOGI("UpdateSimMessage result is: %{public}d", result);
143     SafeFrees(msg.pdu);
144     return result;
145 }
146 
SetSmscAddr(int32_t serialId,const OHOS::HDI::Ril::V1_0::ServiceCenterAddress & serCenterAddress)147 int32_t HRilSms::SetSmscAddr(int32_t serialId, const OHOS::HDI::Ril::V1_0::ServiceCenterAddress &serCenterAddress)
148 {
149     HRilServiceCenterAddress address;
150     size_t len = 0;
151     len = strlen(serCenterAddress.address.c_str()) + 1;
152     address.tosca = serCenterAddress.tosca;
153     if (len > MAX_LEN) {
154         return HRIL_ERR_INVALID_PARAMETER;
155     }
156     CopyToCharPoint(&address.address, serCenterAddress.address);
157     int32_t result = RequestVendor(serialId, HREQ_SMS_SET_SMSC_ADDR, smsFuncs_, &HRilSmsReq::SetSmscAddr, &address,
158         sizeof(HRilServiceCenterAddress));
159     TELEPHONY_LOGI("SetSmscAddr result is: %{public}d", result);
160     SafeFrees(address.address);
161     return result;
162 }
163 
GetSmscAddr(int32_t serialId)164 int32_t HRilSms::GetSmscAddr(int32_t serialId)
165 {
166     return RequestVendor(serialId, HREQ_SMS_GET_SMSC_ADDR, smsFuncs_, &HRilSmsReq::GetSmscAddr);
167 }
168 
SetCBConfig(int32_t serialId,const OHOS::HDI::Ril::V1_0::CBConfigInfo & broadcastInfo)169 int32_t HRilSms::SetCBConfig(int32_t serialId, const OHOS::HDI::Ril::V1_0::CBConfigInfo &broadcastInfo)
170 {
171     HRilCBConfigInfo cellBroadcastInfo;
172     cellBroadcastInfo.mode = broadcastInfo.mode;
173     size_t midsLen = broadcastInfo.mids.size() + 1;
174     if (midsLen > MAX_CHN_LEN) {
175         return HRIL_ERR_INVALID_PARAMETER;
176     }
177     CopyToCharPoint(&cellBroadcastInfo.mids, broadcastInfo.mids);
178     size_t dcssLen = broadcastInfo.dcss.size() + 1;
179     if (dcssLen <= 0) {
180         SafeFrees(cellBroadcastInfo.mids);
181         return HRIL_ERR_INVALID_PARAMETER;
182     }
183     CopyToCharPoint(&cellBroadcastInfo.dcss, broadcastInfo.dcss);
184     int32_t result = RequestVendor(serialId, HREQ_SMS_SET_CB_CONFIG, smsFuncs_, &HRilSmsReq::SetCBConfig,
185         &cellBroadcastInfo, sizeof(HRilServiceCenterAddress));
186     TELEPHONY_LOGI("SetCBConfig result is: %{public}d", result);
187     SafeFrees(cellBroadcastInfo.mids, cellBroadcastInfo.dcss);
188     return result;
189 }
190 
GetCBConfig(int32_t serialId)191 int32_t HRilSms::GetCBConfig(int32_t serialId)
192 {
193     return RequestVendor(serialId, HREQ_SMS_GET_CB_CONFIG, smsFuncs_, &HRilSmsReq::GetCBConfig);
194 }
195 
SetCdmaCBConfig(int32_t serialId,const OHOS::HDI::Ril::V1_0::CdmaCBConfigInfoList & cellBroadcastInfoList)196 int32_t HRilSms::SetCdmaCBConfig(
197     int32_t serialId, const OHOS::HDI::Ril::V1_0::CdmaCBConfigInfoList &cellBroadcastInfoList)
198 {
199     if ((smsFuncs_ == nullptr) || (smsFuncs_->SetCdmaCBConfig == nullptr)) {
200         TELEPHONY_LOGE("(smsFuncs_ or msFuncs_->SetCdmaCBConfig is null");
201         return HRIL_ERR_NULL_POINT;
202     }
203     ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_SET_CDMA_CB_CONFIG);
204     if (requestInfo == nullptr) {
205         return HRIL_ERR_INVALID_PARAMETER;
206     }
207     auto size = cellBroadcastInfoList.size;
208     std::unique_ptr<HRilCdmaCBConfigInfo[]> list = std::make_unique<HRilCdmaCBConfigInfo[]>(size);
209     CopyToHRilCdmaCBConfigInfo(list.get(), cellBroadcastInfoList);
210     smsFuncs_->SetCdmaCBConfig(requestInfo, list.get(), cellBroadcastInfoList.size * sizeof(HRilCdmaCBConfigInfo));
211     return HRIL_ERR_SUCCESS;
212 }
213 
GetCdmaCBConfig(int32_t serialId)214 int32_t HRilSms::GetCdmaCBConfig(int32_t serialId)
215 {
216     return RequestVendor(serialId, HREQ_SMS_GET_CDMA_CB_CONFIG, smsFuncs_, &HRilSmsReq::GetCdmaCBConfig);
217 }
218 
SendSmsMoreMode(int32_t serialId,const OHOS::HDI::Ril::V1_0::GsmSmsMessageInfo & gsmSmsMessageInfo)219 int32_t HRilSms::SendSmsMoreMode(int32_t serialId, const OHOS::HDI::Ril::V1_0::GsmSmsMessageInfo &gsmSmsMessageInfo)
220 {
221     const int32_t COUNT_STRINGS_VALUE = 2;
222     return RequestWithStrings(serialId, HREQ_SMS_SEND_SMS_MORE_MODE, COUNT_STRINGS_VALUE,
223         gsmSmsMessageInfo.smscPdu.c_str(), gsmSmsMessageInfo.pdu.c_str());
224 }
225 
SendSmsAck(int32_t serialId,const OHOS::HDI::Ril::V1_0::ModeData & modeData)226 int32_t HRilSms::SendSmsAck(int32_t serialId, const OHOS::HDI::Ril::V1_0::ModeData &modeData)
227 {
228     if ((smsFuncs_ == nullptr) || (smsFuncs_->SendSmsAck == nullptr)) {
229         TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->SendSmsAck is null");
230         return HRIL_ERR_NULL_POINT;
231     }
232     ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_SEND_SMS_ACK);
233     if (requestInfo == nullptr) {
234         return HRIL_ERR_INVALID_PARAMETER;
235     }
236     int32_t *pBuff = nullptr;
237     const int32_t COUNT_INTS_VALUE = 2;
238     RequestWithInts(&pBuff, requestInfo, COUNT_INTS_VALUE, static_cast<int32_t>(modeData.result), modeData.mode);
239     smsFuncs_->SendSmsAck(requestInfo, pBuff, sizeof(int32_t));
240     if (pBuff != nullptr) {
241         SafeFrees(pBuff);
242     }
243     return HRIL_ERR_SUCCESS;
244 }
245 
AddCdmaSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo & message)246 int32_t HRilSms::AddCdmaSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo &message)
247 {
248     HRilSmsWriteSms msg = {};
249     int32_t pduLen = 0;
250     const int32_t MSG_INDEX = -1;
251     msg.state = message.state;
252     msg.index = MSG_INDEX;
253     pduLen = message.pdu.length();
254     int32_t len = pduLen + 1;
255     if (len <= 0) {
256         return HRIL_ERR_INVALID_PARAMETER;
257     }
258     CopyToCharPoint(&msg.pdu, message.pdu);
259     int32_t result = RequestVendor(serialId, HREQ_SMS_ADD_CDMA_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::AddCdmaSimMessage,
260         &msg, sizeof(HRilSmsWriteSms));
261     TELEPHONY_LOGI("AddCdmaSimMessage result is: %{public}d", result);
262     SafeFrees(msg.pdu);
263     return result;
264 }
265 
DelCdmaSimMessage(int32_t serialId,int32_t index)266 int32_t HRilSms::DelCdmaSimMessage(int32_t serialId, int32_t index)
267 {
268     if ((smsFuncs_ == nullptr) || (smsFuncs_->DelCdmaSimMessage == nullptr)) {
269         TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->DelCdmaSimMessage is null");
270         return HRIL_ERR_NULL_POINT;
271     }
272     ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_DEL_CDMA_SIM_MESSAGE);
273     if (requestInfo == nullptr) {
274         return HRIL_ERR_INVALID_PARAMETER;
275     }
276     int32_t *pBuff = nullptr;
277     RequestWithInts(&pBuff, requestInfo, 1, index);
278     smsFuncs_->DelCdmaSimMessage(requestInfo, pBuff, 0);
279     if (pBuff != nullptr) {
280         SafeFrees(pBuff);
281     }
282     return HRIL_ERR_SUCCESS;
283 }
284 
UpdateCdmaSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo & message)285 int32_t HRilSms::UpdateCdmaSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo &message)
286 {
287     HRilSmsWriteSms msg = {};
288     size_t len = 0;
289     len = message.pdu.size() + 1;
290     msg.state = message.state;
291     if (len > MAX_CHN_LEN) {
292         return HRIL_ERR_INVALID_PARAMETER;
293     }
294     CopyToCharPoint(&msg.pdu, message.pdu);
295     msg.index = message.index;
296     RequestVendor(serialId, HREQ_SMS_UPDATE_CDMA_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::UpdateCdmaSimMessage, &msg,
297         sizeof(HRilSmsWriteSms));
298     SafeFrees(msg.pdu);
299     return HRIL_ERR_SUCCESS;
300 }
301 
SendGsmSmsResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)302 int32_t HRilSms::SendGsmSmsResponse(
303     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
304 {
305     HDI::Ril::V1_0::SendSmsResultInfo result =
306         MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
307     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SendGsmSmsResponse, result);
308 }
309 
SendCdmaSmsResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)310 int32_t HRilSms::SendCdmaSmsResponse(
311     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
312 {
313     HDI::Ril::V1_0::SendSmsResultInfo result =
314         MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
315     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SendCdmaSmsResponse, result);
316 }
317 
AddSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)318 int32_t HRilSms::AddSimMessageResponse(
319     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
320 {
321     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::AddSimMessageResponse);
322 }
323 
DelSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)324 int32_t HRilSms::DelSimMessageResponse(
325     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
326 {
327     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::DelSimMessageResponse);
328 }
329 
UpdateSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)330 int32_t HRilSms::UpdateSimMessageResponse(
331     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
332 {
333     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::UpdateSimMessageResponse);
334 }
335 
SetSmscAddrResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)336 int32_t HRilSms::SetSmscAddrResponse(
337     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
338 {
339     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SetSmscAddrResponse);
340 }
341 
GetSmscAddrResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)342 int32_t HRilSms::GetSmscAddrResponse(
343     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
344 {
345     HDI::Ril::V1_0::ServiceCenterAddress result;
346     if (response == nullptr || responseLen != sizeof(HRilServiceCenterAddress)) {
347         TELEPHONY_LOGE("Invalid response: response is nullptr");
348         if (responseInfo.error == HRilErrType::NONE) {
349             responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
350         }
351         result.address = std::string("");
352     } else {
353         const HRilServiceCenterAddress *address = static_cast<const HRilServiceCenterAddress *>(response);
354         result.tosca = address->tosca;
355         if (address->address == nullptr) {
356             result.address = std::string("");
357             TELEPHONY_LOGE("address is nullptr");
358         } else {
359             result.address = std::string(address->address);
360         }
361         TELEPHONY_LOGE("result address:%{public}s, tosca:%{public}d", result.address.c_str(), result.tosca);
362     }
363     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetSmscAddrResponse, result);
364 }
365 
SetCBConfigResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)366 int32_t HRilSms::SetCBConfigResponse(
367     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
368 {
369     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SetCBConfigResponse);
370 }
371 
GetCBConfigResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)372 int32_t HRilSms::GetCBConfigResponse(
373     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
374 {
375     HDI::Ril::V1_0::CBConfigInfo broadcastInfo;
376     if (response == nullptr || responseLen != sizeof(HRilCBConfigInfo)) {
377         TELEPHONY_LOGE("Invalid response: response is nullptr");
378         broadcastInfo.mode = -1;
379         broadcastInfo.mids = std::string("");
380         broadcastInfo.dcss = std::string("");
381     } else {
382         HRilCBConfigInfo *cellBroadcastInfo = (HRilCBConfigInfo *)response;
383         broadcastInfo.mode = cellBroadcastInfo->mode;
384         if (cellBroadcastInfo->mids == nullptr) {
385             broadcastInfo.mids = std::string("");
386             TELEPHONY_LOGE("result.mids is nullptr");
387         } else {
388             TELEPHONY_LOGI("result.mids :%{private}s", cellBroadcastInfo->mids);
389             broadcastInfo.mids = std::string(cellBroadcastInfo->mids);
390         }
391         if (cellBroadcastInfo->dcss == nullptr) {
392             broadcastInfo.dcss = std::string("");
393             TELEPHONY_LOGE("result.dcss is nullptr");
394         } else {
395             TELEPHONY_LOGI("result.dcss :%{private}s", cellBroadcastInfo->dcss);
396             broadcastInfo.dcss = std::string(cellBroadcastInfo->dcss);
397         }
398         TELEPHONY_LOGD("mode:%{private}d, mids:%{private}s, dcss:%{private}s", cellBroadcastInfo->mode,
399             cellBroadcastInfo->mids, cellBroadcastInfo->dcss);
400     }
401     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetCBConfigResponse, broadcastInfo);
402 }
403 
SetCdmaCBConfigResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)404 int32_t HRilSms::SetCdmaCBConfigResponse(
405     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
406 {
407     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SetCdmaCBConfigResponse);
408 }
409 
GetCdmaCBConfigResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)410 int32_t HRilSms::GetCdmaCBConfigResponse(
411     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
412 {
413     HDI::Ril::V1_0::CdmaCBConfigInfo broadcastInfo;
414     if (response == nullptr || responseLen != sizeof(HRilCdmaCBConfigInfo)) {
415         TELEPHONY_LOGE("Invalid response: response is nullptr");
416         broadcastInfo.checked = -1;
417         broadcastInfo.language = -1;
418         broadcastInfo.service = -1;
419     } else {
420         const HRilCdmaCBConfigInfo *cellBroadcastInfo = static_cast<const HRilCdmaCBConfigInfo *>(response);
421         broadcastInfo.checked = cellBroadcastInfo->checked;
422         broadcastInfo.language = cellBroadcastInfo->language;
423         broadcastInfo.service = cellBroadcastInfo->service;
424         TELEPHONY_LOGE("checked:%{public}c, language:%{public}d, service:%{public}d", cellBroadcastInfo->checked,
425             cellBroadcastInfo->language, cellBroadcastInfo->service);
426     }
427     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetCdmaCBConfigResponse, broadcastInfo);
428 }
429 
SendSmsMoreModeResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)430 int32_t HRilSms::SendSmsMoreModeResponse(
431     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
432 {
433     HDI::Ril::V1_0::SendSmsResultInfo result =
434         MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
435     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SendSmsMoreModeResponse, result);
436 }
437 
SendSmsAckResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)438 int32_t HRilSms::SendSmsAckResponse(
439     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
440 {
441     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SendSmsAckResponse);
442 }
443 
AddCdmaSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)444 int32_t HRilSms::AddCdmaSimMessageResponse(
445     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
446 {
447     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::AddCdmaSimMessageResponse);
448 }
449 
DelCdmaSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)450 int32_t HRilSms::DelCdmaSimMessageResponse(
451     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
452 {
453     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::DelCdmaSimMessageResponse);
454 }
455 
UpdateCdmaSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)456 int32_t HRilSms::UpdateCdmaSimMessageResponse(
457     int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
458 {
459     return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::UpdateCdmaSimMessageResponse);
460 }
461 
SmsStatusReportNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)462 int32_t HRilSms::SmsStatusReportNotify(
463     int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
464 {
465     if (response == nullptr || responseLen == 0) {
466         TELEPHONY_LOGE("invalid response");
467         return HRIL_ERR_GENERIC_FAILURE;
468     }
469     HDI::Ril::V1_0::SmsMessageInfo smsMessageInfo;
470     uint8_t *bytes = ConvertHexStringToBytes(response, responseLen);
471     if (bytes == nullptr) {
472         TELEPHONY_LOGE("ConvertHexStringToBytes in SmsStatusReportNotify is failed!");
473         return HRIL_ERR_GENERIC_FAILURE;
474     }
475     const size_t MESSAGE_SIZE = responseLen / HEX_WIDTH;
476     smsMessageInfo.size = MESSAGE_SIZE;
477     smsMessageInfo.indicationType = static_cast<int32_t>(ConvertIntToRadioNoticeType(indType));
478     uint8_t *temp = bytes;
479     for (int32_t i = 0; i < smsMessageInfo.size; i++) {
480         smsMessageInfo.pdu.push_back(*temp);
481         temp++;
482     }
483     SafeFrees(bytes);
484     return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::SmsStatusReportNotify, smsMessageInfo);
485 }
486 
NewSmsStoredOnSimNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)487 int32_t HRilSms::NewSmsStoredOnSimNotify(
488     int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
489 {
490     if (response == nullptr || responseLen != sizeof(int32_t)) {
491         TELEPHONY_LOGE("invalid response");
492         return HRIL_ERR_SUCCESS;
493     }
494     int32_t recordNumber = *(static_cast<const int32_t *>(response));
495     indType = static_cast<int32_t>(ConvertIntToRadioNoticeType(indType));
496     return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::NewSmsStoredOnSimNotify, recordNumber, indType);
497 }
498 
NewSmsNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)499 int32_t HRilSms::NewSmsNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
500 {
501     HRilSmsResponse *smsResponse = nullptr;
502     if (response == nullptr || responseLen == 0) {
503         TELEPHONY_LOGE("NewSmsNotify: invalid response");
504         return HDF_FAILURE;
505     } else {
506         smsResponse = (HRilSmsResponse *)response;
507     }
508     uint8_t *bytes = ConvertHexStringToBytes(smsResponse->pdu, responseLen);
509     if (bytes == nullptr) {
510         TELEPHONY_LOGE("NewSmsNotify: ConvertHexStringToBytes failed");
511         return HRIL_ERR_GENERIC_FAILURE;
512     }
513     HDI::Ril::V1_0::SmsMessageInfo smsMessageInfo;
514     const size_t NEW_SMS_SIZE = responseLen / HEX_WIDTH;
515     smsMessageInfo.size = NEW_SMS_SIZE;
516     smsMessageInfo.indicationType = indType;
517     uint8_t *temp = bytes;
518     for (int32_t i = 0; i < static_cast<int32_t>(smsMessageInfo.size); i++) {
519         smsMessageInfo.pdu.push_back(*temp);
520         temp++;
521     }
522     SafeFrees(bytes);
523     return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::NewSmsNotify, smsMessageInfo);
524 }
525 
NewCdmaSmsNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)526 int32_t HRilSms::NewCdmaSmsNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
527 {
528     HRilSmsResponse *message = nullptr;
529     if (response == nullptr || responseLen == 0) {
530         TELEPHONY_LOGE("invalid response");
531         return HRIL_ERR_GENERIC_FAILURE;
532     } else {
533         message = (HRilSmsResponse *)response;
534     }
535     HDI::Ril::V1_0::SmsMessageInfo messageInfo;
536     messageInfo.indicationType = indType;
537     if (message->pdu != nullptr) {
538         messageInfo.size = strlen(message->pdu) / HEX_WIDTH;
539         uint8_t *bytes = ConvertHexStringToBytes(message->pdu, strlen(message->pdu));
540         if (bytes == nullptr) {
541             TELEPHONY_LOGE("bytes is nullptr");
542             return HRIL_ERR_GENERIC_FAILURE;
543         }
544         uint8_t *temp = bytes;
545         for (int32_t i = 0; i < messageInfo.size; i++) {
546             messageInfo.pdu.push_back(*temp);
547             temp++;
548         }
549         SafeFrees(bytes);
550     }
551     return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::NewCdmaSmsNotify, messageInfo);
552 }
553 
CBConfigNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)554 int32_t HRilSms::CBConfigNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
555 {
556     HDI::Ril::V1_0::CBConfigReportInfo result = MakeCBConfigResult(response, responseLen);
557     result.indicationType = indType;
558     return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::CBConfigNotify, result);
559 }
560 
IsSmsResponse(uint32_t code)561 bool HRilSms::IsSmsResponse(uint32_t code)
562 {
563     return ((code >= HREQ_SMS_BASE) && (code < HREQ_SIM_BASE));
564 }
565 
IsSmsNotification(uint32_t code)566 bool HRilSms::IsSmsNotification(uint32_t code)
567 {
568     return ((code >= HNOTI_SMS_BASE) && (code < HNOTI_SIM_BASE));
569 }
570 
RequestWithInts(int32_t ** p,ReqDataInfo * requestInfo,int32_t argCount,...)571 int32_t HRilSms::RequestWithInts(int32_t **p, ReqDataInfo *requestInfo, int32_t argCount, ...)
572 {
573     size_t len = sizeof(int32_t);
574     if (len <= 0 || argCount <= 0) {
575         return false;
576     }
577     *p = static_cast<int32_t *>(malloc(argCount * len));
578     if (*p == nullptr) {
579         TELEPHONY_LOGE("req: [%{public}d,%{public}d,%{public}d], malloc fail", requestInfo->serial,
580             static_cast<int32_t>(requestInfo->slotId), requestInfo->request);
581         return false;
582     }
583     if (memset_s(*p, argCount * len, 0, argCount * len) != EOK) {
584         TELEPHONY_LOGE("RequestWithInts memset_s failed");
585         SafeFrees(*p);
586         return false;
587     }
588     va_list list;
589     va_start(list, argCount);
590     int32_t i = 0;
591     while (i < argCount) {
592         (*p)[i] = va_arg(list, int32_t);
593         i++;
594     }
595     va_end(list);
596     return true;
597 }
598 
RequestWithStrings(int32_t serial,int32_t request,int32_t count,...)599 int32_t HRilSms::RequestWithStrings(int32_t serial, int32_t request, int32_t count, ...)
600 {
601     if ((smsFuncs_ == nullptr) || (smsFuncs_->SendGsmSms == nullptr)) {
602         TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->SendGsmSms is null");
603         return HRIL_ERR_NULL_POINT;
604     }
605     char **pBuff = nullptr;
606     if (count <= 0) {
607         return HRIL_ERR_NULL_POINT;
608     }
609     int32_t len = count * sizeof(char *);
610     pBuff = (char **)malloc(len);
611     if (pBuff == nullptr) {
612         TELEPHONY_LOGE("req: [%{public}d,%{public}d], malloc fail", serial, request);
613         return HRIL_ERR_NULL_POINT;
614     }
615     if (memset_s(pBuff, len, 0, len) != EOK) {
616         TELEPHONY_LOGE("RequestWithInts memset_s failed");
617         SafeFrees(pBuff);
618         return false;
619     }
620     va_list list;
621     va_start(list, count);
622     int32_t i = 0;
623     while (i < count) {
624         const char *str = va_arg(list, const char *);
625         if (!ConvertToString(&pBuff[i], str)) {
626             TELEPHONY_LOGE("ConvertToString in RequestWithStrings is failed!");
627             va_end(list);
628             for (int32_t j = 0; j < i; j++) {
629                 SafeFrees(pBuff[j]);
630             }
631             SafeFrees(pBuff);
632             return HRIL_ERR_NULL_POINT;
633         }
634         i++;
635     }
636     va_end(list);
637     int32_t result = RequestVendor(serial, request, smsFuncs_, &HRilSmsReq::SendGsmSms, pBuff, 0);
638     if (pBuff != nullptr) {
639         i = 0;
640         while (i < count) {
641             SafeFrees(pBuff[i]);
642             i++;
643         }
644         SafeFrees(pBuff);
645     }
646     return result;
647 }
648 
MakeCBConfigResult(const void * response,const size_t responseLen)649 HDI::Ril::V1_0::CBConfigReportInfo HRilSms::MakeCBConfigResult(const void *response, const size_t responseLen)
650 {
651     HDI::Ril::V1_0::CBConfigReportInfo result;
652     if (response == nullptr || responseLen != sizeof(HRilCBConfigReportInfo)) {
653         TELEPHONY_LOGE("Invalid response: response is nullptr");
654         result.data = std::string("");
655         result.pdu = std::string("");
656         result.dcs = std::string("");
657     } else {
658         const HRilCBConfigReportInfo *cellBroadcastReportInfo = static_cast<const HRilCBConfigReportInfo *>(response);
659         result.mid = cellBroadcastReportInfo->mid;
660         result.length = cellBroadcastReportInfo->length;
661         result.page = cellBroadcastReportInfo->page;
662         result.pages = cellBroadcastReportInfo->pages;
663         result.sn = cellBroadcastReportInfo->sn;
664         if (cellBroadcastReportInfo->data == nullptr) {
665             result.data = std::string("");
666             TELEPHONY_LOGE("result.data is nullptr");
667         } else {
668             TELEPHONY_LOGI("result.data :%{private}s", cellBroadcastReportInfo->data);
669             result.data = std::string(cellBroadcastReportInfo->data);
670         }
671         if (cellBroadcastReportInfo->pdu == nullptr) {
672             result.pdu = std::string("");
673             TELEPHONY_LOGE("result.pdu is nullptr");
674         } else {
675             TELEPHONY_LOGI("result.pdu :%{private}s", cellBroadcastReportInfo->pdu);
676             result.pdu = std::string(cellBroadcastReportInfo->pdu);
677         }
678         if (cellBroadcastReportInfo->dcs == nullptr) {
679             result.dcs = std::string("");
680             TELEPHONY_LOGE("result.dcs is nullptr");
681         } else {
682             TELEPHONY_LOGI("result.dcs :%{private}s", cellBroadcastReportInfo->dcs);
683             result.dcs = std::string(cellBroadcastReportInfo->dcs);
684         }
685     }
686     return result;
687 }
688 
MakeSendSmsResult(HRilRadioResponseInfo & responseInfo,int32_t serial,const void * response,const size_t responseLen)689 HDI::Ril::V1_0::SendSmsResultInfo HRilSms::MakeSendSmsResult(
690     HRilRadioResponseInfo &responseInfo, int32_t serial, const void *response, const size_t responseLen)
691 {
692     HDI::Ril::V1_0::SendSmsResultInfo result;
693     if (response == nullptr || responseLen != sizeof(HRilSmsResponse)) {
694         TELEPHONY_LOGE("Invalid response: response is nullptr");
695         if (responseInfo.error == HRilErrType::NONE) {
696             responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
697         }
698         result.pdu = std::string("");
699     } else {
700         const HRilSmsResponse *smsResponse = static_cast<const HRilSmsResponse *>(response);
701         result.msgRef = smsResponse->msgRef;
702         if (smsResponse->pdu == nullptr) {
703             result.pdu = std::string("");
704             TELEPHONY_LOGE("result.pdu is nullptr");
705         } else {
706             result.pdu = std::string(smsResponse->pdu);
707         }
708         result.errCode = smsResponse->errCode;
709     }
710     return result;
711 }
712 
CopyToHRilCdmaCBConfigInfo(HRilCdmaCBConfigInfo * list,OHOS::HDI::Ril::V1_0::CdmaCBConfigInfoList cellBroadcastInfoList)713 void HRilSms::CopyToHRilCdmaCBConfigInfo(
714     HRilCdmaCBConfigInfo *list, OHOS::HDI::Ril::V1_0::CdmaCBConfigInfoList cellBroadcastInfoList)
715 {
716     for (int32_t i = 0; i < cellBroadcastInfoList.size; i++) {
717         list[i].service = cellBroadcastInfoList.list[i].service;
718         list[i].language = cellBroadcastInfoList.list[i].language;
719         list[i].checked = cellBroadcastInfoList.list[i].checked;
720     }
721 }
722 } // namespace Telephony
723 } // namespace OHOS
724