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