• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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_log_wrapper.h"
17 #include "ces_inner_error_code.h"
18 #include "common_event_manager.h"
19 #include "common_event_support.h"
20 #include "oh_commonevent_parameters_parse.h"
21 #include "oh_commonevent_wrapper.h"
22 #include <cstdlib>
23 #include <memory>
24 #include <new>
25 
SubscriberObserver(const OHOS::EventFwk::CommonEventSubscribeInfo & subscribeInfo)26 SubscriberObserver::SubscriberObserver(const OHOS::EventFwk::CommonEventSubscribeInfo &subscribeInfo)
27     :OHOS::EventFwk::CommonEventSubscriber(subscribeInfo)
28 {}
29 
~SubscriberObserver()30 SubscriberObserver::~SubscriberObserver()
31 {}
32 
OnReceiveEvent(const OHOS::EventFwk::CommonEventData & data)33 void SubscriberObserver::OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data)
34 {
35     CommonEvent_RcvData *cData = new (std::nothrow) CommonEvent_RcvData();
36     if (cData == nullptr) {
37         EVENT_LOGE("Failed to create CommonEventRcvData");
38         return;
39     }
40     if (IsOrderedCommonEvent()) {
41         EVENT_LOGD("SetAsyncResult");
42         SubscriberManager::GetInstance()->SetAsyncResult(this);
43     }
44     auto want = data.GetWant();
45     cData->code = data.GetCode();
46     cData->data = data.GetData();
47     cData->event = want.GetAction();
48     cData->bundleName = want.GetBundle();
49     cData->parameters = new (std::nothrow) CArrParameters();
50     if (cData->parameters == nullptr) {
51         EVENT_LOGE("Failed to init cData parameters");
52         delete cData;
53         cData = nullptr;
54         return;
55     }
56     cData->parameters->wantParams = want.GetParams();
57     if (callback_ != nullptr) {
58         (*callback_)(cData);
59     }
60     delete cData->parameters;
61     cData->parameters = nullptr;
62     delete cData;
63     cData = nullptr;
64 }
65 
SetCallback(CommonEvent_ReceiveCallback callback)66 void SubscriberObserver::SetCallback(CommonEvent_ReceiveCallback callback)
67 {
68     callback_ = callback;
69 }
70 
71 std::mutex SubscriberManager::instanceMutex_;
72 std::mutex SubscriberManager::resultCacheMutex_;
73 std::shared_ptr<SubscriberManager> SubscriberManager::instance_;
74 std::map<std::shared_ptr<SubscriberObserver>, ResultCacheItem> SubscriberManager::resultCache_;
75 
GetInstance()76 std::shared_ptr<SubscriberManager> SubscriberManager::GetInstance()
77 {
78     if (instance_ == nullptr) {
79         std::lock_guard<std::mutex> lock(instanceMutex_);
80         if (instance_ == nullptr) {
81             instance_ = std::make_shared<SubscriberManager>();
82         }
83     }
84     return instance_;
85 }
86 
CreateSubscriber(const CommonEvent_SubscribeInfo * subscribeInfo,CommonEvent_ReceiveCallback callback)87 CommonEvent_Subscriber* SubscriberManager::CreateSubscriber(const CommonEvent_SubscribeInfo* subscribeInfo,
88     CommonEvent_ReceiveCallback callback)
89 {
90     if (subscribeInfo == nullptr) {
91         EVENT_LOGE("SubscribeInfo is null");
92         return nullptr;
93     }
94     OHOS::EventFwk::MatchingSkills matchingSkills;
95     for (const auto& iter : subscribeInfo->events) {
96         if (!iter.empty()) {
97             matchingSkills.AddEvent(iter);
98         }
99     }
100     OHOS::EventFwk::CommonEventSubscribeInfo commonEventSubscribeInfo(matchingSkills);
101     if (!subscribeInfo->permission.empty()) {
102         commonEventSubscribeInfo.SetPermission(subscribeInfo->permission);
103     }
104     if (!subscribeInfo->bundleName.empty()) {
105         commonEventSubscribeInfo.SetPublisherBundleName(subscribeInfo->bundleName);
106     }
107 
108     auto observer = std::make_shared<SubscriberObserver>(commonEventSubscribeInfo);
109     observer->SetCallback(callback);
110     return new (std::nothrow) std::shared_ptr<SubscriberObserver>(observer);
111 }
112 
DestroySubscriber(CommonEvent_Subscriber * subscriber)113 void SubscriberManager::DestroySubscriber(CommonEvent_Subscriber* subscriber)
114 {
115     if (subscriber != nullptr) {
116         auto subscriberPtr = reinterpret_cast<std::shared_ptr<SubscriberObserver>*>(subscriber);
117         delete subscriberPtr;
118         subscriberPtr = nullptr;
119     }
120 }
121 
Subscribe(const CommonEvent_Subscriber * subscriber)122 CommonEvent_ErrCode SubscriberManager::Subscribe(const CommonEvent_Subscriber* subscriber)
123 {
124     if (subscriber == nullptr) {
125         EVENT_LOGE("subscriber is null");
126         return COMMONEVENT_ERR_INVALID_PARAMETER;
127     }
128     auto observer = *(reinterpret_cast<const std::shared_ptr<SubscriberObserver>*>(subscriber));
129     int32_t ret = OHOS::EventFwk::CommonEventManager::NewSubscribeCommonEvent(observer);
130     if (ret == OHOS::Notification::ERR_NOTIFICATION_CES_COMMON_SYSTEMCAP_NOT_SUPPORT) {
131         return COMMONEVENT_ERR_SUBSCRIBER_NUM_EXCEEDED;
132     }
133     {
134         std::lock_guard<std::mutex> lock(resultCacheMutex_);
135         resultCache_.emplace(observer, ResultCacheItem());
136     }
137     return static_cast<CommonEvent_ErrCode>(ret);
138 }
139 
UnSubscribe(const CommonEvent_Subscriber * subscriber)140 CommonEvent_ErrCode SubscriberManager::UnSubscribe(const CommonEvent_Subscriber* subscriber)
141 {
142     if (subscriber == nullptr) {
143         EVENT_LOGE("subscriber is null");
144         return COMMONEVENT_ERR_INVALID_PARAMETER;
145     }
146     auto observer = *(reinterpret_cast<const std::shared_ptr<SubscriberObserver>*>(subscriber));
147     int32_t ret = OHOS::EventFwk::CommonEventManager::NewUnSubscribeCommonEvent(observer);
148     {
149         std::lock_guard<std::mutex> lock(resultCacheMutex_);
150         resultCache_.erase(observer);
151     }
152     return static_cast<CommonEvent_ErrCode>(ret);
153 }
154 
SetAsyncResult(SubscriberObserver * subscriber)155 void SubscriberManager::SetAsyncResult(SubscriberObserver* subscriber)
156 {
157     if (subscriber == nullptr) {
158         EVENT_LOGE("subscriber is null");
159         return;
160     }
161     {
162         std::lock_guard<std::mutex> lock(resultCacheMutex_);
163         for (auto& iter : resultCache_) {
164             if (iter.first.get() == subscriber) {
165                 iter.second.result = subscriber->GoAsyncCommonEvent();
166                 break;
167             }
168         }
169     }
170 }
171 
GetAsyncResult(const SubscriberObserver * subscriber)172 ResultCacheItem* SubscriberManager::GetAsyncResult(const SubscriberObserver* subscriber)
173 {
174     if (subscriber == nullptr) {
175         EVENT_LOGE("subscriber is null");
176         return nullptr;
177     }
178     {
179         std::lock_guard<std::mutex> lock(resultCacheMutex_);
180         for (auto& iter : resultCache_) {
181             if (iter.first.get() == subscriber) {
182                 return &iter.second;
183             }
184         }
185     }
186     EVENT_LOGI("subscriber not found");
187     return nullptr;
188 }