• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "event_listener_handler.h"
17 
18 #include <cinttypes>
19 
20 #include "ability.h"
21 #include "call_manager_inner_type.h"
22 #include "event_listener_manager.h"
23 #include "inner_event.h"
24 #include "napi_parameter_util.h"
25 #include "napi_radio_types.h"
26 #include "napi_sim_type.h"
27 #include "napi_state_registry.h"
28 #include "napi_telephony_observer.h"
29 #include "napi_util.h"
30 #include "singleton.h"
31 #include "telephony_errors.h"
32 #include "telephony_log_wrapper.h"
33 #include "telephony_state_manager.h"
34 #include "update_contexts.h"
35 
36 namespace OHOS {
37 namespace Telephony {
38 namespace {
WrapRegState(int32_t nativeState)39 int32_t WrapRegState(int32_t nativeState)
40 {
41     RegServiceState state = static_cast<RegServiceState>(nativeState);
42     switch (state) {
43         case RegServiceState::REG_STATE_NO_SERVICE:
44         case RegServiceState::REG_STATE_SEARCH: {
45             return RegStatus::REGISTRATION_STATE_NO_SERVICE;
46         }
47         case RegServiceState::REG_STATE_IN_SERVICE: {
48             return RegStatus::REGISTRATION_STATE_IN_SERVICE;
49         }
50         case RegServiceState::REG_STATE_EMERGENCY_ONLY: {
51             return RegStatus::REGISTRATION_STATE_EMERGENCY_CALL_ONLY;
52         }
53         case RegServiceState::REG_STATE_UNKNOWN: {
54             return RegStatus::REGISTRATION_STATE_POWER_OFF;
55         }
56         default:
57             return RegStatus::REGISTRATION_STATE_POWER_OFF;
58     }
59 }
60 
WrapCallState(int32_t callState)61 int32_t WrapCallState(int32_t callState)
62 {
63     switch (callState) {
64         case (int32_t)Telephony::TelCallState::CALL_STATUS_ACTIVE:
65         case (int32_t)Telephony::TelCallState::CALL_STATUS_HOLDING:
66         case (int32_t)Telephony::TelCallState::CALL_STATUS_DIALING:
67         case (int32_t)Telephony::TelCallState::CALL_STATUS_ALERTING:
68         case (int32_t)Telephony::TelCallState::CALL_STATUS_DISCONNECTING:
69             return static_cast<int32_t>(CallState::CALL_STATE_OFFHOOK);
70         case (int32_t)Telephony::TelCallState::CALL_STATUS_WAITING:
71         case (int32_t)Telephony::TelCallState::CALL_STATUS_INCOMING:
72             return static_cast<int32_t>(CallState::CALL_STATE_RINGING);
73         case (int32_t)Telephony::TelCallState::CALL_STATUS_DISCONNECTED:
74         case (int32_t)Telephony::TelCallState::CALL_STATUS_IDLE:
75             return static_cast<int32_t>(CallState::CALL_STATE_IDLE);
76         default:
77             return static_cast<int32_t>(CallState::CALL_STATE_UNKNOWN);
78     }
79 }
80 
WrapNetworkType(SignalInformation::NetworkType nativeNetworkType)81 int32_t WrapNetworkType(SignalInformation::NetworkType nativeNetworkType)
82 {
83     NetworkType jsNetworkType = NetworkType::NETWORK_TYPE_UNKNOWN;
84     switch (nativeNetworkType) {
85         case SignalInformation::NetworkType::GSM: {
86             jsNetworkType = NetworkType::NETWORK_TYPE_GSM;
87             break;
88         }
89         case SignalInformation::NetworkType::CDMA: {
90             jsNetworkType = NetworkType::NETWORK_TYPE_CDMA;
91             break;
92         }
93         case SignalInformation::NetworkType::LTE: {
94             jsNetworkType = NetworkType::NETWORK_TYPE_LTE;
95             break;
96         }
97         case SignalInformation::NetworkType::TDSCDMA: {
98             jsNetworkType = NetworkType::NETWORK_TYPE_TDSCDMA;
99             break;
100         }
101         case SignalInformation::NetworkType::WCDMA: {
102             jsNetworkType = NetworkType::NETWORK_TYPE_WCDMA;
103             break;
104         }
105         default: {
106             jsNetworkType = NetworkType::NETWORK_TYPE_UNKNOWN;
107         }
108     }
109     return static_cast<int32_t>(jsNetworkType);
110 }
111 
NapiReturnToJS(napi_env env,napi_ref callbackRef,napi_value callbackVal)112 napi_status NapiReturnToJS(napi_env env, napi_ref callbackRef, napi_value callbackVal)
113 {
114     napi_value callbackFunc = nullptr;
115     napi_get_reference_value(env, callbackRef, &callbackFunc);
116     napi_value callbackValues[] = {callbackVal};
117     napi_value recv = nullptr;
118     napi_get_undefined(env, &recv);
119     napi_value callbackResult = nullptr;
120     napi_status status =
121         napi_call_function(env, recv, callbackFunc, std::size(callbackValues), callbackValues, &callbackResult);
122     if (status != napi_ok) {
123         TELEPHONY_LOGE("NapiReturnToJS napi_call_function return error : %{public}d", status);
124     }
125     DelayedSingleton<EventListenerHandler>::GetInstance()->SetCallbackCompleteToListener(callbackRef);
126     return status;
127 }
128 
SignalInfoConversion(napi_env env,int32_t type,int32_t level)129 napi_value SignalInfoConversion(napi_env env, int32_t type, int32_t level)
130 {
131     napi_value val = nullptr;
132     napi_create_object(env, &val);
133     SetPropertyToNapiObject(env, val, "signalType", type);
134     SetPropertyToNapiObject(env, val, "signalLevel", level);
135     return val;
136 }
137 
DataOfNetworkConversion(napi_env env,const GsmCellInformation & info)138 napi_value DataOfNetworkConversion(napi_env env, const GsmCellInformation &info)
139 {
140     napi_value val = nullptr;
141     napi_create_object(env, &val);
142     SetPropertyToNapiObject(env, val, "lac", info.GetLac());
143     SetPropertyToNapiObject(env, val, "cellId", info.GetCellId());
144     SetPropertyToNapiObject(env, val, "arfcn", info.GetArfcn());
145     SetPropertyToNapiObject(env, val, "basic", info.GetBsic());
146     SetPropertyToNapiObject(env, val, "mcc", info.GetMcc());
147     SetPropertyToNapiObject(env, val, "mnc", info.GetMnc());
148     return val;
149 }
150 
DataOfNetworkConversion(napi_env env,const LteCellInformation & info)151 napi_value DataOfNetworkConversion(napi_env env, const LteCellInformation &info)
152 {
153     napi_value val = nullptr;
154     napi_create_object(env, &val);
155     SetPropertyToNapiObject(env, val, "cgi", 0);
156     SetPropertyToNapiObject(env, val, "pci", info.GetPci());
157     SetPropertyToNapiObject(env, val, "tac", info.GetTac());
158     SetPropertyToNapiObject(env, val, "earfcn", info.GetArfcn());
159     SetPropertyToNapiObject(env, val, "bandwith", 0);
160     SetPropertyToNapiObject(env, val, "mcc", info.GetMnc());
161     SetPropertyToNapiObject(env, val, "mnc", info.GetMnc());
162     SetPropertyToNapiObject(env, val, "isSupportEndc", false);
163     return val;
164 }
165 
DataOfNetworkConversion(napi_env env,const WcdmaCellInformation & info)166 napi_value DataOfNetworkConversion(napi_env env, const WcdmaCellInformation &info)
167 {
168     napi_value val = nullptr;
169     napi_create_object(env, &val);
170     SetPropertyToNapiObject(env, val, "lac", info.GetLac());
171     SetPropertyToNapiObject(env, val, "cellId", info.GetCellId());
172     SetPropertyToNapiObject(env, val, "psc", info.GetPsc());
173     SetPropertyToNapiObject(env, val, "uarfcn", info.GetArfcn());
174     SetPropertyToNapiObject(env, val, "mcc", info.GetMcc());
175     SetPropertyToNapiObject(env, val, "mnc", info.GetMnc());
176     return val;
177 }
178 
CellInfoConversion(napi_env env,const CellInformation & info)179 napi_value CellInfoConversion(napi_env env, const CellInformation &info)
180 {
181     napi_value val = nullptr;
182     napi_create_object(env, &val);
183     CellInformation::CellType networkType = info.GetNetworkType();
184     SetPropertyToNapiObject(env, val, "networkType", static_cast<int32_t>(networkType));
185     SetPropertyToNapiObject(env, val, "isCamped", info.GetIsCamped());
186     SetPropertyToNapiObject(env, val, "timeStamp", static_cast<int64_t>(info.GetTimeStamp()));
187     SetPropertyToNapiObject(env, val, "signalInfomation",
188         SignalInfoConversion(env, static_cast<int32_t>(networkType), info.GetSignalLevel()));
189 
190     switch (networkType) {
191         case CellInformation::CellType::CELL_TYPE_GSM:
192             napi_set_named_property(
193                 env, val, "data", DataOfNetworkConversion(env, static_cast<const GsmCellInformation &>(info)));
194             break;
195         case CellInformation::CellType::CELL_TYPE_LTE:
196             napi_set_named_property(
197                 env, val, "data", DataOfNetworkConversion(env, static_cast<const LteCellInformation &>(info)));
198             break;
199         case CellInformation::CellType::CELL_TYPE_WCDMA:
200             napi_set_named_property(
201                 env, val, "data", DataOfNetworkConversion(env, static_cast<const WcdmaCellInformation &>(info)));
202             break;
203         default:
204             break;
205     }
206     return val;
207 }
208 
InitLoop(napi_env env,uv_loop_s ** loop)209 bool InitLoop(napi_env env, uv_loop_s **loop)
210 {
211 #if NAPI_VERSION >= 2
212     napi_status status = napi_get_uv_event_loop(env, loop);
213     if (status != napi_ok) {
214         TELEPHONY_LOGE("napi_get_uv_event_loop napi_status = %{public}d", status);
215         return false;
216     }
217 #endif // NAPI_VERSION >= 2
218     return *loop != nullptr;
219 }
220 } // namespace
221 
EventListenerHandler()222 EventListenerHandler::EventListenerHandler() : AppExecFwk::EventHandler(AppExecFwk::EventRunner::Create())
223 {
224     handleFuncMap_[TelephonyCallbackEventId::EVENT_ON_CALL_STATE_UPDATE] =
225         &EventListenerHandler::HandleCallbackInfoUpdate<CallStateContext, CallStateUpdateInfo,
226             TelephonyUpdateEventType::EVENT_CALL_STATE_UPDATE>;
227     handleFuncMap_[TelephonyCallbackEventId::EVENT_ON_SIGNAL_INFO_UPDATE] =
228         &EventListenerHandler::HandleCallbackInfoUpdate<SignalListContext, SignalUpdateInfo,
229             TelephonyUpdateEventType::EVENT_SIGNAL_STRENGTHS_UPDATE>;
230     handleFuncMap_[TelephonyCallbackEventId::EVENT_ON_NETWORK_STATE_UPDATE] =
231         &EventListenerHandler::HandleCallbackInfoUpdate<NetworkStateContext, NetworkStateUpdateInfo,
232             TelephonyUpdateEventType::EVENT_NETWORK_STATE_UPDATE>;
233     handleFuncMap_[TelephonyCallbackEventId::EVENT_ON_SIM_STATE_UPDATE] =
234         &EventListenerHandler::HandleCallbackInfoUpdate<SimStateContext, SimStateUpdateInfo,
235             TelephonyUpdateEventType::EVENT_SIM_STATE_UPDATE>;
236     handleFuncMap_[TelephonyCallbackEventId::EVENT_ON_CELL_INFOMATION_UPDATE] =
237         &EventListenerHandler::HandleCallbackInfoUpdate<CellInfomationContext, CellInfomationUpdate,
238             TelephonyUpdateEventType::EVENT_CELL_INFO_UPDATE>;
239     handleFuncMap_[TelephonyCallbackEventId::EVENT_ON_CELLULAR_DATA_CONNECTION_UPDATE] =
240         &EventListenerHandler::HandleCallbackInfoUpdate<CellularDataConnectStateContext, CellularDataConnectState,
241             TelephonyUpdateEventType::EVENT_DATA_CONNECTION_UPDATE>;
242     handleFuncMap_[TelephonyCallbackEventId::EVENT_ON_CELLULAR_DATA_FLOW_UPDATE] =
243         &EventListenerHandler::HandleCallbackInfoUpdate<CellularDataFlowContext, CellularDataFlowUpdate,
244             TelephonyUpdateEventType::EVENT_CELLULAR_DATA_FLOW_UPDATE>;
245 
246     workFuncMap_[TelephonyUpdateEventType::EVENT_CALL_STATE_UPDATE] = &EventListenerHandler::WorkCallStateUpdated;
247     workFuncMap_[TelephonyUpdateEventType::EVENT_SIGNAL_STRENGTHS_UPDATE] =
248         &EventListenerHandler::WorkSignalUpdated;
249     workFuncMap_[TelephonyUpdateEventType::EVENT_NETWORK_STATE_UPDATE] =
250         &EventListenerHandler::WorkNetworkStateUpdated;
251     workFuncMap_[TelephonyUpdateEventType::EVENT_SIM_STATE_UPDATE] = &EventListenerHandler::WorkSimStateUpdated;
252     workFuncMap_[TelephonyUpdateEventType::EVENT_CELL_INFO_UPDATE] =
253         &EventListenerHandler::WorkCellInfomationUpdated;
254     workFuncMap_[TelephonyUpdateEventType::EVENT_DATA_CONNECTION_UPDATE] =
255         &EventListenerHandler::WorkCellularDataConnectStateUpdate;
256     workFuncMap_[TelephonyUpdateEventType::EVENT_CELLULAR_DATA_FLOW_UPDATE] =
257         &EventListenerHandler::WorkCellularDataFlowUpdate;
258 }
259 
~EventListenerHandler()260 EventListenerHandler::~EventListenerHandler()
261 {
262     handleFuncMap_.clear();
263     workFuncMap_.clear();
264     listenerList_.clear();
265     registerStateMap_.clear();
266 }
267 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)268 void EventListenerHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
269 {
270     if (event == nullptr) {
271         TELEPHONY_LOGE("EventListenerHandler::ProcessEvent event is nullptr");
272         return;
273     }
274     auto itor = handleFuncMap_.find(static_cast<TelephonyCallbackEventId>(event->GetInnerEventId()));
275     if (itor != handleFuncMap_.end()) {
276         (this->*(itor->second))(event);
277     }
278 }
279 
RegisterEventListener(EventListener & eventListener)280 std::optional<int32_t> EventListenerHandler::RegisterEventListener(EventListener &eventListener)
281 {
282     std::lock_guard<std::mutex> lockGuard(operatorMutex_);
283     eventListener.index = listenerList_.size();
284     listenerList_.push_back(eventListener);
285     bool registered = IsEventTypeRegistered(eventListener.slotId, eventListener.eventType);
286     if (!registered) {
287         NapiTelephonyObserver *telephonyObserver = std::make_unique<NapiTelephonyObserver>().release();
288         if (telephonyObserver == nullptr) {
289             TELEPHONY_LOGE("error by telephonyObserver nullptr");
290             return std::make_optional<int32_t>(ERROR_DEFAULT);
291         }
292         sptr<TelephonyObserverBroker> observer(telephonyObserver);
293         if (observer == nullptr) {
294             TELEPHONY_LOGE("error by observer nullptr");
295             return std::make_optional<int32_t>(ERROR_DEFAULT);
296         }
297         int32_t addResult = TelephonyStateManager::AddStateObserver(
298             observer, eventListener.slotId, ToUint32t(eventListener.eventType), false);
299         if (addResult == TELEPHONY_SUCCESS) {
300             ManageRegistrants(eventListener.slotId, eventListener.eventType, true);
301         } else {
302             TELEPHONY_LOGE("AddStateObserver failed, ret=%{public}d!", addResult);
303             return std::make_optional<int32_t>(addResult);
304         }
305     }
306     return std::nullopt;
307 }
308 
UnregisterEventListener(int32_t slotId,TelephonyUpdateEventType eventType)309 std::optional<int32_t> EventListenerHandler::UnregisterEventListener(
310     int32_t slotId, TelephonyUpdateEventType eventType)
311 {
312     std::lock_guard<std::mutex> lockGuard(operatorMutex_);
313     if (listenerList_.empty()) {
314         TELEPHONY_LOGE("UnregisterEventListener listener list is empty.");
315         return std::nullopt;
316     }
317     if (!IsEventTypeRegistered(slotId, eventType)) {
318         TELEPHONY_LOGE(
319             "UnregisterEventListener eventType %{public}d was not registered!", static_cast<int32_t>(eventType));
320         return std::nullopt;
321     }
322 
323     std::atomic_uint32_t allListenersCallbackComplete = 1;
324     do {
325         for (const EventListener &listener : listenerList_) {
326             if (listener.eventType == eventType) {
327                 allListenersCallbackComplete &= listener.callbackComplete;
328             }
329         }
330     } while (!allListenersCallbackComplete);
331 
332     ManageRegistrants(slotId, eventType, false);
333     int32_t result = TelephonyStateManager::RemoveStateObserver(slotId, ToUint32t(eventType));
334     return (result == TELEPHONY_SUCCESS) ? std::nullopt : std::make_optional<int32_t>(result);
335 }
336 
RemoveListener(TelephonyUpdateEventType eventType)337 void EventListenerHandler::RemoveListener(TelephonyUpdateEventType eventType)
338 {
339     listenerList_.remove_if([eventType](EventListener listener) -> bool {
340         bool matched = listener.eventType == eventType;
341         if (matched) {
342             if (listener.env != nullptr && listener.callbackRef != nullptr) {
343                 napi_delete_reference(listener.env, listener.callbackRef);
344             }
345         };
346         return matched;
347     });
348 }
349 
SetCallbackCompleteToListener(napi_ref ref,bool flag)350 void EventListenerHandler::SetCallbackCompleteToListener(napi_ref ref, bool flag)
351 {
352     for (EventListener &listen : listenerList_) {
353         if (listen.callbackRef == ref) {
354             listen.callbackComplete = flag;
355         }
356     }
357 }
358 
ManageRegistrants(uint32_t slotId,const TelephonyUpdateEventType eventType,bool isRegister)359 void EventListenerHandler::ManageRegistrants(
360     uint32_t slotId, const TelephonyUpdateEventType eventType, bool isRegister)
361 {
362     auto itor = registerStateMap_.find(slotId);
363     if (itor != registerStateMap_.end()) {
364         if (isRegister) {
365             itor->second.insert(eventType);
366         } else {
367             itor->second.erase(eventType);
368         }
369     } else {
370         std::set<TelephonyUpdateEventType> &&typeInfo {eventType};
371         registerStateMap_.insert(std::make_pair(slotId, typeInfo));
372     }
373 }
374 
IsEventTypeRegistered(uint32_t slotId,const TelephonyUpdateEventType eventType) const375 bool EventListenerHandler::IsEventTypeRegistered(uint32_t slotId, const TelephonyUpdateEventType eventType) const
376 {
377     auto itor = registerStateMap_.find(slotId);
378     return (itor != registerStateMap_.end() ? itor->second.count(eventType) : false);
379 }
380 
381 template<typename T, typename D, TelephonyUpdateEventType eventType>
HandleCallbackInfoUpdate(const AppExecFwk::InnerEvent::Pointer & event)382 void EventListenerHandler::HandleCallbackInfoUpdate(const AppExecFwk::InnerEvent::Pointer &event)
383 {
384     if (event == nullptr) {
385         TELEPHONY_LOGE("event nullptr");
386         return;
387     }
388 
389     std::unique_ptr<D> info = event->GetUniqueObject<D>();
390     if (info == nullptr) {
391         TELEPHONY_LOGE("update info nullptr");
392         return;
393     }
394 
395     std::lock_guard<std::mutex> lockGuard(operatorMutex_);
396     for (const EventListener &listen : listenerList_) {
397         if ((listen.eventType == eventType) && (listen.slotId == info->slotId_)) {
398             uv_loop_s *loop = nullptr;
399             if (!InitLoop(listen.env, &loop)) {
400                 TELEPHONY_LOGE("loop is null");
401                 break;
402             }
403             T *context = std::make_unique<T>().release();
404             if (context == nullptr) {
405                 TELEPHONY_LOGE("make context failed");
406                 break;
407             }
408             *(static_cast<EventListener *>(context)) = listen;
409             *context = *info;
410             context->callbackComplete = false;
411             uv_work_t *work = std::make_unique<uv_work_t>().release();
412             if (work == nullptr) {
413                 TELEPHONY_LOGE("make work failed");
414                 break;
415             }
416             work->data = static_cast<void *>(context);
417             uv_queue_work(
418                 loop, work, [](uv_work_t *) {}, (workFuncMap_.find(eventType))->second);
419         }
420     }
421 }
422 
WorkCallStateUpdated(uv_work_t * work,int status)423 void EventListenerHandler::WorkCallStateUpdated(uv_work_t *work, int status)
424 {
425     if (work == nullptr) {
426         TELEPHONY_LOGE("work is null");
427         return;
428     }
429     std::unique_ptr<CallStateContext> callStateInfo(static_cast<CallStateContext *>(work->data));
430     napi_value callbackValue = nullptr;
431     napi_create_object(callStateInfo->env, &callbackValue);
432     int32_t wrappedCallState = WrapCallState(callStateInfo->callState);
433     std::string number = NapiUtil::ToUtf8(callStateInfo->phoneNumber);
434     SetPropertyToNapiObject(callStateInfo->env, callbackValue, "state", wrappedCallState);
435     SetPropertyToNapiObject(callStateInfo->env, callbackValue, "number", number);
436     NapiReturnToJS(callStateInfo->env, callStateInfo->callbackRef, callbackValue);
437 }
438 
WorkSignalUpdated(uv_work_t * work,int status)439 void EventListenerHandler::WorkSignalUpdated(uv_work_t *work, int status)
440 {
441     if (work == nullptr) {
442         TELEPHONY_LOGE("work is null");
443         return;
444     }
445     std::unique_ptr<SignalListContext> infoListUpdateInfo(static_cast<SignalListContext *>(work->data));
446     napi_value callbackValue = nullptr;
447     const napi_env &env = infoListUpdateInfo->env;
448     napi_create_array(env, &callbackValue);
449     size_t infoSize = infoListUpdateInfo->signalInfoList.size();
450     for (size_t i = 0; i < infoSize; ++i) {
451         sptr<SignalInformation> infoItem = infoListUpdateInfo->signalInfoList[i];
452         napi_value info = nullptr;
453         napi_create_object(env, &info);
454         SetPropertyToNapiObject(env, info, "signalType", WrapNetworkType(infoItem->GetNetworkType()));
455         SetPropertyToNapiObject(env, info, "signalLevel", infoItem->GetSignalLevel());
456         napi_set_element(env, callbackValue, i, info);
457     }
458     NapiReturnToJS(env, infoListUpdateInfo->callbackRef, callbackValue);
459 }
460 
WorkNetworkStateUpdated(uv_work_t * work,int status)461 void EventListenerHandler::WorkNetworkStateUpdated(uv_work_t *work, int status)
462 {
463     if (work == nullptr) {
464         TELEPHONY_LOGE("work is null");
465         return;
466     }
467     std::unique_ptr<NetworkStateContext> networkStateUpdateInfo(static_cast<NetworkStateContext *>(work->data));
468     napi_value callbackValue = nullptr;
469     const napi_env &env = networkStateUpdateInfo->env;
470     const sptr<NetworkState> &networkState = networkStateUpdateInfo->networkState;
471     napi_create_object(env, &callbackValue);
472     std::string longOperatorName = networkState->GetLongOperatorName();
473     std::string shortOperatorName = networkState->GetShortOperatorName();
474     std::string plmnNumeric = networkState->GetPlmnNumeric();
475     bool isRoaming = networkState->IsRoaming();
476     int32_t regStatus = static_cast<int32_t>(networkState->GetRegStatus());
477     bool isEmergency = networkState->IsEmergency();
478     SetPropertyToNapiObject(env, callbackValue, "longOperatorName", longOperatorName);
479     SetPropertyToNapiObject(env, callbackValue, "shortOperatorName", shortOperatorName);
480     SetPropertyToNapiObject(env, callbackValue, "plmnNumeric", plmnNumeric);
481     SetPropertyToNapiObject(env, callbackValue, "isRoaming", isRoaming);
482     SetPropertyToNapiObject(env, callbackValue, "regStatus", WrapRegState(regStatus));
483     SetPropertyToNapiObject(env, callbackValue, "isEmergency", isEmergency);
484     NapiReturnToJS(env, networkStateUpdateInfo->callbackRef, callbackValue);
485 }
486 
WorkSimStateUpdated(uv_work_t * work,int status)487 void EventListenerHandler::WorkSimStateUpdated(uv_work_t *work, int status)
488 {
489     if (work == nullptr) {
490         TELEPHONY_LOGE("work is null");
491         return;
492     }
493     std::unique_ptr<SimStateContext> simStateUpdateInfo(static_cast<SimStateContext *>(work->data));
494     napi_value callbackValue = nullptr;
495     int32_t cardType = static_cast<int32_t>(simStateUpdateInfo->cardType);
496     int32_t simState = static_cast<int32_t>(simStateUpdateInfo->simState);
497     int32_t lockReason = static_cast<int32_t>(simStateUpdateInfo->reason);
498     napi_create_object(simStateUpdateInfo->env, &callbackValue);
499     SetPropertyToNapiObject(simStateUpdateInfo->env, callbackValue, "type", cardType);
500     SetPropertyToNapiObject(simStateUpdateInfo->env, callbackValue, "state", simState);
501     SetPropertyToNapiObject(simStateUpdateInfo->env, callbackValue, "reason", lockReason);
502     NapiReturnToJS(simStateUpdateInfo->env, simStateUpdateInfo->callbackRef, callbackValue);
503 }
504 
WorkCellInfomationUpdated(uv_work_t * work,int status)505 void EventListenerHandler::WorkCellInfomationUpdated(uv_work_t *work, int status)
506 {
507     if (work == nullptr) {
508         TELEPHONY_LOGE("work is null");
509         return;
510     }
511     std::unique_ptr<CellInfomationContext> cellInfo(static_cast<CellInfomationContext *>(work->data));
512     napi_value callbackValue = nullptr;
513     napi_create_array(cellInfo->env, &callbackValue);
514     for (size_t i = 0; i < cellInfo->cellInfoVec.size(); i++) {
515         napi_value val = CellInfoConversion(cellInfo->env, *(cellInfo->cellInfoVec[i]));
516         napi_set_element(cellInfo->env, callbackValue, i, val);
517     }
518     NapiReturnToJS(cellInfo->env, cellInfo->callbackRef, callbackValue);
519 }
520 
WorkCellularDataConnectStateUpdate(uv_work_t * work,int status)521 void EventListenerHandler::WorkCellularDataConnectStateUpdate(uv_work_t *work, int status)
522 {
523     if (work == nullptr) {
524         TELEPHONY_LOGE("work is null");
525         return;
526     }
527     std::unique_ptr<CellularDataConnectStateContext> context(
528         static_cast<CellularDataConnectStateContext *>(work->data));
529     napi_value callbackValue = nullptr;
530     napi_create_object(context->env, &callbackValue);
531     SetPropertyToNapiObject(context->env, callbackValue, "state", context->dataState);
532     SetPropertyToNapiObject(context->env, callbackValue, "network", context->networkType);
533     NapiReturnToJS(context->env, context->callbackRef, callbackValue);
534 }
535 
WorkCellularDataFlowUpdate(uv_work_t * work,int status)536 void EventListenerHandler::WorkCellularDataFlowUpdate(uv_work_t *work, int status)
537 {
538     if (work == nullptr) {
539         TELEPHONY_LOGE("work is null");
540         return;
541     }
542     std::unique_ptr<CellularDataFlowContext> dataFlowInfo(static_cast<CellularDataFlowContext *>(work->data));
543     napi_value callbackValue = GetNapiValue(dataFlowInfo->env, dataFlowInfo->flowType_);
544     NapiReturnToJS(dataFlowInfo->env, dataFlowInfo->callbackRef, callbackValue);
545 }
546 } // namespace Telephony
547 } // namespace OHOS