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