• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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