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