1 /*
2 * Copyright (C) 2021-2024 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_service.h"
17
18 #include <sstream>
19 #include <thread>
20
21 #include "common_event_manager.h"
22 #include "common_event_support.h"
23 #include "iservice_registry.h"
24 #include "state_registry_errors.h"
25 #include "string_ex.h"
26 #include "system_ability.h"
27 #include "system_ability_definition.h"
28 #include "telephony_permission.h"
29 #include "telephony_state_manager.h"
30 #include "telephony_state_registry_dump_helper.h"
31 #include "telephony_types.h"
32 #include "telephony_ext_wrapper.h"
33
34 namespace OHOS {
35 namespace Telephony {
36 using namespace OHOS::EventFwk;
37 bool g_registerResult =
38 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<TelephonyStateRegistryService>::GetInstance().get());
39
TelephonyStateRegistryService()40 TelephonyStateRegistryService::TelephonyStateRegistryService()
41 : SystemAbility(TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, true)
42 {
43 TELEPHONY_LOGI("TelephonyStateRegistryService SystemAbility create");
44 slotSize_ = SIM_SLOT_COUNT;
45 for (int32_t i = 0; i < slotSize_; i++) {
46 callState_[i] = static_cast<int32_t>(CallStatus::CALL_STATUS_UNKNOWN);
47 }
48 }
49
~TelephonyStateRegistryService()50 TelephonyStateRegistryService::~TelephonyStateRegistryService()
51 {
52 stateRecords_.clear();
53 callState_.clear();
54 callIncomingNumber_.clear();
55 signalInfos_.clear();
56 searchNetworkState_.clear();
57 }
58
OnStart()59 void TelephonyStateRegistryService::OnStart()
60 {
61 bindStartTime_ =
62 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
63 .count();
64 std::lock_guard<std::mutex> guard(lock_);
65 if (state_ == ServiceRunningState::STATE_RUNNING) {
66 TELEPHONY_LOGE("Leave, FAILED, already running");
67 return;
68 }
69 state_ = ServiceRunningState::STATE_RUNNING;
70 bool ret = SystemAbility::Publish(DelayedSingleton<TelephonyStateRegistryService>::GetInstance().get());
71 if (!ret) {
72 TELEPHONY_LOGE("Leave, Failed to publish TelephonyStateRegistryService");
73 }
74 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
75 TELEPHONY_EXT_WRAPPER.InitTelephonyExtWrapper();
76 #endif
77 TELEPHONY_LOGI("TelephonyStateRegistryService start success.");
78 bindEndTime_ =
79 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
80 .count();
81 std::thread task([&]() {
82 if (IsCommonEventServiceAbilityExist()) {
83 for (int32_t i = 0; i < slotSize_; i++) {
84 TELEPHONY_LOGI("TelephonyStateRegistryService send disconnected call state.");
85 SendCallStateChanged(i, static_cast<int32_t>(CallStatus::CALL_STATUS_DISCONNECTED), u"");
86 }
87 }
88 });
89 pthread_setname_np(task.native_handle(), "state_registry_task");
90 task.detach();
91 }
92
OnStop()93 void TelephonyStateRegistryService::OnStop()
94 {
95 TELEPHONY_LOGI("TelephonyStateRegistryService OnStop ");
96 std::lock_guard<std::mutex> guard(lock_);
97 state_ = ServiceRunningState::STATE_STOPPED;
98 }
99
Finalize()100 void TelephonyStateRegistryService::Finalize()
101 {
102 TELEPHONY_LOGI("TelephonyStateRegistryService Finalize");
103 }
104
OnDump()105 void TelephonyStateRegistryService::OnDump() {}
106
UpdateCellularDataConnectState(int32_t slotId,int32_t dataState,int32_t networkType)107 int32_t TelephonyStateRegistryService::UpdateCellularDataConnectState(
108 int32_t slotId, int32_t dataState, int32_t networkType)
109 {
110 if (!VerifySlotId(slotId)) {
111 TELEPHONY_LOGE("UpdateCellularDataConnectState##VerifySlotId failed ##slotId = %{public}d", slotId);
112 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
113 }
114 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
115 TELEPHONY_LOGE("Check permission failed.");
116 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
117 }
118 std::lock_guard<std::mutex> guard(lock_);
119 cellularDataConnectionState_[slotId] = dataState;
120 cellularDataConnectionNetworkType_[slotId] = networkType;
121 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
122 for (size_t i = 0; i < stateRecords_.size(); i++) {
123 TelephonyStateRegistryRecord record = stateRecords_[i];
124 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_DATA_CONNECTION_STATE) &&
125 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
126 record.telephonyObserver_->OnCellularDataConnectStateUpdated(slotId, dataState, networkType);
127 result = TELEPHONY_SUCCESS;
128 }
129 }
130 SendCellularDataConnectStateChanged(slotId, dataState, networkType);
131 return result;
132 }
133
UpdateCellularDataFlow(int32_t slotId,int32_t flowData)134 int32_t TelephonyStateRegistryService::UpdateCellularDataFlow(int32_t slotId, int32_t flowData)
135 {
136 if (!VerifySlotId(slotId)) {
137 TELEPHONY_LOGE("UpdateCellularDataFlow##VerifySlotId failed ##slotId = %{public}d", slotId);
138 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
139 }
140 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
141 TELEPHONY_LOGE("Check permission failed.");
142 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
143 }
144 cellularDataFlow_[slotId] = flowData;
145 std::lock_guard<std::mutex> guard(lock_);
146 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
147 for (size_t i = 0; i < stateRecords_.size(); i++) {
148 TelephonyStateRegistryRecord record = stateRecords_[i];
149 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_DATA_FLOW) &&
150 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
151 record.telephonyObserver_->OnCellularDataFlowUpdated(slotId, flowData);
152 result = TELEPHONY_SUCCESS;
153 }
154 }
155 return result;
156 }
157
UpdateCallState(int32_t slotId,int32_t callState,const std::u16string & number)158 int32_t TelephonyStateRegistryService::UpdateCallState(int32_t slotId, int32_t callState, const std::u16string &number)
159 {
160 if (!VerifySlotId(slotId)) {
161 TELEPHONY_LOGE("UpdateCallState##VerifySlotId failed ##slotId = %{public}d", slotId);
162 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
163 }
164 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
165 TELEPHONY_LOGE("Check permission failed.");
166 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
167 }
168 std::lock_guard<std::mutex> guard(lock_);
169 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
170 for (size_t i = 0; i < stateRecords_.size(); i++) {
171 TelephonyStateRegistryRecord record = stateRecords_[i];
172 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE) &&
173 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
174 std::u16string phoneNumberStr;
175 if (record.IsCanReadCallHistory()) {
176 phoneNumberStr = number;
177 } else {
178 phoneNumberStr = Str8ToStr16("");
179 }
180 record.telephonyObserver_->OnCallStateUpdated(slotId, callState, phoneNumberStr);
181 result = TELEPHONY_SUCCESS;
182 }
183 }
184 SendCallStateChanged(slotId, callState, number);
185 return result;
186 }
187
UpdateCallStateForSlotId(int32_t slotId,int32_t callId,int32_t callState,const std::u16string & incomingNumber)188 int32_t TelephonyStateRegistryService::UpdateCallStateForSlotId(
189 int32_t slotId, int32_t callId, int32_t callState, const std::u16string &incomingNumber)
190 {
191 std::u16string incomingNumberStr = incomingNumber;
192 if (!VerifySlotId(slotId)) {
193 TELEPHONY_LOGE("UpdateCallStateForSlotId##VerifySlotId failed ##slotId = %{public}d", slotId);
194 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
195 }
196 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
197 TELEPHONY_LOGE("Check permission failed.");
198 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
199 }
200 std::lock_guard<std::mutex> guard(lock_);
201 callState_[slotId] = callState;
202 callIncomingNumber_[slotId] = incomingNumber;
203 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
204 for (size_t i = 0; i < stateRecords_.size(); i++) {
205 TelephonyStateRegistryRecord record = stateRecords_[i];
206 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE) &&
207 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
208 incomingNumberStr = GetCallIncomingNumberForSlotId(record, slotId);
209 record.telephonyObserver_->OnCallStateUpdated(slotId, callState, incomingNumberStr);
210 result = TELEPHONY_SUCCESS;
211 }
212 }
213 SendCallStateChanged(slotId, callState, incomingNumberStr);
214 return result;
215 }
216
UpdateSimState(int32_t slotId,CardType type,SimState state,LockReason reason)217 int32_t TelephonyStateRegistryService::UpdateSimState(int32_t slotId, CardType type, SimState state, LockReason reason)
218 {
219 if (!VerifySlotId(slotId)) {
220 TELEPHONY_LOGE("UpdateSimState##VerifySlotId failed ##slotId = %{public}d", slotId);
221 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
222 }
223 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
224 TELEPHONY_LOGE("Check permission failed.");
225 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
226 }
227 std::lock_guard<std::mutex> guard(lock_);
228 simState_[slotId] = state;
229 simReason_[slotId] = reason;
230 cardType_[slotId] = type;
231 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
232 for (size_t i = 0; i < stateRecords_.size(); i++) {
233 TelephonyStateRegistryRecord record = stateRecords_[i];
234 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_SIM_STATE) &&
235 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
236 record.telephonyObserver_->OnSimStateUpdated(slotId, type, state, reason);
237 result = TELEPHONY_SUCCESS;
238 }
239 }
240 SendSimStateChanged(slotId, type, state, reason);
241 return result;
242 }
243
UpdateSignalInfo(int32_t slotId,const std::vector<sptr<SignalInformation>> & vec)244 int32_t TelephonyStateRegistryService::UpdateSignalInfo(int32_t slotId, const std::vector<sptr<SignalInformation>> &vec)
245 {
246 if (!VerifySlotId(slotId)) {
247 TELEPHONY_LOGE("UpdateSignalInfo##VerifySlotId failed ##slotId = %{public}d", slotId);
248 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
249 }
250 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
251 TELEPHONY_LOGE("Check permission failed.");
252 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
253 }
254 std::lock_guard<std::mutex> guard(lock_);
255 signalInfos_[slotId] = vec;
256 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
257 for (size_t i = 0; i < stateRecords_.size(); i++) {
258 TelephonyStateRegistryRecord record = stateRecords_[i];
259 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_SIGNAL_STRENGTHS) &&
260 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
261 if (TELEPHONY_EXT_WRAPPER.onSignalInfoUpdated_ != nullptr) {
262 std::vector<sptr<SignalInformation>> vecExt = vec;
263 TELEPHONY_EXT_WRAPPER.onSignalInfoUpdated_(slotId, record, vecExt, vec);
264 record.telephonyObserver_->OnSignalInfoUpdated(slotId, vecExt);
265 } else {
266 record.telephonyObserver_->OnSignalInfoUpdated(slotId, vec);
267 }
268 result = TELEPHONY_SUCCESS;
269 }
270 }
271 SendSignalInfoChanged(slotId, vec);
272 return result;
273 }
274
UpdateCellInfo(int32_t slotId,const std::vector<sptr<CellInformation>> & vec)275 int32_t TelephonyStateRegistryService::UpdateCellInfo(int32_t slotId, const std::vector<sptr<CellInformation>> &vec)
276 {
277 if (!VerifySlotId(slotId)) {
278 TELEPHONY_LOGE("UpdateCellInfo##VerifySlotId failed ##slotId = %{public}d", slotId);
279 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
280 }
281 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE) ||
282 !TelephonyPermission::CheckPermission(Permission::CELL_LOCATION)) {
283 TELEPHONY_LOGE("Check permission failed.");
284 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
285 }
286 std::lock_guard<std::mutex> guard(lock_);
287 cellInfos_[slotId] = vec;
288 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
289 for (size_t i = 0; i < stateRecords_.size(); i++) {
290 TelephonyStateRegistryRecord record = stateRecords_[i];
291 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_CELL_INFO) && record.slotId_ == slotId) {
292 if (record.telephonyObserver_ == nullptr) {
293 TELEPHONY_LOGE("record.telephonyObserver_ is nullptr");
294 return TELEPHONY_ERR_LOCAL_PTR_NULL;
295 }
296 if (TELEPHONY_EXT_WRAPPER.onCellInfoUpdated_ != nullptr) {
297 std::vector<sptr<CellInformation>> vecExt = vec;
298 TELEPHONY_EXT_WRAPPER.onCellInfoUpdated_(slotId, record, vecExt, vec);
299 record.telephonyObserver_->OnCellInfoUpdated(slotId, vecExt);
300 } else {
301 record.telephonyObserver_->OnCellInfoUpdated(slotId, vec);
302 }
303 result = TELEPHONY_SUCCESS;
304 }
305 }
306 return result;
307 }
308
UpdateNetworkState(int32_t slotId,const sptr<NetworkState> & networkState)309 int32_t TelephonyStateRegistryService::UpdateNetworkState(int32_t slotId, const sptr<NetworkState> &networkState)
310 {
311 if (!VerifySlotId(slotId)) {
312 TELEPHONY_LOGE("UpdateNetworkState##VerifySlotId failed ##slotId = %{public}d", slotId);
313 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
314 }
315 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
316 TELEPHONY_LOGE("Check permission failed.");
317 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
318 }
319 std::lock_guard<std::mutex> guard(lock_);
320 searchNetworkState_[slotId] = networkState;
321 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
322 for (size_t i = 0; i < stateRecords_.size(); i++) {
323 TelephonyStateRegistryRecord r = stateRecords_[i];
324 if (r.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_NETWORK_STATE) && (r.slotId_ == slotId) &&
325 r.telephonyObserver_ != nullptr) {
326 if (TELEPHONY_EXT_WRAPPER.onNetworkStateUpdated_ != nullptr) {
327 sptr<NetworkState> networkStateExt = new NetworkState();
328 NetworkState &networkStateObj = *networkStateExt;
329 networkStateObj = *(static_cast<NetworkState *>(networkState.GetRefPtr()));
330 TELEPHONY_EXT_WRAPPER.onNetworkStateUpdated_(slotId, r, networkStateExt, networkState);
331 r.telephonyObserver_->OnNetworkStateUpdated(slotId, networkStateExt);
332 } else {
333 r.telephonyObserver_->OnNetworkStateUpdated(slotId, networkState);
334 }
335 result = TELEPHONY_SUCCESS;
336 }
337 }
338 SendNetworkStateChanged(slotId, networkState);
339 TELEPHONY_LOGI("TelephonyStateRegistryService::UpdateNetworkState end");
340 return result;
341 }
342
UpdateCfuIndicator(int32_t slotId,bool cfuResult)343 int32_t TelephonyStateRegistryService::UpdateCfuIndicator(int32_t slotId, bool cfuResult)
344 {
345 if (!VerifySlotId(slotId)) {
346 TELEPHONY_LOGE("UpdateCfuIndicator##VerifySlotId failed ##slotId = %{public}d", slotId);
347 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
348 }
349 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
350 TELEPHONY_LOGE("Check permission failed.");
351 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
352 }
353 std::lock_guard<std::mutex> guard(lock_);
354 cfuResult_[slotId] = cfuResult;
355 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
356 for (size_t i = 0; i < stateRecords_.size(); i++) {
357 TelephonyStateRegistryRecord record = stateRecords_[i];
358 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_CFU_INDICATOR) &&
359 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
360 record.telephonyObserver_->OnCfuIndicatorUpdated(slotId, cfuResult);
361 result = TELEPHONY_SUCCESS;
362 }
363 }
364 TELEPHONY_LOGI("TelephonyStateRegistryService::UpdateCfuIndicator end");
365 return result;
366 }
367
UpdateIccAccount()368 int32_t TelephonyStateRegistryService::UpdateIccAccount()
369 {
370 std::lock_guard<std::mutex> guard(lock_);
371 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
372 for (size_t i = 0; i < stateRecords_.size(); i++) {
373 TelephonyStateRegistryRecord record = stateRecords_[i];
374 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_ICC_ACCOUNT) &&
375 (record.telephonyObserver_ != nullptr)) {
376 record.telephonyObserver_->OnIccAccountUpdated();
377 result = TELEPHONY_SUCCESS;
378 }
379 }
380 TELEPHONY_LOGI("TelephonyStateRegistryService::UpdateIccAccount end");
381 return result;
382 }
383
UpdateVoiceMailMsgIndicator(int32_t slotId,bool voiceMailMsgResult)384 int32_t TelephonyStateRegistryService::UpdateVoiceMailMsgIndicator(int32_t slotId, bool voiceMailMsgResult)
385 {
386 if (!VerifySlotId(slotId)) {
387 TELEPHONY_LOGE("UpdateVoiceMailMsgIndicator##VerifySlotId failed ##slotId = %{public}d", slotId);
388 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
389 }
390 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
391 TELEPHONY_LOGE("Check permission failed.");
392 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
393 }
394 std::lock_guard<std::mutex> guard(lock_);
395 voiceMailMsgResult_[slotId] = voiceMailMsgResult;
396 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
397 for (size_t i = 0; i < stateRecords_.size(); i++) {
398 TelephonyStateRegistryRecord record = stateRecords_[i];
399 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_VOICE_MAIL_MSG_INDICATOR) &&
400 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
401 record.telephonyObserver_->OnVoiceMailMsgIndicatorUpdated(slotId, voiceMailMsgResult);
402 result = TELEPHONY_SUCCESS;
403 }
404 }
405 TELEPHONY_LOGI("TelephonyStateRegistryService::UpdateVoiceMailMsgIndicator end");
406 return result;
407 }
408
CheckCallerIsSystemApp(uint32_t mask)409 bool TelephonyStateRegistryService::CheckCallerIsSystemApp(uint32_t mask)
410 {
411 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_CELL_INFO) != 0) {
412 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
413 TELEPHONY_LOGE("The listening event is cellInfoChange. Non-system applications use system APIs!");
414 return false;
415 }
416 }
417 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_CFU_INDICATOR) != 0) {
418 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
419 TELEPHONY_LOGE("The listening event is cfuIndicatorChange. Non-system applications use system APIs!");
420 return false;
421 }
422 }
423 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_VOICE_MAIL_MSG_INDICATOR) != 0) {
424 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
425 TELEPHONY_LOGE(
426 "The listening event is voiceMailMsgIndicatorChange. Non-system applications use system APIs!");
427 return false;
428 }
429 }
430 return true;
431 }
432
RegisterStateChange(const sptr<TelephonyObserverBroker> & telephonyObserver,int32_t slotId,uint32_t mask,const std::string & bundleName,bool isUpdate,pid_t pid,int32_t uid)433 int32_t TelephonyStateRegistryService::RegisterStateChange(
434 const sptr<TelephonyObserverBroker> &telephonyObserver,
435 int32_t slotId, uint32_t mask, const std::string &bundleName, bool isUpdate, pid_t pid, int32_t uid)
436 {
437 if (!CheckCallerIsSystemApp(mask)) {
438 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
439 }
440 if (!CheckPermission(mask)) {
441 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
442 }
443 std::lock_guard<std::mutex> guard(lock_);
444 bool isExist = false;
445 TelephonyStateRegistryRecord record;
446 for (size_t i = 0; i < stateRecords_.size(); i++) {
447 record = stateRecords_[i];
448 if (record.slotId_ == slotId && record.mask_ == mask && record.pid_ == pid && record.uid_ == uid) {
449 isExist = true;
450 break;
451 }
452 }
453
454 if (!isExist) {
455 record.pid_ = pid;
456 record.uid_ = uid;
457 record.slotId_ = slotId;
458 record.mask_ = mask;
459 record.bundleName_ = bundleName;
460 record.telephonyObserver_ = telephonyObserver;
461 stateRecords_.push_back(record);
462 }
463
464 if (isUpdate && VerifySlotId(slotId)) {
465 UpdateData(record);
466 }
467 return TELEPHONY_SUCCESS;
468 }
469
UnregisterStateChange(int32_t slotId,uint32_t mask,pid_t pid,int32_t uid)470 int32_t TelephonyStateRegistryService::UnregisterStateChange(int32_t slotId, uint32_t mask, pid_t pid, int32_t uid)
471 {
472 if (!CheckCallerIsSystemApp(mask)) {
473 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
474 }
475 if (!CheckPermission(mask)) {
476 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
477 }
478 std::lock_guard<std::mutex> guard(lock_);
479 int32_t result = TELEPHONY_STATE_UNREGISTRY_DATA_NOT_EXIST;
480 std::vector<TelephonyStateRegistryRecord>::iterator it;
481 for (it = stateRecords_.begin(); it != stateRecords_.end(); ++it) {
482 if (it->slotId_ == slotId && it->mask_ == mask && it->pid_ == pid && it->uid_ == uid) {
483 stateRecords_.erase(it);
484 result = TELEPHONY_SUCCESS;
485 break;
486 }
487 }
488 return result;
489 }
490
CheckPermission(uint32_t mask)491 bool TelephonyStateRegistryService::CheckPermission(uint32_t mask)
492 {
493 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_NETWORK_STATE) != 0) {
494 if (!TelephonyPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
495 TELEPHONY_LOGE("Check permission failed,"
496 "you must declare ohos.permission.GET_NETWORK_INFO permission for network state");
497 return false;
498 }
499 }
500 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_CELL_INFO) != 0) {
501 if (!TelephonyPermission::CheckPermission(Permission::CELL_LOCATION)) {
502 TELEPHONY_LOGE("Check permission failed,"
503 "you must declare ohos.permission.LOCATION permission for cell info");
504 return false;
505 }
506 }
507 return true;
508 }
509
VerifySlotId(int slotId)510 bool TelephonyStateRegistryService::VerifySlotId(int slotId)
511 {
512 return slotId >= 0 && slotId < slotSize_;
513 }
514
GetCallIncomingNumberForSlotId(TelephonyStateRegistryRecord record,int32_t slotId)515 std::u16string TelephonyStateRegistryService::GetCallIncomingNumberForSlotId(
516 TelephonyStateRegistryRecord record, int32_t slotId)
517 {
518 if (record.IsCanReadCallHistory()) {
519 return callIncomingNumber_[slotId];
520 } else {
521 return Str8ToStr16("");
522 }
523 }
524
UpdateData(const TelephonyStateRegistryRecord & record)525 void TelephonyStateRegistryService::UpdateData(const TelephonyStateRegistryRecord &record)
526 {
527 if (record.telephonyObserver_ == nullptr) {
528 TELEPHONY_LOGE("record.telephonyObserver_ is nullptr");
529 return;
530 }
531 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE) != 0) {
532 std::u16string phoneNumber = GetCallIncomingNumberForSlotId(record, record.slotId_);
533 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_CALL_STATE");
534 record.telephonyObserver_->OnCallStateUpdated(record.slotId_, callState_[record.slotId_], phoneNumber);
535 }
536 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_SIGNAL_STRENGTHS) != 0) {
537 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_SIGNAL_STRENGTHS");
538 record.telephonyObserver_->OnSignalInfoUpdated(record.slotId_, signalInfos_[record.slotId_]);
539 }
540 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_NETWORK_STATE) != 0) {
541 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_NETWORK_STATE");
542 record.telephonyObserver_->OnNetworkStateUpdated(record.slotId_, searchNetworkState_[record.slotId_]);
543 }
544 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_CELL_INFO) != 0) {
545 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_CELL_INFO");
546 record.telephonyObserver_->OnCellInfoUpdated(record.slotId_, cellInfos_[record.slotId_]);
547 }
548 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_SIM_STATE) != 0) {
549 record.telephonyObserver_->OnSimStateUpdated(
550 record.slotId_, cardType_[record.slotId_], simState_[record.slotId_], simReason_[record.slotId_]);
551 }
552 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_DATA_CONNECTION_STATE) != 0) {
553 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_DATA_CONNECTION_STATE");
554 record.telephonyObserver_->OnCellularDataConnectStateUpdated(record.slotId_,
555 cellularDataConnectionState_[record.slotId_], cellularDataConnectionNetworkType_[record.slotId_]);
556 }
557 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_DATA_FLOW) != 0) {
558 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_DATA_FLOW");
559 record.telephonyObserver_->OnCellularDataFlowUpdated(record.slotId_, cellularDataFlow_[record.slotId_]);
560 }
561 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_CFU_INDICATOR) != 0) {
562 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_CFU_INDICATOR");
563 record.telephonyObserver_->OnCfuIndicatorUpdated(record.slotId_, cfuResult_[record.slotId_]);
564 }
565 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_VOICE_MAIL_MSG_INDICATOR) != 0) {
566 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_VOICE_MAIL_MSG_INDICATOR");
567 record.telephonyObserver_->OnVoiceMailMsgIndicatorUpdated(record.slotId_, voiceMailMsgResult_[record.slotId_]);
568 }
569 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_ICC_ACCOUNT) != 0) {
570 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_ICC_ACCOUNT");
571 record.telephonyObserver_->OnIccAccountUpdated();
572 }
573 }
574
PublishCommonEvent(const AAFwk::Want & want,int eventCode,const std::string & eventData)575 bool TelephonyStateRegistryService::PublishCommonEvent(
576 const AAFwk::Want &want, int eventCode, const std::string &eventData)
577 {
578 EventFwk::CommonEventData data;
579 data.SetWant(want);
580 data.SetCode(eventCode);
581 data.SetData(eventData);
582 EventFwk::CommonEventPublishInfo publishInfo;
583 publishInfo.SetOrdered(false);
584 bool publishResult = EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr);
585 if (!publishResult) {
586 TELEPHONY_LOGE("PublishCommonEvent fail");
587 }
588 return publishResult;
589 }
590
SendCallStateChanged(int32_t slotId,int32_t state,const std::u16string & number)591 void TelephonyStateRegistryService::SendCallStateChanged(int32_t slotId, int32_t state, const std::u16string &number)
592 {
593 AAFwk::Want want;
594 want.SetParam("slotId", slotId);
595 want.SetParam("state", state);
596 want.SetParam("number", Str16ToStr8(number));
597 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED);
598
599 EventFwk::CommonEventData data;
600 data.SetWant(want);
601 EventFwk::CommonEventPublishInfo publishInfo;
602 publishInfo.SetOrdered(false);
603 std::vector<std::string> callPermissions;
604 callPermissions.emplace_back(Permission::GET_TELEPHONY_STATE);
605 publishInfo.SetSubscriberPermissions(callPermissions);
606 bool publishResult = EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr);
607 if (!publishResult) {
608 TELEPHONY_LOGE("SendCallStateChanged PublishBroadcastEvent result fail");
609 }
610 }
611
SendCellularDataConnectStateChanged(int32_t slotId,int32_t dataState,int32_t networkType)612 void TelephonyStateRegistryService::SendCellularDataConnectStateChanged(
613 int32_t slotId, int32_t dataState, int32_t networkType)
614 {
615 AAFwk::Want want;
616 want.SetParam("slotId", slotId);
617 want.SetParam("dataState", dataState);
618 want.SetParam("networkType", networkType);
619 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_CELLULAR_DATA_STATE_CHANGED);
620 int32_t eventCode = 1;
621 std::string eventData("connectStateChanged");
622 PublishCommonEvent(want, eventCode, eventData);
623 }
624
SendSimStateChanged(int32_t slotId,CardType type,SimState state,LockReason reason)625 void TelephonyStateRegistryService::SendSimStateChanged(
626 int32_t slotId, CardType type, SimState state, LockReason reason)
627 {
628 AAFwk::Want want;
629 want.SetParam("slotId", slotId);
630 want.SetParam("cardType", static_cast<int32_t>(type));
631 want.SetParam("reason", static_cast<int32_t>(reason));
632 want.SetParam("state", static_cast<int32_t>(state));
633 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_STATE_CHANGED);
634 int32_t eventCode = 1;
635 std::string eventData("simStateChanged");
636 PublishCommonEvent(want, eventCode, eventData);
637 }
638
SendSignalInfoChanged(int32_t slotId,const std::vector<sptr<SignalInformation>> & vec)639 void TelephonyStateRegistryService::SendSignalInfoChanged(
640 int32_t slotId, const std::vector<sptr<SignalInformation>> &vec)
641 {
642 AAFwk::Want want;
643 want.SetParam("slotId", slotId);
644 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SIGNAL_INFO_CHANGED);
645 std::vector<std::string> contentStr;
646 if (TELEPHONY_EXT_WRAPPER.sendSignalInfoChanged_ != nullptr) {
647 TELEPHONY_EXT_WRAPPER.sendSignalInfoChanged_(slotId, vec);
648 }
649 for (size_t i = 0; i < vec.size(); i++) {
650 sptr<SignalInformation> signal = vec[i];
651 if (signal != nullptr) {
652 contentStr.push_back(signal->ToString());
653 }
654 }
655 want.SetParam("signalInfos", contentStr);
656 int32_t eventCode = 1;
657 std::string eventData("signalInfoChanged");
658 PublishCommonEvent(want, eventCode, eventData);
659 }
660
SendNetworkStateChanged(int32_t slotId,const sptr<NetworkState> & networkState)661 void TelephonyStateRegistryService::SendNetworkStateChanged(int32_t slotId, const sptr<NetworkState> &networkState)
662 {
663 AAFwk::Want want;
664 want.SetParam("slotId", slotId);
665 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_NETWORK_STATE_CHANGED);
666 int32_t eventCode = 1;
667 if (TELEPHONY_EXT_WRAPPER.sendNetworkStateChanged_ != nullptr) {
668 TELEPHONY_EXT_WRAPPER.sendNetworkStateChanged_(slotId, networkState);
669 }
670 if (networkState != nullptr) {
671 want.SetParam("networkState", networkState->ToString());
672 }
673 std::string eventData("networkStateChanged");
674 PublishCommonEvent(want, eventCode, eventData);
675 }
676
Dump(std::int32_t fd,const std::vector<std::u16string> & args)677 int TelephonyStateRegistryService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
678 {
679 if (fd < 0) {
680 TELEPHONY_LOGE("dump fd invalid");
681 return TELEPHONY_ERR_FAIL;
682 }
683 std::vector<std::string> argsInStr;
684 for (const auto &arg : args) {
685 TELEPHONY_LOGI("Dump args: %{public}s", Str16ToStr8(arg).c_str());
686 argsInStr.emplace_back(Str16ToStr8(arg));
687 }
688 std::string result;
689 TelephonyStateRegistryDumpHelper dumpHelper;
690 if (dumpHelper.Dump(argsInStr, stateRecords_, result)) {
691 std::int32_t ret = dprintf(fd, "%s", result.c_str());
692 if (ret < 0) {
693 TELEPHONY_LOGE("dprintf to dump fd failed");
694 return TELEPHONY_ERR_FAIL;
695 }
696 return TELEPHONY_SUCCESS;
697 }
698 TELEPHONY_LOGW("dumpHelper failed");
699 return TELEPHONY_ERR_FAIL;
700 }
701
GetBindStartTime()702 std::string TelephonyStateRegistryService::GetBindStartTime()
703 {
704 std::ostringstream oss;
705 oss << bindStartTime_;
706 return oss.str();
707 }
708
GetBindEndTime()709 std::string TelephonyStateRegistryService::GetBindEndTime()
710 {
711 std::ostringstream oss;
712 oss << bindEndTime_;
713 return oss.str();
714 }
715
GetBindSpendTime()716 std::string TelephonyStateRegistryService::GetBindSpendTime()
717 {
718 std::ostringstream oss;
719 oss << (bindEndTime_ - bindStartTime_);
720 return oss.str();
721 }
722
GetServiceRunningState()723 int32_t TelephonyStateRegistryService::GetServiceRunningState()
724 {
725 return static_cast<int32_t>(state_);
726 }
727
GetSimState(int32_t slotId)728 int32_t TelephonyStateRegistryService::GetSimState(int32_t slotId)
729 {
730 std::map<int32_t, SimState>::iterator it;
731 int32_t result = TELEPHONY_ERROR;
732 for (it = simState_.begin(); it != simState_.end(); ++it) {
733 if (it->first == slotId) {
734 result = static_cast<int32_t>(it->second);
735 TELEPHONY_LOGI("CallState = %{public}d", result);
736 break;
737 }
738 }
739 return result;
740 }
741
GetCallState(int32_t slotId)742 int32_t TelephonyStateRegistryService::GetCallState(int32_t slotId)
743 {
744 std::map<int32_t, int32_t>::iterator it;
745 int32_t result = TELEPHONY_ERROR;
746 for (it = callState_.begin(); it != callState_.end(); ++it) {
747 if (it->first == slotId) {
748 result = it->second;
749 break;
750 }
751 }
752 return result;
753 }
754
GetCardType(int32_t slotId)755 int32_t TelephonyStateRegistryService::GetCardType(int32_t slotId)
756 {
757 std::map<int32_t, CardType>::iterator it;
758 int32_t result = TELEPHONY_ERROR;
759 for (it = cardType_.begin(); it != cardType_.end(); ++it) {
760 if (it->first == slotId) {
761 result = static_cast<int32_t>(it->second);
762 break;
763 }
764 }
765 return result;
766 }
767
GetCellularDataConnectionState(int32_t slotId)768 int32_t TelephonyStateRegistryService::GetCellularDataConnectionState(int32_t slotId)
769 {
770 std::map<int32_t, int32_t>::iterator it;
771 int32_t result = TELEPHONY_ERROR;
772 for (it = cellularDataConnectionState_.begin(); it != cellularDataConnectionState_.end(); ++it) {
773 if (it->first == slotId) {
774 result = it->second;
775 break;
776 }
777 }
778 return result;
779 }
780
GetCellularDataFlow(int32_t slotId)781 int32_t TelephonyStateRegistryService::GetCellularDataFlow(int32_t slotId)
782 {
783 std::map<int32_t, int32_t>::iterator it;
784 int32_t result = TELEPHONY_ERROR;
785 for (it = cellularDataFlow_.begin(); it != cellularDataFlow_.end(); ++it) {
786 if (it->first == slotId) {
787 result = it->second;
788 break;
789 }
790 }
791 return result;
792 }
793
GetCellularDataConnectionNetworkType(int32_t slotId)794 int32_t TelephonyStateRegistryService::GetCellularDataConnectionNetworkType(int32_t slotId)
795 {
796 std::map<int32_t, int32_t>::iterator it;
797 int32_t result = TELEPHONY_ERROR;
798 for (it = cellularDataConnectionNetworkType_.begin(); it != cellularDataConnectionNetworkType_.end(); ++it) {
799 if (it->first == slotId) {
800 result = it->second;
801 break;
802 }
803 }
804 return result;
805 }
806
GetLockReason(int32_t slotId)807 int32_t TelephonyStateRegistryService::GetLockReason(int32_t slotId)
808 {
809 std::map<int32_t, LockReason>::iterator it;
810 int32_t result = TELEPHONY_ERROR;
811 for (it = simReason_.begin(); it != simReason_.end(); ++it) {
812 if (it->first == slotId) {
813 result = static_cast<int32_t>(it->second);
814 break;
815 }
816 }
817 return result;
818 }
819
IsCommonEventServiceAbilityExist()820 bool TelephonyStateRegistryService::IsCommonEventServiceAbilityExist() __attribute__((no_sanitize("cfi")))
821 {
822 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
823 if (sm == nullptr) {
824 TELEPHONY_LOGE("IsCommonEventServiceAbilityExist Get ISystemAbilityManager failed, no SystemAbilityManager");
825 return false;
826 }
827 sptr<IRemoteObject> remote = sm->CheckSystemAbility(COMMON_EVENT_SERVICE_ID);
828 if (remote == nullptr) {
829 TELEPHONY_LOGE("No CesServiceAbility");
830 return false;
831 }
832 return true;
833 }
834 } // namespace Telephony
835 } // namespace OHOS
836