• 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 "common_event_manager_ffi.h"
17 #include "common_event_constant.h"
18 #include "common_event_manager_impl.h"
19 #include "common_event.h"
20 
21 #include "native_log.h"
22 #include "cj_lambda.h"
23 #include "securec.h"
24 using namespace OHOS::FFI;
25 using CommonEventManagerImpl = OHOS::CommonEventManager::CommonEventManagerImpl;
26 
27 namespace OHOS::CommonEventManager {
28     extern "C"
29     {
CJ_PublishEvent(char * event,int32_t userId)30         int32_t CJ_PublishEvent(char *event, int32_t userId)
31         {
32             return CommonEventManagerImpl::PublishEvent(event, userId);
33         }
34 
CJ_PublishEventWithData(char * event,int32_t userId,CommonEventPublishDataBycj options)35         int32_t CJ_PublishEventWithData(char *event, int32_t userId, CommonEventPublishDataBycj options)
36         {
37             return CommonEventManagerImpl::PublishEventWithData(event, userId, options);
38         }
39 
CJ_SetStaticSubscriberState(bool enable)40         int32_t CJ_SetStaticSubscriberState(bool enable)
41         {
42             return CommonEventManagerImpl::SetStaticSubscriberState(enable);
43         }
44 
CJ_RemoveStickyCommonEvent(char * event)45         int32_t CJ_RemoveStickyCommonEvent(char *event)
46         {
47             return CommonEventManagerImpl::RemoveStickyCommonEvent(event);
48         }
49 
CJ_CreateCommonEventSubscribeInfo(CArrString events)50         int64_t CJ_CreateCommonEventSubscribeInfo(CArrString events)
51         {
52             auto infoPtr = CommonEventManagerImpl::CreateCommonEventSubscribeInfo(events.head, events.size);
53             auto ptr = FFIData::Create<CommonEventSubscribeInfoImpl>(infoPtr);
54             if (!ptr) {
55                 return static_cast<int64_t>(ERR_INVALID_INSTANCE_ID);
56             }
57             return ptr->GetID();
58         }
59 
CJ_CreateSubscriber(int64_t id)60         int64_t CJ_CreateSubscriber(int64_t id)
61         {
62             bool haveId = false;
63             int64_t managerId = GetManagerId(id, haveId);
64             if (haveId) {
65                 return managerId;
66             }
67             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
68             if (!instance) {
69                 LOGE("CommonEventSubscribeInfoImpl instance not exist %{public}" PRId64, id);
70                 return static_cast<int64_t>(ERR_INVALID_INSTANCE_ID);
71             }
72             auto info = instance->GetInfoPtr();
73             auto ptr = FFIData::Create<SubscriberManager>(info, id);
74             if (!ptr) {
75                 return static_cast<int64_t>(ERR_INVALID_INSTANCE_ID);
76             }
77             auto subscriber = ptr->GetSubscriber();
78             if (!subscriber) {
79                 return ERR_INVALID_INSTANCE_CODE;
80             }
81             subscriber->SetSubscriberManagerId(ptr->GetID());
82             return ptr->GetID();
83         }
84 
CJ_Subscribe(int64_t id,void (* callbackRef)(const CCommonEventData data))85         int32_t CJ_Subscribe(int64_t id, void (*callbackRef)(const CCommonEventData data))
86         {
87             auto instance = FFIData::GetData<SubscriberManager>(id);
88             if (!instance) {
89                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
90                 return ERR_INVALID_INSTANCE_CODE;
91             }
92             auto subscriber = instance->GetSubscriber();
93             if (!subscriber) {
94                 return ERR_INVALID_INSTANCE_CODE;
95             }
96             auto onChange = [lambda = CJLambda::Create(callbackRef)](const CCommonEventData data) -> void {
97                 lambda(data);
98             };
99             return CommonEventManagerImpl::Subscribe(subscriber, onChange);
100         }
101 
CJ_Unsubscribe(int64_t id)102         int32_t CJ_Unsubscribe(int64_t id)
103         {
104             auto instance = FFIData::GetData<SubscriberManager>(id);
105             if (!instance) {
106                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
107                 return ERR_INVALID_INSTANCE_CODE;
108             }
109             auto subscriber = instance->GetSubscriber();
110             if (!subscriber) {
111                 return ERR_INVALID_INSTANCE_CODE;
112             }
113             return CommonEventManagerImpl::Unsubscribe(subscriber);
114         }
115 
CJ_GetCode(int64_t id)116         RetDataI32 CJ_GetCode(int64_t id)
117         {
118             RetDataI32 ret = {.code = ERR_INVALID_INSTANCE_CODE, .data = 0};
119             auto instance = FFIData::GetData<SubscriberManager>(id);
120             if (!instance) {
121                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
122                 return ret;
123             }
124             auto subscriber = instance->GetSubscriber();
125             if (!subscriber) {
126                 return ret;
127             }
128             GetSubscriberCode(subscriber, ret.data);
129             ret.code = NO_ERROR;
130             return ret;
131         }
132 
CJ_SetCode(int64_t id,int32_t code)133         int32_t CJ_SetCode(int64_t id, int32_t code)
134         {
135             auto instance = FFIData::GetData<SubscriberManager>(id);
136             if (!instance) {
137                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
138                 return ERR_INVALID_INSTANCE_CODE;
139             }
140             auto subscriber = instance->GetSubscriber();
141             if (!subscriber) {
142                 return ERR_INVALID_INSTANCE_CODE;
143             }
144             return SetSubscriberCode(subscriber, code);
145         }
146 
CJ_GetData(int64_t id)147         RetDataCString CJ_GetData(int64_t id)
148         {
149             RetDataCString ret = {.code = ERR_INVALID_INSTANCE_CODE, .data = nullptr};
150             auto instance = FFIData::GetData<SubscriberManager>(id);
151             if (!instance) {
152                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
153                 return ret;
154             }
155             auto subscriber = instance->GetSubscriber();
156             if (!subscriber) {
157                 return ret;
158             }
159             int32_t code = NO_ERROR;
160             ret.data = MallocCString(GetSubscriberData(subscriber), code);
161             ret.code = code;
162             return ret;
163         }
164 
CJ_SetData(int64_t id,char * data)165         int32_t CJ_SetData(int64_t id, char *data)
166         {
167             auto instance = FFIData::GetData<SubscriberManager>(id);
168             if (!instance) {
169                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
170                 return ERR_INVALID_INSTANCE_CODE;
171             }
172             auto subscriber = instance->GetSubscriber();
173             if (!subscriber) {
174                 return ERR_INVALID_INSTANCE_CODE;
175             }
176             return SetSubscriberData(subscriber, data);
177         }
178 
CJ_SetCodeAndData(int64_t id,int32_t code,char * data)179         int32_t CJ_SetCodeAndData(int64_t id, int32_t code, char *data)
180         {
181             auto instance = FFIData::GetData<SubscriberManager>(id);
182             if (!instance) {
183                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
184                 return ERR_INVALID_INSTANCE_CODE;
185             }
186             auto subscriber = instance->GetSubscriber();
187             if (!subscriber) {
188                 return ERR_INVALID_INSTANCE_CODE;
189             }
190             return SetSubscriberCodeAndData(subscriber, code, data);
191         }
192 
CJ_IsOrderedCommonEvent(int64_t id)193         RetDataBool CJ_IsOrderedCommonEvent(int64_t id)
194         {
195             RetDataBool ret = {.code = ERR_INVALID_INSTANCE_CODE, .data = false};
196             auto instance = FFIData::GetData<SubscriberManager>(id);
197             if (!instance) {
198                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
199                 return ret;
200             }
201             auto subscriber = instance->GetSubscriber();
202             if (!subscriber) {
203                 return ret;
204             }
205             IsCommonEventOrdered(subscriber, ret.data);
206             ret.code = NO_ERROR;
207             return ret;
208         }
209 
CJ_IsStickyCommonEvent(int64_t id)210         RetDataBool CJ_IsStickyCommonEvent(int64_t id)
211         {
212             RetDataBool ret = {.code = ERR_INVALID_INSTANCE_CODE, .data = false};
213             auto instance = FFIData::GetData<SubscriberManager>(id);
214             if (!instance) {
215                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
216                 return ret;
217             }
218             auto subscriber = instance->GetSubscriber();
219             if (!subscriber) {
220                 return ret;
221             }
222             IsCommonEventSticky(subscriber, ret.data);
223             ret.code = NO_ERROR;
224             return ret;
225         }
226 
CJ_AbortCommonEvent(int64_t id)227         int32_t CJ_AbortCommonEvent(int64_t id)
228         {
229             auto instance = FFIData::GetData<SubscriberManager>(id);
230             if (!instance) {
231                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
232                 return ERR_INVALID_INSTANCE_CODE;
233             }
234 
235             auto subscriber = instance->GetSubscriber();
236             if (!subscriber) {
237                 return ERR_INVALID_INSTANCE_CODE;
238             }
239             std::shared_ptr<AsyncCommonEventResult> result = GetAsyncResult(subscriber.get());
240             if (!result) {
241                 LOGE("SubscriberManager result not exist %{public}" PRId64, id);
242                 return ERR_CES_FAILED;
243             }
244 
245             return result->AbortCommonEvent() ? SUCCESS_CODE : ERR_CES_FAILED;
246         }
247 
CJ_ClearAbortCommonEvent(int64_t id)248         int32_t CJ_ClearAbortCommonEvent(int64_t id)
249         {
250             auto instance = FFIData::GetData<SubscriberManager>(id);
251             if (!instance) {
252                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
253                 return ERR_INVALID_INSTANCE_CODE;
254             }
255 
256             auto subscriber = instance->GetSubscriber();
257             if (!subscriber) {
258                 return ERR_INVALID_INSTANCE_CODE;
259             }
260             std::shared_ptr<AsyncCommonEventResult> result = GetAsyncResult(subscriber.get());
261             if (!result) {
262                 LOGE("SubscriberManager result not exist %{public}" PRId64, id);
263                 return ERR_CES_FAILED;
264             }
265 
266             return result->ClearAbortCommonEvent() ? SUCCESS_CODE : ERR_CES_FAILED;
267         }
268 
CJ_GetAbortCommonEvent(int64_t id)269         RetDataBool CJ_GetAbortCommonEvent(int64_t id)
270         {
271             RetDataBool ret = {.code = ERR_INVALID_INSTANCE_CODE, .data = false};
272             auto instance = FFIData::GetData<SubscriberManager>(id);
273             if (!instance) {
274                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
275                 return ret;
276             }
277 
278             auto subscriber = instance->GetSubscriber();
279             if (!subscriber) {
280                 return ret;
281             }
282             std::shared_ptr<AsyncCommonEventResult> result = GetAsyncResult(subscriber.get());
283             if (!result) {
284                 LOGE("SubscriberManager result not exist %{public}" PRId64, id);
285                 ret.code = ERR_CES_FAILED;
286                 return ret;
287             }
288 
289             ret.data = result->GetAbortCommonEvent();
290             ret.code = SUCCESS_CODE;
291             return ret;
292         }
293 
CJ_GetSubscribeInfo(int64_t id)294         RetDataI64 CJ_GetSubscribeInfo(int64_t id)
295         {
296             RetDataI64 ret = {.code = ERR_INVALID_INSTANCE_ID, .data = 0};
297             auto instance = FFIData::GetData<SubscriberManager>(id);
298             if (!instance) {
299                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
300                 return ret;
301             }
302             ret.code = instance->GetSubscribeInfoId(ret.data);
303             return ret;
304         }
305 
CJ_FinishCommonEvent(int64_t id)306         int32_t CJ_FinishCommonEvent(int64_t id)
307         {
308             int32_t errorCode = NO_ERROR;
309             auto instance = FFIData::GetData<SubscriberManager>(id);
310             if (!instance) {
311                 LOGE("SubscriberManager instance not exist %{public}" PRId64, id);
312                 return ERR_INVALID_INSTANCE_ID;
313             }
314             auto subscriber = instance->GetSubscriber();
315             if (!subscriber) {
316                 return ERR_INVALID_INSTANCE_ID;
317             }
318             std::shared_ptr<AsyncCommonEventResult> result = GetAsyncResult(subscriber.get());
319             if (result) {
320                 errorCode = result->FinishCommonEvent() ? NO_ERROR : ERR_CES_FAILED;
321             }
322             return errorCode;
323         }
324 
CJ_SetPermission(int64_t id,char * value)325         void CJ_SetPermission(int64_t id, char *value)
326         {
327             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
328             if (!instance) {
329                 LOGE("CommonEventSubscribeInfoImpl instance not exist %{public}" PRId64, id);
330                 return;
331             }
332 
333             return instance->SetPermission(std::string(value));
334         }
335 
CJ_SetDeviceId(int64_t id,const char * value)336         void CJ_SetDeviceId(int64_t id, const char *value)
337         {
338             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
339             if (!instance) {
340                 LOGE("CommonEventSubscribeInfoImpl instance not exist %{public}" PRId64, id);
341                 return;
342             }
343             return instance->SetDeviceId(std::string(value));
344         }
345 
CJ_SetUserId(int64_t id,int32_t value)346         void CJ_SetUserId(int64_t id, int32_t value)
347         {
348             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
349             if (!instance) {
350                 LOGE("CommonEventSubscribeInfoImpl instance not exist %{public}" PRId64, id);
351                 return;
352             }
353             return instance->SetUserId(value);
354         }
355 
CJ_SetPriority(int64_t id,int32_t value)356         void CJ_SetPriority(int64_t id, int32_t value)
357         {
358             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
359             if (!instance) {
360                 LOGE("CommonEventSubscribeInfoImpl instance not exist %{public}" PRId64, id);
361                 return;
362             }
363             return instance->SetPriority(value);
364         }
365 
CJ_SetBundleName(int64_t id,const char * value)366         void CJ_SetBundleName(int64_t id, const char *value)
367         {
368             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
369             if (!instance) {
370                 LOGE("CommonEventSubscribeInfoImpl instance not exist %{public}" PRId64, id);
371                 return;
372             }
373             return instance->SetPublisherBundleName(std::string(value));
374         }
375 
CJ_GetPermission(int64_t id)376         const char *CJ_GetPermission(int64_t id)
377         {
378             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
379             if (!instance) {
380                 LOGE("CJ_GetPermission instance not exist %{public}" PRId64, id);
381                 return nullptr;
382             }
383             auto str = instance->GetPermission();
384             auto ret = MallocCString(str);
385             return ret;
386         }
387 
CJ_GetDeviceId(int64_t id)388         const char *CJ_GetDeviceId(int64_t id)
389         {
390             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
391             if (!instance) {
392                 LOGE("CJ_GetDeviceId instance not exist %{public}" PRId64, id);
393                 return nullptr;
394             }
395             auto str = instance->GetDeviceId();
396             auto ret = MallocCString(str);
397             return ret;
398         }
399 
CJ_GetUserId(int64_t id)400         int32_t CJ_GetUserId(int64_t id)
401         {
402             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
403             if (!instance) {
404                 LOGE("CJ_GetUserId instance not exist %{public}" PRId64, id);
405                 return 0;
406             }
407             return instance->GetUserId();
408         }
409 
CJ_GetPriority(int64_t id)410         int32_t CJ_GetPriority(int64_t id)
411         {
412             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
413             if (!instance) {
414                 LOGE("CJ_GetPriority instance not exist %{public}" PRId64, id);
415                 return 0;
416             }
417             return instance->GetPriority();
418         }
419 
CJ_GetBundleName(int64_t id)420         const char *CJ_GetBundleName(int64_t id)
421         {
422             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
423             if (!instance) {
424                 LOGE("CJ_GetBundleName instance not exist %{public}" PRId64, id);
425                 return nullptr;
426             }
427             auto str = instance->GetPublisherBundleName();
428             auto ret = MallocCString(str);
429             return ret;
430         }
431 
ClearCharPointer(char ** ptr,int count)432         void ClearCharPointer(char** ptr, int count)
433         {
434             for (int i = 0; i < count; i++) {
435                 free(ptr[i]);
436                 ptr[i] = nullptr;
437             }
438         }
439 
VectorToCharPointer(std::vector<std::string> & vec)440         char **VectorToCharPointer(std::vector<std::string> &vec)
441         {
442             char** result = static_cast<char**>(malloc(sizeof(char*) * vec.size()));
443             if (result == nullptr) {
444                 return nullptr;
445             }
446             for (size_t i = 0; i < vec.size(); i++) {
447                 result[i] = MallocCString(vec[i]);
448                 if (result[i] == nullptr) {
449                     ClearCharPointer(result, i);
450                     free(result);
451                     return nullptr;
452                 }
453             }
454             return result;
455         }
456 
CJ_GetEvents(int64_t id)457         CArrString CJ_GetEvents(int64_t id)
458         {
459             auto instance = FFIData::GetData<CommonEventSubscribeInfoImpl>(id);
460             CArrString ret = {.head = nullptr, .size = 0};
461             if (!instance) {
462                 LOGE("CJ_GetEvents instance not exist %{public}" PRId64, id);
463                 return ret;
464             }
465             auto vStr = instance->GetEvents();
466             if (vStr.size() == 0) {
467                 return ret;
468             }
469             ret.head = VectorToCharPointer(vStr);
470             ret.size = static_cast<int64_t>(vStr.size());
471             if (ret.head == nullptr) {
472                 LOGE("Failed to malloc.");
473                 ret.size = 0;
474             }
475             return ret;
476         }
477     }
478 }