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 "hril_notification.h"
19 #include "hril_request.h"
20
21 namespace OHOS {
22 namespace Telephony {
23 namespace {
24 const size_t HEX_WIDTH = 2;
25 const size_t MAX_PDU_LEN = 255;
26 const size_t MAX_LEN = 100;
27 const size_t MAX_CHN_LEN = 50000;
28 const int32_t MSG_DEFAULT_INDEX = -1;
29 } // namespace
30
HRilSms(int32_t slotId,IHRilReporter & hrilReporter)31 HRilSms::HRilSms(int32_t slotId, IHRilReporter &hrilReporter) : HRilBase(slotId, hrilReporter)
32 {
33 AddHandlerToMap();
34 }
35
IsSmsRespOrNotify(uint32_t code)36 bool HRilSms::IsSmsRespOrNotify(uint32_t code)
37 {
38 return IsSmsResponse(code) || IsSmsNotification(code);
39 }
40
RegisterSmsFuncs(const HRilSmsReq * smsFuncs)41 void HRilSms::RegisterSmsFuncs(const HRilSmsReq *smsFuncs)
42 {
43 smsFuncs_ = smsFuncs;
44 }
45
AddHandlerToMap()46 void HRilSms::AddHandlerToMap()
47 {
48 // Response
49 respMemberFuncMap_[HREQ_SMS_SEND_GSM_SMS] = &HRilSms::SendGsmSmsResponse;
50 respMemberFuncMap_[HREQ_SMS_SEND_SMS_MORE_MODE] = &HRilSms::SendSmsMoreModeResponse;
51 respMemberFuncMap_[HREQ_SMS_SEND_SMS_ACK] = &HRilSms::SendSmsAckResponse;
52 respMemberFuncMap_[HREQ_SMS_ADD_SIM_MESSAGE] = &HRilSms::AddSimMessageResponse;
53 respMemberFuncMap_[HREQ_SMS_DEL_SIM_MESSAGE] = &HRilSms::DelSimMessageResponse;
54 respMemberFuncMap_[HREQ_SMS_UPDATE_SIM_MESSAGE] = &HRilSms::UpdateSimMessageResponse;
55 respMemberFuncMap_[HREQ_SMS_SET_SMSC_ADDR] = &HRilSms::SetSmscAddrResponse;
56 respMemberFuncMap_[HREQ_SMS_GET_SMSC_ADDR] = &HRilSms::GetSmscAddrResponse;
57 respMemberFuncMap_[HREQ_SMS_SET_CB_CONFIG] = &HRilSms::SetCBConfigResponse;
58 respMemberFuncMap_[HREQ_SMS_GET_CB_CONFIG] = &HRilSms::GetCBConfigResponse;
59 respMemberFuncMap_[HREQ_SMS_GET_CDMA_CB_CONFIG] = &HRilSms::GetCdmaCBConfigResponse;
60 respMemberFuncMap_[HREQ_SMS_SET_CDMA_CB_CONFIG] = &HRilSms::SetCdmaCBConfigResponse;
61 respMemberFuncMap_[HREQ_SMS_SEND_CDMA_SMS] = &HRilSms::SendCdmaSmsResponse;
62 respMemberFuncMap_[HREQ_SMS_ADD_CDMA_SIM_MESSAGE] = &HRilSms::AddCdmaSimMessageResponse;
63 respMemberFuncMap_[HREQ_SMS_DEL_CDMA_SIM_MESSAGE] = &HRilSms::DelCdmaSimMessageResponse;
64 respMemberFuncMap_[HREQ_SMS_UPDATE_CDMA_SIM_MESSAGE] = &HRilSms::UpdateCdmaSimMessageResponse;
65
66 // Notification
67 notiMemberFuncMap_[HNOTI_SMS_NEW_SMS] = &HRilSms::NewSmsNotify;
68 notiMemberFuncMap_[HNOTI_SMS_NEW_CDMA_SMS] = &HRilSms::NewCdmaSmsNotify;
69 notiMemberFuncMap_[HNOTI_SMS_STATUS_REPORT] = &HRilSms::SmsStatusReportNotify;
70 notiMemberFuncMap_[HNOTI_SMS_NEW_SMS_STORED_ON_SIM] = &HRilSms::NewSmsStoredOnSimNotify;
71 notiMemberFuncMap_[HNOTI_CB_CONFIG_REPORT] = &HRilSms::CBConfigNotify;
72 }
73
SendGsmSms(int32_t serialId,const OHOS::HDI::Ril::V1_0::GsmSmsMessageInfo & gsmSmsMessageInfo)74 int32_t HRilSms::SendGsmSms(int32_t serialId, const OHOS::HDI::Ril::V1_0::GsmSmsMessageInfo &gsmSmsMessageInfo)
75 {
76 const int32_t COUNT_STRINGS_VALUE = 2;
77 return RequestWithStrings(serialId, HREQ_SMS_SEND_GSM_SMS, COUNT_STRINGS_VALUE, gsmSmsMessageInfo.smscPdu.c_str(),
78 gsmSmsMessageInfo.pdu.c_str());
79 }
80
SendCdmaSms(int32_t serialId,const OHOS::HDI::Ril::V1_0::SendCdmaSmsMessageInfo & cdmaSmsMessageInfo)81 int32_t HRilSms::SendCdmaSms(int32_t serialId, const OHOS::HDI::Ril::V1_0::SendCdmaSmsMessageInfo &cdmaSmsMessageInfo)
82 {
83 return RequestVendor(serialId, HREQ_SMS_SEND_CDMA_SMS, smsFuncs_, &HRilSmsReq::SendCdmaSms,
84 cdmaSmsMessageInfo.smscPdu.c_str(), cdmaSmsMessageInfo.smscPdu.size());
85 }
86
AddSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo & message)87 int32_t HRilSms::AddSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo &message)
88 {
89 HRilSmsWriteSms msg = {};
90 msg.state = message.state;
91 msg.index = MSG_DEFAULT_INDEX;
92 size_t pduLen = message.pdu.length();
93 if (pduLen > MAX_PDU_LEN) {
94 return HRIL_ERR_INVALID_PARAMETER;
95 }
96 CopyToCharPoint(&msg.pdu, message.pdu);
97 size_t smscPduLen = message.smscPdu.length() + 1;
98 if (smscPduLen > MAX_PDU_LEN) {
99 SafeFrees(msg.pdu);
100 return HRIL_ERR_INVALID_PARAMETER;
101 }
102 CopyToCharPoint(&msg.smsc, message.smscPdu);
103 int32_t result = RequestVendor(
104 serialId, HREQ_SMS_ADD_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::AddSimMessage, &msg, sizeof(HRilSmsWriteSms));
105 TELEPHONY_LOGI("AddSimMessage result is: %{public}d", result);
106 SafeFrees(msg.pdu, msg.smsc);
107 return result;
108 }
109
DelSimMessage(int32_t serialId,int32_t index)110 int32_t HRilSms::DelSimMessage(int32_t serialId, int32_t index)
111 {
112 if ((smsFuncs_ == nullptr) || (smsFuncs_->DelSimMessage == nullptr)) {
113 TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->DelSimMessage is null");
114 return HRIL_ERR_NULL_POINT;
115 }
116 ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_DEL_SIM_MESSAGE);
117 if (requestInfo == nullptr) {
118 return HRIL_ERR_INVALID_PARAMETER;
119 }
120 int32_t *pBuff = nullptr;
121 RequestWithInts(&pBuff, requestInfo, 1, index);
122 smsFuncs_->DelSimMessage(requestInfo, pBuff, 0);
123 if (pBuff != nullptr) {
124 SafeFrees(pBuff);
125 }
126 return HRIL_ERR_SUCCESS;
127 }
128
UpdateSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo & message)129 int32_t HRilSms::UpdateSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo &message)
130 {
131 HRilSmsWriteSms msg = {};
132 size_t len = 0;
133 len = message.pdu.size() + 1;
134 msg.state = message.state;
135 if (len > MAX_PDU_LEN) {
136 return HRIL_ERR_INVALID_PARAMETER;
137 }
138 CopyToCharPoint(&msg.pdu, message.pdu);
139 msg.index = message.index;
140 int32_t result = RequestVendor(
141 serialId, HREQ_SMS_UPDATE_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::UpdateSimMessage, &msg, sizeof(HRilSmsWriteSms));
142 TELEPHONY_LOGI("UpdateSimMessage result is: %{public}d", result);
143 SafeFrees(msg.pdu);
144 return result;
145 }
146
SetSmscAddr(int32_t serialId,const OHOS::HDI::Ril::V1_0::ServiceCenterAddress & serCenterAddress)147 int32_t HRilSms::SetSmscAddr(int32_t serialId, const OHOS::HDI::Ril::V1_0::ServiceCenterAddress &serCenterAddress)
148 {
149 HRilServiceCenterAddress address;
150 size_t len = 0;
151 len = strlen(serCenterAddress.address.c_str()) + 1;
152 address.tosca = serCenterAddress.tosca;
153 if (len > MAX_LEN) {
154 return HRIL_ERR_INVALID_PARAMETER;
155 }
156 CopyToCharPoint(&address.address, serCenterAddress.address);
157 int32_t result = RequestVendor(serialId, HREQ_SMS_SET_SMSC_ADDR, smsFuncs_, &HRilSmsReq::SetSmscAddr, &address,
158 sizeof(HRilServiceCenterAddress));
159 TELEPHONY_LOGI("SetSmscAddr result is: %{public}d", result);
160 SafeFrees(address.address);
161 return result;
162 }
163
GetSmscAddr(int32_t serialId)164 int32_t HRilSms::GetSmscAddr(int32_t serialId)
165 {
166 return RequestVendor(serialId, HREQ_SMS_GET_SMSC_ADDR, smsFuncs_, &HRilSmsReq::GetSmscAddr);
167 }
168
SetCBConfig(int32_t serialId,const OHOS::HDI::Ril::V1_0::CBConfigInfo & broadcastInfo)169 int32_t HRilSms::SetCBConfig(int32_t serialId, const OHOS::HDI::Ril::V1_0::CBConfigInfo &broadcastInfo)
170 {
171 HRilCBConfigInfo cellBroadcastInfo;
172 cellBroadcastInfo.mode = broadcastInfo.mode;
173 size_t midsLen = broadcastInfo.mids.size() + 1;
174 if (midsLen > MAX_CHN_LEN) {
175 return HRIL_ERR_INVALID_PARAMETER;
176 }
177 CopyToCharPoint(&cellBroadcastInfo.mids, broadcastInfo.mids);
178 size_t dcssLen = broadcastInfo.dcss.size() + 1;
179 if (dcssLen <= 0) {
180 SafeFrees(cellBroadcastInfo.mids);
181 return HRIL_ERR_INVALID_PARAMETER;
182 }
183 CopyToCharPoint(&cellBroadcastInfo.dcss, broadcastInfo.dcss);
184 int32_t result = RequestVendor(serialId, HREQ_SMS_SET_CB_CONFIG, smsFuncs_, &HRilSmsReq::SetCBConfig,
185 &cellBroadcastInfo, sizeof(HRilServiceCenterAddress));
186 TELEPHONY_LOGI("SetCBConfig result is: %{public}d", result);
187 SafeFrees(cellBroadcastInfo.mids, cellBroadcastInfo.dcss);
188 return result;
189 }
190
GetCBConfig(int32_t serialId)191 int32_t HRilSms::GetCBConfig(int32_t serialId)
192 {
193 return RequestVendor(serialId, HREQ_SMS_GET_CB_CONFIG, smsFuncs_, &HRilSmsReq::GetCBConfig);
194 }
195
SetCdmaCBConfig(int32_t serialId,const OHOS::HDI::Ril::V1_0::CdmaCBConfigInfoList & cellBroadcastInfoList)196 int32_t HRilSms::SetCdmaCBConfig(
197 int32_t serialId, const OHOS::HDI::Ril::V1_0::CdmaCBConfigInfoList &cellBroadcastInfoList)
198 {
199 if ((smsFuncs_ == nullptr) || (smsFuncs_->SetCdmaCBConfig == nullptr)) {
200 TELEPHONY_LOGE("(smsFuncs_ or msFuncs_->SetCdmaCBConfig is null");
201 return HRIL_ERR_NULL_POINT;
202 }
203 ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_SET_CDMA_CB_CONFIG);
204 if (requestInfo == nullptr) {
205 return HRIL_ERR_INVALID_PARAMETER;
206 }
207 auto size = cellBroadcastInfoList.size;
208 std::unique_ptr<HRilCdmaCBConfigInfo[]> list = std::make_unique<HRilCdmaCBConfigInfo[]>(size);
209 CopyToHRilCdmaCBConfigInfo(list.get(), cellBroadcastInfoList);
210 smsFuncs_->SetCdmaCBConfig(requestInfo, list.get(), cellBroadcastInfoList.size * sizeof(HRilCdmaCBConfigInfo));
211 return HRIL_ERR_SUCCESS;
212 }
213
GetCdmaCBConfig(int32_t serialId)214 int32_t HRilSms::GetCdmaCBConfig(int32_t serialId)
215 {
216 return RequestVendor(serialId, HREQ_SMS_GET_CDMA_CB_CONFIG, smsFuncs_, &HRilSmsReq::GetCdmaCBConfig);
217 }
218
SendSmsMoreMode(int32_t serialId,const OHOS::HDI::Ril::V1_0::GsmSmsMessageInfo & gsmSmsMessageInfo)219 int32_t HRilSms::SendSmsMoreMode(int32_t serialId, const OHOS::HDI::Ril::V1_0::GsmSmsMessageInfo &gsmSmsMessageInfo)
220 {
221 const int32_t COUNT_STRINGS_VALUE = 2;
222 return RequestWithStrings(serialId, HREQ_SMS_SEND_SMS_MORE_MODE, COUNT_STRINGS_VALUE,
223 gsmSmsMessageInfo.smscPdu.c_str(), gsmSmsMessageInfo.pdu.c_str());
224 }
225
SendSmsAck(int32_t serialId,const OHOS::HDI::Ril::V1_0::ModeData & modeData)226 int32_t HRilSms::SendSmsAck(int32_t serialId, const OHOS::HDI::Ril::V1_0::ModeData &modeData)
227 {
228 if ((smsFuncs_ == nullptr) || (smsFuncs_->SendSmsAck == nullptr)) {
229 TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->SendSmsAck is null");
230 return HRIL_ERR_NULL_POINT;
231 }
232 ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_SEND_SMS_ACK);
233 if (requestInfo == nullptr) {
234 return HRIL_ERR_INVALID_PARAMETER;
235 }
236 int32_t *pBuff = nullptr;
237 const int32_t COUNT_INTS_VALUE = 2;
238 RequestWithInts(&pBuff, requestInfo, COUNT_INTS_VALUE, static_cast<int32_t>(modeData.result), modeData.mode);
239 smsFuncs_->SendSmsAck(requestInfo, pBuff, sizeof(int32_t));
240 if (pBuff != nullptr) {
241 SafeFrees(pBuff);
242 }
243 return HRIL_ERR_SUCCESS;
244 }
245
AddCdmaSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo & message)246 int32_t HRilSms::AddCdmaSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo &message)
247 {
248 HRilSmsWriteSms msg = {};
249 int32_t pduLen = 0;
250 const int32_t MSG_INDEX = -1;
251 msg.state = message.state;
252 msg.index = MSG_INDEX;
253 pduLen = message.pdu.length();
254 int32_t len = pduLen + 1;
255 if (len <= 0) {
256 return HRIL_ERR_INVALID_PARAMETER;
257 }
258 CopyToCharPoint(&msg.pdu, message.pdu);
259 int32_t result = RequestVendor(serialId, HREQ_SMS_ADD_CDMA_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::AddCdmaSimMessage,
260 &msg, sizeof(HRilSmsWriteSms));
261 TELEPHONY_LOGI("AddCdmaSimMessage result is: %{public}d", result);
262 SafeFrees(msg.pdu);
263 return result;
264 }
265
DelCdmaSimMessage(int32_t serialId,int32_t index)266 int32_t HRilSms::DelCdmaSimMessage(int32_t serialId, int32_t index)
267 {
268 if ((smsFuncs_ == nullptr) || (smsFuncs_->DelCdmaSimMessage == nullptr)) {
269 TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->DelCdmaSimMessage is null");
270 return HRIL_ERR_NULL_POINT;
271 }
272 ReqDataInfo *requestInfo = CreateHRilRequest(serialId, HREQ_SMS_DEL_CDMA_SIM_MESSAGE);
273 if (requestInfo == nullptr) {
274 return HRIL_ERR_INVALID_PARAMETER;
275 }
276 int32_t *pBuff = nullptr;
277 RequestWithInts(&pBuff, requestInfo, 1, index);
278 smsFuncs_->DelCdmaSimMessage(requestInfo, pBuff, 0);
279 if (pBuff != nullptr) {
280 SafeFrees(pBuff);
281 }
282 return HRIL_ERR_SUCCESS;
283 }
284
UpdateCdmaSimMessage(int32_t serialId,const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo & message)285 int32_t HRilSms::UpdateCdmaSimMessage(int32_t serialId, const OHOS::HDI::Ril::V1_0::SmsMessageIOInfo &message)
286 {
287 HRilSmsWriteSms msg = {};
288 size_t len = 0;
289 len = message.pdu.size() + 1;
290 msg.state = message.state;
291 if (len > MAX_CHN_LEN) {
292 return HRIL_ERR_INVALID_PARAMETER;
293 }
294 CopyToCharPoint(&msg.pdu, message.pdu);
295 msg.index = message.index;
296 RequestVendor(serialId, HREQ_SMS_UPDATE_CDMA_SIM_MESSAGE, smsFuncs_, &HRilSmsReq::UpdateCdmaSimMessage, &msg,
297 sizeof(HRilSmsWriteSms));
298 SafeFrees(msg.pdu);
299 return HRIL_ERR_SUCCESS;
300 }
301
SendGsmSmsResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)302 int32_t HRilSms::SendGsmSmsResponse(
303 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
304 {
305 HDI::Ril::V1_0::SendSmsResultInfo result =
306 MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
307 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SendGsmSmsResponse, result);
308 }
309
SendCdmaSmsResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)310 int32_t HRilSms::SendCdmaSmsResponse(
311 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
312 {
313 HDI::Ril::V1_0::SendSmsResultInfo result =
314 MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
315 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SendCdmaSmsResponse, result);
316 }
317
AddSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)318 int32_t HRilSms::AddSimMessageResponse(
319 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
320 {
321 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::AddSimMessageResponse);
322 }
323
DelSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)324 int32_t HRilSms::DelSimMessageResponse(
325 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
326 {
327 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::DelSimMessageResponse);
328 }
329
UpdateSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)330 int32_t HRilSms::UpdateSimMessageResponse(
331 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
332 {
333 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::UpdateSimMessageResponse);
334 }
335
SetSmscAddrResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)336 int32_t HRilSms::SetSmscAddrResponse(
337 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
338 {
339 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SetSmscAddrResponse);
340 }
341
GetSmscAddrResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)342 int32_t HRilSms::GetSmscAddrResponse(
343 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
344 {
345 HDI::Ril::V1_0::ServiceCenterAddress result;
346 if (response == nullptr || responseLen != sizeof(HRilServiceCenterAddress)) {
347 TELEPHONY_LOGE("Invalid response: response is nullptr");
348 if (responseInfo.error == HRilErrType::NONE) {
349 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
350 }
351 result.address = std::string("");
352 } else {
353 const HRilServiceCenterAddress *address = static_cast<const HRilServiceCenterAddress *>(response);
354 result.tosca = address->tosca;
355 if (address->address == nullptr) {
356 result.address = std::string("");
357 TELEPHONY_LOGE("address is nullptr");
358 } else {
359 result.address = std::string(address->address);
360 }
361 TELEPHONY_LOGE("result address:%{public}s, tosca:%{public}d", result.address.c_str(), result.tosca);
362 }
363 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetSmscAddrResponse, result);
364 }
365
SetCBConfigResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)366 int32_t HRilSms::SetCBConfigResponse(
367 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
368 {
369 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SetCBConfigResponse);
370 }
371
GetCBConfigResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)372 int32_t HRilSms::GetCBConfigResponse(
373 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
374 {
375 HDI::Ril::V1_0::CBConfigInfo broadcastInfo;
376 if (response == nullptr || responseLen != sizeof(HRilCBConfigInfo)) {
377 TELEPHONY_LOGE("Invalid response: response is nullptr");
378 broadcastInfo.mode = -1;
379 broadcastInfo.mids = std::string("");
380 broadcastInfo.dcss = std::string("");
381 } else {
382 HRilCBConfigInfo *cellBroadcastInfo = (HRilCBConfigInfo *)response;
383 broadcastInfo.mode = cellBroadcastInfo->mode;
384 if (cellBroadcastInfo->mids == nullptr) {
385 broadcastInfo.mids = std::string("");
386 TELEPHONY_LOGE("result.mids is nullptr");
387 } else {
388 TELEPHONY_LOGI("result.mids :%{private}s", cellBroadcastInfo->mids);
389 broadcastInfo.mids = std::string(cellBroadcastInfo->mids);
390 }
391 if (cellBroadcastInfo->dcss == nullptr) {
392 broadcastInfo.dcss = std::string("");
393 TELEPHONY_LOGE("result.dcss is nullptr");
394 } else {
395 TELEPHONY_LOGI("result.dcss :%{private}s", cellBroadcastInfo->dcss);
396 broadcastInfo.dcss = std::string(cellBroadcastInfo->dcss);
397 }
398 TELEPHONY_LOGD("mode:%{private}d, mids:%{private}s, dcss:%{private}s", cellBroadcastInfo->mode,
399 cellBroadcastInfo->mids, cellBroadcastInfo->dcss);
400 }
401 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetCBConfigResponse, broadcastInfo);
402 }
403
SetCdmaCBConfigResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)404 int32_t HRilSms::SetCdmaCBConfigResponse(
405 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
406 {
407 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SetCdmaCBConfigResponse);
408 }
409
GetCdmaCBConfigResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)410 int32_t HRilSms::GetCdmaCBConfigResponse(
411 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
412 {
413 HDI::Ril::V1_0::CdmaCBConfigInfo broadcastInfo;
414 if (response == nullptr || responseLen != sizeof(HRilCdmaCBConfigInfo)) {
415 TELEPHONY_LOGE("Invalid response: response is nullptr");
416 broadcastInfo.checked = -1;
417 broadcastInfo.language = -1;
418 broadcastInfo.service = -1;
419 } else {
420 const HRilCdmaCBConfigInfo *cellBroadcastInfo = static_cast<const HRilCdmaCBConfigInfo *>(response);
421 broadcastInfo.checked = cellBroadcastInfo->checked;
422 broadcastInfo.language = cellBroadcastInfo->language;
423 broadcastInfo.service = cellBroadcastInfo->service;
424 TELEPHONY_LOGE("checked:%{public}c, language:%{public}d, service:%{public}d", cellBroadcastInfo->checked,
425 cellBroadcastInfo->language, cellBroadcastInfo->service);
426 }
427 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::GetCdmaCBConfigResponse, broadcastInfo);
428 }
429
SendSmsMoreModeResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)430 int32_t HRilSms::SendSmsMoreModeResponse(
431 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
432 {
433 HDI::Ril::V1_0::SendSmsResultInfo result =
434 MakeSendSmsResult(responseInfo, responseInfo.serial, response, responseLen);
435 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SendSmsMoreModeResponse, result);
436 }
437
SendSmsAckResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)438 int32_t HRilSms::SendSmsAckResponse(
439 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
440 {
441 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::SendSmsAckResponse);
442 }
443
AddCdmaSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)444 int32_t HRilSms::AddCdmaSimMessageResponse(
445 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
446 {
447 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::AddCdmaSimMessageResponse);
448 }
449
DelCdmaSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)450 int32_t HRilSms::DelCdmaSimMessageResponse(
451 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
452 {
453 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::DelCdmaSimMessageResponse);
454 }
455
UpdateCdmaSimMessageResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)456 int32_t HRilSms::UpdateCdmaSimMessageResponse(
457 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
458 {
459 return Response(responseInfo, &HDI::Ril::V1_0::IRilCallback::UpdateCdmaSimMessageResponse);
460 }
461
SmsStatusReportNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)462 int32_t HRilSms::SmsStatusReportNotify(
463 int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
464 {
465 if (response == nullptr || responseLen == 0) {
466 TELEPHONY_LOGE("invalid response");
467 return HRIL_ERR_GENERIC_FAILURE;
468 }
469 HDI::Ril::V1_0::SmsMessageInfo smsMessageInfo;
470 uint8_t *bytes = ConvertHexStringToBytes(response, responseLen);
471 if (bytes == nullptr) {
472 TELEPHONY_LOGE("ConvertHexStringToBytes in SmsStatusReportNotify is failed!");
473 return HRIL_ERR_GENERIC_FAILURE;
474 }
475 const size_t MESSAGE_SIZE = responseLen / HEX_WIDTH;
476 smsMessageInfo.size = MESSAGE_SIZE;
477 smsMessageInfo.indicationType = static_cast<int32_t>(ConvertIntToRadioNoticeType(indType));
478 uint8_t *temp = bytes;
479 for (int32_t i = 0; i < smsMessageInfo.size; i++) {
480 smsMessageInfo.pdu.push_back(*temp);
481 temp++;
482 }
483 SafeFrees(bytes);
484 return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::SmsStatusReportNotify, smsMessageInfo);
485 }
486
NewSmsStoredOnSimNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)487 int32_t HRilSms::NewSmsStoredOnSimNotify(
488 int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
489 {
490 if (response == nullptr || responseLen != sizeof(int32_t)) {
491 TELEPHONY_LOGE("invalid response");
492 return HRIL_ERR_SUCCESS;
493 }
494 int32_t recordNumber = *(static_cast<const int32_t *>(response));
495 indType = static_cast<int32_t>(ConvertIntToRadioNoticeType(indType));
496 return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::NewSmsStoredOnSimNotify, recordNumber, indType);
497 }
498
NewSmsNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)499 int32_t HRilSms::NewSmsNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
500 {
501 HRilSmsResponse *smsResponse = nullptr;
502 if (response == nullptr || responseLen == 0) {
503 TELEPHONY_LOGE("NewSmsNotify: invalid response");
504 return HDF_FAILURE;
505 } else {
506 smsResponse = (HRilSmsResponse *)response;
507 }
508 uint8_t *bytes = ConvertHexStringToBytes(smsResponse->pdu, responseLen);
509 if (bytes == nullptr) {
510 TELEPHONY_LOGE("NewSmsNotify: ConvertHexStringToBytes failed");
511 return HRIL_ERR_GENERIC_FAILURE;
512 }
513 HDI::Ril::V1_0::SmsMessageInfo smsMessageInfo;
514 const size_t NEW_SMS_SIZE = responseLen / HEX_WIDTH;
515 smsMessageInfo.size = NEW_SMS_SIZE;
516 smsMessageInfo.indicationType = indType;
517 uint8_t *temp = bytes;
518 for (int32_t i = 0; i < static_cast<int32_t>(smsMessageInfo.size); i++) {
519 smsMessageInfo.pdu.push_back(*temp);
520 temp++;
521 }
522 SafeFrees(bytes);
523 return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::NewSmsNotify, smsMessageInfo);
524 }
525
NewCdmaSmsNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)526 int32_t HRilSms::NewCdmaSmsNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
527 {
528 HRilSmsResponse *message = nullptr;
529 if (response == nullptr || responseLen == 0) {
530 TELEPHONY_LOGE("invalid response");
531 return HRIL_ERR_GENERIC_FAILURE;
532 } else {
533 message = (HRilSmsResponse *)response;
534 }
535 HDI::Ril::V1_0::SmsMessageInfo messageInfo;
536 messageInfo.indicationType = indType;
537 if (message->pdu != nullptr) {
538 messageInfo.size = strlen(message->pdu) / HEX_WIDTH;
539 uint8_t *bytes = ConvertHexStringToBytes(message->pdu, strlen(message->pdu));
540 if (bytes == nullptr) {
541 TELEPHONY_LOGE("bytes is nullptr");
542 return HRIL_ERR_GENERIC_FAILURE;
543 }
544 uint8_t *temp = bytes;
545 for (int32_t i = 0; i < messageInfo.size; i++) {
546 messageInfo.pdu.push_back(*temp);
547 temp++;
548 }
549 SafeFrees(bytes);
550 }
551 return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::NewCdmaSmsNotify, messageInfo);
552 }
553
CBConfigNotify(int32_t indType,const HRilErrNumber error,const void * response,size_t responseLen)554 int32_t HRilSms::CBConfigNotify(int32_t indType, const HRilErrNumber error, const void *response, size_t responseLen)
555 {
556 HDI::Ril::V1_0::CBConfigReportInfo result = MakeCBConfigResult(response, responseLen);
557 result.indicationType = indType;
558 return Notify(indType, error, &HDI::Ril::V1_0::IRilCallback::CBConfigNotify, result);
559 }
560
IsSmsResponse(uint32_t code)561 bool HRilSms::IsSmsResponse(uint32_t code)
562 {
563 return ((code >= HREQ_SMS_BASE) && (code < HREQ_SIM_BASE));
564 }
565
IsSmsNotification(uint32_t code)566 bool HRilSms::IsSmsNotification(uint32_t code)
567 {
568 return ((code >= HNOTI_SMS_BASE) && (code < HNOTI_SIM_BASE));
569 }
570
RequestWithInts(int32_t ** p,ReqDataInfo * requestInfo,int32_t argCount,...)571 int32_t HRilSms::RequestWithInts(int32_t **p, ReqDataInfo *requestInfo, int32_t argCount, ...)
572 {
573 size_t len = sizeof(int32_t);
574 if (len <= 0 || argCount <= 0) {
575 return false;
576 }
577 *p = static_cast<int32_t *>(malloc(argCount * len));
578 if (*p == nullptr) {
579 TELEPHONY_LOGE("req: [%{public}d,%{public}d,%{public}d], malloc fail", requestInfo->serial,
580 static_cast<int32_t>(requestInfo->slotId), requestInfo->request);
581 return false;
582 }
583 if (memset_s(*p, argCount * len, 0, argCount * len) != EOK) {
584 TELEPHONY_LOGE("RequestWithInts memset_s failed");
585 SafeFrees(*p);
586 return false;
587 }
588 va_list list;
589 va_start(list, argCount);
590 int32_t i = 0;
591 while (i < argCount) {
592 (*p)[i] = va_arg(list, int32_t);
593 i++;
594 }
595 va_end(list);
596 return true;
597 }
598
RequestWithStrings(int32_t serial,int32_t request,int32_t count,...)599 int32_t HRilSms::RequestWithStrings(int32_t serial, int32_t request, int32_t count, ...)
600 {
601 if ((smsFuncs_ == nullptr) || (smsFuncs_->SendGsmSms == nullptr)) {
602 TELEPHONY_LOGE("smsFuncs_ or smsFuncs_->SendGsmSms is null");
603 return HRIL_ERR_NULL_POINT;
604 }
605 char **pBuff = nullptr;
606 if (count <= 0) {
607 return HRIL_ERR_NULL_POINT;
608 }
609 int32_t len = count * sizeof(char *);
610 pBuff = (char **)malloc(len);
611 if (pBuff == nullptr) {
612 TELEPHONY_LOGE("req: [%{public}d,%{public}d], malloc fail", serial, request);
613 return HRIL_ERR_NULL_POINT;
614 }
615 if (memset_s(pBuff, len, 0, len) != EOK) {
616 TELEPHONY_LOGE("RequestWithInts memset_s failed");
617 SafeFrees(pBuff);
618 return false;
619 }
620 va_list list;
621 va_start(list, count);
622 int32_t i = 0;
623 while (i < count) {
624 const char *str = va_arg(list, const char *);
625 if (!ConvertToString(&pBuff[i], str)) {
626 TELEPHONY_LOGE("ConvertToString in RequestWithStrings is failed!");
627 va_end(list);
628 for (int32_t j = 0; j < i; j++) {
629 SafeFrees(pBuff[j]);
630 }
631 SafeFrees(pBuff);
632 return HRIL_ERR_NULL_POINT;
633 }
634 i++;
635 }
636 va_end(list);
637 int32_t result = RequestVendor(serial, request, smsFuncs_, &HRilSmsReq::SendGsmSms, pBuff, 0);
638 if (pBuff != nullptr) {
639 i = 0;
640 while (i < count) {
641 SafeFrees(pBuff[i]);
642 i++;
643 }
644 SafeFrees(pBuff);
645 }
646 return result;
647 }
648
MakeCBConfigResult(const void * response,const size_t responseLen)649 HDI::Ril::V1_0::CBConfigReportInfo HRilSms::MakeCBConfigResult(const void *response, const size_t responseLen)
650 {
651 HDI::Ril::V1_0::CBConfigReportInfo result;
652 if (response == nullptr || responseLen != sizeof(HRilCBConfigReportInfo)) {
653 TELEPHONY_LOGE("Invalid response: response is nullptr");
654 result.data = std::string("");
655 result.pdu = std::string("");
656 result.dcs = std::string("");
657 } else {
658 const HRilCBConfigReportInfo *cellBroadcastReportInfo = static_cast<const HRilCBConfigReportInfo *>(response);
659 result.mid = cellBroadcastReportInfo->mid;
660 result.length = cellBroadcastReportInfo->length;
661 result.page = cellBroadcastReportInfo->page;
662 result.pages = cellBroadcastReportInfo->pages;
663 result.sn = cellBroadcastReportInfo->sn;
664 if (cellBroadcastReportInfo->data == nullptr) {
665 result.data = std::string("");
666 TELEPHONY_LOGE("result.data is nullptr");
667 } else {
668 TELEPHONY_LOGI("result.data :%{private}s", cellBroadcastReportInfo->data);
669 result.data = std::string(cellBroadcastReportInfo->data);
670 }
671 if (cellBroadcastReportInfo->pdu == nullptr) {
672 result.pdu = std::string("");
673 TELEPHONY_LOGE("result.pdu is nullptr");
674 } else {
675 TELEPHONY_LOGI("result.pdu :%{private}s", cellBroadcastReportInfo->pdu);
676 result.pdu = std::string(cellBroadcastReportInfo->pdu);
677 }
678 if (cellBroadcastReportInfo->dcs == nullptr) {
679 result.dcs = std::string("");
680 TELEPHONY_LOGE("result.dcs is nullptr");
681 } else {
682 TELEPHONY_LOGI("result.dcs :%{private}s", cellBroadcastReportInfo->dcs);
683 result.dcs = std::string(cellBroadcastReportInfo->dcs);
684 }
685 }
686 return result;
687 }
688
MakeSendSmsResult(HRilRadioResponseInfo & responseInfo,int32_t serial,const void * response,const size_t responseLen)689 HDI::Ril::V1_0::SendSmsResultInfo HRilSms::MakeSendSmsResult(
690 HRilRadioResponseInfo &responseInfo, int32_t serial, const void *response, const size_t responseLen)
691 {
692 HDI::Ril::V1_0::SendSmsResultInfo result;
693 if (response == nullptr || responseLen != sizeof(HRilSmsResponse)) {
694 TELEPHONY_LOGE("Invalid response: response is nullptr");
695 if (responseInfo.error == HRilErrType::NONE) {
696 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
697 }
698 result.pdu = std::string("");
699 } else {
700 const HRilSmsResponse *smsResponse = static_cast<const HRilSmsResponse *>(response);
701 result.msgRef = smsResponse->msgRef;
702 if (smsResponse->pdu == nullptr) {
703 result.pdu = std::string("");
704 TELEPHONY_LOGE("result.pdu is nullptr");
705 } else {
706 result.pdu = std::string(smsResponse->pdu);
707 }
708 result.errCode = smsResponse->errCode;
709 }
710 return result;
711 }
712
CopyToHRilCdmaCBConfigInfo(HRilCdmaCBConfigInfo * list,OHOS::HDI::Ril::V1_0::CdmaCBConfigInfoList cellBroadcastInfoList)713 void HRilSms::CopyToHRilCdmaCBConfigInfo(
714 HRilCdmaCBConfigInfo *list, OHOS::HDI::Ril::V1_0::CdmaCBConfigInfoList cellBroadcastInfoList)
715 {
716 for (int32_t i = 0; i < cellBroadcastInfoList.size; i++) {
717 list[i].service = cellBroadcastInfoList.list[i].service;
718 list[i].language = cellBroadcastInfoList.list[i].language;
719 list[i].checked = cellBroadcastInfoList.list[i].checked;
720 }
721 }
722 } // namespace Telephony
723 } // namespace OHOS
724