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 }