• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 "ani_common_event.h"
17 
18 #include "ani_common_event_utils.h"
19 #include "ani_common_event_throw_error.h"
20 #include "ces_inner_error_code.h"
21 #include "event_log_wrapper.h"
22 namespace OHOS {
23 namespace EventManagerFwkAni {
24 
25 using namespace OHOS::EventFwk;
26 
27 std::atomic_ullong SubscriberInstance::subscriberID_ = 0;
28 static std::map<std::shared_ptr<SubscriberInstance>, std::shared_ptr<AsyncCommonEventResult>> subscriberInstances;
29 static std::mutex subscriberInsMutex;
30 
publishExecute(ani_env * env,ani_string eventId)31 static uint32_t publishExecute(ani_env* env, ani_string eventId)
32 {
33     EVENT_LOGD("publishExecute call.");
34     std::string eventIdStr;
35     AniCommonEventUtils::GetStdString(env, eventId, eventIdStr);
36     EVENT_LOGD("publishExecute eventIdStr: %{public}s.", eventIdStr.c_str());
37     CommonEventData commonEventData;
38     CommonEventPublishInfo commonEventPublishInfo;
39     Want want;
40     want.SetAction(eventIdStr);
41     commonEventData.SetWant(want);
42     auto errorCode = CommonEventManager::NewPublishCommonEvent(commonEventData, commonEventPublishInfo);
43     EVENT_LOGD("publishExecute result: %{public}d.", errorCode);
44     return errorCode;
45 }
46 
publishWithOptionsExecute(ani_env * env,ani_string eventId,ani_object optionsObject)47 static uint32_t publishWithOptionsExecute(ani_env* env, ani_string eventId, ani_object optionsObject)
48 {
49     EVENT_LOGD("publishWithOptionsExecute call.");
50     std::string eventIdStr;
51     AniCommonEventUtils::GetStdString(env, eventId, eventIdStr);
52     EVENT_LOGD("publishWithOptionsExecute eventIdStr: %{public}s.", eventIdStr.c_str());
53 
54     CommonEventData commonEventData;
55     CommonEventPublishInfo commonEventPublishInfo;
56     Want want;
57     want.SetAction(eventIdStr);
58     AniCommonEventUtils::ConvertCommonEventPublishData(
59         env, optionsObject, want, commonEventData, commonEventPublishInfo);
60     commonEventData.SetWant(want);
61     auto errorCode = CommonEventManager::NewPublishCommonEvent(commonEventData, commonEventPublishInfo);
62     EVENT_LOGD("publishWithOptionsExecute result: %{public}d.", errorCode);
63     return errorCode;
64 }
65 
publishAsUserExecute(ani_env * env,ani_string eventId,ani_int userId)66 static uint32_t publishAsUserExecute(ani_env* env, ani_string eventId, ani_int userId)
67 {
68     EVENT_LOGD("publishAsUserExecute call.");
69     std::string eventIdStr;
70     AniCommonEventUtils::GetStdString(env, eventId, eventIdStr);
71     EVENT_LOGD("publishAsUserExecute eventIdStr: %{public}s, userId: %{public}d", eventIdStr.c_str(), userId);
72 
73     CommonEventData commonEventData;
74     CommonEventPublishInfo commonEventPublishInfo;
75     Want want;
76     want.SetAction(eventIdStr);
77     commonEventData.SetWant(want);
78 
79     auto errorCode = CommonEventManager::NewPublishCommonEventAsUser(commonEventData, commonEventPublishInfo, userId);
80     EVENT_LOGD("publishAsUserExecute result: %{public}d.", errorCode);
81     return errorCode;
82 }
83 
publishAsUserWithOptionsExecute(ani_env * env,ani_string eventId,ani_int userId,ani_object optionsObject)84 static uint32_t publishAsUserWithOptionsExecute(ani_env* env, ani_string eventId, ani_int userId,
85     ani_object optionsObject)
86 {
87     EVENT_LOGD("publishAsUserWithOptionsExecute call.");
88     std::string eventIdStr;
89     AniCommonEventUtils::GetStdString(env, eventId, eventIdStr);
90     EVENT_LOGD("publishAsUserWithOptionsExecute eventIdStr: %{public}s, userId: %{public}d",
91         eventIdStr.c_str(), userId);
92 
93     CommonEventData commonEventData;
94     CommonEventPublishInfo commonEventPublishInfo;
95     Want want;
96     want.SetAction(eventIdStr);
97     commonEventData.SetWant(want);
98 
99     AniCommonEventUtils::ConvertCommonEventPublishData(
100         env, optionsObject, want, commonEventData, commonEventPublishInfo);
101     auto errorCode = CommonEventManager::NewPublishCommonEventAsUser(commonEventData, commonEventPublishInfo, userId);
102     EVENT_LOGD("publishAsUserWithOptionsExecute result: %{public}d.", errorCode);
103     return errorCode;
104 }
105 
createSubscriberExecute(ani_env * env,ani_object infoObject)106 static ani_ref createSubscriberExecute(ani_env* env, ani_object infoObject)
107 {
108     EVENT_LOGD("createSubscriberExecute call.");
109     CommonEventSubscribeInfo subscribeInfo;
110     AniCommonEventUtils::ConvertCommonEventSubscribeInfo(env, infoObject, subscribeInfo);
111     subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::ThreadMode::HANDLER);
112     auto ret = ANI_OK;
113     auto wrapper = new (std::nothrow) SubscriberInstanceWrapper(subscribeInfo);
114     if (wrapper == nullptr) {
115         return nullptr;
116     }
117     ani_class cls;
118     ret = env->FindClass("LcommonEvent/commonEventSubscriber/CommonEventSubscriberInner;", &cls);
119     if (ret != ANI_OK) {
120         EVENT_LOGE("createSubscriberExecute FindClass error. result: %{public}d.", ret);
121         delete wrapper;
122         wrapper = nullptr;
123         return nullptr;
124     }
125     ani_method ctor;
126     ret = env->Class_FindMethod(cls, "<ctor>", "J:V", &ctor);
127     if (ret != ANI_OK) {
128         EVENT_LOGE("createSubscriberExecute Class_FindMethod error. result: %{public}d.", ret);
129         delete wrapper;
130         wrapper = nullptr;
131         return nullptr;
132     }
133     ani_object subscriberObj;
134     ret = env->Object_New(cls, ctor, &subscriberObj, reinterpret_cast<ani_long>(wrapper));
135     if (ret != ANI_OK) {
136         EVENT_LOGE("createSubscriberExecute Object_New error. result: %{public}d.", ret);
137         delete wrapper;
138         wrapper = nullptr;
139         return nullptr;
140     }
141 
142     EVENT_LOGD("createSubscriberExecute end.");
143     return subscriberObj;
144 }
145 
subscribeExecute(ani_env * env,ani_ref subscribeRef,ani_object callback)146 static uint32_t subscribeExecute(ani_env* env, ani_ref subscribeRef, ani_object callback)
147 {
148     EVENT_LOGD("subscribeExecute call.");
149     auto ret = ANI_OK;
150 
151     ani_long wrapper_long {};
152     ret = env->Object_GetPropertyByName_Long(
153         static_cast<ani_object>(subscribeRef), "subscriberInstanceWrapper", &wrapper_long);
154     if (ret != ANI_OK) {
155         EVENT_LOGE("subscribeExecute Object_GetPropertyByName_Long error. result: %{public}d.", ret);
156         return ANI_INVALID_ARGS;
157     }
158 
159     SubscriberInstanceWrapper* wrapper = nullptr;
160     wrapper = reinterpret_cast<SubscriberInstanceWrapper*>(wrapper_long);
161     if (wrapper == nullptr) {
162         EVENT_LOGE("subscribeExecute wrapper is null.");
163         return ANI_INVALID_ARGS;
164     }
165     auto subscriberInstance = GetSubscriberByWrapper(wrapper);
166     if (subscriberInstance == nullptr) {
167         EVENT_LOGE("subscriberInstance is null.");
168         return ANI_INVALID_ARGS;
169     }
170 
171     ani_ref resultRef = nullptr;
172     ret = env->GlobalReference_Create(callback, &resultRef);
173     if (ret != ANI_OK) {
174         EVENT_LOGE("createSubscriberExecute GlobalReference_Create error. result: %{public}d.", ret);
175         return ANI_INVALID_ARGS;
176     }
177     if (resultRef == nullptr) {
178         EVENT_LOGE("subscribeExecute resultRef is null.");
179     }
180     subscriberInstance->SetEnv(env);
181     subscriberInstance->SetCallback(static_cast<ani_object>(resultRef));
182 
183     ani_vm* etsVm;
184     ret = env->GetVM(&etsVm);
185     if (ret != ANI_OK) {
186         EVENT_LOGE("OnReceiveEvent GetVM error. result: %{public}d.", ret);
187         return ANI_INVALID_ARGS;
188     }
189     subscriberInstance->SetVm(etsVm);
190     auto result = CommonEventManager::NewSubscribeCommonEvent(subscriberInstance);
191     if (result == ANI_OK) {
192         EVENT_LOGD("result is ANI_OK");
193         std::lock_guard<std::mutex> lock(subscriberInsMutex);
194         subscriberInstances[subscriberInstance] = subscriberInstance->GoAsyncCommonEvent();
195     } else {
196         subscriberInstance = nullptr;
197     }
198     EVENT_LOGD("subscribeExecute result: %{public}d.", result);
199     return result;
200 }
201 
removeSubscriberInstance(ani_env * env,SubscriberInstanceWrapper * wrapper)202 static int32_t removeSubscriberInstance(ani_env* env, SubscriberInstanceWrapper* wrapper)
203 {
204     int32_t result = ERR_OK;
205     std::lock_guard<std::mutex> lock(subscriberInsMutex);
206     for (auto iter = subscriberInstances.begin(); iter != subscriberInstances.end();) {
207         if (iter->first.get() == wrapper->GetSubscriber().get()) {
208             result = CommonEventManager::NewUnSubscribeCommonEvent(iter->first);
209             ani_ref callbackRef = static_cast<ani_ref>(iter->first->GetCallback());
210             if (result == ANI_OK && callbackRef != nullptr) {
211                 env->GlobalReference_Delete(callbackRef);
212             }
213             iter = subscriberInstances.erase(iter);
214         } else {
215             ++iter;
216         }
217     }
218     return result;
219 }
220 
unsubscribeExecute(ani_env * env,ani_ref subscribeRef)221 static uint32_t unsubscribeExecute(ani_env* env, ani_ref subscribeRef)
222 {
223     EVENT_LOGD("unsubscribeExecute call.");
224     auto ret = ANI_OK;
225 
226     ani_long wrapper_long {};
227     ret = env->Object_GetPropertyByName_Long(
228         static_cast<ani_object>(subscribeRef), "subscriberInstanceWrapper", &wrapper_long);
229     if (ret != ANI_OK) {
230         EVENT_LOGE("subscribeExecute Object_GetPropertyByName_Long error. result: %{public}d.", ret);
231         return ANI_INVALID_ARGS;
232     }
233 
234     SubscriberInstanceWrapper* wrapper = nullptr;
235     wrapper = reinterpret_cast<SubscriberInstanceWrapper*>(wrapper_long);
236     if (wrapper == nullptr) {
237         EVENT_LOGE("unsubscribeExecute wrapper is null.");
238         return ANI_INVALID_ARGS;
239     }
240 
241     auto subscriberInstance = GetSubscriberByWrapper(wrapper);
242     if (subscriberInstance == nullptr) {
243         EVENT_LOGE("subscriberInstance is null.");
244         return ANI_INVALID_ARGS;
245     }
246     auto result = removeSubscriberInstance(env, wrapper);
247     EVENT_LOGD("unsubscribeExecute result: %{public}d.", result);
248     return result;
249 }
250 
removeStickyCommonEventExecute(ani_env * env,ani_string eventId)251 static uint32_t removeStickyCommonEventExecute(ani_env* env, ani_string eventId)
252 {
253     EVENT_LOGD("removeStickyCommonEventExecute call");
254     std::string eventIdStr;
255     AniCommonEventUtils::GetStdString(env, eventId, eventIdStr);
256     EVENT_LOGD("removeStickyCommonEventExecute eventIdStr: %{public}s.", eventIdStr.c_str());
257     int returncode = CommonEventManager::RemoveStickyCommonEvent(eventIdStr);
258     EVENT_LOGD("removeStickyCommonEventExecute result: %{public}d.", returncode);
259     return returncode;
260 }
261 
setStaticSubscriberStateExecute(ani_env * env,ani_boolean enable)262 static uint32_t setStaticSubscriberStateExecute(ani_env* env, ani_boolean enable)
263 {
264     EVENT_LOGD("setStaticSubscriberStateExecute call");
265     int returncode = CommonEventManager::SetStaticSubscriberState(enable);
266     if (returncode != ERR_OK) {
267         EVENT_LOGE("setStaticSubscriberStateExecute failed with error: %{public}d", returncode);
268         if (returncode != Notification::ERR_NOTIFICATION_CES_COMMON_NOT_SYSTEM_APP &&
269             returncode != Notification::ERR_NOTIFICATION_SEND_ERROR) {
270             returncode = Notification::ERR_NOTIFICATION_CESM_ERROR;
271         }
272     }
273     EVENT_LOGD("setStaticSubscriberStateExecute result: %{public}d", returncode);
274     return returncode;
275 }
276 
setStaticSubscriberStateWithEventsExecute(ani_env * env,ani_boolean enable,ani_object events)277 static uint32_t setStaticSubscriberStateWithEventsExecute(ani_env* env, ani_boolean enable, ani_object events)
278 {
279     EVENT_LOGD("setStaticSubscriberStateWithEventsExecute call");
280     std::vector<std::string> eventList;
281     AniCommonEventUtils::GetStdStringArrayClass(env, events, eventList);
282     int returncode = (events == nullptr) ?
283         CommonEventManager::SetStaticSubscriberState(enable) :
284         CommonEventManager::SetStaticSubscriberState(eventList, enable);
285     if (returncode != ERR_OK) {
286         EVENT_LOGE("setStaticSubscriberStateWithEventsExecute failed with error: %{public}d", returncode);
287         if (returncode != Notification::ERR_NOTIFICATION_CES_COMMON_NOT_SYSTEM_APP &&
288             returncode != Notification::ERR_NOTIFICATION_SEND_ERROR) {
289             returncode = Notification::ERR_NOTIFICATION_CESM_ERROR;
290         }
291     }
292     EVENT_LOGD("setStaticSubscriberStateWithEventsExecute result: %{public}d.", returncode);
293     return returncode;
294 }
295 
GetSubscriber(ani_env * env,ani_ref subscribeRef)296 std::shared_ptr<SubscriberInstance> GetSubscriber(ani_env* env, ani_ref subscribeRef)
297 {
298     EVENT_LOGD("GetSubscriber excute");
299     auto ret = ANI_OK;
300 
301     ani_long wrapper_long {};
302     ret = env->Object_GetPropertyByName_Long(
303         static_cast<ani_object>(subscribeRef), "subscriberInstanceWrapper", &wrapper_long);
304     if (ret != ANI_OK) {
305         EVENT_LOGE("subscribeExecute Object_GetPropertyByName_Long error. result: %{public}d.", ret);
306         return nullptr;
307     }
308 
309     SubscriberInstanceWrapper* wrapper = nullptr;
310     wrapper = reinterpret_cast<SubscriberInstanceWrapper*>(wrapper_long);
311     if (wrapper == nullptr) {
312         EVENT_LOGE("unsubscribeExecute wrapper is null.");
313         return nullptr;
314     }
315     return GetSubscriberByWrapper(wrapper);
316 }
317 
GetSubscriberByWrapper(SubscriberInstanceWrapper * wrapper)318 std::shared_ptr<SubscriberInstance> GetSubscriberByWrapper(SubscriberInstanceWrapper* wrapper)
319 {
320     if (wrapper->GetSubscriber() == nullptr) {
321         EVENT_LOGE("subscriber is null");
322         return nullptr;
323     }
324     std::lock_guard<std::mutex> lock(subscriberInsMutex);
325     for (auto subscriberInstance : subscriberInstances) {
326         if (subscriberInstance.first.get() == wrapper->GetSubscriber().get()) {
327             return subscriberInstance.first;
328         }
329     }
330     return wrapper->GetSubscriber();
331 }
332 
SubscriberInstance(const CommonEventSubscribeInfo & sp)333 SubscriberInstance::SubscriberInstance(const CommonEventSubscribeInfo& sp) : CommonEventSubscriber(sp)
334 {
335     EVENT_LOGD("create SubscriberInstance");
336     id_ = ++subscriberID_;
337 }
338 
~SubscriberInstance()339 SubscriberInstance::~SubscriberInstance()
340 {
341     EVENT_LOGD("destroy SubscriberInstance");
342     if (env_ != nullptr && callback_ != nullptr) {
343         env_->GlobalReference_Delete(callback_);
344     }
345 }
346 
OnReceiveEvent(const CommonEventData & data)347 void SubscriberInstance::OnReceiveEvent(const CommonEventData& data)
348 {
349     EVENT_LOGD("OnReceiveEvent execute action = %{public}s", data.GetWant().GetAction().c_str());
350     if (this->IsOrderedCommonEvent()) {
351         std::lock_guard<std::mutex> lock(subscriberInsMutex);
352         for (auto subscriberInstance : subscriberInstances) {
353             if (subscriberInstance.first.get() == this) {
354                 subscriberInstances[subscriberInstance.first] = GoAsyncCommonEvent();
355                 break;
356             }
357         }
358     }
359 
360     ani_env* etsEnv;
361     ani_status aniResult = ANI_OK;
362     aniResult = etsVm_->GetEnv(ANI_VERSION_1, &etsEnv);
363     if (aniResult != ANI_OK) {
364         EVENT_LOGE("subscribeCallbackThreadFunciton GetEnv error. result: %{public}d.", aniResult);
365         return;
366     }
367 
368     ani_object ani_data {};
369     AniCommonEventUtils::ConvertCommonEventDataToEts(etsEnv, ani_data, data);
370 
371     ani_ref nullObject;
372     aniResult = etsEnv->GetNull(&nullObject);
373     if (aniResult != ANI_OK) {
374         EVENT_LOGE("subscribeCallbackThreadFunciton GetNull error. result: %{public}d.", aniResult);
375     }
376 
377     auto fnObject = reinterpret_cast<ani_fn_object>(reinterpret_cast<ani_ref>(callback_));
378     if (fnObject == nullptr) {
379         EVENT_LOGE("subscribeCallbackThreadFunciton fnObject is null.");
380         return;
381     }
382 
383     EVENT_LOGD("FunctionalObject_Call.");
384     std::vector<ani_ref> args = { nullObject, reinterpret_cast<ani_ref>(ani_data) };
385     ani_ref result;
386     aniResult = etsEnv->FunctionalObject_Call(fnObject, args.size(), args.data(), &result);
387     if (aniResult != ANI_OK) {
388         EVENT_LOGE("subscribeCallbackThreadFunciton FunctionalObject_Call error. result: %{public}d.", aniResult);
389     }
390 }
391 
GetID()392 unsigned long long SubscriberInstance::GetID()
393 {
394     return id_.load();
395 }
396 
SetEnv(ani_env * env)397 void SubscriberInstance::SetEnv(ani_env* env)
398 {
399     EVENT_LOGD("SetEnv");
400     std::lock_guard<std::mutex> lock(envMutex_);
401     env_ = env;
402 }
403 
SetVm(ani_vm * etsVm)404 void SubscriberInstance::SetVm(ani_vm* etsVm)
405 {
406     EVENT_LOGD("SetVm");
407     etsVm_ = etsVm;
408 }
409 
SetCallback(const ani_object & callback)410 void SubscriberInstance::SetCallback(const ani_object& callback)
411 {
412     std::lock_guard<std::mutex> lockRef(callbackMutex_);
413     callback_ = callback;
414 }
415 
GetCallback()416 ani_object SubscriberInstance::GetCallback()
417 {
418     std::lock_guard<std::mutex> lockRef(callbackMutex_);
419     return callback_;
420 }
421 
ClearEnv()422 void SubscriberInstance::ClearEnv()
423 {
424     EVENT_LOGD("Env expired, clear SubscriberInstance env");
425     std::lock_guard<std::mutex> lock(envMutex_);
426     env_ = nullptr;
427 }
428 
SubscriberInstanceWrapper(const CommonEventSubscribeInfo & info)429 SubscriberInstanceWrapper::SubscriberInstanceWrapper(const CommonEventSubscribeInfo& info)
430 {
431     auto objectInfo = new (std::nothrow) SubscriberInstance(info);
432     if (objectInfo == nullptr) {
433         EVENT_LOGE("objectInfo is null");
434         return;
435     }
436 
437     EVENT_LOGD("Constructor objectInfo");
438     subscriber = std::shared_ptr<SubscriberInstance>(objectInfo);
439     if (subscriber == nullptr) {
440         EVENT_LOGE("subscriber is null");
441         return;
442     }
443 }
444 
GetSubscriber()445 std::shared_ptr<SubscriberInstance> SubscriberInstanceWrapper::GetSubscriber()
446 {
447     return subscriber;
448 }
449 
clean(ani_env * env,ani_object object)450 static void clean([[maybe_unused]] ani_env *env, [[maybe_unused]] ani_object object)
451 {
452     ani_long ptr;
453     if (ANI_OK != env->Object_GetFieldByName_Long(object, "ptr", &ptr)) {
454         return;
455     }
456     SubscriberInstanceWrapper* wrapper = nullptr;
457     wrapper = reinterpret_cast<SubscriberInstanceWrapper*>(ptr);
458     if (wrapper == nullptr) {
459         EVENT_LOGE("clean wrapper is null.");
460         return;
461     }
462     auto result = removeSubscriberInstance(env, wrapper);
463     EVENT_LOGD("clean result: %{public}d.", result);
464     return;
465 }
466 
GetAsyncCommonEventResult(ani_env * env,ani_object object)467 std::shared_ptr<AsyncCommonEventResult> GetAsyncCommonEventResult(ani_env* env, ani_object object)
468 {
469     EVENT_LOGD("subscriberInstance GetAsyncCommonEventResult.");
470     auto subscriberInstance = GetSubscriber(env, object);
471     if (subscriberInstance == nullptr) {
472         EVENT_LOGE("subscriberInstance is null.");
473         return nullptr;
474     }
475     if (subscriberInstances.size() == 0) {
476         EVENT_LOGE("subscriberInstances is null.");
477         return nullptr;
478     }
479     std::lock_guard<std::mutex> lock(subscriberInsMutex);
480     for (auto subscriberRes : subscriberInstances) {
481         if (subscriberRes.first.get() == subscriberInstance.get()) {
482             return subscriberInstances[subscriberRes.first];
483         }
484     }
485     return nullptr;
486 }
487 
getCode(ani_env * env,ani_object object)488 static ani_double getCode(ani_env *env, ani_object object)
489 {
490     EVENT_LOGD("subscriberInstance getCode.");
491     auto subscriberRes = GetAsyncCommonEventResult(env, object);
492     int32_t code = 0;
493     if (subscriberRes != nullptr) {
494         code = subscriberRes->GetCode();
495     }
496     ani_double returncode = static_cast<ani_double>(code);
497     return returncode;
498 }
499 
setCode(ani_env * env,ani_object object,ani_int code)500 static uint32_t setCode(ani_env *env, ani_object object, ani_int code)
501 {
502     EVENT_LOGD("subscriberInstance setCode.");
503     int32_t returncode = 0;
504     auto subscriberRes = GetAsyncCommonEventResult(env, object);
505     if (subscriberRes == nullptr) {
506         EVENT_LOGE("subscriberRes is null");
507         return returncode;
508     }
509     bool returnBoolean = subscriberRes->SetCode(code);
510     if (!returnBoolean) {
511         EVENT_LOGE("subscriberRes is null");
512         return returncode;
513     }
514     return returncode;
515 }
516 
getData(ani_env * env,ani_object object)517 static ani_string getData(ani_env *env, ani_object object)
518 {
519     EVENT_LOGD("subscriberInstance getData.");
520     auto subscriberRes = GetAsyncCommonEventResult(env, object);
521     std::string str = "";
522     if (subscriberRes != nullptr) {
523         str = subscriberRes->GetData();
524     }
525     ani_string aniResult = nullptr;
526     AniCommonEventUtils::GetAniString(env, str, aniResult);
527     return aniResult;
528 }
529 
setData(ani_env * env,ani_object object,ani_string data)530 static uint32_t setData(ani_env *env, ani_object object, ani_string data)
531 {
532     EVENT_LOGD("subscriberInstance setData.");
533     int32_t returncode = 0;
534     auto subscriberRes = GetAsyncCommonEventResult(env, object);
535     if (subscriberRes == nullptr) {
536         EVENT_LOGE("subscriberRes is null");
537         return returncode;
538     }
539     std::string stdData;
540     AniCommonEventUtils::GetStdString(env, data, stdData);
541     ani_boolean returnBoolean = static_cast<ani_boolean>(subscriberRes->SetData(stdData));
542     if (!returnBoolean) {
543         EVENT_LOGE("subscriberRes is null");
544         return returncode;
545     }
546     return returncode;
547 }
548 
setCodeAndData(ani_env * env,ani_object object,ani_int code,ani_string data)549 static uint32_t setCodeAndData(ani_env *env, ani_object object, ani_int code, ani_string data)
550 {
551     EVENT_LOGD("subscriberInstance setCodeAndData.");
552     int32_t returncode = 0;
553     auto subscriberRes = GetAsyncCommonEventResult(env, object);
554     if (subscriberRes == nullptr) {
555         EVENT_LOGE("subscriberRes is null");
556         return returncode;
557     }
558     std::string stdData;
559     int32_t intCode = static_cast<ani_boolean>(code);
560     AniCommonEventUtils::GetStdString(env, data, stdData);
561     bool returnBoolean = subscriberRes->SetCodeAndData(intCode, stdData);
562     if (!returnBoolean) {
563         EVENT_LOGE("subscriberRes is null");
564         return returncode;
565     }
566     return returncode;
567 }
568 
isOrderedCommonEvent(ani_env * env,ani_object object)569 static ani_boolean isOrderedCommonEvent(ani_env *env, ani_object object)
570 {
571     EVENT_LOGD("subscriberInstance isOrderedCommonEvent.");
572     auto subscriberRes = GetAsyncCommonEventResult(env, object);
573     ani_boolean returnBoolean = ANI_FALSE;
574     if (subscriberRes != nullptr) {
575         returnBoolean = subscriberRes->IsOrderedCommonEvent() ? ANI_TRUE : ANI_FALSE;
576     }
577     return returnBoolean;
578 }
579 
isStickyCommonEvent(ani_env * env,ani_object object)580 static ani_boolean isStickyCommonEvent(ani_env *env, ani_object object)
581 {
582     EVENT_LOGD("subscriberInstance isStickyCommonEvent.");
583     auto subscriberRes = GetAsyncCommonEventResult(env, object);
584     ani_boolean returnBoolean = ANI_FALSE;
585     if (subscriberRes != nullptr) {
586         returnBoolean = subscriberRes->IsStickyCommonEvent() ? ANI_TRUE : ANI_FALSE;
587     }
588     return returnBoolean;
589 }
590 
abortCommonEvent(ani_env * env,ani_object object)591 static uint32_t abortCommonEvent(ani_env *env, ani_object object)
592 {
593     EVENT_LOGD("subscriberInstance abortCommonEvent.");
594     int32_t returncode = 0;
595     auto subscriberRes = GetAsyncCommonEventResult(env, object);
596     if (subscriberRes == nullptr) {
597         EVENT_LOGE("subscriberRes is null");
598         return returncode;
599     }
600     if (!(subscriberRes->AbortCommonEvent())) {
601         return returncode;
602     }
603     return returncode;
604 }
605 
clearAbortCommonEvent(ani_env * env,ani_object object)606 static uint32_t clearAbortCommonEvent(ani_env *env, ani_object object)
607 {
608     EVENT_LOGD("subscriberInstance clearAbortCommonEvent.");
609     int32_t returncode = 0;
610     auto subscriberRes = GetAsyncCommonEventResult(env, object);
611     if (subscriberRes == nullptr) {
612         EVENT_LOGE("subscriberRes is null");
613         return returncode;
614     }
615     if (!(subscriberRes->ClearAbortCommonEvent())) {
616         return returncode;
617     }
618     return returncode;
619 }
620 
getAbortCommonEvent(ani_env * env,ani_object object)621 static ani_boolean getAbortCommonEvent(ani_env *env, ani_object object)
622 {
623     EVENT_LOGD("subscriberInstance getAbortCommonEvent.");
624     auto subscriberRes = GetAsyncCommonEventResult(env, object);
625     ani_boolean returnBoolean = ANI_FALSE;
626     if (subscriberRes != nullptr) {
627         returnBoolean = subscriberRes->GetAbortCommonEvent() ? ANI_TRUE : ANI_FALSE;
628     }
629     return returnBoolean;
630 }
631 
getSubscribeInfo(ani_env * env,ani_object object)632 static ani_object getSubscribeInfo(ani_env *env, ani_object object)
633 {
634     EVENT_LOGD("subscriberInstance getSubscribeInfo.");
635     auto subscriberInstance = GetSubscriber(env, object);
636     ani_object infoObject {};
637     if (subscriberInstance == nullptr) {
638         EVENT_LOGE("subscriberInstance is null.");
639         ani_ref nullObject;
640         env->GetNull(&nullObject);
641         return static_cast<ani_object>(nullObject);
642     }
643     AniCommonEventUtils::GetCommonEventSubscribeInfoToEts(env, subscriberInstance, infoObject);
644     if (infoObject == nullptr) {
645         EVENT_LOGE("infoObject is null.");
646         ani_ref nullObject;
647         env->GetNull(&nullObject);
648         return static_cast<ani_object>(nullObject);
649     }
650     return infoObject;
651 }
652 
finishCommonEvent(ani_env * env,ani_object object)653 static uint32_t finishCommonEvent(ani_env *env, ani_object object)
654 {
655     EVENT_LOGD("subscriberInstance finishCommonEvent.");
656     auto subscriberRes = GetAsyncCommonEventResult(env, object);
657     int32_t returncode = 0;
658     if (subscriberRes == nullptr) {
659         EVENT_LOGE("subscriberRes is null");
660         return returncode;
661     }
662     if (!(subscriberRes->FinishCommonEvent())) {
663         return returncode;
664     }
665     return returncode;
666 }
667 
668 static std::array commonEventSubscriberFunctions = {
669     ani_native_function{"nativeGetCode", nullptr, reinterpret_cast<void *>(OHOS::EventManagerFwkAni::getCode)},
670     ani_native_function{"nativeSetCode", nullptr, reinterpret_cast<void *>(OHOS::EventManagerFwkAni::setCode)},
671     ani_native_function{"nativeGetData", nullptr, reinterpret_cast<void *>(OHOS::EventManagerFwkAni::getData)},
672     ani_native_function{"nativeSetData", nullptr, reinterpret_cast<void *>(OHOS::EventManagerFwkAni::setData)},
673     ani_native_function{"nativeSetCodeAndData", nullptr,
674         reinterpret_cast<void *>(OHOS::EventManagerFwkAni::setCodeAndData)},
675     ani_native_function{"nativeIsOrderedCommonEvent", nullptr,
676         reinterpret_cast<void *>(OHOS::EventManagerFwkAni::isOrderedCommonEvent)},
677     ani_native_function{"nativeIsStickyCommonEvent", nullptr,
678         reinterpret_cast<void *>(OHOS::EventManagerFwkAni::isStickyCommonEvent)},
679     ani_native_function{"nativeAbortCommonEvent", nullptr,
680         reinterpret_cast<void *>(OHOS::EventManagerFwkAni::abortCommonEvent)},
681     ani_native_function{"nativeClearAbortCommonEvent", nullptr,
682         reinterpret_cast<void *>(OHOS::EventManagerFwkAni::clearAbortCommonEvent)},
683     ani_native_function{"nativeGetAbortCommonEvent", nullptr,
684         reinterpret_cast<void *>(OHOS::EventManagerFwkAni::getAbortCommonEvent)},
685     ani_native_function{"nativeGetSubscribeInfo", nullptr,
686         reinterpret_cast<void *>(OHOS::EventManagerFwkAni::getSubscribeInfo)},
687     ani_native_function{"nativeFinishCommonEvent", nullptr,
688         reinterpret_cast<void *>(OHOS::EventManagerFwkAni::finishCommonEvent)},
689 };
690 
init(ani_env * env,ani_namespace kitNs)691 ani_status init(ani_env *env, ani_namespace kitNs)
692 {
693     ani_status status = ANI_ERROR;
694     std::array methods = {
695         ani_native_function { "publishExecute", "Lstd/core/String;:I",
696             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::publishExecute) },
697         ani_native_function { "publishWithOptionsExecute",
698             "Lstd/core/String;LcommonEvent/commonEventPublishData/CommonEventPublishData;:I",
699             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::publishWithOptionsExecute) },
700         ani_native_function { "publishAsUserExecute", "Lstd/core/String;I:I",
701             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::publishAsUserExecute) },
702         ani_native_function { "publishAsUserWithOptionsExecute",
703             "Lstd/core/String;ILcommonEvent/commonEventPublishData/CommonEventPublishData;:I",
704             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::publishAsUserWithOptionsExecute) },
705         ani_native_function { "createSubscriberExecute",
706             "LcommonEvent/commonEventSubscribeInfo/CommonEventSubscribeInfo;:LcommonEvent/commonEventSubscriber/"
707             "CommonEventSubscriber;",
708             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::createSubscriberExecute) },
709         ani_native_function {
710             "subscribeExecute", nullptr, reinterpret_cast<void*>(OHOS::EventManagerFwkAni::subscribeExecute) },
711         ani_native_function { "unsubscribeExecute", "LcommonEvent/commonEventSubscriber/CommonEventSubscriber;:I",
712             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::unsubscribeExecute) },
713         ani_native_function { "removeStickyCommonEventExecute", "Lstd/core/String;:I",
714             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::removeStickyCommonEventExecute) },
715         ani_native_function { "setStaticSubscriberStateExecute", "Z:I",
716             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::setStaticSubscriberStateExecute) },
717         ani_native_function { "setStaticSubscriberStateWithEventsExecute", nullptr,
718             reinterpret_cast<void*>(OHOS::EventManagerFwkAni::setStaticSubscriberStateWithEventsExecute) },
719     };
720 
721     status = env->Namespace_BindNativeFunctions(kitNs, methods.data(), methods.size());
722     if (status != ANI_OK) {
723         EVENT_LOGE("Cannot bind native methods to L@ohos/event/common_event_manager/commonEventManager");
724         return ANI_INVALID_TYPE;
725     }
726     return status;
727 }
728 
729 extern "C" {
ANI_Constructor(ani_vm * vm,uint32_t * result)730 ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result)
731 {
732     EVENT_LOGD("ANI_Constructor call.");
733     ani_env* env;
734     ani_status status = ANI_ERROR;
735     if (ANI_OK != vm->GetEnv(ANI_VERSION_1, &env)) {
736         EVENT_LOGE("Unsupported ANI_VERSION_1.");
737         return ANI_ERROR;
738     }
739 
740     ani_namespace kitNs;
741     status = env->FindNamespace("L@ohos/commonEventManager/commonEventManager;", &kitNs);
742     if (status != ANI_OK) {
743         EVENT_LOGE("Not found L@ohos/commonEventManager/commonEventManager.");
744         return ANI_INVALID_ARGS;
745     }
746     status = init(env, kitNs);
747     if (status != ANI_OK) {
748         EVENT_LOGE("Cannot bind native methods to L@ohos/events/emitter/emitter");
749         return ANI_INVALID_TYPE;
750     }
751 
752     ani_class cls;
753     status = env->FindClass("LcommonEvent/commonEventSubscriber/Cleaner;", &cls);
754     if (status != ANI_OK) {
755         EVENT_LOGE("Not found LcommonEvent/commonEventSubscriber/Cleaner");
756         return ANI_INVALID_ARGS;
757     }
758     std::array cleanMethod = {
759         ani_native_function{"clean", nullptr, reinterpret_cast<void *>(OHOS::EventManagerFwkAni::clean)}};
760     status = env->Class_BindNativeMethods(cls, cleanMethod.data(), cleanMethod.size());
761     if (status != ANI_OK) {
762         EVENT_LOGE("Cannot bind native methods to LcommonEvent/commonEventSubscriber/Cleaner");
763         return ANI_INVALID_TYPE;
764     }
765 
766     ani_class commonEventSubscriberCls;
767     status = env->FindClass("LcommonEvent/commonEventSubscriber/CommonEventSubscriberInner;",
768         &commonEventSubscriberCls);
769     if (status != ANI_OK) {
770         EVENT_LOGE("Not found LcommonEvent/commonEventSubscriber/CommonEventSubscriberInner");
771         return ANI_INVALID_ARGS;
772     }
773     status = env->Class_BindNativeMethods(commonEventSubscriberCls, commonEventSubscriberFunctions.data(),
774         commonEventSubscriberFunctions.size());
775     if (status != ANI_OK) {
776         EVENT_LOGE("Cannot bind native methods to LcommonEvent/commonEventSubscriber/CommonEventSubscriberInner");
777         return ANI_INVALID_TYPE;
778     }
779     *result = ANI_VERSION_1;
780     return ANI_OK;
781 }
782 }
783 
784 } // namespace EventManagerFwkAni
785 } // namespace OHOS
786