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