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