From c52c4a828bf20a130547429d389a6874ea6e694b Mon Sep 17 00:00:00 2001 From: hanlin15 Date: Tue, 9 Sep 2025 17:53:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BE=9Bnative=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E4=B8=8EANI=E5=AF=B9=E8=B1=A1=E7=9B=B8=E4=BA=92=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hanlin15 --- bundle.json | 11 +- ipc/native/src/taihe/BUILD.gn | 28 +- ipc/native/src/taihe/idl/ohos.rpc.rpc.taihe | 4 + .../src/taihe/inc/remote_object_taihe_ani.h | 31 +++ ipc/native/src/taihe/inc/rpc_taihe_error.h | 56 ++-- ipc/native/src/taihe/inc/taihe_remote_proxy.h | 5 +- .../src/taihe/src/ohos.rpc.rpc.impl.cpp | 248 ++++++++++-------- .../src/taihe/src/remote_object_taihe_ani.cpp | 72 +++++ 8 files changed, 315 insertions(+), 140 deletions(-) create mode 100644 ipc/native/src/taihe/inc/remote_object_taihe_ani.h create mode 100644 ipc/native/src/taihe/src/remote_object_taihe_ani.cpp diff --git a/bundle.json b/bundle.json index 9c6c5ca8..3785e1b6 100644 --- a/bundle.json +++ b/bundle.json @@ -61,7 +61,16 @@ ], "inner_kits": [ { - "name": "//foundation/communication/ipc/ipc/native/src/taihe:rpc_taihe_idl" + "name": "//foundation/communication/ipc/ipc/native/src/taihe:rpc_taihe_idl" + }, + { + "name": "//foundation/communication/ipc/ipc/native/src/taihe:rpc_taihe", + "header": { + "header_files": [ + "remote_object_taihe_ani.h" + ], + "header_base": "//foundation/communication/ipc/ipc/native/src/taihe/inc" + } }, { "name": "//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core", diff --git a/ipc/native/src/taihe/BUILD.gn b/ipc/native/src/taihe/BUILD.gn index 1c9c51a2..eebdead5 100644 --- a/ipc/native/src/taihe/BUILD.gn +++ b/ipc/native/src/taihe/BUILD.gn @@ -21,6 +21,15 @@ if (support_jsapi) { TAIHE_FILE_PATH = "$taihe_file_path/out/$SUBSYSTEM_NAME/$PART_NAME" SUBSYSTEM_DIR = "//foundation/communication/ipc" +config("taihe_inc_config") { + include_dirs = [ + "$SUBSYSTEM_DIR/interfaces/innerkits/ipc_core/include", + "$SUBSYSTEM_DIR/ipc/native/src/taihe/inc", + "$SUBSYSTEM_DIR/utils/include", + "$SUBSYSTEM_DIR/ipc/native/src/napi_common/include", + ] +} + copy_taihe_idl("rpc_taihe_idl") { sources = [ "idl/ohos.rpc.rpc.taihe" ] } @@ -39,15 +48,12 @@ if (support_jsapi) { part_name = "$PART_NAME" subsystem_name = "$SUBSYSTEM_NAME" sources = get_target_outputs(":rpc_taihe_generate") - include_dirs = [ - "$SUBSYSTEM_DIR/interfaces/innerkits/ipc_core/include", - "$SUBSYSTEM_DIR/ipc/native/src/taihe/inc", - "$SUBSYSTEM_DIR/utils/include", - ] + public_configs = [ ":taihe_inc_config" ] sources += [ "src/ani_constructor.cpp", "src/ohos.rpc.rpc.impl.cpp", "src/rpc_taihe_error.cpp", + "src/remote_object_taihe_ani.cpp", ] deps = [ ":rpc_taihe_generate", @@ -85,7 +91,17 @@ if (support_jsapi) { ] } } else { + SUBSYSTEM_DIR = "//foundation/communication/ipc" + ohos_shared_library("rpc_taihe") { + include_dirs = [ + "$SUBSYSTEM_DIR/interfaces/innerkits/ipc_core/include", + "$SUBSYSTEM_DIR/ipc/native/src/taihe/inc", + "$SUBSYSTEM_DIR/utils/include", + ] + } group("rpc_taihe_components") { - deps = [] + deps = [ + ":rpc_taihe" + ] } } \ No newline at end of file diff --git a/ipc/native/src/taihe/idl/ohos.rpc.rpc.taihe b/ipc/native/src/taihe/idl/ohos.rpc.rpc.taihe index 4e088d25..2e433a6c 100644 --- a/ipc/native/src/taihe/idl/ohos.rpc.rpc.taihe +++ b/ipc/native/src/taihe/idl/ohos.rpc.rpc.taihe @@ -180,6 +180,10 @@ function CreateMessageSequence(): MessageSequence; @static("MessageSequence") function CloseFileDescriptor(fd: i32): void; +function unwrapRemoteObject(obj: IRemoteObjectUnion): i64; + +function wrapRemoteObject(nativePtr: i64): IRemoteObjectUnion; + interface IRemoteObject { GetLocalInterface(descriptor: String): IRemoteBroker; diff --git a/ipc/native/src/taihe/inc/remote_object_taihe_ani.h b/ipc/native/src/taihe/inc/remote_object_taihe_ani.h new file mode 100644 index 00000000..7f6efbf2 --- /dev/null +++ b/ipc/native/src/taihe/inc/remote_object_taihe_ani.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef REMOTE_OBJECT_TAIHE_ANI_H +#define REMOTE_OBJECT_TAIHE_ANI_H + +#include +#include + +namespace OHOS { + class IRemoteObject; +} +class RemoteObjectTaiheAni { +public: + OHOS::sptr nativeObject_; +}; +OHOS::sptr AniGetNativeRemoteObject(ani_env *env, ani_object obj); +ani_object ANI_ohos_rpc_CreateJsRemoteObject(ani_env *env, OHOS::sptr remoteObject); +#endif // REMOTE_OBJECT_TAIHE_ANI_H \ No newline at end of file diff --git a/ipc/native/src/taihe/inc/rpc_taihe_error.h b/ipc/native/src/taihe/inc/rpc_taihe_error.h index 97e3f432..0a025e54 100644 --- a/ipc/native/src/taihe/inc/rpc_taihe_error.h +++ b/ipc/native/src/taihe/inc/rpc_taihe_error.h @@ -21,20 +21,20 @@ namespace OHOS { enum RpcTaiheErrorCode { - TAIHE_CHECK_PARAM_ERROR, - TAIHE_OS_MMAP_ERROR, - TAIHE_OS_IOCTL_ERROR, - TAIHE_WRITE_TO_ASHMEM_ERROR, - TAIHE_READ_FROM_ASHMEM_ERROR, - TAIHE_ONLY_PROXY_OBJECT_PERMITTED_ERROR, - TAIHE_ONLY_REMOTE_OBJECT_PERMITTED_ERROR, - TAIHE_COMMUNICATION_ERROR, - TAIHE_PROXY_OR_REMOTE_OBJECT_INVALID_ERROR, - TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR, - TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, - TAIHE_PARCEL_MEMORY_ALLOC_ERROR, - TAIHE_CALL_JS_METHOD_ERROR, - TAIHE_OS_DUP_ERROR + RPC_ERR_CHECK_PARAM_ERROR, + RPC_ERR_OS_MMAP_ERROR, + RPC_ERR_OS_IOCTL_ERROR, + RPC_ERR_WRITE_TO_ASHMEM_ERROR, + RPC_ERR_READ_FROM_ASHMEM_ERROR, + RPC_ERR_ONLY_PROXY_OBJECT_PERMITTED_ERROR, + RPC_ERR_ONLY_REMOTE_OBJECT_PERMITTED_ERROR, + RPC_ERR_COMMUNICATION_ERROR, + RPC_ERR_PROXY_OR_REMOTE_OBJECT_INVALID_ERROR, + RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR, + RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + RPC_ERR_PARCEL_MEMORY_ALLOC_ERROR, + RPC_ERR_CALL_JS_METHOD_ERROR, + RPC_ERR_OS_DUP_ERROR }; struct RpcTaiheErrorInfo { @@ -59,20 +59,20 @@ struct RpcTaiheErrorInfo { } while (0) const std::map RPC_TAIHE_ERR_MAP { - { TAIHE_CHECK_PARAM_ERROR, { 401, "check param error" } }, - { TAIHE_OS_MMAP_ERROR, { 1900001, "os mmap function failed" } }, - { TAIHE_OS_IOCTL_ERROR, { 1900002, "os ioctl function failed" } }, - { TAIHE_WRITE_TO_ASHMEM_ERROR, { 1900003, "write to ashmem failed" } }, - { TAIHE_READ_FROM_ASHMEM_ERROR, { 1900004, "read from ashmem failed" } }, - { TAIHE_ONLY_PROXY_OBJECT_PERMITTED_ERROR, { 1900005, "only proxy object permitted" } }, - { TAIHE_ONLY_REMOTE_OBJECT_PERMITTED_ERROR, { 1900006, "only remote object permitted" } }, - { TAIHE_COMMUNICATION_ERROR, { 1900007, "communication failed" } }, - { TAIHE_PROXY_OR_REMOTE_OBJECT_INVALID_ERROR, { 1900008, "proxy or remote object is invalid" } }, - { TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR, { 1900009, "write data to message sequence failed" } }, - { TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, { 1900010, "read data from message sequence failed" } }, - { TAIHE_PARCEL_MEMORY_ALLOC_ERROR, { 1900011, "parcel memory alloc failed" } }, - { TAIHE_CALL_JS_METHOD_ERROR, { 1900012, "call js method failed" } }, - { TAIHE_OS_DUP_ERROR, { 1900013, "os dup function failed" } } + { RPC_ERR_CHECK_PARAM_ERROR, { 401, "check param error" } }, + { RPC_ERR_OS_MMAP_ERROR, { 1900001, "os mmap function failed" } }, + { RPC_ERR_OS_IOCTL_ERROR, { 1900002, "os ioctl function failed" } }, + { RPC_ERR_WRITE_TO_ASHMEM_ERROR, { 1900003, "write to ashmem failed" } }, + { RPC_ERR_READ_FROM_ASHMEM_ERROR, { 1900004, "read from ashmem failed" } }, + { RPC_ERR_ONLY_PROXY_OBJECT_PERMITTED_ERROR, { 1900005, "only proxy object permitted" } }, + { RPC_ERR_ONLY_REMOTE_OBJECT_PERMITTED_ERROR, { 1900006, "only remote object permitted" } }, + { RPC_ERR_COMMUNICATION_ERROR, { 1900007, "communication failed" } }, + { RPC_ERR_PROXY_OR_REMOTE_OBJECT_INVALID_ERROR, { 1900008, "proxy or remote object is invalid" } }, + { RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR, { 1900009, "write data to message sequence failed" } }, + { RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, { 1900010, "read data from message sequence failed" } }, + { RPC_ERR_PARCEL_MEMORY_ALLOC_ERROR, { 1900011, "parcel memory alloc failed" } }, + { RPC_ERR_CALL_JS_METHOD_ERROR, { 1900012, "call js method failed" } }, + { RPC_ERR_OS_DUP_ERROR, { 1900013, "os dup function failed" } } }; class RpcTaiheError { diff --git a/ipc/native/src/taihe/inc/taihe_remote_proxy.h b/ipc/native/src/taihe/inc/taihe_remote_proxy.h index 9ec46e09..290a661e 100644 --- a/ipc/native/src/taihe/inc/taihe_remote_proxy.h +++ b/ipc/native/src/taihe/inc/taihe_remote_proxy.h @@ -28,12 +28,13 @@ #include #include "ipc_object_proxy.h" +#include "taihe_deathrecipient.h" namespace OHOS { class RemoteProxyImpl { public: - RemoteProxyImpl(uintptr_t nativePtr); + RemoteProxyImpl(uintptr_t nativePtr, bool bRemoteObj = false); ::ohos::rpc::rpc::IRemoteBroker GetLocalInterface(::taihe::string_view descriptor); @@ -53,8 +54,8 @@ public: void AddJsObjWeakRef(::ohos::rpc::rpc::weak::RemoteProxy obj); static ::ohos::rpc::rpc::RemoteProxy CreateRemoteProxyFromNative(uintptr_t nativePtr); - private: + OHOS::sptr remoteObject_; OHOS::sptr cachedObject_; std::optional<::ohos::rpc::rpc::RemoteProxy> jsObjRef_; std::optional<::ohos::rpc::rpc::IRemoteBroker> jsLocalInterface_; diff --git a/ipc/native/src/taihe/src/ohos.rpc.rpc.impl.cpp b/ipc/native/src/taihe/src/ohos.rpc.rpc.impl.cpp index bfbd9e11..2482c5c3 100644 --- a/ipc/native/src/taihe/src/ohos.rpc.rpc.impl.cpp +++ b/ipc/native/src/taihe/src/ohos.rpc.rpc.impl.cpp @@ -29,6 +29,7 @@ #include "message_option.h" #include "refbase.h" #include "rpc_taihe_error.h" +#include "remote_object_taihe_ani.h" #include "taihe_ani_remote_object.h" #include "taihe_ashmem.h" @@ -58,7 +59,7 @@ constexpr size_t BYTE_SIZE_8 = 1; if ((maxCapacityToWrite) < (nativeParcel)->GetWritePosition()) { \ ZLOGE(LOG_LABEL, "invalid write position, maxCapacityToWrite:%{public}zu, GetWritePosition:%{public}zu", \ (maxCapacityToWrite), (nativeParcel)->GetWritePosition()); \ - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); \ + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); \ } \ } while (0) @@ -78,7 +79,7 @@ constexpr size_t BYTE_SIZE_8 = 1; if ((nativeParcel)->GetDataSize() < (nativeParcel)->GetReadPosition()) { \ ZLOGE(LOG_LABEL, "invalid read position, GetDataSize:%{public}zu, GetReadPosition:%{public}zu", \ (nativeParcel)->GetDataSize(), (nativeParcel)->GetReadPosition()); \ - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); \ + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); \ } \ } while (0) @@ -87,7 +88,8 @@ constexpr size_t BYTE_SIZE_8 = 1; if ((nativeParcel)->GetDataSize() < (nativeParcel)->GetReadPosition()) { \ ZLOGE(LOG_LABEL, "invalid read position, GetDataSize:%{public}zu, GetReadPosition:%{public}zu", \ (nativeParcel)->GetDataSize(), (nativeParcel)->GetReadPosition()); \ - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, retVal); \ + RPC_TAIHE_ERROR_WITH_RETVAL( + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, retVal); \ } \ } while (0) @@ -155,7 +157,7 @@ void DeathRecipientImpl::OnRemoteDied(const OHOS::wptr &obj jsObjRef_->OnRemoteDied(); if (taihe::has_error()) { ZLOGE(LOG_LABEL, "call onRemoteDied failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CALL_JS_METHOD_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CALL_JS_METHOD_ERROR); } } @@ -199,27 +201,34 @@ int ANIRemoteObject::GetObjectType() const } // RemoteProxyImpl -RemoteProxyImpl::RemoteProxyImpl(uintptr_t nativePtr) +RemoteProxyImpl::RemoteProxyImpl(uintptr_t nativePtr, bool bRemoteObj) { if (reinterpret_cast(nativePtr) == nullptr) { - ZLOGE(LOG_LABEL, "nativePtr is null"); TH_THROW(std::runtime_error, "RemoteProxyImpl nativePtr is nullptr"); return; } - auto proxy = reinterpret_cast(nativePtr); - if (proxy == nullptr) { - ZLOGE(LOG_LABEL, "reinterpret_cast nativePtr failed"); - TH_THROW(std::runtime_error, "RemoteProxyImpl reinterpret_cast nativePtr failed"); - return; + if (bRemoteObj) { + auto proxy = reinterpret_cast(nativePtr); + if (proxy == nullptr) { + TH_THROW(std::runtime_error, "RemoteProxyImpl reinterpret_cast nativePtr failed"); + return; + } + remoteObject_ = proxy->nativeObject_; + } else { + auto proxy = reinterpret_cast(nativePtr); + if (proxy == nullptr) { + TH_THROW(std::runtime_error, "RemoteProxyImpl reinterpret_cast nativePtr failed"); + return; + } + cachedObject_ = proxy; } - cachedObject_ = proxy; } ::ohos::rpc::rpc::IRemoteBroker RemoteProxyImpl::GetLocalInterface(::taihe::string_view descriptor) { ZLOGE(LOG_LABEL, "only RemoteObject permitted"); auto jsBroker = taihe::make_holder(); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_ONLY_REMOTE_OBJECT_PERMITTED_ERROR, jsBroker); + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_ONLY_REMOTE_OBJECT_PERMITTED_ERROR, jsBroker); } ::ohos::rpc::rpc::RequestResult RemoteProxyImpl::SendMessageRequestSync( @@ -315,17 +324,17 @@ AshmemImpl::AshmemImpl(OHOS::sptr ashmem) int32_t size = ashmem->GetAshmemSize(); if (fd < 0 || size == 0) { ZLOGE(LOG_LABEL, "fd < 0 or size == 0"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } int dupFd = dup(fd); if (dupFd < 0) { ZLOGE(LOG_LABEL, "fail to dup fd:%{public}d", dupFd); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_OS_DUP_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_OS_DUP_ERROR); } OHOS::sptr newAshmem(new (std::nothrow) OHOS::Ashmem(dupFd, size)); if (newAshmem == nullptr) { ZLOGE(LOG_LABEL, "fail to create new Ashmem"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_PARCEL_MEMORY_ALLOC_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_PARCEL_MEMORY_ALLOC_ERROR); } ashmem_ = newAshmem; } @@ -337,13 +346,13 @@ int64_t AshmemImpl::GetNativePtr() void AshmemImpl::MapReadWriteAshmem() { - CHECK_NATIVE_OBJECT(ashmem_, OHOS::RpcTaiheErrorCode::TAIHE_OS_MMAP_ERROR); + CHECK_NATIVE_OBJECT(ashmem_, OHOS::RpcTaiheErrorCode::RPC_ERR_OS_MMAP_ERROR); ashmem_->MapReadAndWriteAshmem(); } int32_t AshmemImpl::GetAshmemSize() { - CHECK_NATIVE_OBJECT_WITH_RETVAL(ashmem_, OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR, 0); + CHECK_NATIVE_OBJECT_WITH_RETVAL(ashmem_, OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR, 0); return ashmem_->GetAshmemSize(); } @@ -656,19 +665,19 @@ void MessageSequenceImpl::CreateJsMessageSequence(napi_env jsenv, napi_status st void MessageSequenceImpl::WriteRemoteObject(::ohos::rpc::rpc::IRemoteObjectUnion const& object) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); if (object.get_tag() == ::ohos::rpc::rpc::IRemoteObjectUnion::tag_t::remoteObject) { auto &remoteStub = object.get_remoteObject_ref(); OHOS::sptr nativeStub = reinterpret_cast(remoteStub->GetNativePtr()); if (nativeStub == nullptr) { ZLOGE(LOG_LABEL, "reinterpret_cast to IRemoteObject failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } bool result = nativeParcel_->WriteRemoteObject(nativeStub); if (!result) { ZLOGE(LOG_LABEL, "write RemoteObject failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } return; } else if (object.get_tag() == ::ohos::rpc::rpc::IRemoteObjectUnion::tag_t::remoteProxy) { @@ -677,7 +686,7 @@ void MessageSequenceImpl::WriteRemoteObject(::ohos::rpc::rpc::IRemoteObjectUnion bool result = nativeParcel_->WriteRemoteObject(nativeProxy); if (!result) { ZLOGE(LOG_LABEL, "write RemoteProxy failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } return; } else { @@ -688,11 +697,12 @@ void MessageSequenceImpl::WriteRemoteObject(::ohos::rpc::rpc::IRemoteObjectUnion ::ohos::rpc::rpc::IRemoteObjectUnion MessageSequenceImpl::ReadRemoteObject() { - CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::ohos::rpc::rpc::IRemoteObjectUnion::make_errRet()); OHOS::sptr obj = nativeParcel_->ReadRemoteObject(); if (obj == nullptr) { - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::ohos::rpc::rpc::IRemoteObjectUnion::make_errRet()); } if (obj->IsProxyObject()) { @@ -714,23 +724,50 @@ void MessageSequenceImpl::WriteRemoteObject(::ohos::rpc::rpc::IRemoteObjectUnion void MessageSequenceImpl::WriteInterfaceToken(::taihe::string_view token) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); if (token.size() > MAX_BYTES_LENGTH) { ZLOGE(LOG_LABEL, "token is too large"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } std::u16string tokenStr(token.begin(), token.end()); bool result = nativeParcel_->WriteInterfaceToken(tokenStr); if (!result) { ZLOGE(LOG_LABEL, "write interface token failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } +int64_t unwrapRemoteObject(::ohos::rpc::rpc::IRemoteObjectUnion const& obj) +{ + if (obj.get_tag() == ::ohos::rpc::rpc::IRemoteObjectUnion::tag_t::remoteObject) { + auto &remoteStub = obj.get_remoteObject_ref(); + int64_t objectptr = remoteStub->GetNativePtr(); + return objectptr; + } + if (obj.get_tag() == ::ohos::rpc::rpc::IRemoteObjectUnion::tag_t::remoteProxy) { + auto &remoteProxy = obj.get_remoteProxy_ref(); + int64_t proxyptr = remoteProxy->GetNativePtr(); + return proxyptr; + } + return 0; +} + +::ohos::rpc::rpc::IRemoteObjectUnion wrapRemoteObject(int64_t nativePtr) +{ + if (reinterpret_cast(nativePtr) == nullptr) { + ZLOGE(LOG_LABEL, "nativePtr is nullptr"); + TH_THROW(std::runtime_error, "nativePtr is null"); + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + ::ohos::rpc::rpc::IRemoteObjectUnion::make_errRet()); + } + ::ohos::rpc::rpc::RemoteProxy obj = taihe::make_holder(nativePtr, true); + return ::ohos::rpc::rpc::IRemoteObjectUnion::make_remoteProxy(obj); +} + ::taihe::string MessageSequenceImpl::ReadInterfaceToken() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ""); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ""); std::u16string result = nativeParcel_->ReadInterfaceToken(); return OHOS::Str16ToStr8(result); } @@ -738,34 +775,34 @@ void MessageSequenceImpl::WriteInterfaceToken(::taihe::string_view token) int32_t MessageSequenceImpl::GetCapacity() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); int32_t result = nativeParcel_->GetDataCapacity(); return result; } void MessageSequenceImpl::SetCapacity(int32_t size) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); bool result = nativeParcel_->SetDataCapacity(size); if (!result) { ZLOGE(LOG_LABEL, "set data capacity failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } void MessageSequenceImpl::WriteNoException() { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); bool result = nativeParcel_->WriteInt32(0); if (!result) { ZLOGE(LOG_LABEL, "write int32 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } void MessageSequenceImpl::ReadException() { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); int32_t code = nativeParcel_->ReadInt32(); if (code == 0) { ZLOGE(LOG_LABEL, "ReadException failed, no exception"); @@ -777,31 +814,31 @@ void MessageSequenceImpl::ReadException() void MessageSequenceImpl::WriteInt(int32_t val) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); bool result = nativeParcel_->WriteInt32(val); if (!result) { ZLOGE(LOG_LABEL, "write int32 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } void MessageSequenceImpl::WriteLong(int64_t val) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); bool result = nativeParcel_->WriteInt64(val); if (!result) { ZLOGE(LOG_LABEL, "write int64 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } void MessageSequenceImpl::WriteBoolean(bool val) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); bool result = nativeParcel_->WriteInt8(val); if (!result) { ZLOGE(LOG_LABEL, "write int8 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } @@ -809,38 +846,38 @@ void MessageSequenceImpl::WriteString(::taihe::string_view val) { if (val.size() > MAX_BYTES_LENGTH) { ZLOGE(LOG_LABEL, "write string failed, string size:%{public}zu is too large", val.size()); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); CHECK_WRITE_CAPACITY(BYTE_SIZE_32 * val.size(), nativeParcel_, (nativeParcel_->GetMaxCapacity())); std::u16string str(val.begin(), val.end()); bool result = nativeParcel_->WriteString16(str); if (!result) { ZLOGE(LOG_LABEL, "write string16 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } void MessageSequenceImpl::WriteParcelable(::ohos::rpc::rpc::weak::Parcelable val) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); size_t pos = nativeParcel_->GetWritePosition(); nativeParcel_->WriteInt32(1); val->Marshalling(*jsObjRef_); if (taihe::has_error()) { ZLOGE(LOG_LABEL, "call marshalling failed"); nativeParcel_->RewindWrite(pos); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CALL_JS_METHOD_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CALL_JS_METHOD_ERROR); } } void MessageSequenceImpl::WriteByteArray(::taihe::array_view byteArray) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); uint32_t arrayLength = byteArray.size(); if (arrayLength == 0) { ZLOGE(LOG_LABEL, "arrayLength is 0"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } CHECK_WRITE_CAPACITY(BYTE_SIZE_32 + (BYTE_SIZE_8 * arrayLength), nativeParcel_, nativeParcel_->GetMaxCapacity()); size_t pos = nativeParcel_->GetWritePosition(); @@ -851,18 +888,19 @@ void MessageSequenceImpl::WriteByteArray(::taihe::array_view byteArray) if (!result) { nativeParcel_->RewindWrite(pos); ZLOGE(LOG_LABEL, "write int8 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + } } } void MessageSequenceImpl::WriteIntArray(::taihe::array_view intArray) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); uint32_t arrayLength = intArray.size(); if (arrayLength == 0) { ZLOGE(LOG_LABEL, "arrayLength is 0"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } CHECK_WRITE_CAPACITY(BYTE_SIZE_32 * (arrayLength + 1), nativeParcel_, nativeParcel_->GetMaxCapacity()); size_t pos = nativeParcel_->GetWritePosition(); @@ -873,18 +911,18 @@ void MessageSequenceImpl::WriteIntArray(::taihe::array_view intArray) if (!result) { nativeParcel_->RewindWrite(pos); ZLOGE(LOG_LABEL, "write int32 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } } void MessageSequenceImpl::WriteDoubleArray(::taihe::array_view doubleArray) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); uint32_t arrayLength = doubleArray.size(); if (arrayLength == 0) { ZLOGE(LOG_LABEL, "arrayLength is 0"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } CHECK_WRITE_CAPACITY(BYTE_SIZE_32 + sizeof(double) * arrayLength, nativeParcel_, nativeParcel_->GetMaxCapacity()); size_t pos = nativeParcel_->GetWritePosition(); @@ -895,18 +933,18 @@ void MessageSequenceImpl::WriteDoubleArray(::taihe::array_view doubleArr if (!result) { nativeParcel_->RewindWrite(pos); ZLOGE(LOG_LABEL, "write double failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } } void MessageSequenceImpl::WriteBooleanArray(::taihe::array_view booleanArray) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); uint32_t arrayLength = booleanArray.size(); if (arrayLength == 0) { ZLOGE(LOG_LABEL, "arrayLength is 0"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } CHECK_WRITE_CAPACITY(BYTE_SIZE_32 + (BYTE_SIZE_8 * arrayLength), nativeParcel_, nativeParcel_->GetMaxCapacity()); size_t pos = nativeParcel_->GetWritePosition(); @@ -917,18 +955,18 @@ void MessageSequenceImpl::WriteBooleanArray(::taihe::array_view booleanArr if (!result) { nativeParcel_->RewindWrite(pos); ZLOGE(LOG_LABEL, "write int8 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } } void MessageSequenceImpl::WriteStringArray(::taihe::array_view<::taihe::string> stringArray) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); uint32_t arrayLength = stringArray.size(); if (arrayLength == 0) { ZLOGE(LOG_LABEL, "arrayLength is 0"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } size_t pos = nativeParcel_->GetWritePosition(); nativeParcel_->WriteUint32(arrayLength); @@ -937,7 +975,7 @@ void MessageSequenceImpl::WriteStringArray(::taihe::array_view<::taihe::string> if (stringArray[i].size() > MAX_BYTES_LENGTH) { ZLOGE(LOG_LABEL, "string length is too long, index:%{public}zu, size:%{public}zu", i, stringArray[i].size()); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } REWIND_IF_WRITE_CHECK_FAIL(BYTE_SIZE_32 + (BYTE_SIZE_16 * stringArray[i].size()), pos, nativeParcel_, (nativeParcel_->GetMaxCapacity())); @@ -946,23 +984,23 @@ void MessageSequenceImpl::WriteStringArray(::taihe::array_view<::taihe::string> if (!result) { nativeParcel_->RewindWrite(pos); ZLOGE(LOG_LABEL, "write string16 failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } } void MessageSequenceImpl::WriteParcelableArray(::taihe::array_view<::ohos::rpc::rpc::Parcelable> parcelableArray) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); uint32_t arrayLength = parcelableArray.size(); if (arrayLength == 0) { ZLOGE(LOG_LABEL, "arrayLength is 0"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } size_t pos = nativeParcel_->GetWritePosition(); if (!(nativeParcel_->WriteUint32(arrayLength))) { ZLOGE(LOG_LABEL, "write array length failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } for (size_t i = 0; i < arrayLength; i++) { nativeParcel_->WriteInt32(1); @@ -970,7 +1008,7 @@ void MessageSequenceImpl::WriteParcelableArray(::taihe::array_view<::ohos::rpc:: if (taihe::has_error()) { nativeParcel_->RewindWrite(pos); ZLOGE(LOG_LABEL, "call marshalling failed, element index:%{public}zu", i); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CALL_JS_METHOD_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CALL_JS_METHOD_ERROR); } } } @@ -978,54 +1016,54 @@ void MessageSequenceImpl::WriteParcelableArray(::taihe::array_view<::ohos::rpc:: int32_t MessageSequenceImpl::ReadInt() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); return nativeParcel_->ReadInt32(); } int64_t MessageSequenceImpl::ReadLong() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); return nativeParcel_->ReadInt64(); } bool MessageSequenceImpl::ReadBoolean() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, false); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, false); return static_cast(nativeParcel_->ReadInt8()); } ::taihe::string MessageSequenceImpl::ReadString() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ""); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ""); return OHOS::Str16ToStr8(nativeParcel_->ReadString16()); } void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable dataIn) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); int32_t flags = nativeParcel_->ReadInt32(); if (flags != 1) { ZLOGE(LOG_LABEL, "read parcelable failed, flags:%{public}d", flags); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); } dataIn->Unmarshalling(*jsObjRef_); if (taihe::has_error()) { ZLOGE(LOG_LABEL, "call marshalling failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CALL_JS_METHOD_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CALL_JS_METHOD_ERROR); } } ::taihe::array MessageSequenceImpl::ReadIntArrayImpl() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); int32_t arrayLength = nativeParcel_->ReadInt32(); if (arrayLength <= 0) { ZLOGE(LOG_LABEL, "arrayLength:%{public}d <= 0", arrayLength); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR, (::taihe::array(nullptr, 0))); } CHECK_READ_LENGTH_RETVAL(static_cast(arrayLength), BYTE_SIZE_32, @@ -1034,7 +1072,7 @@ void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable data for (uint32_t i = 0; i < static_cast(arrayLength); i++) { if (!nativeParcel_->ReadInt32(res[i])) { ZLOGE(LOG_LABEL, "read int32 failed"); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, (::taihe::array(nullptr, 0))); } } @@ -1044,11 +1082,11 @@ void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable data ::taihe::array MessageSequenceImpl::ReadDoubleArrayImpl() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); int32_t arrayLength = nativeParcel_->ReadInt32(); if (arrayLength <= 0) { ZLOGE(LOG_LABEL, "arrayLength:%{public}d <= 0", arrayLength); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR, (::taihe::array(nullptr, 0))); } CHECK_READ_LENGTH_RETVAL(static_cast(arrayLength), sizeof(double), @@ -1057,7 +1095,7 @@ void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable data for (uint32_t i = 0; i < static_cast(arrayLength); i++) { if (!nativeParcel_->ReadDouble(res[i])) { ZLOGE(LOG_LABEL, "read double failed"); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, (::taihe::array(nullptr, 0))); } } @@ -1067,11 +1105,11 @@ void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable data ::taihe::array MessageSequenceImpl::ReadBooleanArrayImpl() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); int32_t arrayLength = nativeParcel_->ReadInt32(); if (arrayLength <= 0) { ZLOGE(LOG_LABEL, "arrayLength:%{public}d <= 0", arrayLength); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR, (::taihe::array(nullptr, 0))); } CHECK_READ_LENGTH_RETVAL(static_cast(arrayLength), BYTE_SIZE_8, @@ -1081,7 +1119,7 @@ void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable data for (uint32_t i = 0; i < static_cast(arrayLength); i++) { if (!nativeParcel_->ReadInt8(val)) { ZLOGE(LOG_LABEL, "read bool failed"); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, (::taihe::array(nullptr, 0))); } res[i] = (val != 0) ? true : false; @@ -1091,12 +1129,13 @@ void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable data ::taihe::array<::taihe::string> MessageSequenceImpl::ReadStringArrayImpl() { - CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array<::taihe::string>(nullptr, 0)); int32_t arrayLength = nativeParcel_->ReadInt32(); if (arrayLength <= 0) { ZLOGE(LOG_LABEL, "arrayLength:%{public}d <= 0", arrayLength); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR, (::taihe::array<::taihe::string>(nullptr, 0))); } std::vector res; @@ -1107,7 +1146,7 @@ void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable data } if (!nativeParcel_->ReadString16(val)) { ZLOGE(LOG_LABEL, "read string16 failed"); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, (::taihe::array<::taihe::string>(nullptr, 0))); } res.push_back(OHOS::Str16ToStr8(val)); @@ -1117,67 +1156,67 @@ void MessageSequenceImpl::ReadParcelable(::ohos::rpc::rpc::weak::Parcelable data void MessageSequenceImpl::ReadParcelableArray(::taihe::array_view<::ohos::rpc::rpc::Parcelable> parcelableArray) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); int32_t arrayLength = nativeParcel_->ReadInt32(); if (arrayLength <= 0) { ZLOGE(LOG_LABEL, "arrayLength:%{public}d <= 0", arrayLength); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } int32_t flags; for (uint32_t i = 0; i < static_cast(arrayLength); i++) { flags = nativeParcel_->ReadInt32(); if (flags != 1) { ZLOGE(LOG_LABEL, "read parcelable failed, flags:%{public}d", flags); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR); } parcelableArray[i]->Unmarshalling(*jsObjRef_); if (taihe::has_error()) { ZLOGE(LOG_LABEL, "call unmarshalling failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CALL_JS_METHOD_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CALL_JS_METHOD_ERROR); } } } void MessageSequenceImpl::WriteFileDescriptor(int32_t fd) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); bool result = nativeParcel_->WriteFileDescriptor(fd); if (!result) { ZLOGE(LOG_LABEL, "write file descriptor failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } int32_t MessageSequenceImpl::ReadFileDescriptor() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); int32_t result = nativeParcel_->ReadFileDescriptor(); if (result < 0) { ZLOGE(LOG_LABEL, "read file descriptor failed"); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, 0); } return result; } void MessageSequenceImpl::WriteAshmem(::ohos::rpc::rpc::weak::Ashmem ashmem) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); if (!nativeParcel_->WriteAshmem(reinterpret_cast(ashmem->GetNativePtr()))) { ZLOGE(LOG_LABEL, "write ashmem failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } ::ohos::rpc::rpc::Ashmem MessageSequenceImpl::ReadAshmem() { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, (taihe::make_holder())); OHOS::sptr nativeAshmem = nativeParcel_->ReadAshmem(); if (nativeAshmem == nullptr) { ZLOGE(LOG_LABEL, "nativeAshmem is null"); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, (taihe::make_holder())); } return taihe::make_holder(nativeAshmem); @@ -1185,26 +1224,26 @@ void MessageSequenceImpl::WriteAshmem(::ohos::rpc::rpc::weak::Ashmem ashmem) void MessageSequenceImpl::WriteRawDataBuffer(::taihe::array_view rawData, int32_t size) { - CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + CHECK_NATIVE_OBJECT(nativeParcel_, OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); if (!nativeParcel_->WriteRawData(static_cast(rawData.data()), size)) { ZLOGE(LOG_LABEL, "write raw data failed"); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR); } } ::taihe::array MessageSequenceImpl::ReadRawDataBuffer(int32_t size) { CHECK_NATIVE_OBJECT_WITH_RETVAL(nativeParcel_, - OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); + OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); if (size <= 0) { ZLOGE(LOG_LABEL, "invalid param size:%{public}d", size); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR, (::taihe::array(nullptr, 0))); } const void *rawData = nativeParcel_->ReadRawData(size); if (rawData == nullptr) { ZLOGE(LOG_LABEL, "rawData is null"); - RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::TAIHE_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, + RPC_TAIHE_ERROR_WITH_RETVAL(OHOS::RpcTaiheErrorCode::RPC_ERR_READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, ::taihe::array(nullptr, 0)); } const uint8_t* bytePtr = static_cast(rawData); @@ -1235,7 +1274,7 @@ void MessageSequenceImpl::CloseFileDescriptor(int32_t fd) { if (fd < 0) { ZLOGE(LOG_LABEL, "invalid fd:%{public}d", fd); - RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::TAIHE_CHECK_PARAM_ERROR); + RPC_TAIHE_ERROR(OHOS::RpcTaiheErrorCode::RPC_ERR_CHECK_PARAM_ERROR); } close(fd); } @@ -1277,7 +1316,8 @@ void MessageOptionImpl::AddJsObjWeakRef(::ohos::rpc::rpc::weak::MessageOption ob jsObjRef_ = std::optional<::ohos::rpc::rpc::MessageOption>(std::in_place, obj); } -::ohos::rpc::rpc::MessageOption MessageOptionImpl::CreateMessageOption_WithTwoParam(int32_t syncFlags, int32_t waitTime) +::ohos::rpc::rpc::MessageOption MessageOptionImpl::CreateMessageOption_WithTwoParam(int32_t syncFlags, + int32_t waitTime) { return taihe::make_holder(syncFlags, waitTime); } @@ -1339,4 +1379,6 @@ TH_EXPORT_CPP_API_GetCallingPid(OHOS::IPCSkeletonImpl::GetCallingPid); TH_EXPORT_CPP_API_GetCallingUid(OHOS::IPCSkeletonImpl::GetCallingUid); TH_EXPORT_CPP_API_GetCallingTokenId(OHOS::IPCSkeletonImpl::GetCallingTokenId); TH_EXPORT_CPP_API_GetContextObject(OHOS::IPCSkeletonImpl::GetContextObject); +TH_EXPORT_CPP_API_unwrapRemoteObject(OHOS::unwrapRemoteObject); +TH_EXPORT_CPP_API_wrapRemoteObject(OHOS::wrapRemoteObject); // NOLINTEND \ No newline at end of file diff --git a/ipc/native/src/taihe/src/remote_object_taihe_ani.cpp b/ipc/native/src/taihe/src/remote_object_taihe_ani.cpp new file mode 100644 index 00000000..a71c0300 --- /dev/null +++ b/ipc/native/src/taihe/src/remote_object_taihe_ani.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "remote_object_taihe_ani.h" + +#include +#include "ipc_debug.h" +#include "iremote_object.h" +#include "ipc_object_stub.h" +#include "hilog/log.h" +#include "log_tags.h" +// This file is for legacy ANI backward compatibility + +using namespace OHOS; +using namespace arkts; +static constexpr OHOS::HiviewDFX::HiLogLabel LOG_LABEL = { LOG_CORE, LOG_ID_IPC_OTHER, "rpc_taihe" }; + +ani_object ANI_ohos_rpc_CreateJsRemoteObject(ani_env* env, OHOS::sptr remoteObject) +{ + std::unique_ptr taiheAniobj = std::make_unique(); + taiheAniobj->nativeObject_ = remoteObject; + + ani_signature::Namespace ns = ani_signature::Builder::BuildNamespace("@ohos.rpc.rpc"); + ani_namespace imageNamespace; + if (env->FindNamespace(ns.Descriptor().c_str(), &imageNamespace) != ANI_OK) { + ZLOGD(LOG_LABEL, "FindNamespace error"); + return nullptr; + } + ani_function createFunc; + if (env->Namespace_FindFunction(imageNamespace, "wrapRemoteObject", nullptr, &createFunc) != ANI_OK) { + ZLOGI(LOG_LABEL, "FindFunction error"); + return nullptr; + } + ani_ref remoteObj; + if (env->Function_Call_Ref(createFunc, &remoteObj, reinterpret_cast(taiheAniobj.get())) == ANI_OK) { + taiheAniobj.release(); + } else { + ZLOGI(LOG_LABEL, "Call_Ref error"); + return nullptr; + } + return reinterpret_cast(remoteObj); +} + +OHOS::sptr AniGetNativeRemoteObject(ani_env* env, ani_object obj) +{ + ani_signature::Namespace ns = ani_signature::Builder::BuildNamespace("@ohos.rpc.rpc"); + ani_namespace imageNamespace; + if (env->FindNamespace(ns.Descriptor().c_str(), &imageNamespace) != ANI_OK) { + return nullptr; + } + ani_function createFunc; + if (env->Namespace_FindFunction(imageNamespace, "unwrapRemoteObject", nullptr, &createFunc) != ANI_OK) { + return nullptr; + } + ani_long implPtr; + if (!(env->Function_Call_Long(createFunc, &implPtr, obj) == ANI_OK)) { + return nullptr; + } + return reinterpret_cast(implPtr); +} \ No newline at end of file -- Gitee