• 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 <regex>
19 
20 #include "hril_notification.h"
21 #include "hril_request.h"
22 
23 namespace OHOS {
24 namespace Telephony {
25 namespace {
26 const size_t HEX_WIDTH = 2;
27 const size_t MAX_PDU_LEN = 255;
28 const size_t MAX_LEN = 100;
29 const size_t MAX_CHN_LEN = 50000;
30 const int32_t MSG_DEFAULT_INDEX = -1;
31 const int32_t BYTE_LEN = 1;
32 const int32_t INT_LEN = 4;
33 const int32_t NUM_2 = 2;
34 const int32_t NUM_3 = 3;
35 const int32_t NUM_4 = 4;
36 const int32_t NUM_5 = 5;
37 const int HEXADECIMAL = 16;
38 const int DEC_DECIMAL = 10;
39 constexpr const char *COMMA_STR = ",";
40 } // namespace
41 
HRilSms(int32_t slotId)42 HRilSms::HRilSms(int32_t slotId) : HRilBase(slotId)
43 {
44     AddHandlerToMap();
45     AddNotificationToMap();
46 }
47 
IsSmsRespOrNotify(uint32_t code)48 bool HRilSms::IsSmsRespOrNotify(uint32_t code)
49 {
50     return IsSmsResponse(code) || IsSmsNotification(code);
51 }
52 
RegisterSmsFuncs(const HRilSmsReq * smsFuncs)53 void HRilSms::RegisterSmsFuncs(const HRilSmsReq *smsFuncs)
54 {
55     smsFuncs_ = smsFuncs;
56 }
57 
AddHandlerToMap()58 void HRilSms::AddHandlerToMap()
59 {
60     // Response
61     respMemberFuncMap_[HREQ_SMS_SEND_GSM_SMS] =
62         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
63         size_t responseLen) { return SendGsmSmsResponse(requestNum, responseInfo, response, responseLen); };
64     respMemberFuncMap_[HREQ_SMS_SEND_SMS_MORE_MODE] =
65         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
66         size_t responseLen) { return SendSmsMoreModeResponse(requestNum, responseInfo, response, responseLen); };
67     respMemberFuncMap_[HREQ_SMS_SEND_SMS_ACK] =
68         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
69         size_t responseLen) { return SendSmsAckResponse(requestNum, responseInfo, response, responseLen); };
70     respMemberFuncMap_[HREQ_SMS_ADD_SIM_MESSAGE] =
71         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
72         size_t responseLen) { return AddSimMessageResponse(requestNum, responseInfo, response, responseLen); };
73     respMemberFuncMap_[HREQ_SMS_DEL_SIM_MESSAGE] =
74         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
75         size_t responseLen) { return DelSimMessageResponse(requestNum, responseInfo, response, responseLen); };
76     respMemberFuncMap_[HREQ_SMS_UPDATE_SIM_MESSAGE] =
77         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
78         size_t responseLen) { return UpdateSimMessageResponse(requestNum, responseInfo, response, responseLen); };
79     respMemberFuncMap_[HREQ_SMS_SET_SMSC_ADDR] =
80         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
81         size_t responseLen) { return SetSmscAddrResponse(requestNum, responseInfo, response, responseLen); };
82     respMemberFuncMap_[HREQ_SMS_GET_SMSC_ADDR] =
83         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
84         size_t responseLen) { return GetSmscAddrResponse(requestNum, responseInfo, response, responseLen); };
85     respMemberFuncMap_[HREQ_SMS_SET_CB_CONFIG] =
86         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
87         size_t responseLen) { return SetCBConfigResponse(requestNum, responseInfo, response, responseLen); };
88     respMemberFuncMap_[HREQ_SMS_GET_CB_CONFIG] =
89         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
90         size_t responseLen) { return GetCBConfigResponse(requestNum, responseInfo, response, responseLen); };
91     respMemberFuncMap_[HREQ_SMS_GET_CDMA_CB_CONFIG] =
92         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
93         size_t responseLen) { return GetCdmaCBConfigResponse(requestNum, responseInfo, response, responseLen); };
94     respMemberFuncMap_[HREQ_SMS_SET_CDMA_CB_CONFIG] =
95         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
96         size_t responseLen) { return SetCdmaCBConfigResponse(requestNum, responseInfo, response, responseLen); };
97     respMemberFuncMap_[HREQ_SMS_SEND_CDMA_SMS] =
98         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
99         size_t responseLen) { return SendCdmaSmsResponse(requestNum, responseInfo, response, responseLen); };
100     respMemberFuncMap_[HREQ_SMS_ADD_CDMA_SIM_MESSAGE] =
101         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
102         size_t responseLen) { return AddCdmaSimMessageResponse(requestNum, responseInfo, response, responseLen); };
103     respMemberFuncMap_[HREQ_SMS_DEL_CDMA_SIM_MESSAGE] =
104         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
105         size_t responseLen) { return DelCdmaSimMessageResponse(requestNum, responseInfo, response, responseLen); };
106     respMemberFuncMap_[HREQ_SMS_UPDATE_CDMA_SIM_MESSAGE] =
107         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
108         size_t responseLen) { return UpdateCdmaSimMessageResponse(requestNum, responseInfo, response, responseLen); };
109 }
110 
AddNotificationToMap()111 void HRilSms::AddNotificationToMap()
112 {
113     // Notification
114     notiMemberFuncMap_[HNOTI_SMS_NEW_SMS] =
115         [this](int32_t notifyType, HRilErrNumber error, const void *response,
116         size_t responseLen) { return NewSmsNotify(notifyType, error, response, responseLen); };
117     notiMemberFuncMap_[HNOTI_SMS_NEW_CDMA_SMS] =
118         [this](int32_t notifyType, HRilErrNumber error, const void *response,
119         size_t responseLen) { return NewCdmaSmsNotify(notifyType, error, response, responseLen); };
120     notiMemberFuncMap_[HNOTI_SMS_STATUS_REPORT] =
121         [this](int32_t notifyType, HRilErrNumber error, const void *response,
122         size_t responseLen) { return SmsStatusReportNotify(notifyType, error, response, responseLen); };
123     notiMemberFuncMap_[HNOTI_SMS_NEW_SMS_STORED_ON_SIM] =
124         [this](int32_t notifyType, HRilErrNumber error, const void *response,
125         size_t responseLen) { return NewSmsStoredOnSimNotify(notifyType, error, response, responseLen); };
126     notiMemberFuncMap_[HNOTI_CB_CONFIG_REPORT] =
127         [this](int32_t notifyType, HRilErrNumber error, const void *response,
128         size_t responseLen) { return CBConfigNotify(notifyType, error, response, responseLen); };
129 }
130 
SendGsmSms(int32_t serialId,const OHOS::HDI::Ril::V1_1::GsmSmsMessageInfo & gsmSmsMessageInfo)131 int32_t HRilSms::SendGsmSms(int32_t serialId, const OHOS::HDI::Ril::V1_1::GsmSmsMessageInfo &gsmSmsMessageInfo)
132 {
133     const int32_t COUNT_STRINGS_VALUE = 2;
134     return RequestWithStrings(serialId, HREQ_SMS_SEND_GSM_SMS, COUNT_STRINGS_VALUE, gsmSmsMessageInfo.smscPdu.c_str(),
135         gsmSmsMessageInfo.pdu.c_str());
136 }
137 
SendCdmaSms(int32_t serialId,const OHOS::HDI::Ril::V1_1::SendCdmaSmsMessageInfo & cdmaSmsMessageInfo)138 int32_t HRilSms::SendCdmaSms(int32_t serialId, const OHOS::HDI::Ril::V1_1::SendCdmaSmsMessageInfo &cdmaSmsMessageInfo)
139 {
140     return RequestVendor(serialId, HREQ_SMS_SEND_CDMA_SMS, smsFuncs_, &HRilSmsReq::SendCdmaSms,
141         cdmaSmsMessageInfo.smscPdu.c_str(), cdmaSmsMessageInfo.smscPdu.size());
142 }
143 
AddSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_1::SmsMessageIOInfo & message)144 int32_t HRilSms::AddSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_1::SmsMessageIOInfo &message)
145 {
146     HRilSmsWriteSms msg = {};
147     msg.state = message.state;
148     msg.index = MSG_DEFAULT_INDEX;
149     size_t pduLen = message.pdu.length();
150     if (pduLen > MAX_PDU_LEN) {
151         return HRIL_ERR_INVALID_PARAMETER;
152     }
153     CopyToCharPoint(&msg.pdu, message.pdu);
154     size_t smscPduLen = message.smscPdu.length() + 1;
155     if (smscPduLen > MAX_PDU_LEN) {
156         SafeFrees(msg.pdu);
157         return HRIL_ERR_INVALID_PARAMETER;
158     }
159     CopyToCharPoint(&msg.smsc, message.smscPdu);
160     int32_t result = RequestVendor(
161         serialId, HREQ_SMS_ADD_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::AddSimMessage, &msg, sizeof(HRilSmsWriteSms));
162     TELEPHONY_LOGI("AddSimMessage result is: %{public}d", result);
163     SafeFrees(msg.pdu);
164     SafeFrees(msg.smsc);
165     return result;
166 }
167 
DelSimMessage(int32_t serialId,int32_t index)168 int32_t HRilSms::DelSimMessage(int32_t serialId, int32_t index)
169 {
170     if ((smsFuncs_ == nullptr) || (smsFuncs_->DelSimMessage == nullptr)) {
171         TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->DelSimMessage is null");
172         return HRIL_ERR_NULL_POINT;
173     }
174     ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_DEL_SIM_MESSAGE);
175     if (requestInfo == nullptr) {
176         return HRIL_ERR_INVALID_PARAMETER;
177     }
178     int32_t *pBuff = nullptr;
179     RequestWithInts(&pBuff, requestInfo, 1, index);
180     smsFuncs_->DelSimMessage(requestInfo, pBuff, sizeof(int32_t));
181     if (pBuff != nullptr) {
182         SafeFrees(pBuff);
183     }
184     return HRIL_ERR_SUCCESS;
185 }
186 
UpdateSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_1::SmsMessageIOInfo & message)187 int32_t HRilSms::UpdateSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_1::SmsMessageIOInfo &message)
188 {
189     HRilSmsWriteSms msg = {};
190     msg.state = message.state;
191     msg.index = message.index;
192     size_t len = message.pdu.size() + 1;
193     if (len > MAX_PDU_LEN) {
194         return HRIL_ERR_INVALID_PARAMETER;
195     }
196     CopyToCharPoint(&msg.pdu, message.pdu);
197     size_t smscPduLen = message.smscPdu.length() + 1;
198     if (smscPduLen > MAX_PDU_LEN) {
199         SafeFrees(msg.pdu);
200         return HRIL_ERR_INVALID_PARAMETER;
201     }
202     CopyToCharPoint(&msg.smsc, message.smscPdu);
203     int32_t result = RequestVendor(
204         serialId, HREQ_SMS_UPDATE_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::UpdateSimMessage, &msg, sizeof(HRilSmsWriteSms));
205     TELEPHONY_LOGI("UpdateSimMessage result is: %{public}d", result);
206     SafeFrees(msg.pdu);
207     SafeFrees(msg.smsc);
208     return result;
209 }
210 
SetSmscAddr(int32_t serialId,const OHOS::HDI::Ril::V1_1::ServiceCenterAddress & serCenterAddress)211 int32_t HRilSms::SetSmscAddr(int32_t serialId, const OHOS::HDI::Ril::V1_1::ServiceCenterAddress &serCenterAddress)
212 {
213     HRilServiceCenterAddress address;
214     size_t len = 0;
215     len = strlen(serCenterAddress.address.c_str()) + 1;
216     address.tosca = serCenterAddress.tosca;
217     if (len > MAX_LEN) {
218         return HRIL_ERR_INVALID_PARAMETER;
219     }
220     CopyToCharPoint(&address.address, serCenterAddress.address);
221     int32_t result = RequestVendor(serialId, HREQ_SMS_SET_SMSC_ADDR, smsFuncs_, &HRilSmsReq::SetSmscAddr, &address,
222         sizeof(HRilServiceCenterAddress));
223     TELEPHONY_LOGI("SetSmscAddr result is: %{public}d", result);
224     SafeFrees(address.address);
225     return result;
226 }
227 
GetSmscAddr(int32_t serialId)228 int32_t HRilSms::GetSmscAddr(int32_t serialId)
229 {
230     return RequestVendor(serialId, HREQ_SMS_GET_SMSC_ADDR, smsFuncs_, &HRilSmsReq::GetSmscAddr);
231 }
232 
SetCBConfig(int32_t serialId,const OHOS::HDI::Ril::V1_1::CBConfigInfo & broadcastInfo)233 int32_t HRilSms::SetCBConfig(int32_t serialId, const OHOS::HDI::Ril::V1_1::CBConfigInfo &broadcastInfo)
234 {
235     size_t midsLen = broadcastInfo.mids.size() + 1;
236     if (midsLen == 0 || midsLen > MAX_CHN_LEN) {
237         return HRIL_ERR_INVALID_PARAMETER;
238     }
239 
240     size_t dcssLen = broadcastInfo.dcss.size();
241     if (dcssLen == 0) {
242         return HRIL_ERR_INVALID_PARAMETER;
243     }
244     int32_t result;
245     std::vector<HRilCBConfigInfo> configInfo;
246     if (!GetHRilCBConfigInfo(configInfo, broadcastInfo)) {
247         return HRIL_ERR_INVALID_PARAMETER;
248     }
249     if (configInfo.size() == 0 || configInfo.size() > MAX_CHN_LEN) {
250         return HRIL_ERR_INVALID_PARAMETER;
251     }
252     HRilCBConfigInfo *info = new HRilCBConfigInfo[configInfo.size()];
253     std::size_t locate = 0;
254     while (locate < configInfo.size()) {
255         info[locate].startOfServiceId = configInfo[locate].startOfServiceId;
256         info[locate].endOfServiceId = configInfo[locate].endOfServiceId;
257         info[locate].startOfCodeScheme = configInfo[locate].startOfCodeScheme;
258         info[locate].endOfCodeScheme = configInfo[locate].endOfCodeScheme;
259         info[locate].selected = configInfo[locate].selected;
260         locate++;
261     }
262     uint32_t len = sizeof(HRilCBConfigInfo) * configInfo.size();
263     result = RequestVendor(serialId, HREQ_SMS_SET_CB_CONFIG, smsFuncs_, &HRilSmsReq::SetCBConfig, info, len);
264     if (result != HRIL_ERR_SUCCESS) {
265         TELEPHONY_LOGE("SetCBConfig fail, result is: %{public}d", result);
266     }
267     delete[] info;
268     return result;
269 }
270 
GetHRilCBConfigInfo(std::vector<HRilCBConfigInfo> & cellBroadcastInfo,const OHOS::HDI::Ril::V1_1::CBConfigInfo & broadcastInfo)271 bool HRilSms::GetHRilCBConfigInfo(
272     std::vector<HRilCBConfigInfo> &cellBroadcastInfo, const OHOS::HDI::Ril::V1_1::CBConfigInfo &broadcastInfo)
273 {
274     std::vector<std::string> mids;
275     SplitMids(broadcastInfo.mids, mids, COMMA_STR);
276     for (auto mid : mids) {
277         std::string startMid;
278         std::string endMid;
279         if (!SplitValue(mid, startMid, endMid, "-")) {
280             TELEPHONY_LOGE("cb channel invalid");
281             return false;
282         }
283         std::string startDcs;
284         std::string endDcs;
285         if (!SplitValue(broadcastInfo.dcss, startDcs, endDcs, "-")) {
286             TELEPHONY_LOGE("cb dcs invalid");
287             return false;
288         }
289         HRilCBConfigInfo info;
290         info.startOfServiceId = strtol(startMid.c_str(), nullptr, DEC_DECIMAL);
291         info.endOfServiceId = strtol(endMid.c_str(), nullptr, DEC_DECIMAL);
292         info.startOfCodeScheme = strtol(startDcs.c_str(), nullptr, DEC_DECIMAL);
293         info.endOfCodeScheme = strtol(endDcs.c_str(), nullptr, DEC_DECIMAL);
294         info.selected = broadcastInfo.mode;
295         cellBroadcastInfo.push_back(info);
296     }
297     return true;
298 }
299 
SplitMids(std::string src,std::vector<std::string> & dest,const std::string delimiter)300 void HRilSms::SplitMids(std::string src, std::vector<std::string> &dest, const std::string delimiter)
301 {
302     if (src.empty()) {
303         return;
304     }
305     size_t pos = src.find(delimiter);
306     while (pos != std::string::npos) {
307         dest.push_back(src.substr(0, pos));
308         src.erase(0, pos + delimiter.length());
309         pos = src.find(delimiter);
310     }
311     dest.push_back(src);
312 }
313 
SplitValue(std::string value,std::string & start,std::string & end,const std::string delimiter)314 bool HRilSms::SplitValue(std::string value, std::string &start, std::string &end, const std::string delimiter)
315 {
316     if (value.empty()) {
317         return false;
318     }
319     size_t pos = value.find(delimiter);
320     if (pos == 0 || pos == value.size() - 1) {
321         return false;
322     } else if (pos == std::string::npos) {
323         start = value;
324         end = value;
325         return true;
326     }
327     start = value.substr(0, pos);
328     end = value.substr(pos + 1);
329     return true;
330 }
331 
GetCBConfig(int32_t serialId)332 int32_t HRilSms::GetCBConfig(int32_t serialId)
333 {
334     return RequestVendor(serialId, HREQ_SMS_GET_CB_CONFIG, smsFuncs_, &HRilSmsReq::GetCBConfig);
335 }
336 
SetCdmaCBConfig(int32_t serialId,const OHOS::HDI::Ril::V1_1::CdmaCBConfigInfoList & cellBroadcastInfoList)337 int32_t HRilSms::SetCdmaCBConfig(
338     int32_t serialId, const OHOS::HDI::Ril::V1_1::CdmaCBConfigInfoList &cellBroadcastInfoList)
339 {
340     if ((smsFuncs_ == nullptr) || (smsFuncs_->SetCdmaCBConfig == nullptr)) {
341         TELEPHONY_LOGE("(smsFuncs_ or msFuncs_->SetCdmaCBConfig is null");
342         return HRIL_ERR_NULL_POINT;
343     }
344     ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_SET_CDMA_CB_CONFIG);
345     if (requestInfo == nullptr) {
346         return HRIL_ERR_INVALID_PARAMETER;
347     }
348     auto size = cellBroadcastInfoList.size;
349     std::unique_ptr<HRilCdmaCBConfigInfo[]> list = std::make_unique<HRilCdmaCBConfigInfo[]>(size);
350     CopyToHRilCdmaCBConfigInfo(list.get(), cellBroadcastInfoList);
351     smsFuncs_->SetCdmaCBConfig(requestInfo, list.get(), cellBroadcastInfoList.size * sizeof(HRilCdmaCBConfigInfo));
352     return HRIL_ERR_SUCCESS;
353 }
354 
GetCdmaCBConfig(int32_t serialId)355 int32_t HRilSms::GetCdmaCBConfig(int32_t serialId)
356 {
357     return RequestVendor(serialId, HREQ_SMS_GET_CDMA_CB_CONFIG, smsFuncs_, &HRilSmsReq::GetCdmaCBConfig);
358 }
359 
SendSmsMoreMode(int32_t serialId,const OHOS::HDI::Ril::V1_1::GsmSmsMessageInfo & gsmSmsMessageInfo)360 int32_t HRilSms::SendSmsMoreMode(int32_t serialId, const OHOS::HDI::Ril::V1_1::GsmSmsMessageInfo &gsmSmsMessageInfo)
361 {
362     const int32_t COUNT_STRINGS_VALUE = 2;
363     return RequestWithStrings(serialId, HREQ_SMS_SEND_SMS_MORE_MODE, COUNT_STRINGS_VALUE,
364         gsmSmsMessageInfo.smscPdu.c_str(), gsmSmsMessageInfo.pdu.c_str());
365 }
366 
SendSmsAck(int32_t serialId,const OHOS::HDI::Ril::V1_1::ModeData & modeData)367 int32_t HRilSms::SendSmsAck(int32_t serialId, const OHOS::HDI::Ril::V1_1::ModeData &modeData)
368 {
369     if ((smsFuncs_ == nullptr) || (smsFuncs_->SendSmsAck == nullptr)) {
370         TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->SendSmsAck is null");
371         return HRIL_ERR_NULL_POINT;
372     }
373     ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_SEND_SMS_ACK);
374     if (requestInfo == nullptr) {
375         return HRIL_ERR_INVALID_PARAMETER;
376     }
377     int32_t *pBuff = nullptr;
378     const int32_t COUNT_INTS_VALUE = 2;
379     RequestWithInts(&pBuff, requestInfo, COUNT_INTS_VALUE, static_cast<int32_t>(modeData.result), modeData.mode);
380     smsFuncs_->SendSmsAck(requestInfo, pBuff, sizeof(int32_t));
381     if (pBuff != nullptr) {
382         SafeFrees(pBuff);
383     }
384     return HRIL_ERR_SUCCESS;
385 }
386 
AddCdmaSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_1::SmsMessageIOInfo & message)387 int32_t HRilSms::AddCdmaSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_1::SmsMessageIOInfo &message)
388 {
389     HRilSmsWriteCdmaSms msg = {};
390     msg.state = message.state;
391     if (!CreateCdmaMessageInfo(msg.cdmaMessageInfo, message.pdu)) {
392         TELEPHONY_LOGE("CreateCdmaMessageInfo failed");
393         return HRIL_ERR_INVALID_PARAMETER;
394     }
395     int32_t result = RequestVendor(serialId, HREQ_SMS_ADD_CDMA_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::AddCdmaSimMessageV2,
396         &msg, sizeof(HRilSmsWriteCdmaSms));
397     TELEPHONY_LOGI("AddCdmaSimMessageV2 result is: %{public}d", result);
398     return result;
399 }
400 
CreateCdmaMessageInfo(HRilCdmaSmsMessageInfo & cdmaSmsInfo,const std::string & pdu)401 bool HRilSms::CreateCdmaMessageInfo(HRilCdmaSmsMessageInfo &cdmaSmsInfo, const std::string &pdu)
402 {
403     if (!CheckCdmaPduLength(cdmaSmsInfo, pdu)) {
404         TELEPHONY_LOGE("pdu is invalid");
405         return false;
406     }
407     cdmaSmsInfo.serviceId = strtol(pdu.substr(0, INT_LEN).c_str(), nullptr, HEXADECIMAL);
408     cdmaSmsInfo.isExist = strtol(pdu.substr(INT_LEN + BYTE_LEN * NUM_3, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
409     cdmaSmsInfo.type = strtol(pdu.substr(INT_LEN + INT_LEN, INT_LEN).c_str(), nullptr, HEXADECIMAL);
410     int32_t index = INT_LEN * NUM_3;
411     // adress
412     cdmaSmsInfo.address.digitMode = strtol(pdu.substr(index, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
413     cdmaSmsInfo.address.mode = strtol(pdu.substr(index + BYTE_LEN, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
414     cdmaSmsInfo.address.type = strtol(pdu.substr(index + BYTE_LEN * NUM_2, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
415     cdmaSmsInfo.address.plan = strtol(pdu.substr(index + BYTE_LEN * NUM_3, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
416     cdmaSmsInfo.address.number = strtol(pdu.substr(index + BYTE_LEN * NUM_4, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
417     std::string addByte = pdu.substr(index + BYTE_LEN * NUM_5, BYTE_LEN * cdmaSmsInfo.address.number);
418     char *addressByte = reinterpret_cast<char *>(cdmaSmsInfo.address.bytes);
419     if (strcpy_s(addressByte, cdmaSmsInfo.address.number + 1, addByte.c_str()) != EOK) {
420         TELEPHONY_LOGE("strcpy_s fail.");
421         return false;
422     }
423     index += BYTE_LEN * NUM_5 + BYTE_LEN * cdmaSmsInfo.address.number;
424     // subAdress
425     cdmaSmsInfo.subAddress.type = strtol(pdu.substr(index, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
426     cdmaSmsInfo.subAddress.odd = strtol(pdu.substr(index + BYTE_LEN, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
427     cdmaSmsInfo.subAddress.number = strtol(
428         pdu.substr(index + BYTE_LEN * NUM_2, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
429     std::string subAddByte = pdu.substr(index + BYTE_LEN * NUM_3, BYTE_LEN * cdmaSmsInfo.subAddress.number);
430     char *subAddressByte = reinterpret_cast<char *>(cdmaSmsInfo.subAddress.bytes);
431     if (strcpy_s(subAddressByte, cdmaSmsInfo.subAddress.number + 1, subAddByte.c_str()) != EOK) {
432         TELEPHONY_LOGE("strcpy_s fail.");
433         return false;
434     }
435     index += BYTE_LEN * NUM_3 + BYTE_LEN * cdmaSmsInfo.subAddress.number;
436     // bearer Data
437     cdmaSmsInfo.size = strtol(pdu.substr(index, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
438     std::string byte = pdu.substr(index + BYTE_LEN, BYTE_LEN * cdmaSmsInfo.size);
439     char *byteInfo = reinterpret_cast<char *>(cdmaSmsInfo.bytes);
440     if (strcpy_s(byteInfo, cdmaSmsInfo.size + 1, byte.c_str()) != EOK) {
441         TELEPHONY_LOGE("strcpy_s fail.");
442         return false;
443     }
444     return true;
445 }
446 
CheckCdmaPduLength(HRilCdmaSmsMessageInfo & cdmaSmsInfo,const std::string & pdu)447 bool HRilSms::CheckCdmaPduLength(HRilCdmaSmsMessageInfo &cdmaSmsInfo, const std::string &pdu)
448 {
449     int32_t index = INT_LEN * NUM_3 + BYTE_LEN * NUM_5;
450     // adress
451     if (pdu.length() < static_cast<size_t>(index)) {
452         TELEPHONY_LOGE("pdu length invalid.");
453         return false;
454     }
455     if (!regex_match(pdu, std::regex("[0-9a-fA-F]+"))) {
456         TELEPHONY_LOGE("pdu invalid.");
457         return false;
458     }
459     cdmaSmsInfo.address.number = strtol(pdu.substr(index - BYTE_LEN, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
460     index += BYTE_LEN * cdmaSmsInfo.address.number + BYTE_LEN * NUM_3;
461     if (pdu.length() < static_cast<size_t>(index)) {
462         TELEPHONY_LOGE("pdu length invalid.");
463         return false;
464     }
465     // subAdress
466     cdmaSmsInfo.subAddress.number = strtol(pdu.substr(index - BYTE_LEN, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
467     index += BYTE_LEN * cdmaSmsInfo.subAddress.number + BYTE_LEN;
468     if (pdu.length() < static_cast<size_t>(index)) {
469         TELEPHONY_LOGE("pdu length invalid.");
470         return false;
471     }
472     // bearer Data
473     cdmaSmsInfo.size = strtol(pdu.substr(index - BYTE_LEN, BYTE_LEN).c_str(), nullptr, HEXADECIMAL);
474     index += BYTE_LEN * cdmaSmsInfo.size;
475     if (pdu.length() < static_cast<size_t>(index)) {
476         TELEPHONY_LOGE("pdu length invalid.");
477         return false;
478     }
479     return true;
480 }
481 
DelCdmaSimMessage(int32_t serialId,int32_t index)482 int32_t HRilSms::DelCdmaSimMessage(int32_t serialId, int32_t index)
483 {
484     if ((smsFuncs_ == nullptr) || (smsFuncs_->DelCdmaSimMessage == nullptr)) {
485         TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->DelCdmaSimMessage is null");
486         return HRIL_ERR_NULL_POINT;
487     }
488     ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_DEL_CDMA_SIM_MESSAGE);
489     if (requestInfo == nullptr) {
490         return HRIL_ERR_INVALID_PARAMETER;
491     }
492     int32_t *pBuff = nullptr;
493     RequestWithInts(&pBuff, requestInfo, 1, index);
494     smsFuncs_->DelCdmaSimMessage(requestInfo, pBuff, sizeof(int32_t));
495     if (pBuff != nullptr) {
496         SafeFrees(pBuff);
497     }
498     return HRIL_ERR_SUCCESS;
499 }
500 
UpdateCdmaSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_1::SmsMessageIOInfo & message)501 int32_t HRilSms::UpdateCdmaSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_1::SmsMessageIOInfo &message)
502 {
503     HRilSmsWriteSms msg = {};
504     size_t len = 0;
505     len = message.pdu.size() + 1;
506     msg.state = message.state;
507     if (len > MAX_CHN_LEN) {
508         return HRIL_ERR_INVALID_PARAMETER;
509     }
510     CopyToCharPoint(&msg.pdu, message.pdu);
511     msg.index = message.index;
512     RequestVendor(serialId, HREQ_SMS_UPDATE_CDMA_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::UpdateCdmaSimMessage, &msg,
513         sizeof(HRilSmsWriteSms));
514     SafeFrees(msg.pdu);
515     return HRIL_ERR_SUCCESS;
516 }
517 
SendGsmSmsResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)518 int32_t HRilSms::SendGsmSmsResponse(
519     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
520 {
521     HDI::Ril::V1_1::SendSmsResultInfo result =
522         MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
523     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SendGsmSmsResponse, result);
524 }
525 
SendCdmaSmsResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)526 int32_t HRilSms::SendCdmaSmsResponse(
527     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
528 {
529     HDI::Ril::V1_1::SendSmsResultInfo result =
530         MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
531     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SendCdmaSmsResponse, result);
532 }
533 
AddSimMessageResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)534 int32_t HRilSms::AddSimMessageResponse(
535     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
536 {
537     TELEPHONY_LOGI("AddSimMessageResponse send");
538     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::AddSimMessageResponse);
539 }
540 
DelSimMessageResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)541 int32_t HRilSms::DelSimMessageResponse(
542     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
543 {
544     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::DelSimMessageResponse);
545 }
546 
UpdateSimMessageResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)547 int32_t HRilSms::UpdateSimMessageResponse(
548     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
549 {
550     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::UpdateSimMessageResponse);
551 }
552 
SetSmscAddrResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)553 int32_t HRilSms::SetSmscAddrResponse(
554     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
555 {
556     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetSmscAddrResponse);
557 }
558 
GetSmscAddrResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)559 int32_t HRilSms::GetSmscAddrResponse(
560     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
561 {
562     HDI::Ril::V1_1::ServiceCenterAddress result;
563     if (response == nullptr || responseLen != sizeof(HRilServiceCenterAddress)) {
564         TELEPHONY_LOGE("Invalid response: response is nullptr");
565         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
566             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
567         }
568         result.address = std::string("");
569     } else {
570         const HRilServiceCenterAddress *address = static_cast<const HRilServiceCenterAddress *>(response);
571         result.tosca = address->tosca;
572         if (address->address == nullptr) {
573             result.address = std::string("");
574             TELEPHONY_LOGE("address is nullptr");
575         } else {
576             result.address = std::string(address->address);
577         }
578         TELEPHONY_LOGI("result address:%{private}s, tosca:%{private}d", result.address.c_str(), result.tosca);
579     }
580     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetSmscAddrResponse, result);
581 }
582 
SetCBConfigResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)583 int32_t HRilSms::SetCBConfigResponse(
584     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
585 {
586     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetCBConfigResponse);
587 }
588 
GetCBConfigResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)589 int32_t HRilSms::GetCBConfigResponse(
590     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
591 {
592     HDI::Ril::V1_1::CBConfigInfo broadcastInfo;
593     if (response == nullptr) {
594         TELEPHONY_LOGE("Invalid response: response is nullptr");
595         broadcastInfo.mode = -1;
596         broadcastInfo.mids = std::string("");
597         broadcastInfo.dcss = std::string("");
598     } else {
599         HRilCBConfigInfo *cellBroadcastInfo = (HRilCBConfigInfo *)response;
600         size_t len = responseLen / sizeof(HRilCBConfigInfo);
601         if (len != 0) {
602             if (!GetCBConfigInfo(cellBroadcastInfo, len, broadcastInfo)) {
603                 TELEPHONY_LOGE("result is invalid");
604             }
605         }
606         TELEPHONY_LOGD("mode:%{public}d, mids:%{public}s, dcss:%{public}s", broadcastInfo.mode,
607             broadcastInfo.mids.c_str(), broadcastInfo.dcss.c_str());
608     }
609     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetCBConfigResponse, broadcastInfo);
610 }
611 
GetCBConfigInfo(HRilCBConfigInfo * cellBroadcastInfo,size_t len,OHOS::HDI::Ril::V1_1::CBConfigInfo & broadcastInfo)612 bool HRilSms::GetCBConfigInfo(
613     HRilCBConfigInfo *cellBroadcastInfo, size_t len, OHOS::HDI::Ril::V1_1::CBConfigInfo &broadcastInfo)
614 {
615     broadcastInfo.mode = cellBroadcastInfo[0].selected;
616     std::string mids;
617     std::string dcss;
618     for (size_t locate = 0; locate < len; locate++) {
619         if (cellBroadcastInfo[locate].startOfServiceId > cellBroadcastInfo[locate].endOfServiceId) {
620             TELEPHONY_LOGE("result.mids is invalid");
621             return false;
622         } else if (cellBroadcastInfo[locate].startOfServiceId < cellBroadcastInfo[locate].endOfServiceId) {
623             mids += std::to_string(cellBroadcastInfo[locate].startOfServiceId) + "-" +
624                     std::to_string(cellBroadcastInfo[locate].endOfServiceId) + COMMA_STR;
625         } else {
626             mids += std::to_string(cellBroadcastInfo[locate].startOfServiceId) + COMMA_STR;
627         }
628         if (cellBroadcastInfo[locate].startOfCodeScheme > cellBroadcastInfo[locate].endOfCodeScheme) {
629             TELEPHONY_LOGE("result.dcss is invalid");
630             return false;
631         } else if (cellBroadcastInfo[locate].startOfCodeScheme < cellBroadcastInfo[locate].endOfCodeScheme) {
632             dcss += std::to_string(cellBroadcastInfo[locate].startOfCodeScheme) + "-" +
633                     std::to_string(cellBroadcastInfo[locate].endOfCodeScheme) + COMMA_STR;
634         } else {
635             dcss += std::to_string(cellBroadcastInfo[locate].startOfCodeScheme) + COMMA_STR;
636         }
637     }
638     broadcastInfo.mids = mids;
639     broadcastInfo.dcss = dcss;
640     return true;
641 }
642 
SetCdmaCBConfigResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)643 int32_t HRilSms::SetCdmaCBConfigResponse(
644     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
645 {
646     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetCdmaCBConfigResponse);
647 }
648 
GetCdmaCBConfigResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)649 int32_t HRilSms::GetCdmaCBConfigResponse(
650     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
651 {
652     HDI::Ril::V1_1::CdmaCBConfigInfo broadcastInfo;
653     if (response == nullptr || responseLen != sizeof(HRilCdmaCBConfigInfo)) {
654         TELEPHONY_LOGE("Invalid response: response is nullptr");
655         broadcastInfo.checked = -1;
656         broadcastInfo.language = -1;
657         broadcastInfo.service = -1;
658     } else {
659         const HRilCdmaCBConfigInfo *cellBroadcastInfo = static_cast<const HRilCdmaCBConfigInfo *>(response);
660         broadcastInfo.checked = cellBroadcastInfo->checked;
661         broadcastInfo.language = cellBroadcastInfo->language;
662         broadcastInfo.service = cellBroadcastInfo->service;
663         TELEPHONY_LOGE("checked:%{public}c, language:%{public}d, service:%{public}d", cellBroadcastInfo->checked,
664             cellBroadcastInfo->language, cellBroadcastInfo->service);
665     }
666     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetCdmaCBConfigResponse, broadcastInfo);
667 }
668 
SendSmsMoreModeResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)669 int32_t HRilSms::SendSmsMoreModeResponse(
670     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
671 {
672     HDI::Ril::V1_1::SendSmsResultInfo result =
673         MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
674     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SendSmsMoreModeResponse, result);
675 }
676 
SendSmsAckResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)677 int32_t HRilSms::SendSmsAckResponse(
678     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
679 {
680     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SendSmsAckResponse);
681 }
682 
AddCdmaSimMessageResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)683 int32_t HRilSms::AddCdmaSimMessageResponse(
684     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
685 {
686     TELEPHONY_LOGI("receive response");
687     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::AddCdmaSimMessageResponse);
688 }
689 
DelCdmaSimMessageResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)690 int32_t HRilSms::DelCdmaSimMessageResponse(
691     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
692 {
693     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::DelCdmaSimMessageResponse);
694 }
695 
UpdateCdmaSimMessageResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)696 int32_t HRilSms::UpdateCdmaSimMessageResponse(
697     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
698 {
699     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::UpdateCdmaSimMessageResponse);
700 }
701 
SmsStatusReportNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)702 int32_t HRilSms::SmsStatusReportNotify(
703     int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
704 {
705     if (response == nullptr || responseLen == 0) {
706         TELEPHONY_LOGE("invalid response");
707         return HRIL_ERR_GENERIC_FAILURE;
708     }
709     HDI::Ril::V1_1::SmsMessageInfo smsMessageInfo;
710     uint8_t *bytes = ConvertHexStringToBytes(response, responseLen);
711     if (bytes == nullptr) {
712         TELEPHONY_LOGE("ConvertHexStringToBytes in SmsStatusReportNotify is failed!");
713         return HRIL_ERR_GENERIC_FAILURE;
714     }
715     const size_t MESSAGE_SIZE = responseLen / HEX_WIDTH;
716     smsMessageInfo.size = MESSAGE_SIZE;
717     smsMessageInfo.indicationType = static_cast<int32_t>(ConvertIntToRadioNoticeType(indType));
718     uint8_t *temp = bytes;
719     for (int32_t i = 0; i < smsMessageInfo.size; i++) {
720         smsMessageInfo.pdu.push_back(*temp);
721         temp++;
722     }
723     SafeFrees(bytes);
724     return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::SmsStatusReportNotify, smsMessageInfo);
725 }
726 
NewSmsStoredOnSimNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)727 int32_t HRilSms::NewSmsStoredOnSimNotify(
728     int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
729 {
730     if (response == nullptr || responseLen != sizeof(int32_t)) {
731         TELEPHONY_LOGE("invalid response");
732         return HRIL_ERR_SUCCESS;
733     }
734     int32_t recordNumber = *(static_cast<const int32_t *>(response));
735     indType = static_cast<int32_t>(ConvertIntToRadioNoticeType(indType));
736     return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::NewSmsStoredOnSimNotify, recordNumber, indType);
737 }
738 
NewSmsNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)739 int32_t HRilSms::NewSmsNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
740 {
741     HRilSmsResponse *smsResponse = nullptr;
742     if (response == nullptr || responseLen == 0) {
743         TELEPHONY_LOGE("NewSmsNotify: invalid response");
744         return HDF_FAILURE;
745     } else {
746         smsResponse = (HRilSmsResponse *)response;
747     }
748     uint8_t *bytes = ConvertHexStringToBytes(smsResponse->pdu, responseLen);
749     if (bytes == nullptr) {
750         TELEPHONY_LOGE("NewSmsNotify: ConvertHexStringToBytes failed");
751         return HRIL_ERR_GENERIC_FAILURE;
752     }
753     HDI::Ril::V1_1::SmsMessageInfo smsMessageInfo;
754     const size_t NEW_SMS_SIZE = responseLen / HEX_WIDTH;
755     smsMessageInfo.size = NEW_SMS_SIZE;
756     smsMessageInfo.indicationType = indType;
757     uint8_t *temp = bytes;
758     for (int32_t i = 0; i < static_cast<int32_t>(smsMessageInfo.size); i++) {
759         smsMessageInfo.pdu.push_back(*temp);
760         temp++;
761     }
762     SafeFrees(bytes);
763     return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::NewSmsNotify, smsMessageInfo);
764 }
765 
NewCdmaSmsNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)766 int32_t HRilSms::NewCdmaSmsNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
767 {
768     HRilSmsResponse *message = nullptr;
769     if (response == nullptr || responseLen == 0) {
770         TELEPHONY_LOGE("invalid response");
771         return HRIL_ERR_GENERIC_FAILURE;
772     } else {
773         message = (HRilSmsResponse *)response;
774     }
775     HDI::Ril::V1_1::SmsMessageInfo messageInfo;
776     messageInfo.indicationType = indType;
777     if (message->pdu != nullptr) {
778         messageInfo.size = strlen(message->pdu) / HEX_WIDTH;
779         uint8_t *bytes = ConvertHexStringToBytes(message->pdu, strlen(message->pdu));
780         if (bytes == nullptr) {
781             TELEPHONY_LOGE("bytes is nullptr");
782             return HRIL_ERR_GENERIC_FAILURE;
783         }
784         uint8_t *temp = bytes;
785         for (int32_t i = 0; i < messageInfo.size; i++) {
786             messageInfo.pdu.push_back(*temp);
787             temp++;
788         }
789         SafeFrees(bytes);
790     }
791     return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::NewCdmaSmsNotify, messageInfo);
792 }
793 
CBConfigNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)794 int32_t HRilSms::CBConfigNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
795 {
796     HDI::Ril::V1_1::CBConfigReportInfo result = MakeCBConfigResult(response, responseLen);
797     result.indicationType = indType;
798     return Notify(indType, error, &HDI::Ril::V1_1::IRilCallback::CBConfigNotify, result);
799 }
800 
IsSmsResponse(uint32_t code)801 bool HRilSms::IsSmsResponse(uint32_t code)
802 {
803     return ((code >= HREQ_SMS_BASE) && (code < HREQ_SIM_BASE));
804 }
805 
IsSmsNotification(uint32_t code)806 bool HRilSms::IsSmsNotification(uint32_t code)
807 {
808     return ((code >= HNOTI_SMS_BASE) && (code < HNOTI_SIM_BASE));
809 }
810 
RequestWithInts(int32_t ** p,ReqDataInfo * requestInfo,int32_t argCount,...)811 int32_t HRilSms::RequestWithInts(int32_t **p, ReqDataInfo *requestInfo, int32_t argCount, ...)
812 {
813     size_t len = sizeof(int32_t);
814     if (len <= 0 || argCount <= 0) {
815         return false;
816     }
817     *p = static_cast<int32_t *>(malloc(argCount * len));
818     if (*p == nullptr) {
819         TELEPHONY_LOGE("req: [%{public}d,%{public}d,%{public}d], malloc fail", requestInfo->serial,
820             static_cast<int32_t>(requestInfo->slotId), requestInfo->request);
821         return false;
822     }
823     if (memset_s(*p, argCount * len, 0, argCount * len) != EOK) {
824         TELEPHONY_LOGE("RequestWithInts memset_s failed");
825         SafeFrees(*p);
826         return false;
827     }
828     va_list list;
829     va_start(list, argCount);
830     int32_t i = 0;
831     while (i < argCount) {
832         (*p)[i] = va_arg(list, int32_t);
833         i++;
834     }
835     va_end(list);
836     return true;
837 }
838 
RequestWithStrings(int32_t serial,int32_t request,int32_t count,...)839 int32_t HRilSms::RequestWithStrings(int32_t serial, int32_t request, int32_t count, ...)
840 {
841     if ((smsFuncs_ == nullptr) || (smsFuncs_->SendGsmSms == nullptr)) {
842         TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->SendGsmSms is null");
843         return HRIL_ERR_NULL_POINT;
844     }
845     char **pBuff = nullptr;
846     if (count <= 0) {
847         return HRIL_ERR_NULL_POINT;
848     }
849     int32_t len = count * sizeof(char *);
850     pBuff = (char **)malloc(len);
851     if (pBuff == nullptr) {
852         TELEPHONY_LOGE("req: [%{public}d,%{public}d], malloc fail", serial, request);
853         return HRIL_ERR_NULL_POINT;
854     }
855     if (memset_s(pBuff, len, 0, len) != EOK) {
856         TELEPHONY_LOGE("RequestWithInts memset_s failed");
857         SafeFrees(pBuff);
858         return HRIL_ERR_NULL_POINT;
859     }
860     va_list list;
861     va_start(list, count);
862     int32_t i = 0;
863     while (i < count) {
864         const char *str = va_arg(list, const char *);
865         if (!ConvertToString(&pBuff[i], str)) {
866             TELEPHONY_LOGE("ConvertToString in RequestWithStrings is failed!");
867             va_end(list);
868             for (int32_t j = 0; j < i; j++) {
869                 SafeFrees(pBuff[j]);
870             }
871             SafeFrees(pBuff);
872             return HRIL_ERR_NULL_POINT;
873         }
874         i++;
875     }
876     va_end(list);
877     int32_t result = RequestVendor(serial, request, smsFuncs_, &HRilSmsReq::SendGsmSms, pBuff, count);
878     if (pBuff != nullptr) {
879         i = 0;
880         while (i < count) {
881             SafeFrees(pBuff[i]);
882             i++;
883         }
884         SafeFrees(pBuff);
885     }
886     return result;
887 }
888 
MakeCBConfigResult(const void * response,const size_t responseLen)889 HDI::Ril::V1_1::CBConfigReportInfo HRilSms::MakeCBConfigResult(const void *response, const size_t responseLen)
890 {
891     HDI::Ril::V1_1::CBConfigReportInfo result;
892     if (response == nullptr || responseLen != sizeof(HRilCBConfigReportInfo)) {
893         TELEPHONY_LOGE("Invalid response: response is nullptr");
894         result.data = std::string("");
895         result.pdu = std::string("");
896         result.dcs = std::string("");
897     } else {
898         const HRilCBConfigReportInfo *cellBroadcastReportInfo = static_cast<const HRilCBConfigReportInfo *>(response);
899         result.mid = cellBroadcastReportInfo->mid;
900         result.length = cellBroadcastReportInfo->length;
901         result.page = cellBroadcastReportInfo->page;
902         result.pages = cellBroadcastReportInfo->pages;
903         result.sn = cellBroadcastReportInfo->sn;
904         if (cellBroadcastReportInfo->data == nullptr) {
905             result.data = std::string("");
906             TELEPHONY_LOGE("result.data is nullptr");
907         } else {
908             TELEPHONY_LOGI("result.data :%{private}s", cellBroadcastReportInfo->data);
909             result.data = std::string(cellBroadcastReportInfo->data);
910         }
911         if (cellBroadcastReportInfo->pdu == nullptr) {
912             result.pdu = std::string("");
913             TELEPHONY_LOGE("result.pdu is nullptr");
914         } else {
915             TELEPHONY_LOGI("result.pdu :%{private}s", cellBroadcastReportInfo->pdu);
916             result.pdu = StringToHex(cellBroadcastReportInfo->pdu, cellBroadcastReportInfo->length);
917         }
918         if (cellBroadcastReportInfo->dcs == nullptr) {
919             result.dcs = std::string("");
920             TELEPHONY_LOGE("result.dcs is nullptr");
921         } else {
922             TELEPHONY_LOGI("result.dcs :%{private}s", cellBroadcastReportInfo->dcs);
923             result.dcs = std::string(cellBroadcastReportInfo->dcs);
924         }
925     }
926     return result;
927 }
928 
MakeSendSmsResult(HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,int32_t serial,const void * response,const size_t responseLen)929 HDI::Ril::V1_1::SendSmsResultInfo HRilSms::MakeSendSmsResult(
930     HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, int32_t serial, const void *response, const size_t responseLen)
931 {
932     HDI::Ril::V1_1::SendSmsResultInfo result;
933     if (response == nullptr || responseLen != sizeof(HRilSmsResponse)) {
934         TELEPHONY_LOGE("Invalid response: response is nullptr");
935         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
936             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
937         }
938         result.pdu = std::string("");
939     } else {
940         const HRilSmsResponse *smsResponse = static_cast<const HRilSmsResponse *>(response);
941         result.msgRef = smsResponse->msgRef;
942         if (smsResponse->pdu == nullptr) {
943             result.pdu = std::string("");
944             TELEPHONY_LOGE("result.pdu is nullptr");
945         } else {
946             result.pdu = std::string(smsResponse->pdu);
947         }
948         result.errCode = smsResponse->errCode;
949     }
950     return result;
951 }
952 
CopyToHRilCdmaCBConfigInfo(HRilCdmaCBConfigInfo * list,OHOS::HDI::Ril::V1_1::CdmaCBConfigInfoList cellBroadcastInfoList)953 void HRilSms::CopyToHRilCdmaCBConfigInfo(
954     HRilCdmaCBConfigInfo *list, OHOS::HDI::Ril::V1_1::CdmaCBConfigInfoList cellBroadcastInfoList)
955 {
956     for (int32_t i = 0; i < cellBroadcastInfoList.size; i++) {
957         list[i].service = cellBroadcastInfoList.list[i].service;
958         list[i].language = cellBroadcastInfoList.list[i].language;
959         list[i].checked = cellBroadcastInfoList.list[i].checked;
960     }
961 }
962 } // namespace Telephony
963 } // namespace OHOS
964