mirror of
https://github.com/openharmony/miscservices_inputmethod.git
synced 2026-07-19 20:13:32 -04:00
@@ -45,6 +45,14 @@ namespace MiscServices {
|
||||
EventListener *first_;
|
||||
EventListener *last_;
|
||||
};
|
||||
|
||||
class UvWorkMsg{
|
||||
public:
|
||||
UvWorkMsg(const char *type, Event *event);
|
||||
~UvWorkMsg(){};
|
||||
char *type_;
|
||||
Event *event_;
|
||||
};
|
||||
}
|
||||
}
|
||||
#endif // INPUT_METHOD_NAPI_EVENT_TARGET_H
|
||||
@@ -162,24 +162,73 @@ namespace MiscServices {
|
||||
void EventTarget::Emit(const char *type, Event *event)
|
||||
{
|
||||
IMSA_HILOGI("EventTarget::Emit");
|
||||
napi_handle_scope scope = nullptr;
|
||||
napi_open_handle_scope(env_, &scope);
|
||||
|
||||
napi_value thisVar = nullptr;
|
||||
napi_get_reference_value(env_, thisVarRef_, &thisVar);
|
||||
for (EventListener *eventListener = first_; eventListener != nullptr; eventListener = eventListener->next) {
|
||||
if (strcmp(eventListener->type, type) == 0) {
|
||||
napi_value jsEvent = event ? event->ToJsObject() : nullptr;
|
||||
napi_value handler = nullptr;
|
||||
napi_value result = nullptr;
|
||||
napi_get_reference_value(env_, eventListener->handlerRef, &handler);
|
||||
napi_call_function(env_, thisVar, handler, jsEvent ? 1 : 0, jsEvent ? &jsEvent : nullptr, &result);
|
||||
if (eventListener->isOnce) {
|
||||
Off(type, handler);
|
||||
}
|
||||
}
|
||||
uv_loop_s *loop = nullptr;
|
||||
napi_get_uv_event_loop(env_, &loop);
|
||||
if (loop == nullptr) {
|
||||
IMSA_HILOGI("EventTarget::Emit loop == nullptr");
|
||||
return;
|
||||
}
|
||||
napi_close_handle_scope(env_, scope);
|
||||
|
||||
uv_work_t *work1 = new (std::nothrow) uv_work_t;
|
||||
if (work1 == nullptr) {
|
||||
IMSA_HILOGI("EventTarget::Emit No memory work1 == nullptr");
|
||||
return;
|
||||
}
|
||||
|
||||
UvWorkMsg *workData = new (std::nothrow) UvWorkMsg(type, event);
|
||||
if (workData == nullptr) {
|
||||
IMSA_HILOGI("EventTarget::Emit No memory workData == nullptr");
|
||||
delete work1;
|
||||
return;
|
||||
}
|
||||
|
||||
work1->data = reinterpret_cast<void *>(workData);
|
||||
int ret = uv_queue_work(loop, work1, [](uv_work_t *work) {}, [](uv_work_t *work, int status) {
|
||||
//Js Thread
|
||||
if (work == nullptr) {
|
||||
IMSA_HILOGI("EventTarget::Emit work == nullptr");
|
||||
return;
|
||||
}
|
||||
UvWorkMsg *workMsg = reinterpret_cast<UvWorkMsg *>(work->data);
|
||||
do {
|
||||
if (!workMsg) {
|
||||
IMSA_HILOGI("EventTarget::Emit workMsg is nullptr");
|
||||
break;
|
||||
}
|
||||
|
||||
napi_handle_scope scope = nullptr;
|
||||
napi_open_handle_scope(env_, &scope);
|
||||
|
||||
napi_value thisVar = nullptr;
|
||||
napi_get_reference_value(env_, thisVarRef_, &thisVar);
|
||||
for (EventListener *eventListener = first_; eventListener != nullptr; eventListener = eventListener->next) {
|
||||
if (strcmp(eventListener->type, workMsg->type) == 0) {
|
||||
napi_value jsEvent = event ? event->ToJsObject() : nullptr;
|
||||
napi_value handler = nullptr;
|
||||
napi_value result = nullptr;
|
||||
napi_get_reference_value(env_, eventListener->handlerRef, &handler);
|
||||
napi_call_function(env_, thisVar, handler, jsEvent ? 1 : 0, jsEvent ? &jsEvent : nullptr, &result);
|
||||
if (eventListener->isOnce) {
|
||||
Off(workMsg->type, handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
napi_close_handle_scope(env_, scope);
|
||||
} while (0);
|
||||
if (workMsg) {
|
||||
delete workMsg;
|
||||
}
|
||||
delete work;
|
||||
});
|
||||
if (ret != 0) {
|
||||
IMSA_HILOGI("EventTarget::Emit failed to execute libuv work queue");
|
||||
delete workData;
|
||||
delete work1;
|
||||
}
|
||||
}
|
||||
|
||||
UvWorkMsg::UvWorkMsg(const char *type, Event *event) : type_(type), event_(event)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user