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 "telephony_observer.h"
17
18 #include "telephony_errors.h"
19 #include "telephony_log_wrapper.h"
20
21 namespace OHOS {
22 namespace Telephony {
OnCallStateUpdated(int32_t slotId,int32_t callState,const std::u16string & phoneNumber)23 void TelephonyObserver::OnCallStateUpdated(
24 int32_t slotId, int32_t callState, const std::u16string &phoneNumber) {}
25
OnSignalInfoUpdated(int32_t slotId,const std::vector<sptr<SignalInformation>> & vec)26 void TelephonyObserver::OnSignalInfoUpdated(
27 int32_t slotId, const std::vector<sptr<SignalInformation>> &vec) {}
28
OnNetworkStateUpdated(int32_t slotId,const sptr<NetworkState> & networkState)29 void TelephonyObserver::OnNetworkStateUpdated(
30 int32_t slotId, const sptr<NetworkState> &networkState) {}
31
OnCellInfoUpdated(int32_t slotId,const std::vector<sptr<CellInformation>> & vec)32 void TelephonyObserver::OnCellInfoUpdated(
33 int32_t slotId, const std::vector<sptr<CellInformation>> &vec) {}
34
OnSimStateUpdated(int32_t slotId,CardType type,SimState state,LockReason reason)35 void TelephonyObserver::OnSimStateUpdated(
36 int32_t slotId, CardType type, SimState state, LockReason reason) {}
37
OnCellularDataConnectStateUpdated(int32_t slotId,int32_t dataState,int32_t networkType)38 void TelephonyObserver::OnCellularDataConnectStateUpdated(
39 int32_t slotId, int32_t dataState, int32_t networkType) {}
40
OnCellularDataFlowUpdated(int32_t slotId,int32_t dataFlowType)41 void TelephonyObserver::OnCellularDataFlowUpdated(
42 int32_t slotId, int32_t dataFlowType) {}
43
OnCfuIndicatorUpdated(int32_t slotId,bool cfuResult)44 void TelephonyObserver::OnCfuIndicatorUpdated(int32_t slotId, bool cfuResult) {}
45
OnVoiceMailMsgIndicatorUpdated(int32_t slotId,bool voiceMailMsgResult)46 void TelephonyObserver::OnVoiceMailMsgIndicatorUpdated(int32_t slotId, bool voiceMailMsgResult) {}
47
OnIccAccountUpdated()48 void TelephonyObserver::OnIccAccountUpdated() {}
49
TelephonyObserver()50 TelephonyObserver::TelephonyObserver()
51 {
52 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_CALL_STATE_UPDATED)] =
53 [this](MessageParcel &data, MessageParcel &reply) { OnCallStateUpdatedInner(data, reply); };
54 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_SIGNAL_INFO_UPDATED)] =
55 [this](MessageParcel &data, MessageParcel &reply) { OnSignalInfoUpdatedInner(data, reply); };
56 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_CELL_INFO_UPDATED)] =
57 [this](MessageParcel &data, MessageParcel &reply) { OnCellInfoUpdatedInner(data, reply); };
58 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_NETWORK_STATE_UPDATED)] =
59 [this](MessageParcel &data, MessageParcel &reply) { OnNetworkStateUpdatedInner(data, reply); };
60 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_SIM_STATE_UPDATED)] =
61 [this](MessageParcel &data, MessageParcel &reply) { OnSimStateUpdatedInner(data, reply); };
62 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_CELLULAR_DATA_CONNECT_STATE_UPDATED)] =
63 [this](MessageParcel &data, MessageParcel &reply) { OnCellularDataConnectStateUpdatedInner(data, reply); };
64 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_CELLULAR_DATA_FLOW_UPDATED)] =
65 [this](MessageParcel &data, MessageParcel &reply) { OnCellularDataFlowUpdatedInner(data, reply); };
66 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_CFU_INDICATOR_UPDATED)] =
67 [this](MessageParcel &data, MessageParcel &reply) { OnCfuIndicatorUpdatedInner(data, reply); };
68 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_VOICE_MAIL_MSG_INDICATOR_UPDATED)] =
69 [this](MessageParcel &data, MessageParcel &reply) { OnVoiceMailMsgIndicatorUpdatedInner(data, reply); };
70 memberFuncMap_[static_cast<uint32_t>(ObserverBrokerCode::ON_ICC_ACCOUNT_UPDATED)] =
71 [this](MessageParcel &data, MessageParcel &reply) { OnIccAccountUpdatedInner(data, reply); };
72 }
73
~TelephonyObserver()74 TelephonyObserver::~TelephonyObserver()
75 {
76 memberFuncMap_.clear();
77 }
78
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)79 int32_t TelephonyObserver::OnRemoteRequest(
80 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
81 {
82 TELEPHONY_LOGD("code = %{public}u......", code);
83 if (data.ReadInterfaceToken() != GetDescriptor()) {
84 TELEPHONY_LOGE("verify token failed!");
85 return TELEPHONY_ERR_DESCRIPTOR_MISMATCH;
86 }
87 auto itFunc = memberFuncMap_.find(code);
88 if (itFunc != memberFuncMap_.end()) {
89 auto memberFunc = itFunc->second;
90 if (memberFunc != nullptr) {
91 memberFunc(data, reply);
92 return OHOS::NO_ERROR;
93 }
94 }
95 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
96 }
97
OnCallStateUpdatedInner(MessageParcel & data,MessageParcel & reply)98 void TelephonyObserver::OnCallStateUpdatedInner(
99 MessageParcel &data, MessageParcel &reply)
100 {
101 int32_t slotId = data.ReadInt32();
102 int32_t callState = data.ReadInt32();
103 std::u16string phoneNumber = data.ReadString16();
104 OnCallStateUpdated(slotId, callState, phoneNumber);
105 }
106
OnSignalInfoUpdatedInner(MessageParcel & data,MessageParcel & reply)107 void TelephonyObserver::OnSignalInfoUpdatedInner(
108 MessageParcel &data, MessageParcel &reply)
109 {
110 int32_t slotId = data.ReadInt32();
111 std::vector<sptr<SignalInformation>> signalInfos;
112 ConvertSignalInfoList(data, signalInfos);
113 OnSignalInfoUpdated(slotId, signalInfos);
114 }
115
OnNetworkStateUpdatedInner(MessageParcel & data,MessageParcel & reply)116 void TelephonyObserver::OnNetworkStateUpdatedInner(
117 MessageParcel &data, MessageParcel &reply)
118 {
119 int32_t slotId = data.ReadInt32();
120 sptr<NetworkState> networkState = NetworkState::Unmarshalling(data);
121 OnNetworkStateUpdated(slotId, networkState);
122 }
123
OnCellInfoUpdatedInner(MessageParcel & data,MessageParcel & reply)124 void TelephonyObserver::OnCellInfoUpdatedInner(
125 MessageParcel &data, MessageParcel &reply)
126 {
127 int32_t slotId = data.ReadInt32();
128 std::vector<sptr<CellInformation>> cells;
129 ConvertCellInfoList(data, cells);
130 OnCellInfoUpdated(slotId, cells);
131 }
132
OnSimStateUpdatedInner(MessageParcel & data,MessageParcel & reply)133 void TelephonyObserver::OnSimStateUpdatedInner(
134 MessageParcel &data, MessageParcel &reply)
135 {
136 int32_t slotId = data.ReadInt32();
137 CardType type = static_cast<CardType>(data.ReadInt32());
138 SimState simState = static_cast<SimState>(data.ReadInt32());
139 LockReason reson = static_cast<LockReason>(data.ReadInt32());
140 OnSimStateUpdated(slotId, type, simState, reson);
141 }
142
OnCellularDataConnectStateUpdatedInner(MessageParcel & data,MessageParcel & reply)143 void TelephonyObserver::OnCellularDataConnectStateUpdatedInner(
144 MessageParcel &data, MessageParcel &reply)
145 {
146 int32_t slotId = data.ReadInt32();
147 int32_t dataState = data.ReadInt32();
148 int32_t networkType = data.ReadInt32();
149 OnCellularDataConnectStateUpdated(slotId, dataState, networkType);
150 }
151
OnCellularDataFlowUpdatedInner(MessageParcel & data,MessageParcel & reply)152 void TelephonyObserver::OnCellularDataFlowUpdatedInner(
153 MessageParcel &data, MessageParcel &reply)
154 {
155 int32_t slotId = data.ReadInt32();
156 int32_t flowType = data.ReadInt32();
157 OnCellularDataFlowUpdated(slotId, flowType);
158 }
159
OnCfuIndicatorUpdatedInner(MessageParcel & data,MessageParcel & reply)160 void TelephonyObserver::OnCfuIndicatorUpdatedInner(
161 MessageParcel &data, MessageParcel &reply)
162 {
163 int32_t slotId = data.ReadInt32();
164 bool cfuResult = data.ReadBool();
165 OnCfuIndicatorUpdated(slotId, cfuResult);
166 }
167
OnVoiceMailMsgIndicatorUpdatedInner(MessageParcel & data,MessageParcel & reply)168 void TelephonyObserver::OnVoiceMailMsgIndicatorUpdatedInner(
169 MessageParcel &data, MessageParcel &reply)
170 {
171 int32_t slotId = data.ReadInt32();
172 bool voiceMailMsgResult = data.ReadBool();
173 OnVoiceMailMsgIndicatorUpdated(slotId, voiceMailMsgResult);
174 }
175
OnIccAccountUpdatedInner(MessageParcel & data,MessageParcel & reply)176 void TelephonyObserver::OnIccAccountUpdatedInner(MessageParcel &data, MessageParcel &reply)
177 {
178 OnIccAccountUpdated();
179 }
180
ConvertSignalInfoList(MessageParcel & data,std::vector<sptr<SignalInformation>> & result)181 void TelephonyObserver::ConvertSignalInfoList(
182 MessageParcel &data, std::vector<sptr<SignalInformation>> &result)
183 {
184 int32_t size = data.ReadInt32();
185 size = (size > SIGNAL_NUM_MAX) ? SIGNAL_NUM_MAX : size;
186 SignalInformation::NetworkType type;
187 for (int i = 0; i < size; ++i) {
188 type = static_cast<SignalInformation::NetworkType>(data.ReadInt32());
189 switch (type) {
190 case SignalInformation::NetworkType::GSM: {
191 std::unique_ptr<GsmSignalInformation> signal = std::make_unique<GsmSignalInformation>();
192 if (signal != nullptr) {
193 signal->ReadFromParcel(data);
194 result.emplace_back(signal.release());
195 }
196 break;
197 }
198 case SignalInformation::NetworkType::CDMA: {
199 std::unique_ptr<CdmaSignalInformation> signal = std::make_unique<CdmaSignalInformation>();
200 if (signal != nullptr) {
201 signal->ReadFromParcel(data);
202 result.emplace_back(signal.release());
203 }
204 break;
205 }
206 case SignalInformation::NetworkType::LTE:
207 [[fallthrough]]; // fall_through
208 case SignalInformation::NetworkType::NR: {
209 ConvertLteNrSignalInfoList(data, result, type);
210 break;
211 }
212 case SignalInformation::NetworkType::WCDMA: {
213 std::unique_ptr<WcdmaSignalInformation> signal = std::make_unique<WcdmaSignalInformation>();
214 if (signal != nullptr) {
215 signal->ReadFromParcel(data);
216 result.emplace_back(signal.release());
217 }
218 break;
219 }
220 default:
221 break;
222 }
223 }
224 }
225
ConvertLteNrSignalInfoList(MessageParcel & data,std::vector<sptr<SignalInformation>> & signalInfos,SignalInformation::NetworkType type)226 void TelephonyObserver::ConvertLteNrSignalInfoList(
227 MessageParcel &data, std::vector<sptr<SignalInformation>> &signalInfos, SignalInformation::NetworkType type)
228 {
229 switch (type) {
230 case SignalInformation::NetworkType::LTE: {
231 std::unique_ptr<LteSignalInformation> signal = std::make_unique<LteSignalInformation>();
232 if (signal != nullptr) {
233 signal->ReadFromParcel(data);
234 signalInfos.emplace_back(signal.release());
235 }
236 break;
237 }
238 case SignalInformation::NetworkType::NR: {
239 std::unique_ptr<NrSignalInformation> signal = std::make_unique<NrSignalInformation>();
240 if (signal != nullptr) {
241 signal->ReadFromParcel(data);
242 signalInfos.emplace_back(signal.release());
243 }
244 break;
245 }
246 default:
247 break;
248 }
249 }
250
ConvertCellInfoList(MessageParcel & data,std::vector<sptr<CellInformation>> & cells)251 void TelephonyObserver::ConvertCellInfoList(
252 MessageParcel &data, std::vector<sptr<CellInformation>> &cells)
253 {
254 int32_t size = data.ReadInt32();
255 size = (size > CELL_NUM_MAX) ? CELL_NUM_MAX : size;
256 CellInformation::CellType type;
257 for (int i = 0; i < size; ++i) {
258 type = static_cast<CellInformation::CellType>(data.ReadInt32());
259 switch (type) {
260 case CellInformation::CellType::CELL_TYPE_GSM: {
261 std::unique_ptr<GsmCellInformation> cell = std::make_unique<GsmCellInformation>();
262 if (cell != nullptr) {
263 cell->ReadFromParcel(data);
264 cells.emplace_back(cell.release());
265 }
266 break;
267 }
268 case CellInformation::CellType::CELL_TYPE_LTE: {
269 std::unique_ptr<LteCellInformation> cell = std::make_unique<LteCellInformation>();
270 if (cell != nullptr) {
271 cell->ReadFromParcel(data);
272 cells.emplace_back(cell.release());
273 }
274 break;
275 }
276 case CellInformation::CellType::CELL_TYPE_NR: {
277 std::unique_ptr<NrCellInformation> cell = std::make_unique<NrCellInformation>();
278 if (cell != nullptr) {
279 cell->ReadFromParcel(data);
280 cells.emplace_back(cell.release());
281 }
282 break;
283 }
284 default:
285 break;
286 }
287 }
288 }
289 } // namespace Telephony
290 } // namespace OHOS
291