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 namespace OHOS {
19 namespace Telephony {
20 std::mutex SimSmsController::mtx_;
21
SimSmsController(const std::shared_ptr<AppExecFwk::EventRunner> & runner,std::shared_ptr<SimStateManager> simStateManager)22 SimSmsController::SimSmsController(
23 const std::shared_ptr<AppExecFwk::EventRunner> &runner, std::shared_ptr<SimStateManager> simStateManager)
24 : AppExecFwk::EventHandler(runner), stateManager_(simStateManager)
25 {}
26
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)27 void SimSmsController::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
28 {
29 int id = 0;
30 id = event->GetInnerEventId();
31 TELEPHONY_LOGI("SimSmsController ProcessEvent Id is %{public}d", id);
32 switch (id) {
33 case SIM_SMS_GET_COMPLETED:
34 ProcessLoadDone(event);
35 break;
36 case SIM_SMS_UPDATE_COMPLETED:
37 ProcessUpdateDone(event);
38 break;
39 case SIM_SMS_WRITE_COMPLETED:
40 ProcessWriteDone(event);
41 break;
42 case SIM_SMS_DELETE_COMPLETED:
43 ProcessDeleteDone(event);
44 break;
45 default:
46 break;
47 }
48 }
49
ProcessLoadDone(const AppExecFwk::InnerEvent::Pointer & event)50 void SimSmsController::ProcessLoadDone(const AppExecFwk::InnerEvent::Pointer &event)
51 {
52 TELEPHONY_LOGI("SimSmsController::ProcessLoadDone: start");
53 std::unique_ptr<ControllerToFileMsg> fd = event->GetUniqueObject<ControllerToFileMsg>();
54 if (fd != nullptr) {
55 if (fd->exception != nullptr) {
56 TELEPHONY_LOGE("ProcessLoadDone: get error result");
57 std::vector<std::string> nullVector;
58 smsList_.swap(nullVector);
59 }
60 } else {
61 std::shared_ptr<MultiRecordResult> object = event->GetSharedObject<MultiRecordResult>();
62 if (object != nullptr) {
63 TELEPHONY_LOGI("SimSmsController::ProcessLoadDone: %{public}d", object->resultLength);
64 if (object->exception == nullptr) {
65 smsList_.assign(object->fileResults.begin(), object->fileResults.end());
66 }
67 } else {
68 TELEPHONY_LOGE("ProcessLoadDone: get null pointer!!!");
69 }
70 }
71 processWait_.notify_all();
72 }
73
ProcessUpdateDone(const AppExecFwk::InnerEvent::Pointer & event)74 void SimSmsController::ProcessUpdateDone(const AppExecFwk::InnerEvent::Pointer &event)
75 {
76 result_ = true;
77 std::shared_ptr<HRilRadioResponseInfo> responseInfo = event->GetSharedObject<HRilRadioResponseInfo>();
78 if (responseInfo != nullptr) {
79 TELEPHONY_LOGE("SimSmsController::ProcessUpdateDone error %{public}d", responseInfo->error);
80 result_ = (responseInfo->error == HRilErrType::NONE);
81 }
82 TELEPHONY_LOGI("SimSmsController::ProcessUpdateDone: end");
83 processWait_.notify_all();
84 }
85
ProcessWriteDone(const AppExecFwk::InnerEvent::Pointer & event)86 void SimSmsController::ProcessWriteDone(const AppExecFwk::InnerEvent::Pointer &event)
87 {
88 result_ = true;
89 std::shared_ptr<HRilRadioResponseInfo> responseInfo = event->GetSharedObject<HRilRadioResponseInfo>();
90 if (responseInfo != nullptr) {
91 TELEPHONY_LOGE("SimSmsController::ProcessWriteDone error %{public}d", responseInfo->error);
92 result_ = (responseInfo->error == HRilErrType::NONE);
93 }
94 TELEPHONY_LOGI("SimSmsController::ProcessWriteDone: end");
95 processWait_.notify_all();
96 }
97
ProcessDeleteDone(const AppExecFwk::InnerEvent::Pointer & event)98 void SimSmsController::ProcessDeleteDone(const AppExecFwk::InnerEvent::Pointer &event)
99 {
100 result_ = true;
101 std::shared_ptr<HRilRadioResponseInfo> responseInfo = event->GetSharedObject<HRilRadioResponseInfo>();
102 if (responseInfo != nullptr) {
103 TELEPHONY_LOGE("SimSmsController::ProcessDeleteDone error %{public}d", responseInfo->error);
104 result_ = (responseInfo->error == HRilErrType::NONE);
105 }
106 TELEPHONY_LOGI("SimSmsController::ProcessDeleteDone: end");
107 processWait_.notify_all();
108 }
109
UpdateSmsIcc(int index,int status,std::string & pduData,std::string & smsc)110 bool SimSmsController::UpdateSmsIcc(int index, int status, std::string &pduData, std::string &smsc)
111 {
112 std::unique_lock<std::mutex> lock(mtx_);
113 result_ = false;
114 bool isCDMA = IsCdmaCardType();
115 TELEPHONY_LOGI("UpdateSmsIcc start: %{public}d, %{public}d", index, isCDMA);
116 if (!isCDMA) {
117 AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_UPDATE_COMPLETED);
118 SimMessageParam param {index, status, smsc, pduData};
119 telRilManager_->UpdateSimMessage(slotId_, param, response);
120 processWait_.wait(lock);
121 } else {
122 AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_UPDATE_COMPLETED);
123 CdmaSimMessageParam param {index, status, pduData};
124 telRilManager_->UpdateCdmaSimMessage(slotId_, param, response);
125 processWait_.wait(lock);
126 }
127 TELEPHONY_LOGI("SimSmsController::UpdateSmsIcc OK return %{public}d", result_);
128 return result_;
129 }
130
DelSmsIcc(int index)131 bool SimSmsController::DelSmsIcc(int index)
132 {
133 std::unique_lock<std::mutex> lock(mtx_);
134 result_ = false;
135 bool isCDMA = IsCdmaCardType();
136 TELEPHONY_LOGI("DelSmsIcc start: %{public}d, %{public}d", index, isCDMA);
137 if (!isCDMA) {
138 AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_DELETE_COMPLETED);
139 telRilManager_->DelSimMessage(slotId_, index, response);
140 processWait_.wait(lock);
141 TELEPHONY_LOGI("SimSmsController::DelSmsIcc OK return %{public}d", result_);
142 return result_;
143 } else {
144 AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_DELETE_COMPLETED);
145 telRilManager_->DelCdmaSimMessage(slotId_, index, response);
146 processWait_.wait(lock);
147 TELEPHONY_LOGI("SimSmsController::DelCdmaSimMessage OK return %{public}d", result_);
148 return result_;
149 }
150 }
151
AddSmsToIcc(int status,std::string & pdu,std::string & smsc)152 bool SimSmsController::AddSmsToIcc(int status, std::string &pdu, std::string &smsc)
153 {
154 std::unique_lock<std::mutex> lock(mtx_);
155 result_ = false;
156 bool isCDMA = IsCdmaCardType();
157 TELEPHONY_LOGI("AddSmsToIcc start: %{public}d, %{public}d", status, isCDMA);
158 if (!isCDMA) {
159 AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_WRITE_COMPLETED);
160 SimMessageParam param {0, status, smsc, pdu};
161 telRilManager_->AddSimMessage(slotId_, param, response);
162 } else {
163 AppExecFwk::InnerEvent::Pointer response = BuildCallerInfo(SIM_SMS_WRITE_COMPLETED);
164 telRilManager_->AddCdmaSimMessage(slotId_, status, pdu, response);
165 }
166 processWait_.wait(lock);
167 TELEPHONY_LOGI("SimSmsController::AddSmsToIcc OK return %{public}d", result_);
168 return result_;
169 }
170
Init(int slodId)171 void SimSmsController::Init(int slodId)
172 {
173 slotId_ = slodId;
174 }
175
ObtainAllSmsOfIcc()176 std::vector<std::string> SimSmsController::ObtainAllSmsOfIcc()
177 {
178 std::unique_lock<std::mutex> lock(mtx_);
179 std::shared_ptr<IccFileController> fileController = fileManager_->GetIccFileController();
180 if (fileController == nullptr) {
181 TELEPHONY_LOGE("Cannot load Sms records. No icc card?");
182 std::vector<std::string> nullVector;
183 smsList_.swap(nullVector);
184 return smsList_;
185 }
186 TELEPHONY_LOGI("ObtainAllSmsOfIcc start!!");
187 AppExecFwk::InnerEvent::Pointer event = BuildCallerInfo(SIM_SMS_GET_COMPLETED);
188 fileController->ObtainAllLinearFixedFile(ELEMENTARY_FILE_SMS, event);
189 processWait_.wait(lock);
190 TELEPHONY_LOGI("SimSmsController::ObtainAllSmsOfIcc: end");
191 return smsList_;
192 }
193
SetRilAndFileManager(std::shared_ptr<Telephony::ITelRilManager> ril,std::shared_ptr<SimFileManager> fileMgr)194 void SimSmsController::SetRilAndFileManager(
195 std::shared_ptr<Telephony::ITelRilManager> ril, std::shared_ptr<SimFileManager> fileMgr)
196 {
197 telRilManager_ = ril;
198 if (telRilManager_ == nullptr) {
199 TELEPHONY_LOGE("SimSmsController rilmanager get null pointer");
200 }
201 fileManager_ = fileMgr;
202 if (fileManager_ == nullptr) {
203 TELEPHONY_LOGE("SimSmsController fileManager get null pointer");
204 }
205 }
206
BuildCallerInfo(int eventId)207 AppExecFwk::InnerEvent::Pointer SimSmsController::BuildCallerInfo(int eventId)
208 {
209 std::unique_ptr<FileToControllerMsg> object = std::make_unique<FileToControllerMsg>();
210 int eventParam = 0;
211 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(eventId, object, eventParam);
212 event->SetOwner(shared_from_this());
213 return event;
214 }
215
IsCdmaCardType() const216 bool SimSmsController::IsCdmaCardType() const
217 {
218 bool isCdmaType = false;
219 if (stateManager_ != nullptr) {
220 CardType type = stateManager_->GetCardType();
221 TELEPHONY_LOGI("IsCdmaCardType card type id %{public}d", type);
222 if (type == CardType::SINGLE_MODE_RUIM_CARD) {
223 isCdmaType = true; // cdma
224 }
225 }
226 TELEPHONY_LOGI("IsCdmaCardType result %{public}d", isCdmaType);
227 return isCdmaType;
228 }
229
~SimSmsController()230 SimSmsController::~SimSmsController() {}
231 } // namespace Telephony
232 } // namespace OHOS
233