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