diff --git a/interfaces/kits/cj/src/common_event_defination.h b/interfaces/kits/cj/src/common_event_defination.h index a41066910b85971ed4b477fca2b58db35ac25067..ee208170420653558825b81478c7cdb3ed8a0733 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 711961b25efe63845d1584965ff5e8a692a9904a..40168c6e6718c901c2018519ffdeb7bd3c4d31f0 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 7dcbc98e57673b286ed4a4a713fc2c5534a0ff88..2a56ebf24c03e40e1b1788c6168c035fd3912e41 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 08e8c40d3549d674dfcb26892436fec1e92925ca..d39569b3e4a9d1af8fbd68e9d327c9607746c84b 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 62d76fdd8c63a7126914c644db336eddaa210ac3..50b3fcbe4eaba1dac0a23226583c2dab14b27154 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: