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