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