• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_misc_manager.h"
17 
18 #include "core_manager_inner.h"
19 #include "short_message.h"
20 #include "sms_mms_errors.h"
21 #include "string_utils.h"
22 #include "telephony_common_utils.h"
23 #include "telephony_log_wrapper.h"
24 
25 namespace OHOS {
26 namespace Telephony {
27 static constexpr int32_t WAIT_TIME_SECOND = 1;
28 static constexpr int32_t TIME_OUT_SECOND = 3;
29 static constexpr uint8_t GSM_TYPE = 1;
30 static constexpr uint8_t MIN_SMSC_LEN = 2;
31 static constexpr uint32_t RANG_MAX = 65535;
32 static constexpr int32_t CB_RANGE_PAIR_SIZE = 2;
33 bool SmsMiscManager::hasGotCbRange_ = false;
34 
SmsMiscManager(int32_t slotId)35 SmsMiscManager::SmsMiscManager(int32_t slotId) : TelEventHandler("SmsMiscManager"), slotId_(slotId) {}
36 
SetCBConfig(bool enable,uint32_t fromMsgId,uint32_t toMsgId,uint8_t netType)37 int32_t SmsMiscManager::SetCBConfig(bool enable, uint32_t fromMsgId, uint32_t toMsgId, uint8_t netType)
38 {
39     bool ret = false;
40     if ((toMsgId > RANG_MAX) || (fromMsgId > toMsgId) || (netType != GSM_TYPE)) {
41         TELEPHONY_LOGI("cb channel invalid");
42         return TELEPHONY_ERR_ARGUMENT_INVALID;
43     }
44     std::unique_lock<std::mutex> lock(cbMutex_);
45     if (!hasGotCbRange_) {
46         GetModemCBRange();
47         if (mdRangeList_.size() != 0) {
48             if (!SendDataToRil(false, mdRangeList_)) {
49                 return TELEPHONY_ERR_RIL_CMD_FAIL;
50             }
51             mdRangeList_.clear();
52         }
53     }
54     std::list<gsmCBRangeInfo> oldRangeList = rangeList_;
55     if (enable) {
56         ret = OpenCBRange(fromMsgId, toMsgId);
57     } else {
58         ret = CloseCBRange(fromMsgId, toMsgId);
59     }
60     if (ret) {
61         if (!SendDataToRil(false, oldRangeList)) {
62             rangeList_ = oldRangeList;
63             return TELEPHONY_ERR_RIL_CMD_FAIL;
64         }
65         if (!SendDataToRil(true, rangeList_)) {
66             rangeList_ = oldRangeList;
67             return TELEPHONY_ERR_RIL_CMD_FAIL;
68         }
69     } else {
70         rangeList_ = oldRangeList;
71     }
72     return TELEPHONY_ERR_SUCCESS;
73 }
74 
GetRangeInfo() const75 std::list<SmsMiscManager::gsmCBRangeInfo> SmsMiscManager::GetRangeInfo() const
76 {
77     return rangeList_;
78 }
79 
80 // from 3GPP TS 27.005 3.3.4 Select Cell Broadcast Message Types
OpenCBRange(uint32_t fromMsgId,uint32_t toMsgId)81 bool SmsMiscManager::OpenCBRange(uint32_t fromMsgId, uint32_t toMsgId)
82 {
83     infoData data(fromMsgId, toMsgId);
84     rangeList_.emplace_back(fromMsgId, toMsgId);
85     CombineCBRange();
86     return true;
87 }
88 
SplitMsgId(uint32_t fromMsgId,uint32_t toMsgId,const std::list<gsmCBRangeInfo>::iterator & oldIter)89 void SmsMiscManager::SplitMsgId(
90     uint32_t fromMsgId, uint32_t toMsgId, const std::list<gsmCBRangeInfo>::iterator &oldIter)
91 {
92     auto &info = *oldIter;
93     if (fromMsgId == UINT32_MAX || fromMsgId < 1) {
94         return;
95     }
96     rangeList_.emplace_back(info.fromMsgId, fromMsgId - 1);
97     rangeList_.emplace_back(toMsgId + 1, info.toMsgId);
98     rangeList_.erase(oldIter);
99 }
100 
101 // from 3GPP TS 27.005 3.3.4 Select Cell Broadcast Message Types
CloseCBRange(uint32_t fromMsgId,uint32_t toMsgId)102 bool SmsMiscManager::CloseCBRange(uint32_t fromMsgId, uint32_t toMsgId)
103 {
104     if (fromMsgId == UINT32_MAX || fromMsgId < 1) {
105         return false;
106     }
107 
108     auto iter = rangeList_.begin();
109     while (iter != rangeList_.end()) {
110         auto oldIter = iter++;
111         auto &info = *oldIter;
112         if (fromMsgId == info.fromMsgId && toMsgId == info.toMsgId) {
113             rangeList_.erase(oldIter);
114             continue;
115         } else if (fromMsgId == info.fromMsgId && toMsgId > info.toMsgId) {
116             rangeList_.erase(oldIter);
117             continue;
118         } else if (fromMsgId == info.fromMsgId && toMsgId < info.toMsgId) {
119             rangeList_.emplace_back(toMsgId + 1, info.toMsgId);
120             rangeList_.erase(oldIter);
121             continue;
122         } else if (fromMsgId < info.fromMsgId && toMsgId == info.toMsgId) {
123             rangeList_.erase(oldIter);
124             continue;
125         } else if (fromMsgId > info.fromMsgId && toMsgId == info.toMsgId) {
126             rangeList_.emplace_back(info.fromMsgId, fromMsgId - 1);
127             rangeList_.erase(oldIter);
128             continue;
129         } else if (fromMsgId > info.fromMsgId && toMsgId < info.toMsgId) {
130             SplitMsgId(fromMsgId, toMsgId, oldIter);
131             continue;
132         } else if (fromMsgId > info.fromMsgId && fromMsgId <= info.toMsgId) {
133             rangeList_.emplace_back(info.fromMsgId, fromMsgId - 1);
134             rangeList_.erase(oldIter);
135             continue;
136         } else if (fromMsgId < info.fromMsgId && toMsgId > info.toMsgId) {
137             rangeList_.erase(oldIter);
138             continue;
139         } else if (toMsgId < info.toMsgId && toMsgId >= info.fromMsgId) {
140             rangeList_.emplace_back(toMsgId + 1, info.toMsgId);
141             rangeList_.erase(oldIter);
142             continue;
143         }
144     }
145     CombineCBRange();
146     return true;
147 }
148 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)149 void SmsMiscManager::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
150 {
151     if (event == nullptr) {
152         TELEPHONY_LOGE("SmsMiscManager ProcessEvent event == nullptr");
153         return;
154     }
155 
156     uint32_t eventId = 0;
157     eventId = event->GetInnerEventId();
158     switch (eventId) {
159         case SET_CB_CONFIG_FINISH: {
160             TELEPHONY_LOGD("SmsMiscManager::ProcessEvent Set cb config finish");
161             isSuccess_ = true;
162             std::shared_ptr<RadioResponseInfo> res = event->GetSharedObject<RadioResponseInfo>();
163             if (res != nullptr) {
164                 isSuccess_ = (res->error == ErrType::NONE);
165             }
166             NotifyHasResponse();
167             break;
168         }
169         case GET_CB_CONFIG_FINISH: {
170             TELEPHONY_LOGI("SmsMiscManager::ProcessEvent Get cb config finish");
171             GetCBConfigFinish(event);
172             break;
173         }
174         case SET_SMSC_ADDR_FINISH: {
175             TELEPHONY_LOGI("SmsMiscManager::ProcessEvent Set smsc addr finish");
176             isSuccess_ = true;
177             std::shared_ptr<RadioResponseInfo> res = event->GetSharedObject<RadioResponseInfo>();
178             if (res != nullptr) {
179                 isSuccess_ = (res->error == ErrType::NONE);
180             }
181             NotifyHasResponse();
182             break;
183         }
184         case GET_SMSC_ADDR_FINISH: {
185             TELEPHONY_LOGI("SmsMiscManager::ProcessEvent Get smsc addr finish");
186             isSuccess_ = true;
187             std::shared_ptr<ServiceCenterAddress> addr = event->GetSharedObject<ServiceCenterAddress>();
188             if (addr != nullptr) {
189                 smscAddr_ = addr->address;
190             }
191             NotifyHasResponse();
192             break;
193         }
194         default:
195             TELEPHONY_LOGI("SmsMiscManager::ProcessEvent default!");
196             break;
197     }
198 }
199 
GetCBConfigFinish(const AppExecFwk::InnerEvent::Pointer & event)200 void SmsMiscManager::GetCBConfigFinish(const AppExecFwk::InnerEvent::Pointer &event)
201 {
202     isSuccess_ = true;
203     std::shared_ptr<CBConfigInfo> res = event->GetSharedObject<CBConfigInfo>();
204     if (res == nullptr) {
205         isSuccess_ = false;
206     } else {
207         UpdateCbRangList(res);
208     }
209     NotifyHasResponse();
210 }
211 
IsEmpty() const212 bool SmsMiscManager::IsEmpty() const
213 {
214     return rangeList_.empty();
215 }
216 
NotifyHasResponse()217 void SmsMiscManager::NotifyHasResponse()
218 {
219     std::unique_lock<std::mutex> lock(mutex_);
220     if (fairList_.size() > 0) {
221         fairVar_ = fairList_.front();
222         fairList_.pop_front();
223     } else {
224         return;
225     }
226     condVar_.notify_all();
227 }
228 
UpdateCbRangList(std::shared_ptr<CBConfigInfo> res)229 void SmsMiscManager::UpdateCbRangList(std::shared_ptr<CBConfigInfo> res)
230 {
231     mdRangeList_.clear();
232     if (res->mids.empty()) {
233         return;
234     }
235     std::vector<std::string> dest;
236     SplitMids(res->mids, dest, ",");
237     for (auto v : dest) {
238         std::string start;
239         std::string end;
240         if (!SplitMidValue(v, start, end, "-")) {
241             continue;
242         }
243         if (!IsValidDecValue(start) || !IsValidDecValue(end)) {
244             TELEPHONY_LOGE("start or end not decimal");
245             return;
246         }
247         if (std::stoi(start) <= std::stoi(end)) {
248             infoData data(std::stoi(start), std::stoi(end));
249             mdRangeList_.emplace_back(data.startPos, data.endPos);
250         }
251     }
252     rangeList_ = mdRangeList_;
253     CombineCBRange();
254 }
255 
CombineCBRange(std::list<gsmCBRangeInfo> & ranges)256 void SmsMiscManager::CombineCBRange(std::list<gsmCBRangeInfo>& ranges)
257 {
258     ranges.sort();
259     ranges.unique();
260     auto iter = ranges.begin();
261     while (iter != ranges.end()) {
262         auto OtherIter = iter;
263         OtherIter++;
264         bool eraseFlag = false;
265         while (OtherIter != ranges.end()) {
266             if (OtherIter->fromMsgId == iter->fromMsgId) {
267                 eraseFlag = true;
268                 break;
269             } else if (OtherIter->toMsgId <= iter->toMsgId) {
270                 OtherIter = ranges.erase(OtherIter);
271                 continue;
272             } else if (OtherIter->fromMsgId <= static_cast<uint32_t>(iter->toMsgId + 1)) {
273                 iter->toMsgId = OtherIter->toMsgId;
274                 OtherIter = ranges.erase(OtherIter);
275                 continue;
276             }
277             OtherIter++;
278         }
279         if (eraseFlag) {
280             iter = ranges.erase(iter);
281         } else {
282             iter++;
283         }
284     }
285 }
286 
CombineCBRange()287 void SmsMiscManager::CombineCBRange()
288 {
289     CombineCBRange(rangeList_);
290 }
291 
SplitMids(std::string src,std::vector<std::string> & dest,const std::string delimiter)292 void SmsMiscManager::SplitMids(std::string src, std::vector<std::string> &dest, const std::string delimiter)
293 {
294     size_t pos = src.find(delimiter);
295     while (pos != std::string::npos) {
296         dest.push_back(src.substr(0, pos));
297         src.erase(0, pos + delimiter.length());
298         pos = src.find(delimiter);
299     }
300     dest.push_back(src);
301 }
302 
SplitMidValue(std::string value,std::string & start,std::string & end,const std::string delimiter)303 bool SmsMiscManager::SplitMidValue(std::string value, std::string &start, std::string &end, const std::string delimiter)
304 {
305     if (value.empty()) {
306         return false;
307     }
308     size_t pos = value.find(delimiter);
309     if (value.size() == 0) {
310         return false;
311     }
312     if (pos == 0 || pos == value.size() - 1) {
313         return false;
314     } else if (pos == std::string::npos) {
315         start = value;
316         end = value;
317         return true;
318     }
319     start = value.substr(0, pos);
320     end = value.substr(pos + 1);
321     return true;
322 }
323 
RangeListToString(const std::list<gsmCBRangeInfo> rangeList)324 std::string SmsMiscManager::RangeListToString(const std::list<gsmCBRangeInfo> rangeList)
325 {
326     std::string ret;
327     bool isFirst = true;
328     for (const auto &item : rangeList) {
329         if (isFirst) {
330             isFirst = false;
331         } else {
332             ret += ",";
333         }
334         if (item.fromMsgId == item.toMsgId) {
335             ret += std::to_string(item.fromMsgId);
336         } else {
337             ret += std::to_string(item.fromMsgId) + "-" + std::to_string(item.toMsgId);
338         }
339     }
340     return ret;
341 }
342 
SendDataToRil(bool enable,std::list<gsmCBRangeInfo> list)343 bool SmsMiscManager::SendDataToRil(bool enable, std::list<gsmCBRangeInfo> list)
344 {
345     TELEPHONY_LOGI("enable CB channel:%{public}d", enable);
346     for (auto item : list) {
347         TELEPHONY_LOGD("[%{public}d-%{public}d]", item.fromMsgId, item.toMsgId);
348     }
349     std::unique_lock<std::mutex> lock(mutex_);
350     if (!list.empty()) {
351         isSuccess_ = false;
352         int32_t condition = conditonVar_++;
353         fairList_.push_back(condition);
354         CBConfigParam cbData;
355         cbData.mode = enable ? 1 : 0;
356         cbData.idList = RangeListToString(list);
357         cbData.dcsList = codeScheme_;
358         CoreManagerInner::GetInstance().SetCBConfig(
359             slotId_, SmsMiscManager::SET_CB_CONFIG_FINISH, cbData, shared_from_this());
360         while (!isSuccess_) {
361             TELEPHONY_LOGD("SendDataToRil::wait(), isSuccess_ = false");
362             if (condVar_.wait_for(lock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
363                 break;
364             }
365         }
366         return isSuccess_;
367     } else {
368         return true;
369     }
370 }
371 
GetModemCBRange()372 void SmsMiscManager::GetModemCBRange()
373 {
374     std::unique_lock<std::mutex> lock(mutex_);
375     if (!hasGotCbRange_) {
376         isSuccess_ = false;
377         int32_t condition = conditonVar_++;
378         fairList_.push_back(condition);
379         CoreManagerInner::GetInstance().GetCBConfig(slotId_, SmsMiscManager::GET_CB_CONFIG_FINISH, shared_from_this());
380         while (!isSuccess_) {
381             TELEPHONY_LOGI("GetCBConfig::wait(), isSuccess_ = false");
382             if (condVar_.wait_for(lock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
383                 break;
384             }
385         }
386         hasGotCbRange_ = true;
387     }
388 }
389 
ConvertToRangeList(const std::vector<int32_t> & messageIds)390 std::list<SmsMiscManager::gsmCBRangeInfo> SmsMiscManager::ConvertToRangeList(const std::vector<int32_t>& messageIds)
391 {
392     std::list<gsmCBRangeInfo> result;
393     if (messageIds.size() % CB_RANGE_PAIR_SIZE != 0) {
394         TELEPHONY_LOGE("Invalid messageIds size (must be even)");
395         return result;
396     }
397     for (size_t i = 0; i < messageIds.size(); i += CB_RANGE_PAIR_SIZE) {
398         result.emplace_back(messageIds[i], messageIds[i + 1]);
399     }
400     return result;
401 }
402 
SetCBConfigList(const std::vector<int32_t> & messageIds,int32_t ranType)403 int32_t SmsMiscManager::SetCBConfigList(const std::vector<int32_t>& messageIds, int32_t ranType)
404 {
405     if (ranType != GSM_TYPE) {
406         TELEPHONY_LOGE("cb channel invalid, netType is not gsm");
407         return TELEPHONY_ERR_ARGUMENT_INVALID;
408     }
409     // 转换为范围列表
410     std::list<gsmCBRangeInfo> newRanges = ConvertToRangeList(messageIds);
411     // 如果没有新范围,直接返回成功(保持原有配置)
412     if (newRanges.empty()) {
413         return TELEPHONY_ERR_SUCCESS;
414     }
415     // 合并新范围到当前缓存(先备份)
416     std::unique_lock<std::mutex> lock(cbMutex_);
417     std::list<gsmCBRangeInfo> oldRangeList = rangeList_;
418     std::list<gsmCBRangeInfo> mergedRanges = oldRangeList;
419     // 将新范围合并到mergedRanges
420     for (const auto& range : newRanges) {
421         mergedRanges.emplace_back(range.fromMsgId, range.toMsgId);
422     }
423     // 合并重叠范围
424     CombineCBRange(mergedRanges);
425     // 发送合并后的范围到RIL
426     if (!SendDataToRil(true, mergedRanges)) {
427         return TELEPHONY_ERR_RIL_CMD_FAIL;
428     }
429     // 发送成功,更新缓存
430     rangeList_ = std::move(mergedRanges);
431     return TELEPHONY_ERR_SUCCESS;
432 }
433 
AddSimMessage(const std::string & smsc,const std::string & pdu,ISmsServiceInterface::SimMessageStatus status)434 int32_t SmsMiscManager::AddSimMessage(
435     const std::string &smsc, const std::string &pdu, ISmsServiceInterface::SimMessageStatus status)
436 {
437     std::vector<ShortMessage> message;
438     int32_t result = GetAllSimMessages(message);
439     if (result != TELEPHONY_ERR_SUCCESS) {
440         TELEPHONY_LOGE("SmsMiscManager::AddSimMessage get result fail");
441         return result;
442     }
443     int32_t smsCountCurrent = static_cast<int32_t>(message.size());
444     TELEPHONY_LOGI("smsCountCurrent = %{public}d smsCapacityOfSim_ = %{public}d", smsCountCurrent, smsCapacityOfSim_);
445     if (smsCountCurrent >= smsCapacityOfSim_) {
446         TELEPHONY_LOGE("AddSimMessage sim card is full");
447         return TELEPHONY_ERR_FAIL;
448     }
449 
450     TELEPHONY_LOGI("smscLen = %{public}zu pudLen = %{public}zu status = %{public}d", smsc.size(), pdu.size(), status);
451     std::string smscAddr(smsc);
452     if (smsc.length() <= MIN_SMSC_LEN) {
453         smscAddr.clear();
454         smscAddr.insert(0, "00");
455     }
456     TELEPHONY_LOGD("smscAddr = %{private}s", smscAddr.c_str());
457     return CoreManagerInner::GetInstance().AddSmsToIcc(
458         slotId_, static_cast<int>(status), const_cast<std::string &>(pdu), smscAddr);
459 }
460 
DelSimMessage(uint32_t msgIndex)461 int32_t SmsMiscManager::DelSimMessage(uint32_t msgIndex)
462 {
463     TELEPHONY_LOGI("messageIndex = %{public}d", msgIndex);
464     bool hasSimCard = false;
465     CoreManagerInner::GetInstance().HasSimCard(slotId_, hasSimCard);
466     if (!hasSimCard) {
467         TELEPHONY_LOGE("no sim card");
468         return TELEPHONY_ERR_SLOTID_INVALID;
469     }
470     return CoreManagerInner::GetInstance().DelSmsIcc(slotId_, msgIndex);
471 }
472 
UpdateSimMessage(uint32_t msgIndex,ISmsServiceInterface::SimMessageStatus newStatus,const std::string & pdu,const std::string & smsc)473 int32_t SmsMiscManager::UpdateSimMessage(uint32_t msgIndex, ISmsServiceInterface::SimMessageStatus newStatus,
474     const std::string &pdu, const std::string &smsc)
475 {
476     std::string smscAddr(smsc);
477     if (smsc.length() <= MIN_SMSC_LEN) {
478         smscAddr.clear();
479         smscAddr.insert(0, "00");
480     }
481     return CoreManagerInner::GetInstance().UpdateSmsIcc(
482         slotId_, msgIndex, static_cast<int>(newStatus), const_cast<std::string &>(pdu), smscAddr);
483 }
484 
GetAllSimMessages(std::vector<ShortMessage> & message)485 int32_t SmsMiscManager::GetAllSimMessages(std::vector<ShortMessage> &message)
486 {
487     bool hasSimCard = false;
488     CoreManagerInner::GetInstance().HasSimCard(slotId_, hasSimCard);
489     if (!hasSimCard) {
490         TELEPHONY_LOGE("no sim card");
491         return TELEPHONY_ERR_SLOTID_INVALID;
492     }
493     std::vector<std::string> pdus = CoreManagerInner::GetInstance().ObtainAllSmsOfIcc(slotId_);
494     smsCapacityOfSim_ = static_cast<int32_t>(pdus.size());
495     TELEPHONY_LOGI("smsCapacityOfSim_[%{public}d]", smsCapacityOfSim_);
496     int index = 1;
497     PhoneType type = CoreManagerInner::GetInstance().GetPhoneType(slotId_);
498     std::string specification;
499     if (PhoneType::PHONE_TYPE_IS_GSM == type) {
500         specification = "3gpp";
501     } else if (PhoneType::PHONE_TYPE_IS_CDMA == type) {
502         specification = "3gpp2";
503     } else {
504         return TELEPHONY_ERR_UNKNOWN_NETWORK_TYPE;
505     }
506     for (auto &v : pdus) {
507         v = v.substr(0, v.find("FFFFF"));
508         if (v.compare("00") == 0) {
509             index++;
510             continue;
511         }
512         std::vector<unsigned char> pdu = StringUtils::HexToByteVector(v);
513         ShortMessage item = ShortMessage::CreateIccMessage(pdu, specification, index);
514         if (item.GetIccMessageStatus() != ShortMessage::SMS_SIM_MESSAGE_STATUS_FREE) {
515             message.emplace_back(item);
516         }
517         index++;
518     }
519     return TELEPHONY_ERR_SUCCESS;
520 }
521 
SetSmscAddr(const std::string & scAddr)522 int32_t SmsMiscManager::SetSmscAddr(const std::string &scAddr)
523 {
524     TELEPHONY_LOGI("SmsMiscManager::SetSmscAddr [%{private}s]", scAddr.c_str());
525     std::unique_lock<std::mutex> lock(mutex_);
526     isSuccess_ = false;
527     int32_t condition = conditonVar_++;
528     fairList_.push_back(condition);
529     CoreManagerInner::GetInstance().SetSmscAddr(
530         slotId_, SmsMiscManager::SET_SMSC_ADDR_FINISH, 0, scAddr, shared_from_this());
531     while (!isSuccess_) {
532         TELEPHONY_LOGI("SetSmscAddr::wait(), isSuccess_ = false");
533         if (condVar_.wait_for(lock, std::chrono::seconds(TIME_OUT_SECOND)) == std::cv_status::timeout) {
534             break;
535         }
536     }
537 
538     if (isSuccess_ == false) {
539         return TELEPHONY_ERR_RIL_CMD_FAIL;
540     }
541     return TELEPHONY_ERR_SUCCESS;
542 }
543 
GetSmscAddr(std::u16string & smscAddress)544 int32_t SmsMiscManager::GetSmscAddr(std::u16string &smscAddress)
545 {
546     TELEPHONY_LOGI("SmsMiscManager::GetSmscAddr");
547     std::unique_lock<std::mutex> lock(mutex_);
548     smscAddr_.clear();
549     isSuccess_ = false;
550     int32_t condition = conditonVar_++;
551     fairList_.push_back(condition);
552     CoreManagerInner::GetInstance().GetSmscAddr(slotId_, SmsMiscManager::GET_SMSC_ADDR_FINISH, shared_from_this());
553     while (!isSuccess_) {
554         TELEPHONY_LOGI("GetSmscAddr::wait(), isSuccess_ = false");
555         if (condVar_.wait_for(lock, std::chrono::seconds(TIME_OUT_SECOND)) == std::cv_status::timeout) {
556             break;
557         }
558     }
559     smscAddress = StringUtils::ToUtf16(smscAddr_);
560     return TELEPHONY_ERR_SUCCESS;
561 }
562 
SetDefaultSmsSlotId(int32_t slotId)563 int32_t SmsMiscManager::SetDefaultSmsSlotId(int32_t slotId)
564 {
565     TELEPHONY_LOGI("SetDefaultSmsSlotId slotId = %{public}d", slotId);
566     return CoreManagerInner::GetInstance().SetDefaultSmsSlotId(slotId);
567 }
568 
GetDefaultSmsSlotId()569 int32_t SmsMiscManager::GetDefaultSmsSlotId()
570 {
571     TELEPHONY_LOGI("GetDefaultSmsSlotId");
572     return CoreManagerInner::GetInstance().GetDefaultSmsSlotId();
573 }
574 
GetDefaultSmsSimId(int32_t & simId)575 int32_t SmsMiscManager::GetDefaultSmsSimId(int32_t &simId)
576 {
577     TELEPHONY_LOGI("GetDefaultSmsSimId");
578     return CoreManagerInner::GetInstance().GetDefaultSmsSimId(simId);
579 }
580 } // namespace Telephony
581 } // namespace OHOS
582