1 /* 2 * Copyright (c) 2021-2022 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 NAPI_IPC_OHOS_REMOTE_OBJECT_H 17 #define NAPI_IPC_OHOS_REMOTE_OBJECT_H 18 19 #include <set> 20 #include "iremote_object.h" 21 #include "napi/native_api.h" 22 #include "napi/native_node_api.h" 23 #include "refbase.h" 24 25 constexpr size_t TRACESIZE = 64; 26 namespace OHOS { 27 EXTERN_C_START 28 napi_value NAPIIPCSkeletonExport(napi_env env, napi_value exports); 29 napi_value NAPIRemoteProxyExport(napi_env env, napi_value exports); 30 napi_value NAPIRemoteObjectExport(napi_env env, napi_value exports); 31 napi_value NAPIMessageOptionExport(napi_env env, napi_value exports); 32 EXTERN_C_END 33 34 /* 35 * The native DeathRecipient container. 36 * As an recipient of obituary of service death, 37 * and pass the message to js Layer. 38 */ 39 class NAPIDeathRecipient : public IRemoteObject::DeathRecipient { 40 public: 41 explicit NAPIDeathRecipient(napi_env env, napi_value jsRecipient); 42 43 void OnRemoteDied(const wptr<IRemoteObject> &object) override; 44 45 bool Matches(napi_value jsRecipient); 46 47 protected: 48 virtual ~NAPIDeathRecipient(); 49 50 private: 51 struct OnRemoteDiedParam { 52 napi_env env; 53 napi_ref deathRecipientRef; 54 }; 55 napi_env env_ = nullptr; 56 napi_ref deathRecipientRef_ = nullptr; 57 }; 58 59 /* 60 * List of native NAPIDeathRecipient 61 */ 62 class NAPIDeathRecipientList : public RefBase { 63 public: 64 NAPIDeathRecipientList(); 65 66 ~NAPIDeathRecipientList(); 67 68 bool Add(const sptr<NAPIDeathRecipient> &recipient); 69 70 bool Remove(const sptr<NAPIDeathRecipient> &recipient); 71 72 sptr<NAPIDeathRecipient> Find(napi_value jsRecipient); 73 74 private: 75 std::mutex mutex_; 76 std::set<sptr<NAPIDeathRecipient>> set_; 77 }; 78 79 class NAPIRemoteProxyHolder { 80 public: 81 NAPIRemoteProxyHolder(); 82 ~NAPIRemoteProxyHolder(); 83 sptr<NAPIDeathRecipientList> list_; 84 sptr<IRemoteObject> object_; 85 }; 86 87 struct CallingInfo { 88 pid_t callingPid; 89 pid_t callingUid; 90 uint32_t callingTokenId; 91 std::string callingDeviceID; 92 std::string localDeviceID; 93 bool isLocalCalling; 94 int activeStatus; 95 }; 96 97 struct NAPI_CallingInfo { 98 napi_value callingPid; 99 napi_value callingUid; 100 napi_value callingTokenId; 101 napi_value callingDeviceID; 102 napi_value localDeviceID; 103 napi_value isLocalCalling; 104 napi_value activeStatus; 105 }; 106 // IPCSkeleton napi methods 107 napi_value NAPI_IPCSkeleton_getContextObject(napi_env env, napi_callback_info info); 108 109 napi_value NAPI_IPCSkeleton_getCallingPid(napi_env env, napi_callback_info info); 110 111 napi_value NAPI_IPCSkeleton_getCallingUid(napi_env env, napi_callback_info info); 112 113 napi_value NAPI_IPCSkeleton_getCallingDeviceID(napi_env env, napi_callback_info info); 114 115 napi_value NAPI_IPCSkeleton_getLocalDeviceID(napi_env env, napi_callback_info info); 116 117 napi_value NAPI_IPCSkeleton_isLocalCalling(napi_env env, napi_callback_info info); 118 119 napi_value NAPI_IPCSkeleton_flushCommands(napi_env env, napi_callback_info info); 120 121 napi_value NAPI_IPCSkeleton_flushCmdBuffer(napi_env env, napi_callback_info info); 122 123 napi_value NAPI_IPCSkeleton_resetCallingIdentity(napi_env env, napi_callback_info info); 124 125 napi_value NAPI_IPCSkeleton_setCallingIdentity(napi_env env, napi_callback_info info); 126 127 napi_value NAPI_IPCSkeleton_restoreCallingIdentity(napi_env env, napi_callback_info info); 128 129 napi_value NAPI_IPCSkeleton_getCallingTokenId(napi_env env, napi_callback_info info); 130 131 // RemoteObject napi methods 132 napi_value NAPI_RemoteObject_sendRequest(napi_env env, napi_callback_info info); 133 134 napi_value NAPI_RemoteObject_sendMessageRequest(napi_env env, napi_callback_info info); 135 136 napi_value NAPI_RemoteObject_getCallingPid(napi_env env, napi_callback_info info); 137 138 napi_value NAPI_RemoteObject_getCallingUid(napi_env env, napi_callback_info info); 139 140 napi_value NAPI_RemoteObject_getInterfaceDescriptor(napi_env env, napi_callback_info info); 141 142 napi_value NAPI_RemoteObject_getDescriptor(napi_env env, napi_callback_info info); 143 144 napi_value NAPI_RemoteObject_attachLocalInterface(napi_env env, napi_callback_info info); 145 146 napi_value NAPI_RemoteObject_modifyLocalInterface(napi_env env, napi_callback_info info); 147 148 napi_value NAPI_RemoteObject_queryLocalInterface(napi_env env, napi_callback_info info); 149 150 napi_value NAPI_RemoteObject_getLocalInterface(napi_env env, napi_callback_info info); 151 152 napi_value NAPI_RemoteObject_addDeathRecipient(napi_env env, napi_callback_info info); 153 154 napi_value NAPI_RemoteObject_registerDeathRecipient(napi_env env, napi_callback_info info); 155 156 napi_value NAPI_RemoteObject_removeDeathRecipient(napi_env env, napi_callback_info info); 157 158 napi_value NAPI_RemoteObject_unregisterDeathRecipient(napi_env env, napi_callback_info info); 159 160 napi_value NAPI_RemoteObject_isObjectDead(napi_env env, napi_callback_info info); 161 162 void NAPI_RemoteObject_getCallingInfo(CallingInfo &newCallingInfoParam); 163 164 void NAPI_RemoteObject_saveOldCallingInfo(napi_env env, NAPI_CallingInfo &oldCallingInfo); 165 166 void NAPI_RemoteObject_setNewCallingInfo(napi_env env, const CallingInfo &newCallingInfoParam); 167 168 void NAPI_RemoteObject_resetOldCallingInfo(napi_env env, NAPI_CallingInfo &oldCallingInfo); 169 170 // RemoteProxy napi methods 171 napi_value NAPI_RemoteProxy_sendRequest(napi_env env, napi_callback_info info); 172 173 napi_value NAPI_RemoteProxy_sendMessageRequest(napi_env env, napi_callback_info info); 174 175 napi_value NAPI_RemoteProxy_queryLocalInterface(napi_env env, napi_callback_info info); 176 177 napi_value NAPI_RemoteProxy_getLocalInterface(napi_env env, napi_callback_info info); 178 179 napi_value NAPI_RemoteProxy_addDeathRecipient(napi_env env, napi_callback_info info); 180 181 napi_value NAPI_RemoteProxy_registerDeathRecipient(napi_env env, napi_callback_info info); 182 183 napi_value NAPI_RemoteProxy_removeDeathRecipient(napi_env env, napi_callback_info info); 184 185 napi_value NAPI_RemoteProxy_unregisterDeathRecipient(napi_env env, napi_callback_info info); 186 187 napi_value NAPI_RemoteProxy_getInterfaceDescriptor(napi_env env, napi_callback_info info); 188 189 napi_value NAPI_RemoteProxy_getDescriptor(napi_env env, napi_callback_info info); 190 191 napi_value NAPI_RemoteProxy_isObjectDead(napi_env env, napi_callback_info info); 192 193 sptr<IRemoteObject> NAPI_ohos_rpc_getNativeRemoteObject(napi_env env, napi_value object); 194 195 napi_value NAPI_ohos_rpc_CreateJsRemoteObject(napi_env env, const sptr<IRemoteObject> target); 196 197 struct SendRequestParam { 198 sptr<IRemoteObject> target; 199 uint32_t code; 200 std::shared_ptr<MessageParcel> data; 201 std::shared_ptr<MessageParcel> reply; 202 MessageOption &option; 203 napi_async_work asyncWork; 204 napi_deferred deferred; 205 int errCode; 206 napi_ref jsCodeRef; 207 napi_ref jsDataRef; 208 napi_ref jsReplyRef; 209 napi_ref callback; 210 napi_env env; 211 std::string traceValue; 212 int32_t traceId; 213 }; 214 215 napi_value MakeSendRequestResult(SendRequestParam *param); 216 217 } // namespace OHOS 218 #endif // NAPI_IPC_OHOS_REMOTE_OBJECT_H 219