1 /*
2 * Copyright (C) 2021-2023 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 "sms_interface_stub.h"
17
18 #include "sms_interface_manager.h"
19 #include "sms_receive_reliability_handler.h"
20 #include "sms_service.h"
21 #include "string_utils.h"
22 #include "telephony_errors.h"
23 #include "telephony_log_wrapper.h"
24 #include "telephony_types.h"
25
26 namespace OHOS {
27 namespace Telephony {
28 using namespace std;
29
IsValidSlotId(int32_t slotId)30 static inline bool IsValidSlotId(int32_t slotId)
31 {
32 return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
33 }
34
SmsInterfaceStub()35 SmsInterfaceStub::SmsInterfaceStub()
36 {
37 memberFuncMap_[SmsServiceInterfaceCode::TEXT_BASED_SMS_DELIVERY] = [this](MessageParcel &data,
38 MessageParcel &reply, MessageOption &option) { OnSendSmsTextRequest(data, reply, option); };
39 memberFuncMap_[SmsServiceInterfaceCode::DATA_BASED_SMS_DELIVERY] = [this](MessageParcel &data,
40 MessageParcel &reply, MessageOption &option) { OnSendSmsDataRequest(data, reply, option); };
41 memberFuncMap_[SmsServiceInterfaceCode::SET_SMSC_ADDRESS] = [this](MessageParcel &data,
42 MessageParcel &reply, MessageOption &option) { OnSetSmscAddr(data, reply, option); };
43 memberFuncMap_[SmsServiceInterfaceCode::GET_SMSC_ADDRESS] = [this](MessageParcel &data,
44 MessageParcel &reply, MessageOption &option) { OnGetSmscAddr(data, reply, option); };
45 memberFuncMap_[SmsServiceInterfaceCode::ADD_SIM_MESSAGE] = [this](MessageParcel &data,
46 MessageParcel &reply, MessageOption &option) { OnAddSimMessage(data, reply, option); };
47 memberFuncMap_[SmsServiceInterfaceCode::DEL_SIM_MESSAGE] = [this](MessageParcel &data,
48 MessageParcel &reply, MessageOption &option) { OnDelSimMessage(data, reply, option); };
49 memberFuncMap_[SmsServiceInterfaceCode::UPDATE_SIM_MESSAGE] = [this](MessageParcel &data,
50 MessageParcel &reply, MessageOption &option) { OnUpdateSimMessage(data, reply, option); };
51 memberFuncMap_[SmsServiceInterfaceCode::GET_ALL_SIM_MESSAGE] = [this](MessageParcel &data,
52 MessageParcel &reply, MessageOption &option) { OnGetAllSimMessages(data, reply, option); };
53 memberFuncMap_[SmsServiceInterfaceCode::SET_CB_CONFIG] = [this](MessageParcel &data,
54 MessageParcel &reply, MessageOption &option) { OnSetCBConfig(data, reply, option); };
55 memberFuncMap_[SmsServiceInterfaceCode::SET_IMS_SMS_CONFIG] = [this](MessageParcel &data,
56 MessageParcel &reply, MessageOption &option) { OnSetImsSmsConfig(data, reply, option); };
57 memberFuncMap_[SmsServiceInterfaceCode::SET_DEFAULT_SMS_SLOT_ID] = [this](MessageParcel &data,
58 MessageParcel &reply, MessageOption &option) { OnSetDefaultSmsSlotId(data, reply, option); };
59 memberFuncMap_[SmsServiceInterfaceCode::GET_DEFAULT_SMS_SLOT_ID] = [this](MessageParcel &data,
60 MessageParcel &reply, MessageOption &option) { OnGetDefaultSmsSlotId(data, reply, option); };
61 memberFuncMap_[SmsServiceInterfaceCode::GET_DEFAULT_SMS_SIM_ID] = [this](MessageParcel &data,
62 MessageParcel &reply, MessageOption &option) { OnGetDefaultSmsSimId(data, reply, option); };
63 memberFuncMap_[SmsServiceInterfaceCode::SPLIT_MESSAGE] = [this](MessageParcel &data,
64 MessageParcel &reply, MessageOption &option) { OnSplitMessage(data, reply, option); };
65 memberFuncMap_[SmsServiceInterfaceCode::GET_SMS_SEGMENTS_INFO] = [this](MessageParcel &data,
66 MessageParcel &reply, MessageOption &option) { OnGetSmsSegmentsInfo(data, reply, option); };
67 memberFuncMap_[SmsServiceInterfaceCode::GET_IMS_SHORT_MESSAGE_FORMAT] = [this](MessageParcel &data,
68 MessageParcel &reply, MessageOption &option) { OnGetImsShortMessageFormat(data, reply, option); };
69 memberFuncMap_[SmsServiceInterfaceCode::IS_IMS_SMS_SUPPORTED] = [this](MessageParcel &data,
70 MessageParcel &reply, MessageOption &option) { OnIsImsSmsSupported(data, reply, option); };
71 memberFuncMap_[SmsServiceInterfaceCode::HAS_SMS_CAPABILITY] = [this](MessageParcel &data,
72 MessageParcel &reply, MessageOption &option) { OnHasSmsCapability(data, reply, option); };
73 memberFuncMap_[SmsServiceInterfaceCode::CREATE_MESSAGE] = [this](MessageParcel &data,
74 MessageParcel &reply, MessageOption &option) { OnCreateMessage(data, reply, option); };
75 memberFuncMap_[SmsServiceInterfaceCode::MMS_BASE64_ENCODE] = [this](MessageParcel &data,
76 MessageParcel &reply, MessageOption &option) { OnGetBase64Encode(data, reply, option); };
77 memberFuncMap_[SmsServiceInterfaceCode::MMS_BASE64_DECODE] = [this](MessageParcel &data,
78 MessageParcel &reply, MessageOption &option) { OnGetBase64Decode(data, reply, option); };
79 memberFuncMap_[SmsServiceInterfaceCode::GET_ENCODE_STRING] = [this](MessageParcel &data,
80 MessageParcel &reply, MessageOption &option) { OnGetEncodeStringFunc(data, reply, option); };
81 memberFuncMap_[SmsServiceInterfaceCode::SEND_MMS] = [this](MessageParcel &data,
82 MessageParcel &reply, MessageOption &option) { OnSendMms(data, reply, option); };
83 memberFuncMap_[SmsServiceInterfaceCode::DOWNLOAD_MMS] = [this](MessageParcel &data,
84 MessageParcel &reply, MessageOption &option) { OnDownloadMms(data, reply, option); };
85 }
86
~SmsInterfaceStub()87 SmsInterfaceStub::~SmsInterfaceStub()
88 {
89 slotSmsInterfaceManagerMap_.clear();
90 memberFuncMap_.clear();
91 }
92
InitModule()93 void SmsInterfaceStub::InitModule()
94 {
95 static bool bInitModule = false;
96 if (bInitModule) {
97 return;
98 }
99 bInitModule = true;
100 std::lock_guard<std::mutex> lock(mutex_);
101 for (int32_t slotId = 0; slotId < SIM_SLOT_COUNT; ++slotId) {
102 slotSmsInterfaceManagerMap_[slotId] = std::make_shared<SmsInterfaceManager>(slotId);
103 if (slotSmsInterfaceManagerMap_[slotId] == nullptr) {
104 TELEPHONY_LOGE("SmsInterfaceStub InitModule slotSmsInterfaceManagerMap_[%{public}d] is nullptr", slotId);
105 return;
106 }
107 slotSmsInterfaceManagerMap_[slotId]->InitInterfaceManager();
108
109 TelFFRTUtils::Submit([slotId]() {
110 auto reliabilityHandler = std::make_shared<SmsReceiveReliabilityHandler>(slotId);
111 if (reliabilityHandler == nullptr) {
112 TELEPHONY_LOGE("reliabilityHandler nullptr");
113 return;
114 }
115 if (!reliabilityHandler->DeleteExpireSmsFromDB()) {
116 return;
117 }
118 if (!reliabilityHandler->CheckSmsCapable()) {
119 TELEPHONY_LOGE("sms receive capable unSupport");
120 return;
121 }
122 reliabilityHandler->SmsReceiveReliabilityProcessing();
123 });
124 }
125 }
126
GetSmsInterfaceManager(int32_t slotId)127 std::shared_ptr<SmsInterfaceManager> SmsInterfaceStub::GetSmsInterfaceManager(int32_t slotId)
128 {
129 std::lock_guard<std::mutex> lock(mutex_);
130 std::map<uint32_t, std::shared_ptr<SmsInterfaceManager>>::iterator iter =
131 slotSmsInterfaceManagerMap_.find(slotId);
132 if (iter != slotSmsInterfaceManagerMap_.end()) {
133 return iter->second;
134 }
135 return nullptr;
136 }
137
GetSmsInterfaceManager()138 std::shared_ptr<SmsInterfaceManager> SmsInterfaceStub::GetSmsInterfaceManager()
139 {
140 std::lock_guard<std::mutex> lock(mutex_);
141 for (const auto &iter : slotSmsInterfaceManagerMap_) {
142 if (iter.second != nullptr) {
143 return iter.second;
144 }
145 }
146 return nullptr;
147 }
148
OnSendSmsTextRequest(MessageParcel & data,MessageParcel & reply,MessageOption & option)149 void SmsInterfaceStub::OnSendSmsTextRequest(MessageParcel &data, MessageParcel &reply, MessageOption &option)
150 {
151 sptr<ISendShortMessageCallback> sendCallback = nullptr;
152 sptr<IDeliveryShortMessageCallback> deliveryCallback = nullptr;
153 int32_t slotId = data.ReadInt32();
154 u16string desAddr = data.ReadString16();
155 u16string scAddr = data.ReadString16();
156 u16string text = data.ReadString16();
157 if (!IsValidSlotId(slotId)) {
158 TELEPHONY_LOGE("invalid slotId:%{public}d", slotId);
159 return;
160 }
161
162 sptr<IRemoteObject> remoteSendCallback = data.ReadRemoteObject();
163 sptr<IRemoteObject> remoteDeliveryCallback = data.ReadRemoteObject();
164 if (remoteSendCallback != nullptr) {
165 sendCallback = iface_cast<ISendShortMessageCallback>(remoteSendCallback);
166 }
167 if (remoteDeliveryCallback != nullptr) {
168 deliveryCallback = iface_cast<IDeliveryShortMessageCallback>(remoteDeliveryCallback);
169 }
170 TELEPHONY_LOGI("MessageID::TEXT_BASED_SMS_DELIVERY %{public}d", slotId);
171 RemoveSpacesInDesAddr(desAddr);
172 std::string bundleName = data.ReadString();
173 TELEPHONY_LOGI("bundleName = %{public}s", bundleName.c_str());
174 int32_t result = SendMessage(slotId, desAddr, scAddr, text, sendCallback, deliveryCallback);
175 if (bundleName != MMS_APP && result == TELEPHONY_ERR_SUCCESS) {
176 DelayedSingleton<SmsService>::GetInstance()->InsertSessionAndDetail(slotId, StringUtils::ToUtf8(desAddr),
177 StringUtils::ToUtf8(text));
178 }
179 reply.WriteInt32(result);
180 }
181
OnSendSmsDataRequest(MessageParcel & data,MessageParcel & reply,MessageOption & option)182 void SmsInterfaceStub::OnSendSmsDataRequest(MessageParcel &data, MessageParcel &reply, MessageOption &option)
183 {
184 sptr<ISendShortMessageCallback> sendCallback = nullptr;
185 sptr<IDeliveryShortMessageCallback> deliveryCallback = nullptr;
186 int32_t slotId = data.ReadInt32();
187 u16string desAddr = data.ReadString16();
188 u16string scAddr = data.ReadString16();
189 int16_t port = data.ReadInt16();
190 if (!IsValidSlotId(slotId)) {
191 TELEPHONY_LOGE("invalid slotId:%{public}d", slotId);
192 return;
193 }
194
195 sptr<IRemoteObject> remoteSendCallback = data.ReadRemoteObject();
196 sptr<IRemoteObject> remoteDeliveryCallback = data.ReadRemoteObject();
197 if (remoteSendCallback != nullptr) {
198 sendCallback = iface_cast<ISendShortMessageCallback>(remoteSendCallback);
199 }
200 if (remoteDeliveryCallback != nullptr) {
201 deliveryCallback = iface_cast<IDeliveryShortMessageCallback>(remoteDeliveryCallback);
202 }
203 int16_t dataLen = data.ReadInt16();
204 const uint8_t *buffer = reinterpret_cast<const uint8_t *>(data.ReadRawData(dataLen));
205 if (buffer == nullptr) {
206 return;
207 }
208 RemoveSpacesInDesAddr(desAddr);
209 int32_t result = SendMessage(slotId, desAddr, scAddr, port, buffer, dataLen, sendCallback, deliveryCallback);
210 reply.WriteInt32(result);
211 }
212
RemoveSpacesInDesAddr(std::u16string & desAddr)213 void SmsInterfaceStub::RemoveSpacesInDesAddr(std::u16string &desAddr)
214 {
215 // Remove spaces in desAddr
216 if (desAddr.empty() || desAddr.size() >= MAX_ADDRESS_LEN) {
217 TELEPHONY_LOGE("RemoveSpacesInDesAddr desAddr is invalid");
218 return;
219 }
220
221 std::u16string storeAddr = desAddr;
222 int32_t count = static_cast<int32_t>(desAddr.size());
223 int32_t indexDes = 0;
224 int32_t indexResult = 0;
225 while (indexDes < count) {
226 if (desAddr[indexDes] != ' ') {
227 storeAddr[indexResult] = desAddr[indexDes];
228 indexResult++;
229 }
230 indexDes++;
231 }
232 desAddr = storeAddr.substr(0, indexResult);
233 }
234
OnSetSmscAddr(MessageParcel & data,MessageParcel & reply,MessageOption & option)235 void SmsInterfaceStub::OnSetSmscAddr(MessageParcel &data, MessageParcel &reply, MessageOption &option)
236 {
237 int32_t slotId = data.ReadInt32();
238 std::u16string scAddr = data.ReadString16();
239 int32_t result = SetSmscAddr(slotId, scAddr);
240 TELEPHONY_LOGI("set smsc result:%{public}d", result == TELEPHONY_ERR_SUCCESS);
241 reply.WriteInt32(result);
242 }
243
OnGetSmscAddr(MessageParcel & data,MessageParcel & reply,MessageOption & option)244 void SmsInterfaceStub::OnGetSmscAddr(MessageParcel &data, MessageParcel &reply, MessageOption &option)
245 {
246 std::u16string smscAddress;
247 int32_t slotId = data.ReadInt32();
248 int32_t result = GetSmscAddr(slotId, smscAddress);
249 if (!reply.WriteInt32(result)) {
250 TELEPHONY_LOGE("SmsInterfaceStub::OnGetSmscAddr write reply failed.");
251 return;
252 }
253 if (result != TELEPHONY_ERR_SUCCESS) {
254 TELEPHONY_LOGE("SmsInterfaceStub::OnGetSmscAddr result is not TELEPHONY_ERR_SUCCESS.");
255 return;
256 }
257
258 if (!reply.WriteString16(smscAddress)) {
259 TELEPHONY_LOGE("SmsInterfaceStub::OnGetSmscAddr write reply failed.");
260 return;
261 }
262 }
263
OnAddSimMessage(MessageParcel & data,MessageParcel & reply,MessageOption & option)264 void SmsInterfaceStub::OnAddSimMessage(MessageParcel &data, MessageParcel &reply, MessageOption &option)
265 {
266 int32_t slotId = data.ReadInt32();
267 std::u16string smsc = data.ReadString16();
268 std::u16string pdu = data.ReadString16();
269 uint32_t status = data.ReadUint32();
270 if (status > SIM_MESSAGE_STATUS_SENT || status < SIM_MESSAGE_STATUS_UNREAD) {
271 return;
272 }
273 int32_t result = AddSimMessage(slotId, smsc, pdu, static_cast<SimMessageStatus>(status));
274 TELEPHONY_LOGI("AddSimMessage result %{public}d", result);
275 reply.WriteInt32(result);
276 }
277
OnDelSimMessage(MessageParcel & data,MessageParcel & reply,MessageOption & option)278 void SmsInterfaceStub::OnDelSimMessage(MessageParcel &data, MessageParcel &reply, MessageOption &option)
279 {
280 int32_t slotId = data.ReadInt32();
281 uint32_t msgIndex = data.ReadUint32();
282 int32_t result = DelSimMessage(slotId, msgIndex);
283 TELEPHONY_LOGI("DelSimMessage result %{public}d", result);
284 reply.WriteInt32(result);
285 }
286
OnUpdateSimMessage(MessageParcel & data,MessageParcel & reply,MessageOption & option)287 void SmsInterfaceStub::OnUpdateSimMessage(MessageParcel &data, MessageParcel &reply, MessageOption &option)
288 {
289 int32_t slotId = data.ReadInt32();
290 uint32_t msgIndex = data.ReadUint32();
291 uint32_t newStatus = data.ReadUint32();
292 std::u16string pdu = data.ReadString16();
293 std::u16string smsc = data.ReadString16();
294 if (newStatus > SIM_MESSAGE_STATUS_SENT || newStatus < SIM_MESSAGE_STATUS_UNREAD) {
295 return;
296 }
297 int32_t result = UpdateSimMessage(slotId, msgIndex, static_cast<SimMessageStatus>(newStatus), pdu, smsc);
298 TELEPHONY_LOGI("UpdateSimMessage result %{public}d", result);
299 reply.WriteInt32(result);
300 }
301
OnGetAllSimMessages(MessageParcel & data,MessageParcel & reply,MessageOption & option)302 void SmsInterfaceStub::OnGetAllSimMessages(MessageParcel &data, MessageParcel &reply, MessageOption &option)
303 {
304 std::vector<ShortMessage> message;
305 int32_t slotId = data.ReadInt32();
306 int32_t result = GetAllSimMessages(slotId, message);
307 TELEPHONY_LOGI("GetAllSimMessages result %{public}d size %{public}zu", result, message.size());
308 reply.WriteInt32(result);
309 if (result != TELEPHONY_ERR_SUCCESS) {
310 TELEPHONY_LOGE("SmsInterfaceStub::OnGetSmscAddr result is not TELEPHONY_ERR_SUCCESS.");
311 return;
312 }
313 int32_t resultLen = static_cast<int32_t>(message.size());
314 reply.WriteInt32(resultLen);
315 for (const auto &v : message) {
316 v.Marshalling(reply);
317 }
318 }
319
OnSetCBConfig(MessageParcel & data,MessageParcel & reply,MessageOption & option)320 void SmsInterfaceStub::OnSetCBConfig(MessageParcel &data, MessageParcel &reply, MessageOption &option)
321 {
322 int32_t slotId = data.ReadInt32();
323 TELEPHONY_LOGD("set cb config slotId:%{public}d", slotId);
324 bool enable = data.ReadBool();
325 uint32_t fromMsgId = data.ReadUint32();
326 uint32_t toMsgId = data.ReadUint32();
327 uint8_t ranType = data.ReadUint8();
328 int32_t result = SetCBConfig(slotId, enable, fromMsgId, toMsgId, ranType);
329 if (result != TELEPHONY_ERR_SUCCESS) {
330 TELEPHONY_LOGE("OnSetCBConfig fail, result:%{public}d, slotId:%{public}d", result, slotId);
331 }
332 reply.WriteInt32(result);
333 }
334
OnSetImsSmsConfig(MessageParcel & data,MessageParcel & reply,MessageOption & option)335 void SmsInterfaceStub::OnSetImsSmsConfig(MessageParcel &data, MessageParcel &reply, MessageOption &option)
336 {
337 bool result = false;
338 int32_t slotId = data.ReadInt32();
339 int32_t enable = data.ReadInt32();
340 result = SetImsSmsConfig(slotId, enable);
341 TELEPHONY_LOGI("SetImsSmsConfig result %{public}d", result);
342 reply.WriteBool(result);
343 }
344
OnSetDefaultSmsSlotId(MessageParcel & data,MessageParcel & reply,MessageOption & option)345 void SmsInterfaceStub::OnSetDefaultSmsSlotId(MessageParcel &data, MessageParcel &reply, MessageOption &option)
346 {
347 int32_t slotId = data.ReadInt32();
348 int32_t result = SetDefaultSmsSlotId(slotId);
349 TELEPHONY_LOGI("SetDefaultSmsSlotId result %{public}d", result);
350 reply.WriteInt32(result);
351 }
352
OnGetDefaultSmsSlotId(MessageParcel & data,MessageParcel & reply,MessageOption & option)353 void SmsInterfaceStub::OnGetDefaultSmsSlotId(MessageParcel &data, MessageParcel &reply, MessageOption &option)
354 {
355 int32_t result = 0;
356 result = GetDefaultSmsSlotId();
357 TELEPHONY_LOGI("SetDefaultSmsSlotId result %{public}d", result);
358 reply.WriteInt32(result);
359 }
360
OnGetDefaultSmsSimId(MessageParcel & data,MessageParcel & reply,MessageOption & option)361 void SmsInterfaceStub::OnGetDefaultSmsSimId(MessageParcel &data, MessageParcel &reply, MessageOption &option)
362 {
363 int32_t result = 0;
364 int32_t simId = 0;
365 result = GetDefaultSmsSimId(simId);
366 if (!reply.WriteInt32(result)) {
367 TELEPHONY_LOGE("write int32 reply failed.");
368 return;
369 }
370 if (result != TELEPHONY_ERR_SUCCESS) {
371 TELEPHONY_LOGE("result %{public}d", result);
372 return;
373 }
374 if (!reply.WriteInt32(simId)) {
375 TELEPHONY_LOGE("write int32 reply failed.");
376 return;
377 }
378 }
379
OnSplitMessage(MessageParcel & data,MessageParcel & reply,MessageOption & option)380 void SmsInterfaceStub::OnSplitMessage(MessageParcel &data, MessageParcel &reply, MessageOption &option)
381 {
382 std::vector<std::u16string> splitMessage;
383 std::u16string message = data.ReadString16();
384 int32_t result = SplitMessage(message, splitMessage);
385 reply.WriteInt32(result);
386 if (result != TELEPHONY_ERR_SUCCESS) {
387 TELEPHONY_LOGE("SmsInterfaceStub::OnSplitMessage result is not TELEPHONY_ERR_SUCCESS.");
388 return;
389 }
390 int32_t resultLen = static_cast<int32_t>(splitMessage.size());
391 TELEPHONY_LOGI("SplitMessage size %{public}d", resultLen);
392 reply.WriteInt32(resultLen);
393 for (const auto &item : splitMessage) {
394 reply.WriteString16(item);
395 }
396 }
397
OnGetSmsSegmentsInfo(MessageParcel & data,MessageParcel & reply,MessageOption & option)398 void SmsInterfaceStub::OnGetSmsSegmentsInfo(MessageParcel &data, MessageParcel &reply, MessageOption &option)
399 {
400 int32_t slotId = data.ReadInt32();
401 std::u16string message = data.ReadString16();
402 bool force7BitCode = data.ReadBool();
403
404 SmsSegmentsInfo segInfo;
405 int32_t result = GetSmsSegmentsInfo(slotId, message, force7BitCode, segInfo);
406 reply.WriteInt32(result);
407
408 if (result == TELEPHONY_ERR_SUCCESS) {
409 reply.WriteInt32(segInfo.msgSegCount);
410 reply.WriteInt32(segInfo.msgEncodingCount);
411 reply.WriteInt32(segInfo.msgRemainCount);
412 reply.WriteInt32(static_cast<int32_t>(segInfo.msgCodeScheme));
413 }
414 }
415
OnIsImsSmsSupported(MessageParcel & data,MessageParcel & reply,MessageOption & option)416 void SmsInterfaceStub::OnIsImsSmsSupported(MessageParcel &data, MessageParcel &reply, MessageOption &option)
417 {
418 int32_t slotId = data.ReadInt32();
419 bool isSupported = false;
420 int32_t result = IsImsSmsSupported(slotId, isSupported);
421 if (!reply.WriteInt32(result)) {
422 TELEPHONY_LOGE("SmsInterfaceStub::OnIsImsSmsSupported write reply failed.");
423 return;
424 }
425 if (result != TELEPHONY_ERR_SUCCESS) {
426 TELEPHONY_LOGE("SmsInterfaceStub::OnIsImsSmsSupported result is not TELEPHONY_ERR_SUCCESS.");
427 return;
428 }
429 if (!reply.WriteBool(isSupported)) {
430 TELEPHONY_LOGE("SmsInterfaceStub::OnIsImsSmsSupported write reply failed.");
431 return;
432 }
433 }
434
OnGetImsShortMessageFormat(MessageParcel & data,MessageParcel & reply,MessageOption & option)435 void SmsInterfaceStub::OnGetImsShortMessageFormat(MessageParcel &data, MessageParcel &reply, MessageOption &option)
436 {
437 std::u16string format;
438 int32_t result = GetImsShortMessageFormat(format);
439 reply.WriteInt32(result);
440 if (result != TELEPHONY_ERR_SUCCESS) {
441 TELEPHONY_LOGE("SmsInterfaceStub::OnGetImsShortMessageFormat result is not TELEPHONY_ERR_SUCCESS.");
442 return;
443 }
444 reply.WriteString16(format);
445 }
446
OnHasSmsCapability(MessageParcel & data,MessageParcel & reply,MessageOption & option)447 void SmsInterfaceStub::OnHasSmsCapability(MessageParcel &data, MessageParcel &reply, MessageOption &option)
448 {
449 reply.WriteBool(HasSmsCapability());
450 }
451
OnCreateMessage(MessageParcel & data,MessageParcel & reply,MessageOption & option)452 void SmsInterfaceStub::OnCreateMessage(MessageParcel &data, MessageParcel &reply, MessageOption &option)
453 {
454 std::string pdu = data.ReadString();
455 std::string specification = data.ReadString();
456 ShortMessage message;
457 int32_t result = CreateMessage(pdu, specification, message);
458
459 reply.WriteInt32(result);
460 if (result != TELEPHONY_ERR_SUCCESS) {
461 return;
462 }
463 if (!message.Marshalling(reply)) {
464 TELEPHONY_LOGE("SmsInterfaceStub::OnCreateMessage fail");
465 }
466 }
467
OnGetBase64Encode(MessageParcel & data,MessageParcel & reply,MessageOption & option)468 void SmsInterfaceStub::OnGetBase64Encode(MessageParcel &data, MessageParcel &reply, MessageOption &option)
469 {
470 bool result = false;
471
472 u16string src = data.ReadString16();
473 std::string dest;
474 result = GetBase64Encode(StringUtils::ToUtf8(src), dest);
475 reply.WriteBool(result);
476 if (!result) {
477 return;
478 }
479 reply.WriteString16(StringUtils::ToUtf16(dest));
480 }
481
OnGetBase64Decode(MessageParcel & data,MessageParcel & reply,MessageOption & option)482 void SmsInterfaceStub::OnGetBase64Decode(MessageParcel &data, MessageParcel &reply, MessageOption &option)
483 {
484 bool result = false;
485 u16string src = data.ReadString16();
486 std::string dest;
487 result = GetBase64Decode(StringUtils::ToUtf8(src), dest);
488 reply.WriteBool(result);
489 if (!result) {
490 return;
491 }
492 reply.WriteString16(StringUtils::ToUtf16(dest));
493 }
494
OnGetEncodeStringFunc(MessageParcel & data,MessageParcel & reply,MessageOption & option)495 void SmsInterfaceStub::OnGetEncodeStringFunc(MessageParcel &data, MessageParcel &reply, MessageOption &option)
496 {
497 bool result = false;
498 uint32_t charset = data.ReadUint32();
499 uint32_t valLength = data.ReadUint32();
500 u16string strEncodeString = data.ReadString16();
501 std::string str = StringUtils::ToUtf8(strEncodeString);
502 std::string encodeString;
503
504 if (valLength != str.length()) {
505 TELEPHONY_LOGE("invalid valLength!");
506 return;
507 }
508 result = GetEncodeStringFunc(encodeString, charset, valLength, str);
509 reply.WriteBool(result);
510 if (!result) {
511 return;
512 }
513 reply.WriteString16(StringUtils::ToUtf16(encodeString));
514 }
515
OnSendMms(MessageParcel & data,MessageParcel & reply,MessageOption & option)516 void SmsInterfaceStub::OnSendMms(MessageParcel &data, MessageParcel &reply, MessageOption &option)
517 {
518 int32_t slotId = data.ReadInt32();
519 TELEPHONY_LOGI("send mms slotId:%{public}d", slotId);
520 u16string mmsc = data.ReadString16();
521 u16string mmsData = data.ReadString16();
522 u16string ua = data.ReadString16();
523 u16string uaprof = data.ReadString16();
524 int32_t result = SendMms(slotId, mmsc, mmsData, ua, uaprof);
525 if (!reply.WriteInt32(result)) {
526 TELEPHONY_LOGE("SmsInterfaceStub::OnSendMms write reply failed");
527 return;
528 }
529 }
530
OnDownloadMms(MessageParcel & data,MessageParcel & reply,MessageOption & option)531 void SmsInterfaceStub::OnDownloadMms(MessageParcel &data, MessageParcel &reply, MessageOption &option)
532 {
533 int32_t slotId = data.ReadInt32();
534 TELEPHONY_LOGI("download mms slotId:%{public}d", slotId);
535 u16string mmsc = data.ReadString16();
536 u16string mmsData = data.ReadString16();
537 u16string ua = data.ReadString16();
538 u16string uaprof = data.ReadString16();
539 int32_t result = DownloadMms(slotId, mmsc, mmsData, ua, uaprof);
540 if (!reply.WriteInt32(result)) {
541 TELEPHONY_LOGE("SmsInterfaceStub::OnDownloadMms write reply failed");
542 return;
543 }
544 reply.WriteString16(mmsData);
545 TELEPHONY_LOGI("SmsInterfaceStub::OnDownloadMms dbUrls:%{public}s", StringUtils::ToUtf8(mmsData).c_str());
546 }
547
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)548 int SmsInterfaceStub::OnRemoteRequest(
549 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
550 {
551 TELEPHONY_LOGD("SmsInterfaceStub::OnRemoteRequest code:%{public}d", code);
552 std::u16string myDescripter = SmsInterfaceStub::GetDescriptor();
553 std::u16string remoteDescripter = data.ReadInterfaceToken();
554 if (myDescripter != remoteDescripter) {
555 TELEPHONY_LOGE("descriptor checked fail");
556 return TELEPHONY_ERR_DESCRIPTOR_MISMATCH;
557 }
558
559 auto itFunc = memberFuncMap_.find(static_cast<SmsServiceInterfaceCode>(code));
560 if (itFunc != memberFuncMap_.end()) {
561 auto memberFunc = itFunc->second;
562 if (memberFunc != nullptr) {
563 memberFunc(data, reply, option);
564 return TELEPHONY_ERR_SUCCESS;
565 }
566 }
567 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
568 }
569 } // namespace Telephony
570 } // namespace OHOS
571