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