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