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