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