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