• 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 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