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