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#ifndef CAPI_INCLUDE_IPC_CREMOTE_OBJECT_H 17#define CAPI_INCLUDE_IPC_CREMOTE_OBJECT_H 18 19/** 20 * @addtogroup OHIPCRemoteObject 21 * @{ 22 * 23 * @brief Provides C interfaces for creating and destroying a remote object, transferring data, 24 * and observing the dead status of a remote object. 25 * 26 * @syscap SystemCapability.Communication.IPC.Core 27 * @since 12 28 */ 29 30/** 31 * @file ipc_cremote_object.h 32 * 33 * @brief Defines C interfaces for creating and destroying a remote object, transferring data, 34 * and observing the dead status of a remote object. 35 * 36 * @library libipc_capi.so 37 * @kit IPCKit 38 * @syscap SystemCapability.Communication.IPC.Core 39 * @since 12 40 */ 41 42#include <stdint.h> 43 44#include "ipc_cparcel.h" 45 46#ifdef __cplusplus 47extern "C" { 48#endif 49 50/** 51* @brief Defines an <b>OHIPCDeathRecipient</b> object, which is used to receive a notification 52* when the <b>OHIPCRemoteStub</b> object dies unexpectedly. 53* 54* @syscap SystemCapability.Communication.IPC.Core 55* @since 12 56*/ 57struct OHIPCDeathRecipient; 58 59/** 60* @brief Typedef an <b>OHIPCDeathRecipient</b> object. 61* 62* @syscap SystemCapability.Communication.IPC.Core 63* @since 12 64*/ 65typedef struct OHIPCDeathRecipient OHIPCDeathRecipient; 66 67/** 68 * @brief Called to process the remote data request at the stub. 69 * 70 * @syscap SystemCapability.Communication.IPC.Core 71 * @param code Custom command word for communication, in the range [0x01, 0x00ffffff]. 72 * @param data Pointer to the request data object. It cannot be NULL or released in the function. 73 * @param reply Pointer to the response data object. It cannot be NULL or released in the function. 74 * If this function returns an error, data cannot be written to this parameter. 75 * @param userData Pointer to the user data. It can be NULL. 76 * @return Returns {@link OH_IPC_ErrorCode#OH_IPC_SUCCESS} if the operation is successful. \n 77 * Returns a custom error code in the range [1909001, 1909999] or a system error code otherwise. \n 78 * Returns {@link OH_IPC_ErrorCode#OH_IPC_INVALID_USER_ERROR_CODE} if the custom error code is out of the value range. 79 * @since 12 80 */ 81typedef int (*OH_OnRemoteRequestCallback)(uint32_t code, const OHIPCParcel *data, 82 OHIPCParcel *reply, void *userData); 83 84/** 85 * @brief Called when an observed object is destroyed. 86 * 87 * @syscap SystemCapability.Communication.IPC.Core 88 * @param userData Pointer to the user data. It can be NULL. 89 * @since 12 90 */ 91typedef void (*OH_OnRemoteDestroyCallback)(void *userData); 92 93/** 94 * @brief Creates an <b>OHIPCRemoteStub</b> object. 95 * 96 * @syscap SystemCapability.Communication.IPC.Core 97 * @param descriptor Pointer to the descriptor of the <b>OHIPCRemoteStub</b> object to create. It cannot be NULL. 98 * @param requestCallback Callback used to process the data request. It cannot be NULL. 99 * @param destroyCallback Callback to be invoked when the object is destroyed. It can be NULL. 100 * @param userData Pointer to the user data. It can be NULL. 101 * @return Returns the pointer to the <b>OHIPCRemoteStub</b> object created if the operation is successful; 102 * returns NULL otherwise. 103 * @since 12 104 */ 105OHIPCRemoteStub* OH_IPCRemoteStub_Create(const char *descriptor, OH_OnRemoteRequestCallback requestCallback, 106 OH_OnRemoteDestroyCallback destroyCallback, void *userData); 107 108/** 109 * @brief Destroys an <b>OHIPCRemoteStub</b> object. 110 * 111 * @syscap SystemCapability.Communication.IPC.Core 112 * @param stub Pointer to the <b>OHIPCRemoteStub</b> object to destroy. 113 * @since 12 114 */ 115void OH_IPCRemoteStub_Destroy(OHIPCRemoteStub *stub); 116 117/** 118 * @brief Destroys an <b>OHIPCRemoteProxy</b> object. 119 * 120 * @syscap SystemCapability.Communication.IPC.Core 121 * @param proxy Pointer to the <b>OHIPCRemoteProxy</b> object to destroy. 122 * @since 12 123 */ 124void OH_IPCRemoteProxy_Destroy(OHIPCRemoteProxy *proxy); 125 126/** 127 * @brief Enumerates the IPC request modes. 128 * 129 * @since 12 130 */ 131typedef enum { 132 /** Synchronous request. */ 133 OH_IPC_REQUEST_MODE_SYNC = 0, 134 /** Asynchronous request. */ 135 OH_IPC_REQUEST_MODE_ASYNC = 1, 136} OH_IPC_RequestMode; 137 138/** 139 * @brief Defines the IPC message options. 140 * 141 * @since 12 142 */ 143#pragma pack(4) 144typedef struct { 145 /** Message request mode. */ 146 OH_IPC_RequestMode mode; 147 /** Parameter reserved for RPC, which is invalid for IPC. */ 148 uint32_t timeout; 149 /** Reserved parameter, which must be NULL. */ 150 void* reserved; 151} OH_IPC_MessageOption; 152#pragma pack() 153 154/** 155 * @brief Sends an IPC message. 156 * 157 * @syscap SystemCapability.Communication.IPC.Core 158 * @param proxy Pointer to the <b>OHIPCRemoteProxy</b> object. It cannot be NULL. 159 * @param code Custom IPC command word, in the range [0x01, 0x00ffffff]. 160 * @param data Pointer to the request data object. It cannot be NULL. 161 * @param reply Pointer to the response data object. It cannot be NULL in the case of a synchronous request, 162 * and can be NULL in the case of an asynchronous request. 163 * @param option Pointer to the message options. It can be NULL, which indicates a synchronous request. 164 * @return Returns {@link OH_IPC_ErrorCode#OH_IPC_SUCCESS} if the operation is successful. \n 165 * Returns {@link OH_IPC_ErrorCode#OH_IPC_CHECK_PARAM_ERROR} if invalid parameters are found. \n 166 * Returns {@link OH_IPC_ErrorCode#OH_IPC_DEAD_REMOTE_OBJECT} if the <b>OHIPCRemoteStub</b> object is dead. \n 167 * Returns {@link OH_IPC_ErrorCode#OH_IPC_CODE_OUT_OF_RANGE} if the error code is out of the value range. \n 168 * Returns {@link OH_IPC_ErrorCode#OH_IPC_INNER_ERROR} or a custom error code in other cases. 169 * @since 12 170 */ 171int OH_IPCRemoteProxy_SendRequest(const OHIPCRemoteProxy *proxy, uint32_t code, const OHIPCParcel *data, 172 OHIPCParcel *reply, const OH_IPC_MessageOption *option); 173 174/** 175 * @brief Obtains the interface descriptor from the stub. 176 * 177 * @syscap SystemCapability.Communication.IPC.Core 178 * @param proxy Pointer to the <b>OHIPCRemoteProxy</b> object. It cannot be NULL. 179 * @param descriptor Double pointer to the address of the memory for holding the interface descriptor. 180 * The memory is allocated by the allocator provided by the user and needs to be released. This pointer cannot be NULL. 181 * If an error code is returned, you still need to check whether the memory is empty and release the memory. 182 * Otherwise, memory leaks may occur. 183 * @param len Pointer to the length of the data to be written to the descriptor, including the terminator. 184 * This parameter cannot be NULL. 185 * @param allocator Memory allocator specified by the user for allocating memory for <b>descriptor</b>. 186 * It cannot be NULL. 187 * @return Returns {@link OH_IPC_ErrorCode#OH_IPC_SUCCESS} if the operation is successful. \n 188 * Returns {@link OH_IPC_ErrorCode#OH_IPC_CHECK_PARAM_ERROR} if incorrect parameters are found. \n 189 * Returns {@link OH_IPC_ErrorCode#OH_IPC_DEAD_REMOTE_OBJECT} if the <b>OHIPCRemoteStub</b> object is dead. \n 190 * Returns {@link OH_IPC_ErrorCode#OH_IPC_MEM_ALLOCATOR_ERROR} if memory allocation fails. \n 191 * Returns {@link OH_IPC_ErrorCode#OH_IPC_PARCEL_READ_ERROR} if the data in the serialized object failed to be read. 192 * @since 12 193 */ 194int OH_IPCRemoteProxy_GetInterfaceDescriptor(OHIPCRemoteProxy *proxy, char **descriptor, int32_t *len, 195 OH_IPC_MemAllocator allocator); 196 197/** 198 * @brief Called when the <b>OHIPCRemoteStub</b> object dies unexpectedly. 199 * 200 * @syscap SystemCapability.Communication.IPC.Core 201 * @param userData Pointer to the user data. It can be NULL. 202 * @since 12 203 */ 204typedef void (*OH_OnDeathRecipientCallback)(void *userData); 205 206/** 207 * @brief Called when the <b>OHIPCDeathRecipient</b> object is destroyed. 208 * 209 * @syscap SystemCapability.Communication.IPC.Core 210 * @param userData Pointer to the user data. It can be NULL. 211 * @since 12 212 */ 213typedef void (*OH_OnDeathRecipientDestroyCallback)(void *userData); 214 215/** 216 * @brief Creates an <b>OHIPCDeathRecipient</b> object, which allows a notification to be received 217 * when the <b>OHIPCRemoteStub</b> object dies unexpectedly. 218 * 219 * @syscap SystemCapability.Communication.IPC.Core 220 * @param deathRecipientCallback Callback to be invoked when the <b>OHIPCRemoteStub</b> object is dead. 221 * It cannot be NULL. 222 * @param destroyCallback Callback to be invoked when the object is destroyed. It can be NULL. 223 * @param userData Pointer to the user data. It can be NULL. 224 * @return Returns the pointer to the <b>OHIPCDeathRecipient</b> object created if the operation is successful; 225 * returns NULL otherwise. 226 * @since 12 227 */ 228OHIPCDeathRecipient* OH_IPCDeathRecipient_Create(OH_OnDeathRecipientCallback deathRecipientCallback, 229 OH_OnDeathRecipientDestroyCallback destroyCallback, void *userData); 230 231/** 232 * @brief Destroys an <b>OHIPCDeathRecipient</b> object. 233 * 234 * @syscap SystemCapability.Communication.IPC.Core 235 * @param recipient Pointer to the <b>OHIPCDeathRecipient</b> object to destroy. 236 * @since 12 237 */ 238void OH_IPCDeathRecipient_Destroy(OHIPCDeathRecipient *recipient); 239 240/** 241 * @brief Subscribes to the death of an <b>OHIPCRemoteStub</b> object for an <b>OHIPCRemoteProxy</b> object. 242 * 243 * @syscap SystemCapability.Communication.IPC.Core 244 * @param proxy Pointer to the <b>OHIPCRemoteProxy</b> object that subscribes to the death notification. 245 * It cannot be NULL. 246 * @param recipient Pointer to the object that receives the death notification of the <b>OHIPCRemoteStub</b> object. 247 * It cannot be NULL. 248 * @return Returns {@link OH_IPC_ErrorCode#OH_IPC_SUCCESS} if the operation is successful. \n 249 * Returns {@link OH_IPC_ErrorCode#OH_IPC_CHECK_PARAM_ERROR} if incorrect parameters are found. \n 250 * Returns {@link OH_IPC_ErrorCode#OH_IPC_INNER_ERROR} in other cases. 251 * @since 12 252 */ 253int OH_IPCRemoteProxy_AddDeathRecipient(OHIPCRemoteProxy *proxy, OHIPCDeathRecipient *recipient); 254 255/** 256 * @brief Unsubscribes from the death of the <b>OHIPCRemoteStub</b> object for an <b>OHIPCRemoteProxy</b> object. 257 * 258 * @syscap SystemCapability.Communication.IPC.Core 259 * @param proxy Pointer to the <b>OHIPCRemoteProxy</b> object that unsubscribes from the death notification. 260 * It cannot be NULL. 261 * @param recipient Pointer to the object that receives the death notification of the <b>OHIPCRemoteStub</b> object. 262 * It cannot be NULL. 263 * @return Returns {@link OH_IPC_ErrorCode#OH_IPC_SUCCESS} if the operation is successful. \n 264 * Returns {@link OH_IPC_ErrorCode#OH_IPC_CHECK_PARAM_ERROR} if incorrect parameters are found. \n 265 * Returns {@link OH_IPC_ErrorCode#OH_IPC_INNER_ERROR} in other cases. 266 * @since 12 267 */ 268int OH_IPCRemoteProxy_RemoveDeathRecipient(OHIPCRemoteProxy *proxy, OHIPCDeathRecipient *recipient); 269 270/** 271 * @brief Checks whether the <b>OHIPCRemoteStub</b> object corresponding to the <b>OHIPCRemoteProxy</b> object is dead. 272 * 273 * @syscap SystemCapability.Communication.IPC.Core 274 * @param proxy Pointer to the <b>OHIPCRemoteProxy</b> object to check. It cannot be NULL. 275 * @return Returns <b>1</b> if the <b>OHIPCRemoteStub</b> object is dead; returns <b>0</b> otherwise. 276 * If an invalid parameter is found, the <b>OHIPCRemoteStub</b> object does not exist. 277 * In this case, <b>1</b> is returned. 278 * @since 12 279 */ 280int OH_IPCRemoteProxy_IsRemoteDead(const OHIPCRemoteProxy *proxy); 281 282#ifdef __cplusplus 283} 284#endif 285 286/** @} */ 287#endif 288