• 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_state_registry_stub.h"
17 
18 #include "ipc_skeleton.h"
19 #include "string_ex.h"
20 
21 #include "sim_state_type.h"
22 #include "state_registry_errors.h"
23 #include "telephony_permission.h"
24 
25 namespace OHOS {
26 namespace Telephony {
TelephonyStateRegistryStub()27 TelephonyStateRegistryStub::TelephonyStateRegistryStub()
28 {
29     memberFuncMap_[StateNotifyInterfaceCode::CELL_INFO] = &TelephonyStateRegistryStub::OnUpdateCellInfo;
30     memberFuncMap_[StateNotifyInterfaceCode::SIM_STATE] = &TelephonyStateRegistryStub::OnUpdateSimState;
31     memberFuncMap_[StateNotifyInterfaceCode::SIGNAL_INFO] = &TelephonyStateRegistryStub::OnUpdateSignalInfo;
32     memberFuncMap_[StateNotifyInterfaceCode::NET_WORK_STATE] = &TelephonyStateRegistryStub::OnUpdateNetworkState;
33     memberFuncMap_[StateNotifyInterfaceCode::CALL_STATE] = &TelephonyStateRegistryStub::OnUpdateCallState;
34     memberFuncMap_[StateNotifyInterfaceCode::CALL_STATE_FOR_ID] =
35         &TelephonyStateRegistryStub::OnUpdateCallStateForSlotId;
36     memberFuncMap_[StateNotifyInterfaceCode::CELLULAR_DATA_STATE] =
37         &TelephonyStateRegistryStub::OnUpdateCellularDataConnectState;
38     memberFuncMap_[StateNotifyInterfaceCode::CELLULAR_DATA_FLOW] =
39         &TelephonyStateRegistryStub::OnUpdateCellularDataFlow;
40     memberFuncMap_[StateNotifyInterfaceCode::ADD_OBSERVER] = &TelephonyStateRegistryStub::OnRegisterStateChange;
41     memberFuncMap_[StateNotifyInterfaceCode::REMOVE_OBSERVER] = &TelephonyStateRegistryStub::OnUnregisterStateChange;
42     memberFuncMap_[StateNotifyInterfaceCode::CFU_INDICATOR] = &TelephonyStateRegistryStub::OnUpdateCfuIndicator;
43     memberFuncMap_[StateNotifyInterfaceCode::VOICE_MAIL_MSG_INDICATOR] =
44         &TelephonyStateRegistryStub::OnUpdateVoiceMailMsgIndicator;
45     memberFuncMap_[StateNotifyInterfaceCode::ICC_ACCOUNT_CHANGE] = &TelephonyStateRegistryStub::OnIccAccountUpdated;
46 }
47 
~TelephonyStateRegistryStub()48 TelephonyStateRegistryStub::~TelephonyStateRegistryStub()
49 {
50     memberFuncMap_.clear();
51 }
52 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)53 int32_t TelephonyStateRegistryStub::OnRemoteRequest(
54     uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
55 {
56     TELEPHONY_LOGD("TelephonyStateRegistryStub::OnRemoteRequest start##code = %{public}u", code);
57     std::u16string myToken = TelephonyStateRegistryStub::GetDescriptor();
58     std::u16string remoteToken = data.ReadInterfaceToken();
59     if (myToken != remoteToken) {
60         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnRemoteRequest end##descriptor checked fail");
61         return TELEPHONY_ERR_DESCRIPTOR_MISMATCH;
62     }
63     auto itFunc = memberFuncMap_.find(static_cast<StateNotifyInterfaceCode>(code));
64     if (itFunc != memberFuncMap_.end()) {
65         auto memberFunc = itFunc->second;
66         if (memberFunc != nullptr) {
67             return (this->*memberFunc)(data, reply);
68         }
69     }
70     int ret = IPCObjectStub::OnRemoteRequest(code, data, reply, option);
71     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnRemoteRequest end##ret=%{public}d", ret);
72     return ret;
73 }
74 
OnUpdateCallState(MessageParcel & data,MessageParcel & reply)75 int32_t TelephonyStateRegistryStub::OnUpdateCallState(MessageParcel &data, MessageParcel &reply)
76 {
77     int32_t slotId = data.ReadInt32();
78     int32_t callState = data.ReadInt32();
79     std::u16string phoneNumber = data.ReadString16();
80     int32_t ret = UpdateCallState(slotId, callState, phoneNumber);
81     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnUpdateCallState end##ret=%{public}d", ret);
82     reply.WriteInt32(ret);
83     return ret;
84 }
85 
OnUpdateSimState(MessageParcel & data,MessageParcel & reply)86 int32_t TelephonyStateRegistryStub::OnUpdateSimState(MessageParcel &data, MessageParcel &reply)
87 {
88     int32_t slotId = data.ReadInt32();
89     CardType type = static_cast<CardType>(data.ReadInt32());
90     SimState state = static_cast<SimState>(data.ReadInt32());
91     LockReason reason = static_cast<LockReason>(data.ReadInt32());
92     int32_t ret = UpdateSimState(slotId, type, state, reason);
93     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnUpdateSimState end##ret=%{public}d", ret);
94     reply.WriteInt32(ret);
95     return ret;
96 }
97 
OnUpdateCallStateForSlotId(MessageParcel & data,MessageParcel & reply)98 int32_t TelephonyStateRegistryStub::OnUpdateCallStateForSlotId(MessageParcel &data, MessageParcel &reply)
99 {
100     int32_t slotId = data.ReadInt32();
101     int32_t callId = data.ReadInt32();
102     int32_t callState = data.ReadInt32();
103     std::u16string incomingNumber = data.ReadString16();
104     int32_t ret = UpdateCallStateForSlotId(slotId, callId, callState, incomingNumber);
105     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnUpdateCallStateForSlotId end##ret=%{public}d", ret);
106     reply.WriteInt32(ret);
107     return ret;
108 }
109 
OnUpdateCellularDataConnectState(MessageParcel & data,MessageParcel & reply)110 int32_t TelephonyStateRegistryStub::OnUpdateCellularDataConnectState(MessageParcel &data, MessageParcel &reply)
111 {
112     int32_t slotId = data.ReadInt32();
113     int32_t dataState = data.ReadInt32();
114     int32_t networkType = data.ReadInt32();
115     int32_t ret = UpdateCellularDataConnectState(slotId, dataState, networkType);
116     if (ret != TELEPHONY_SUCCESS) {
117         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnUpdateCellularDataConnectState end fail##ret=%{public}d", ret);
118     }
119     reply.WriteInt32(ret);
120     return ret;
121 }
122 
OnUpdateCellularDataFlow(MessageParcel & data,MessageParcel & reply)123 int32_t TelephonyStateRegistryStub::OnUpdateCellularDataFlow(MessageParcel &data, MessageParcel &reply)
124 {
125     int32_t slotId = data.ReadInt32();
126     int32_t flowData = data.ReadInt32();
127     int32_t ret = UpdateCellularDataFlow(slotId, flowData);
128     if (ret != TELEPHONY_SUCCESS) {
129         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnUpdateCellularDataFlow end fail##ret=%{public}d", ret);
130     }
131     reply.WriteInt32(ret);
132     return ret;
133 }
134 
OnUpdateSignalInfo(MessageParcel & data,MessageParcel & reply)135 int32_t TelephonyStateRegistryStub::OnUpdateSignalInfo(MessageParcel &data, MessageParcel &reply)
136 {
137     int32_t ret = TELEPHONY_SUCCESS;
138     int32_t slotId = data.ReadInt32();
139     int32_t size = data.ReadInt32();
140     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnUpdateSignalInfo size=%{public}d", size);
141     size = ((size > SignalInformation::MAX_SIGNAL_NUM) ? 0 : size);
142     if (size <= 0) {
143         ret = TELEPHONY_ERR_FAIL;
144         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnUpdateSignalInfo size <= 0");
145         return ret;
146     }
147     std::vector<sptr<SignalInformation>> result;
148     parseSignalInfos(data, size, result);
149     ret = UpdateSignalInfo(slotId, result);
150     if (ret != TELEPHONY_SUCCESS) {
151         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnUpdateSignalInfo end fail##ret=%{public}d", ret);
152     }
153     reply.WriteInt32(ret);
154     return ret;
155 }
156 
parseSignalInfos(MessageParcel & data,const int32_t size,std::vector<sptr<SignalInformation>> & result)157 void TelephonyStateRegistryStub::parseSignalInfos(
158     MessageParcel &data, const int32_t size, std::vector<sptr<SignalInformation>> &result)
159 {
160     SignalInformation::NetworkType type;
161     for (int i = 0; i < size; ++i) {
162         type = static_cast<SignalInformation::NetworkType>(data.ReadInt32());
163         switch (type) {
164             case SignalInformation::NetworkType::GSM: {
165                 TELEPHONY_LOGI("TelephonyStateRegistryStub::parseSignalInfos NetworkType::GSM");
166                 std::unique_ptr<GsmSignalInformation> signal = std::make_unique<GsmSignalInformation>();
167                 if (signal != nullptr) {
168                     signal->ReadFromParcel(data);
169                     result.emplace_back(signal.release());
170                 }
171                 break;
172             }
173             case SignalInformation::NetworkType::CDMA: {
174                 TELEPHONY_LOGI("TelephonyStateRegistryStub::parseSignalInfos NetworkType::CDMA");
175                 std::unique_ptr<CdmaSignalInformation> signal = std::make_unique<CdmaSignalInformation>();
176                 if (signal != nullptr) {
177                     signal->ReadFromParcel(data);
178                     result.emplace_back(signal.release());
179                 }
180                 break;
181             }
182             case SignalInformation::NetworkType::LTE:
183                 [[fallthrough]]; // fall_through
184             case SignalInformation::NetworkType::NR: {
185                 ParseLteNrSignalInfos(data, result, type);
186                 break;
187             }
188             case SignalInformation::NetworkType::WCDMA: {
189                 TELEPHONY_LOGI("TelephonyStateRegistryStub::parseSignalInfos NetworkType::Wcdma");
190                 std::unique_ptr<WcdmaSignalInformation> signal = std::make_unique<WcdmaSignalInformation>();
191                 if (signal != nullptr) {
192                     signal->ReadFromParcel(data);
193                     result.emplace_back(signal.release());
194                 }
195                 break;
196             }
197             default:
198                 break;
199         }
200     }
201 }
202 
ParseLteNrSignalInfos(MessageParcel & data,std::vector<sptr<SignalInformation>> & result,SignalInformation::NetworkType type)203 void TelephonyStateRegistryStub::ParseLteNrSignalInfos(
204     MessageParcel &data, std::vector<sptr<SignalInformation>> &result, SignalInformation::NetworkType type)
205 {
206     switch (type) {
207         case SignalInformation::NetworkType::LTE: {
208             TELEPHONY_LOGI("TelephonyStateRegistryStub::ParseLteNrSignalInfos NetworkType::LTE");
209             std::unique_ptr<LteSignalInformation> signal = std::make_unique<LteSignalInformation>();
210             if (signal != nullptr) {
211                 signal->ReadFromParcel(data);
212                 result.emplace_back(signal.release());
213             }
214             break;
215         }
216         case SignalInformation::NetworkType::NR: {
217             TELEPHONY_LOGI("TelephonyStateRegistryStub::ParseSignalInfos");
218             std::unique_ptr<NrSignalInformation> signal = std::make_unique<NrSignalInformation>();
219             if (signal != nullptr) {
220                 signal->ReadFromParcel(data);
221                 result.emplace_back(signal.release());
222             }
223             break;
224         }
225         default:
226             break;
227     }
228 }
229 
OnUpdateCellInfo(MessageParcel & data,MessageParcel & reply)230 int32_t TelephonyStateRegistryStub::OnUpdateCellInfo(MessageParcel &data, MessageParcel &reply)
231 {
232     int32_t ret = TELEPHONY_SUCCESS;
233     int32_t slotId = data.ReadInt32();
234     int32_t size = data.ReadInt32();
235     TELEPHONY_LOGI("TelephonyStateRegistryStub OnUpdateCellInfo:size=%{public}d", size);
236     size = ((size > CellInformation::MAX_CELL_NUM) ? 0 : size);
237     if (size <= 0) {
238         ret = TELEPHONY_ERR_FAIL;
239         TELEPHONY_LOGE("TelephonyStateRegistryStub the size less than or equal to 0!");
240         return ret;
241     }
242     std::vector<sptr<CellInformation>> cells;
243     CellInformation::CellType type;
244     for (int i = 0; i < size; ++i) {
245         type = static_cast<CellInformation::CellType>(data.ReadInt32());
246         switch (type) {
247             case CellInformation::CellType::CELL_TYPE_GSM: {
248                 std::unique_ptr<GsmCellInformation> cell = std::make_unique<GsmCellInformation>();
249                 if (cell != nullptr) {
250                     cell->ReadFromParcel(data);
251                     cells.emplace_back(cell.release());
252                 }
253                 break;
254             }
255             case CellInformation::CellType::CELL_TYPE_LTE: {
256                 std::unique_ptr<LteCellInformation> cell = std::make_unique<LteCellInformation>();
257                 if (cell != nullptr) {
258                     cell->ReadFromParcel(data);
259                     cells.emplace_back(cell.release());
260                 }
261                 break;
262             }
263             case CellInformation::CellType::CELL_TYPE_NR: {
264                 std::unique_ptr<NrCellInformation> cell = std::make_unique<NrCellInformation>();
265                 if (cell != nullptr) {
266                     cell->ReadFromParcel(data);
267                     cells.emplace_back(cell.release());
268                 }
269                 break;
270             }
271             default:
272                 break;
273         }
274     }
275     ret = UpdateCellInfo(slotId, cells);
276     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnUpdateCellInfo end##ret=%{public}d", ret);
277     reply.WriteInt32(ret);
278     return ret;
279 }
280 
OnUpdateNetworkState(MessageParcel & data,MessageParcel & reply)281 int32_t TelephonyStateRegistryStub::OnUpdateNetworkState(MessageParcel &data, MessageParcel &reply)
282 {
283     int32_t ret = TELEPHONY_SUCCESS;
284     int32_t slotId = data.ReadInt32();
285     sptr<NetworkState> result = NetworkState::Unmarshalling(data);
286     if (result == nullptr) {
287         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnUpdateNetworkState GetNetworkStatus  is null");
288         ret = TELEPHONY_ERR_FAIL;
289         return ret;
290     }
291     ret = UpdateNetworkState(slotId, result);
292     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnUpdateNetworkState end##ret=%{public}d", ret);
293     reply.WriteInt32(ret);
294     return ret;
295 }
296 
OnRegisterStateChange(MessageParcel & data,MessageParcel & reply)297 int32_t TelephonyStateRegistryStub::OnRegisterStateChange(MessageParcel &data, MessageParcel &reply)
298 {
299     int32_t ret = TELEPHONY_SUCCESS;
300     int32_t slotId = data.ReadInt32();
301     int32_t mask = data.ReadInt32();
302     bool notifyNow = data.ReadBool();
303     sptr<TelephonyObserverBroker> callback = nullptr;
304     ret = ReadData(data, reply, callback);
305     if (ret != TELEPHONY_SUCCESS) {
306         reply.WriteInt32(ret);
307         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnRegisterStateChange ReadData failed");
308         return ret;
309     }
310     ret = RegisterStateChange(callback, slotId, mask, notifyNow);
311     if (ret != TELEPHONY_SUCCESS) {
312         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnRegisterStateChange end fail##ret=%{public}d", ret);
313     }
314     reply.WriteInt32(ret);
315     return ret;
316 }
317 
OnUnregisterStateChange(MessageParcel & data,MessageParcel & reply)318 int32_t TelephonyStateRegistryStub::OnUnregisterStateChange(MessageParcel &data, MessageParcel &reply)
319 {
320     int32_t slotId = data.ReadInt32();
321     int32_t mask = data.ReadInt32();
322     int32_t ret = UnregisterStateChange(slotId, mask);
323     if (ret != TELEPHONY_SUCCESS) {
324         TELEPHONY_LOGE("TelephonyStateRegistryStub::OnUnregisterStateChange end fail##ret=%{public}d", ret);
325     }
326     reply.WriteInt32(ret);
327     return ret;
328 }
329 
ReadData(MessageParcel & data,MessageParcel & reply,sptr<TelephonyObserverBroker> & callback)330 int32_t TelephonyStateRegistryStub::ReadData(
331     MessageParcel &data, MessageParcel &reply, sptr<TelephonyObserverBroker> &callback)
332 {
333     int32_t result = TELEPHONY_SUCCESS;
334     sptr<IRemoteObject> remote = data.ReadRemoteObject();
335     if (remote == nullptr) {
336         TELEPHONY_LOGE("TelephonyStateRegistryStub::ReadData  remote is nullptr.");
337         result = TELEPHONY_ERR_FAIL;
338         reply.WriteInt32(result);
339         return result;
340     }
341     callback = iface_cast<TelephonyObserverBroker>(remote);
342     if (callback == nullptr) {
343         TELEPHONY_LOGE("TelephonyStateRegistryStub::ReadData callback is nullptr.");
344         result = TELEPHONY_ERR_FAIL;
345         reply.WriteInt32(result);
346         return result;
347     }
348     return result;
349 }
350 
OnUpdateCfuIndicator(MessageParcel & data,MessageParcel & reply)351 int32_t TelephonyStateRegistryStub::OnUpdateCfuIndicator(MessageParcel &data, MessageParcel &reply)
352 {
353     int32_t slotId = data.ReadInt32();
354     bool cfuResult = data.ReadBool();
355     int32_t ret = UpdateCfuIndicator(slotId, cfuResult);
356     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnUpdateCfuIndicator end##ret=%{public}d", ret);
357     reply.WriteInt32(ret);
358     return ret;
359 }
360 
OnUpdateVoiceMailMsgIndicator(MessageParcel & data,MessageParcel & reply)361 int32_t TelephonyStateRegistryStub::OnUpdateVoiceMailMsgIndicator(MessageParcel &data, MessageParcel &reply)
362 {
363     int32_t slotId = data.ReadInt32();
364     bool voiceMailMsgResult = data.ReadBool();
365     int32_t ret = UpdateVoiceMailMsgIndicator(slotId, voiceMailMsgResult);
366     TELEPHONY_LOGI("TelephonyStateRegistryStub::OnUpdateVoiceMailMsgIndicator end##ret=%{public}d", ret);
367     reply.WriteInt32(ret);
368     return ret;
369 }
370 
OnIccAccountUpdated(MessageParcel & data,MessageParcel & reply)371 int32_t TelephonyStateRegistryStub::OnIccAccountUpdated(MessageParcel &data, MessageParcel &reply)
372 {
373     int32_t ret = UpdateIccAccount();
374     TELEPHONY_LOGI("end##ret=%{public}d", ret);
375     reply.WriteInt32(ret);
376     return ret;
377 }
378 
RegisterStateChange(const sptr<TelephonyObserverBroker> & telephonyObserver,int32_t slotId,uint32_t mask,bool isUpdate)379 int32_t TelephonyStateRegistryStub::RegisterStateChange(const sptr<TelephonyObserverBroker> &telephonyObserver,
380     int32_t slotId, uint32_t mask, bool isUpdate)
381 {
382     int32_t uid = IPCSkeleton::GetCallingUid();
383     std::string bundleName = "";
384     TelephonyPermission::GetBundleNameByUid(uid, bundleName);
385     int32_t tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
386     return RegisterStateChange(telephonyObserver, slotId, mask, bundleName, isUpdate,
387         IPCSkeleton::GetCallingPid(), uid, tokenId);
388 }
389 
UnregisterStateChange(int32_t slotId,uint32_t mask)390 int32_t TelephonyStateRegistryStub::UnregisterStateChange(int32_t slotId, uint32_t mask)
391 {
392     int32_t tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
393     return UnregisterStateChange(slotId, mask, tokenId, IPCSkeleton::GetCallingPid());
394 }
395 } // namespace Telephony
396 } // namespace OHOS