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