• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "sim_sms_controller.h"
17 
18 #include "core_service_errors.h"
19 
20 namespace OHOS {
21 namespace Telephony {
22 std::mutex SimSmsController::mtx_;
23 constexpr static const int32_t WAIT_TIME_SECOND = 1;
24 constexpr static const int32_t WAIT_TIME_TEN_SECOND = 10;
25 
SimSmsController(const std::shared_ptr<AppExecFwk::EventRunner> & runner,std::shared_ptr<SimStateManager> simStateManager)26 SimSmsController::SimSmsController(
27     const std::shared_ptr<AppExecFwk::EventRunner> &runner, std::shared_ptr<SimStateManager> simStateManager)
28     : AppExecFwk::EventHandler(runner), stateManager_(simStateManager)
29 {}
30 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)31 void SimSmsController::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
32 {
33     if (event == nullptr) {
34         TELEPHONY_LOGE("SimSmsController ProcessEvent event is nullptr");
35         return;
36     }
37     uint32_t id = event->GetInnerEventId();
38     TELEPHONY_LOGI("SimSmsController ProcessEvent Id is %{public}d", id);
39     switch (id) {
40         case SIM_SMS_GET_COMPLETED:
41             ProcessLoadDone(event);
42             break;
43         case SIM_SMS_UPDATE_COMPLETED:
44             ProcessUpdateDone(event);
45             break;
46         case SIM_SMS_WRITE_COMPLETED:
47             ProcessWriteDone(event);
48             break;
49         case SIM_SMS_DELETE_COMPLETED:
50             ProcessDeleteDone(event);
51             break;
52         default:
53             break;
54     }
55 }
56 
ProcessLoadDone(const AppExecFwk::InnerEvent::Pointer & event)57 void SimSmsController::ProcessLoadDone(const AppExecFwk::InnerEvent::Pointer &event)
58 {
59     TELEPHONY_LOGI("SimSmsController::ProcessLoadDone: start");
60     if (event == nullptr) {
61         TELEPHONY_LOGE("SimSmsController ProcessLoadDone event is nullptr");
62         return;
63     }
64     std::unique_ptr<ControllerToFileMsg> fd = event->GetUniqueObject<ControllerToFileMsg>();
65     if (fd != nullptr) {
66         if (fd->exception != nullptr) {
67             TELEPHONY_LOGE("ProcessLoadDone: get error result");
68             std::vector<std::string> nullVector;
69             smsList_.swap(nullVector);
70         }
71     } else {
72         std::shared_ptr<MultiRecordResult> object = event->GetSharedObject<MultiRecordResult>();
73         if (object != nullptr) {
74             TELEPHONY_LOGI("SimSmsController::ProcessLoadDone: %{public}d", object->resultLength);
75             if (object->exception == nullptr) {
76                 smsList_.assign(object->fileResults.begin(), object->fileResults.end());
77             }
78             for (std::string str : object->fileResults) {
79                 TELEPHONY_LOGI("SimSmsController::ProcessLoadDone: %{public}s", str.c_str());
80             }
81         } else {
82             TELEPHONY_LOGE("ProcessLoadDone: get null pointer!!!");
83         }
84     }
85     loadDone_ = true;
86     processWait_.notify_all();
87 }
88 
ProcessUpdateDone(const AppExecFwk::InnerEvent::Pointer & event)89 void SimSmsController::ProcessUpdateDone(const AppExecFwk::InnerEvent::Pointer &event)
90 {
91     if (event == nullptr) {
92         TELEPHONY_LOGE("SimSmsController ProcessUpdateDone event is nullptr");
93         return;
94     }
95     responseReady_ = true;
96     std::shared_ptr<HRilRadioResponseInfo> responseInfo = event->GetSharedObject<HRilRadioResponseInfo>();
97     if (responseInfo != nullptr) {
98         TELEPHONY_LOGE("SimSmsController::ProcessUpdateDone error %{public}d", responseInfo->error);
99         responseReady_ = (responseInfo->error == HRilErrType::NONE);
100     }
101     TELEPHONY_LOGI("SimSmsController::ProcessUpdateDone: end");
102     processWait_.notify_all();
103 }
104 
ProcessWriteDone(const AppExecFwk::InnerEvent::Pointer & event)105 void SimSmsController::ProcessWriteDone(const AppExecFwk::InnerEvent::Pointer &event)
106 {
107     if (event == nullptr) {
108         TELEPHONY_LOGE("SimSmsController ProcessWriteDone event is nullptr");
109         return;
110     }
111     responseReady_ = true;
112     std::shared_ptr<HRilRadioResponseInfo> responseInfo = event->GetSharedObject<HRilRadioResponseInfo>();
113     if (responseInfo != nullptr) {
114         TELEPHONY_LOGE("SimSmsController::ProcessWriteDone error %{public}d", responseInfo->error);
115         responseReady_ = (responseInfo->error == HRilErrType::NONE);
116     }
117     TELEPHONY_LOGI("SimSmsController::ProcessWriteDone: end");
118     processWait_.notify_all();
119 }
120 
ProcessDeleteDone(const AppExecFwk::InnerEvent::Pointer & event)121 void SimSmsController::ProcessDeleteDone(const AppExecFwk::InnerEvent::Pointer &event)
122 {
123     if (event == nullptr) {
124         TELEPHONY_LOGE("SimSmsController ProcessDeleteDone event is nullptr");
125         return;
126     }
127     responseReady_ = true;
128     std::shared_ptr<HRilRadioResponseInfo> responseInfo = event->GetSharedObject<HRilRadioResponseInfo>();
129     if (responseInfo != nullptr) {
130         TELEPHONY_LOGE("SimSmsController::ProcessDeleteDone error %{public}d", responseInfo->error);
131         responseReady_ = (responseInfo->error == HRilErrType::NONE);
132     }
133     TELEPHONY_LOGI("SimSmsController::ProcessDeleteDone: end");
134     processWait_.notify_all();
135 }
136 
UpdateSmsIcc(int index,int status,std::string & pduData,std::string & smsc)137 int32_t SimSmsController::UpdateSmsIcc(int index, int status, std::string &pduData, std::string &smsc)
138 {
139     std::unique_lock<std::mutex> lock(mtx_);
140     bool isCDMA = IsCdmaCardType();
141     TELEPHONY_LOGI("UpdateSmsIcc start: %{public}d, %{public}d", index, isCDMA);
142     responseReady_ = false;
143     if (!isCDMA) {
144         AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_UPDATE_COMPLETED);
145         SimMessageParam param { index, status, smsc, pduData };
146         telRilManager_->UpdateSimMessage(slotId_, param, response);
147     } else {
148         AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_UPDATE_COMPLETED);
149         CdmaSimMessageParam param { index, status, pduData };
150         telRilManager_->UpdateCdmaSimMessage(slotId_, param, response);
151     }
152     while (!responseReady_) {
153         TELEPHONY_LOGI("UpdateSmsIcc::wait(), response = false");
154         if (processWait_.wait_for(lock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
155             break;
156         }
157     }
158     TELEPHONY_LOGI("SimSmsController::UpdateSmsIcc OK return %{public}d", responseReady_);
159     if (responseReady_) {
160         return TELEPHONY_ERR_SUCCESS;
161     } else {
162         return CORE_ERR_SIM_CARD_UPDATE_FAILED;
163     }
164 }
165 
DelSmsIcc(int index)166 int32_t SimSmsController::DelSmsIcc(int index)
167 {
168     std::unique_lock<std::mutex> lock(mtx_);
169     bool isCDMA = IsCdmaCardType();
170     TELEPHONY_LOGI("DelSmsIcc start: %{public}d, %{public}d", index, isCDMA);
171     responseReady_ = false;
172     if (!isCDMA) {
173         AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_DELETE_COMPLETED);
174         telRilManager_->DelSimMessage(slotId_, index, response);
175         TELEPHONY_LOGI("SimSmsController::DelSmsIcc OK return %{public}d", responseReady_);
176     } else {
177         AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_DELETE_COMPLETED);
178         telRilManager_->DelCdmaSimMessage(slotId_, index, response);
179         TELEPHONY_LOGI("SimSmsController::DelCdmaSimMessage OK return %{public}d", responseReady_);
180     }
181     while (!responseReady_) {
182         TELEPHONY_LOGI("DelSmsIcc::wait(), response = false");
183         if (processWait_.wait_for(lock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
184             break;
185         }
186     }
187     if (responseReady_) {
188         return TELEPHONY_ERR_SUCCESS;
189     } else {
190         return CORE_ERR_SIM_CARD_UPDATE_FAILED;
191     }
192 }
193 
AddSmsToIcc(int status,std::string & pdu,std::string & smsc)194 int32_t SimSmsController::AddSmsToIcc(int status, std::string &pdu, std::string &smsc)
195 {
196     std::unique_lock<std::mutex> lock(mtx_);
197     bool isCDMA = IsCdmaCardType();
198     TELEPHONY_LOGI("AddSmsToIcc start: %{public}d, %{public}d", status, isCDMA);
199     responseReady_ = false;
200     if (!isCDMA) {
201         AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_WRITE_COMPLETED);
202         SimMessageParam param { 0, status, smsc, pdu };
203         telRilManager_->AddSimMessage(slotId_, param, response);
204     } else {
205         AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_WRITE_COMPLETED);
206         telRilManager_->AddCdmaSimMessage(slotId_, status, pdu, response);
207     }
208     while (!responseReady_) {
209         TELEPHONY_LOGI("AddSmsToIcc::wait(), response = false");
210         if (processWait_.wait_for(lock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
211             break;
212         }
213     }
214     TELEPHONY_LOGI("SimSmsController::AddSmsToIcc OK return %{public}d", responseReady_);
215     if (responseReady_) {
216         return TELEPHONY_ERR_SUCCESS;
217     } else {
218         return CORE_ERR_SIM_CARD_UPDATE_FAILED;
219     }
220 }
221 
Init(int slodId)222 void SimSmsController::Init(int slodId)
223 {
224     slotId_ = slodId;
225 }
226 
ObtainAllSmsOfIcc()227 std::vector<std::string> SimSmsController::ObtainAllSmsOfIcc()
228 {
229     std::unique_lock<std::mutex> lock(mtx_);
230     std::shared_ptr<IccFileController> fileController = fileManager_->GetIccFileController();
231     loadDone_ = false;
232     if (fileController == nullptr) {
233         TELEPHONY_LOGE("Cannot load Sms records. No icc card?");
234         std::vector<std::string> nullVector;
235         smsList_.swap(nullVector);
236         return smsList_;
237     }
238     TELEPHONY_LOGI("ObtainAllSmsOfIcc start!!");
239     AppExecFwk::InnerEvent::Pointer event = BuildCallerInfo(SIM_SMS_GET_COMPLETED);
240     fileController->ObtainAllLinearFixedFile(ELEMENTARY_FILE_SMS, event);
241     while (!loadDone_) {
242         TELEPHONY_LOGI("ObtainAllSmsOfIcc::wait(), response = false");
243         if (processWait_.wait_for(lock, std::chrono::seconds(WAIT_TIME_TEN_SECOND)) == std::cv_status::timeout) {
244             break;
245         }
246     }
247     TELEPHONY_LOGI("SimSmsController::ObtainAllSmsOfIcc: end");
248     return smsList_;
249 }
250 
SetRilAndFileManager(std::shared_ptr<Telephony::ITelRilManager> ril,std::shared_ptr<SimFileManager> fileMgr)251 void SimSmsController::SetRilAndFileManager(
252     std::shared_ptr<Telephony::ITelRilManager> ril, std::shared_ptr<SimFileManager> fileMgr)
253 {
254     telRilManager_ = ril;
255     if (telRilManager_ == nullptr) {
256         TELEPHONY_LOGE("SimSmsController rilmanager get null pointer");
257     }
258     fileManager_ = fileMgr;
259     if (fileManager_ == nullptr) {
260         TELEPHONY_LOGE("SimSmsController fileManager get null pointer");
261     }
262 }
263 
BuildCallerInfo(int eventId)264 AppExecFwk::InnerEvent::Pointer SimSmsController::BuildCallerInfo(int eventId)
265 {
266     std::unique_ptr<FileToControllerMsg> object = std::make_unique<FileToControllerMsg>();
267     int eventParam = 0;
268     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(eventId, object, eventParam);
269     if (event == nullptr) {
270         TELEPHONY_LOGE("event is nullptr!");
271         return AppExecFwk::InnerEvent::Pointer(nullptr, nullptr);
272     }
273     event->SetOwner(shared_from_this());
274     return event;
275 }
276 
IsCdmaCardType() const277 bool SimSmsController::IsCdmaCardType() const
278 {
279     bool isCdmaType = false;
280     if (stateManager_ != nullptr) {
281         CardType type = stateManager_->GetCardType();
282         TELEPHONY_LOGI("IsCdmaCardType card type id %{public}d", type);
283         if (type == CardType::SINGLE_MODE_RUIM_CARD) {
284             isCdmaType = true; // cdma
285         }
286     }
287     TELEPHONY_LOGI("IsCdmaCardType result %{public}d", isCdmaType);
288     return isCdmaType;
289 }
290 
~SimSmsController()291 SimSmsController::~SimSmsController() {}
292 } // namespace Telephony
293 } // namespace OHOS
294