From 6b09909ac3ee7da4e0a58f8b67f0569735275d04 Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Tue, 19 Oct 2021 16:20:57 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8A=8Anapi=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=94=BE=E5=88=B0ui=E7=BA=BF=E7=A8=8B=E4=B8=AD?= =?UTF-8?q?=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyongfei --- .../include/event_target.h | 8 ++ .../inputmethod_ability/src/event_target.cpp | 77 +++++++++++++++---- 2 files changed, 71 insertions(+), 14 deletions(-) diff --git a/frameworks/inputmethod_ability/include/event_target.h b/frameworks/inputmethod_ability/include/event_target.h index e1a345a23..96b99eced 100644 --- a/frameworks/inputmethod_ability/include/event_target.h +++ b/frameworks/inputmethod_ability/include/event_target.h @@ -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 \ No newline at end of file diff --git a/frameworks/inputmethod_ability/src/event_target.cpp b/frameworks/inputmethod_ability/src/event_target.cpp index 8269d9c79..0d95845ad 100644 --- a/frameworks/inputmethod_ability/src/event_target.cpp +++ b/frameworks/inputmethod_ability/src/event_target.cpp @@ -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); + uv_loop_s *loop = nullptr; + napi_get_uv_event_loop(env_, &loop); + if (loop == nullptr) { + IMSA_HILOGI("EventTarget::Emit loop == nullptr"); + return; + } - 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_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(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(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; } - napi_close_handle_scope(env_, scope); + } + + UvWorkMsg::UvWorkMsg(const char *type, Event *event) : type_(type), event_(event) + { } } } \ No newline at end of file -- Gitee From 397e0dc25a604ab73ed7062efc4bdc4bda586be2 Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Wed, 20 Oct 2021 10:46:36 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=8A=8ANapi=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=94=BE=E5=88=B0ui=E7=9A=84=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E4=B8=AD=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyongfei --- .../include/event_target.h | 11 +-- .../inputmethod_ability/src/event_target.cpp | 68 +++++++++---------- .../src/input_method_ability.cpp | 4 +- 3 files changed, 36 insertions(+), 47 deletions(-) diff --git a/frameworks/inputmethod_ability/include/event_target.h b/frameworks/inputmethod_ability/include/event_target.h index 96b99eced..afd0c4924 100644 --- a/frameworks/inputmethod_ability/include/event_target.h +++ b/frameworks/inputmethod_ability/include/event_target.h @@ -17,6 +17,7 @@ #define INPUT_METHOD_NAPI_EVENT_TARGET_H #include "napi/native_api.h" +#include "napi/native_node_api.h" #include "global.h" #include "input_method_ability.h" @@ -37,7 +38,7 @@ namespace MiscServices { virtual void Once(const char *type, napi_value handler); virtual void Off(const char *type, napi_value handler); virtual void Off(const char *type); - virtual void Emit(const char *type, Event *event); + virtual void Emit(sptr &eventTarget, const char *type, Event *event); protected: napi_env env_; @@ -45,14 +46,6 @@ 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 \ No newline at end of file diff --git a/frameworks/inputmethod_ability/src/event_target.cpp b/frameworks/inputmethod_ability/src/event_target.cpp index 0d95845ad..4c6f1b032 100644 --- a/frameworks/inputmethod_ability/src/event_target.cpp +++ b/frameworks/inputmethod_ability/src/event_target.cpp @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +#include #include "event_target.h" #include "securec.h" @@ -29,6 +29,15 @@ namespace MiscServices { EventListener *back = nullptr; EventListener *next = nullptr; }; + struct EventTargetCB { + napi_env env; + napi_ref thisVarRef; + EventListener *first; + EventListener *last; + sptr &eventTarget; + const char *type; + Event *event; + }; EventTarget::EventTarget(napi_env env, napi_value thisVar) { IMSA_HILOGI("EventTarget::EventTarget"); @@ -159,7 +168,7 @@ namespace MiscServices { } } - void EventTarget::Emit(const char *type, Event *event) + void EventTarget::Emit(sptr &eventTarget, const char *type, Event *event) { IMSA_HILOGI("EventTarget::Emit"); uv_loop_s *loop = nullptr; @@ -169,66 +178,53 @@ namespace MiscServices { return; } - uv_work_t *work1 = new (std::nothrow) uv_work_t; - if (work1 == nullptr) { - IMSA_HILOGI("EventTarget::Emit No memory work1 == nullptr"); + uv_work_t *work = new (std::nothrow) uv_work_t; + if (work == nullptr) { + IMSA_HILOGI("EventTarget::Emit No memory work == nullptr"); return; } - UvWorkMsg *workData = new (std::nothrow) UvWorkMsg(type, event); - if (workData == nullptr) { - IMSA_HILOGI("EventTarget::Emit No memory workData == nullptr"); - delete work1; - return; - } + EventTargetCB *eventTargetCB = new (std::nothrow) EventTargetCB {.env = env_, .thisVarRef = thisVarRef_, + .first = first_, .last = last_, .type = type, .event = event, .eventTarget = eventTarget}; + + work->data = (void *)eventTargetCB; - work1->data = reinterpret_cast(workData); - int ret = uv_queue_work(loop, work1, [](uv_work_t *work) {}, [](uv_work_t *work, int status) { + int ret = uv_queue_work(loop, work, [](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(work->data); + EventTargetCB *eventTargetCB = (EventTargetCB *)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_open_handle_scope(eventTargetCB->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_get_reference_value(eventTargetCB->env, eventTargetCB->thisVarRef, &thisVar); + for (EventListener *eventListener = eventTargetCB->first; eventListener != nullptr; eventListener = eventListener->next) { + if (strcmp(eventListener->type, eventTargetCB->type) == 0) { + napi_value jsEvent = eventTargetCB->event ? eventTargetCB->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); + napi_get_reference_value(eventTargetCB->env, eventListener->handlerRef, &handler); + napi_call_function(eventTargetCB->env, thisVar, handler, jsEvent ? 1 : 0, jsEvent ? &jsEvent : nullptr, &result); if (eventListener->isOnce) { - Off(workMsg->type, handler); + eventTargetCB->eventTarget->Off(eventTargetCB->type, handler); } } } - napi_close_handle_scope(env_, scope); + napi_close_handle_scope(eventTargetCB->env, scope); } while (0); - if (workMsg) { - delete workMsg; + if (eventTargetCB) { + delete eventTargetCB; } delete work; }); if (ret != 0) { IMSA_HILOGI("EventTarget::Emit failed to execute libuv work queue"); - delete workData; - delete work1; + delete work; } } - - UvWorkMsg::UvWorkMsg(const char *type, Event *event) : type_(type), event_(event) - { - } } } \ No newline at end of file diff --git a/frameworks/inputmethod_ability/src/input_method_ability.cpp b/frameworks/inputmethod_ability/src/input_method_ability.cpp index 6be1a4d3b..3d7c3958a 100644 --- a/frameworks/inputmethod_ability/src/input_method_ability.cpp +++ b/frameworks/inputmethod_ability/src/input_method_ability.cpp @@ -240,13 +240,13 @@ namespace MiscServices { void InputMethodAbility::ShowInputWindow() { IMSA_HILOGI("InputMethodAbility::ShowInputWindow"); - eventTarget_->Emit("keyboardShow", nullptr); + eventTarget_->Emit(eventTarget_, "keyboardShow", nullptr); } void InputMethodAbility::DissmissInputWindow() { IMSA_HILOGI("InputMethodAbility::DissmissInputWindow"); - eventTarget_->Emit("keyboardHide", nullptr); + eventTarget_->Emit(eventTarget_, "keyboardHide", nullptr); } bool InputMethodAbility::InsertText(const std::string text) -- Gitee From b2a71d0099f8422ae6af2e5fe2555a27a2193092 Mon Sep 17 00:00:00 2001 From: zhouyongfei Date: Wed, 20 Oct 2021 14:56:20 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=B3=95=E5=81=B6=E5=B0=94=E7=99=BD=E5=B1=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyongfei --- .../src/input_method_ability.cpp | 2 ++ services/src/peruser_session.cpp | 6 +++--- services/src/peruser_setting.cpp | 16 +++++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/frameworks/inputmethod_ability/src/input_method_ability.cpp b/frameworks/inputmethod_ability/src/input_method_ability.cpp index 3d7c3958a..c14fd5ff0 100644 --- a/frameworks/inputmethod_ability/src/input_method_ability.cpp +++ b/frameworks/inputmethod_ability/src/input_method_ability.cpp @@ -38,6 +38,8 @@ namespace MiscServices { InputMethodAbility::~InputMethodAbility() { + IMSA_HILOGI("InputMethodAbility::~InputMethodAbility"); + instance_ = nullptr; if (msgHandler != nullptr) { delete msgHandler; msgHandler = nullptr; diff --git a/services/src/peruser_session.cpp b/services/src/peruser_session.cpp index 7884b3c7a..e7c7de95e 100644 --- a/services/src/peruser_session.cpp +++ b/services/src/peruser_session.cpp @@ -329,8 +329,8 @@ namespace MiscServices { IMSA_HILOGI("PerUserSession::AddClient"); ClientInfo *clientInfo = GetClientInfo(inputClient); if (clientInfo != nullptr) { - IMSA_HILOGE("PerUserSession::AddClient clientInfo is not nullptr"); - return ErrorCode::ERROR_CLIENT_DUPLICATED; + IMSA_HILOGE("PerUserSession::AddClient clientInfo is exist, not need add."); + return ErrorCode::NO_ERROR; } sptr obj = inputClient->AsObject(); @@ -1296,7 +1296,6 @@ namespace MiscServices { } if (imsCore[index] != nullptr) { IMSA_HILOGI("PerUserSession::onSetInputMethodCore End... Input Method Service has already been started ! "); - return; } imsCore[index] = core; int ret = StartInputMethod(index); @@ -1314,6 +1313,7 @@ namespace MiscServices { IMSA_HILOGI("PerUserSession::OnStartInput End...[%{public}d]\n", userId_); } } + IMSA_HILOGI("PerUserSession::OnStartInput End. currentClient is nullptr"); } /*! Stop input. Called by an input client. diff --git a/services/src/peruser_setting.cpp b/services/src/peruser_setting.cpp index 6b241c32b..5dcdf453e 100644 --- a/services/src/peruser_setting.cpp +++ b/services/src/peruser_setting.cpp @@ -117,13 +117,15 @@ namespace MiscServices { return ErrorCode::NO_ERROR; } - /*! Remove an input method engine. - \n It's called when a package is removed from the system. - \param packageName the package name of installed package. - \param[out] isSecurityIme check if the removed ime is a security ime. - \return ErrorCode::NO_ERROR The removed package is an IME package, and is removed from the input method management system - \return ErrorCode::ERROR_NOT_IME_PACKAGE The removed package is not an IME package. - */ + /** + * Remove an input method engine. + * It's called when a package is removed from the system. + * @param packageName the package name of installed package. + * @param isSecurityIme check if the removed ime is a security ime. + * @return ErrorCode::NO_ERROR The removed package is an IME package, + * and is removed from the input method management system + * ErrorCode::ERROR_NOT_IME_PACKAGE The removed package is not an IME package. + */ int PerUserSetting::OnPackageRemoved(std::u16string& packageName, bool isSecurityIme) { if (isSecurityIme) { -- Gitee