From ed03843299b0a6125bb745f9531236821c344961 Mon Sep 17 00:00:00 2001 From: JIAO Date: Tue, 26 Aug 2025 17:26:55 +0800 Subject: [PATCH] increase new ffi for createSubsriber Signed-off-by: JIAO --- .../kits/cj/src/common_event_defination.h | 9 +++++ .../kits/cj/src/common_event_manager_ffi.cpp | 38 ++++++++++++++++--- .../kits/cj/src/common_event_manager_ffi.h | 1 + interfaces/kits/cj/src/subscriber.cpp | 33 ++++++++++++++-- interfaces/kits/cj/src/subscriber.h | 8 ++-- 5 files changed, 77 insertions(+), 12 deletions(-) diff --git a/interfaces/kits/cj/src/common_event_defination.h b/interfaces/kits/cj/src/common_event_defination.h index a4106691..ee208170 100755 --- a/interfaces/kits/cj/src/common_event_defination.h +++ b/interfaces/kits/cj/src/common_event_defination.h @@ -48,6 +48,15 @@ struct CCommonEventData { CArrParameters parameters; }; +struct CSubscribeInfo { + CArrString events; + int32_t priority; + int32_t userId; + char *publisherPermission; + char *publisherDeviceId; + char *publisherBundleName; +}; + namespace OHOS::CommonEventManager { constexpr int32_t NO_ERROR = 0; constexpr int32_t ERR_CES_FAILED = 1; diff --git a/interfaces/kits/cj/src/common_event_manager_ffi.cpp b/interfaces/kits/cj/src/common_event_manager_ffi.cpp index 711961b2..40168c6e 100755 --- a/interfaces/kits/cj/src/common_event_manager_ffi.cpp +++ b/interfaces/kits/cj/src/common_event_manager_ffi.cpp @@ -70,18 +70,44 @@ namespace OHOS::CommonEventManager { return static_cast(ERR_INVALID_INSTANCE_ID); } auto info = instance->GetInfoPtr(); - auto ptr = FFIData::Create(info, id); + auto ptr = SubscriberManager::Create(info, id); if (!ptr) { return static_cast(ERR_INVALID_INSTANCE_ID); } - auto subscriber = ptr->GetSubscriber(); - if (!subscriber) { - return ERR_INVALID_INSTANCE_CODE; - } - subscriber->SetSubscriberManagerId(ptr->GetID()); return ptr->GetID(); } + int64_t FfiCommonEventManagerCreateSubscriber(CSubscribeInfo *info, int32_t *errorCode) + { + OHOS::EventFwk::MatchingSkills matchingSkills; + for (int64_t i = 0; i < info->events.size; ++i) { + std::string event(info->events.head[i]); + matchingSkills.AddEvent(event); + } + auto infoPtr = std::make_shared(matchingSkills); + if (info->publisherPermission) { + std::string permission(info->publisherPermission); + infoPtr->SetPermission(permission); + } + if (info->publisherDeviceId) { + std::string deviceId(info->publisherDeviceId); + infoPtr->SetDeviceId(deviceId); + } + if (info->publisherBundleName) { + std::string bundleName(info->publisherBundleName); + infoPtr->SetPublisherBundleName(bundleName); + } + infoPtr->SetUserId(info->userId); + infoPtr->SetPriority(info->priority); + + auto mgrPtr = SubscriberManager::Create(infoPtr); + if (!mgrPtr) { + *errorCode = ERR_INVALID_INSTANCE_ID; + return 0; + } + return mgrPtr->GetID(); + } + int32_t CJ_Subscribe(int64_t id, void (*callbackRef)(const CCommonEventData data)) { auto instance = FFIData::GetData(id); diff --git a/interfaces/kits/cj/src/common_event_manager_ffi.h b/interfaces/kits/cj/src/common_event_manager_ffi.h index 7dcbc98e..2a56ebf2 100755 --- a/interfaces/kits/cj/src/common_event_manager_ffi.h +++ b/interfaces/kits/cj/src/common_event_manager_ffi.h @@ -31,6 +31,7 @@ extern "C" FFI_EXPORT int32_t CJ_RemoveStickyCommonEvent(char *event); FFI_EXPORT int64_t CJ_CreateCommonEventSubscribeInfo(CArrString events); FFI_EXPORT int64_t CJ_CreateSubscriber(int64_t id); + FFI_EXPORT int64_t FfiCommonEventManagerCreateSubscriber(CSubscribeInfo *info, int32_t *errorCode); FFI_EXPORT int32_t CJ_Subscribe(int64_t id, void (*callbackRef)(const CCommonEventData data)); FFI_EXPORT int32_t CJ_Unsubscribe(int64_t id); diff --git a/interfaces/kits/cj/src/subscriber.cpp b/interfaces/kits/cj/src/subscriber.cpp index 08e8c40d..d39569b3 100755 --- a/interfaces/kits/cj/src/subscriber.cpp +++ b/interfaces/kits/cj/src/subscriber.cpp @@ -14,6 +14,7 @@ */ #include "common_event.h" +#include "common_event_manager.h" #include "native_log.h" #include "parameter_parse.h" @@ -30,6 +31,14 @@ namespace OHOS::CommonEventManager { infoId_ = infoId; } + SubscriberImpl::SubscriberImpl(std::shared_ptr sp) + : CommonEventSubscriber(*sp) + { + id_ = ++subscriberID_; + LOGI("constructor SubscriberImpl"); + valid_ = std::make_shared(false); + } + SubscriberImpl::~SubscriberImpl() { LOGI("destructor SubscriberImpl[%{public}llu]", id_.load()); @@ -105,14 +114,32 @@ namespace OHOS::CommonEventManager { *valid_ = true; } - SubscriberManager::SubscriberManager(std::shared_ptr info, int64_t infoId) + sptr SubscriberManager::Create(std::shared_ptr info) { - auto objectInfo = new (std::nothrow) SubscriberImpl(info, infoId); - subscriber = std::shared_ptr(objectInfo); + auto ptr = FFIData::Create(); + if (ptr != nullptr) { + ptr->subscriber = std::make_shared(info); + ptr->subscriber->SetSubscriberManagerId(ptr->GetID()); + } + return ptr; + } + + sptr SubscriberManager::Create(std::shared_ptr info, int64_t infoId) + { + auto ptr = FFIData::Create(); + if (ptr != nullptr) { + ptr->subscriber = std::make_shared(info, infoId); + ptr->subscriber->SetSubscriberManagerId(ptr->GetID()); + } + return ptr; } SubscriberManager::~SubscriberManager() { + if (subscriber != nullptr) { + OHOS::EventFwk::CommonEventManager::UnSubscribeCommonEvent(subscriber); + DeleteSubscribe(subscriber); + } } std::shared_ptr SubscriberManager::GetSubscriber() diff --git a/interfaces/kits/cj/src/subscriber.h b/interfaces/kits/cj/src/subscriber.h index 62d76fdd..50b3fcbe 100755 --- a/interfaces/kits/cj/src/subscriber.h +++ b/interfaces/kits/cj/src/subscriber.h @@ -30,6 +30,7 @@ namespace OHOS::CommonEventManager { class SubscriberImpl : public CommonEventSubscriber { public: SubscriberImpl(std::shared_ptr sp, int64_t infoId); + explicit SubscriberImpl(std::shared_ptr sp); ~SubscriberImpl() override; void OnReceiveEvent(const CommonEventData &data) override; @@ -49,21 +50,22 @@ namespace OHOS::CommonEventManager { std::shared_ptr valid_; std::atomic_ullong id_; static std::atomic_ullong subscriberID_; - int64_t infoId_; + int64_t infoId_ = -1; int64_t managerId_ = -1; }; class SubscriberManager : public OHOS::FFI::FFIData { public: + static sptr Create(std::shared_ptr info); + static sptr Create(std::shared_ptr info, int64_t infoId); OHOS::FFI::RuntimeType *GetRuntimeType() override { return GetClassType(); } - SubscriberManager(std::shared_ptr info, int64_t infoId); + SubscriberManager() = default; ~SubscriberManager() override; std::shared_ptr GetSubscriber(); - int32_t GetSubscribeInfoId(int64_t &id); private: -- Gitee