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 OHOS_DISTRIBUTED_COLLAB_SESSION_MANAGER_JS_ABILITY_CONNECTION_MANAGER_H 17 #define OHOS_DISTRIBUTED_COLLAB_SESSION_MANAGER_JS_ABILITY_CONNECTION_MANAGER_H 18 19 #include <utility> 20 21 #include "ability_connection_info.h" 22 #include "ability_info.h" 23 #include "js_ability_connection_session_listener.h" 24 #include "native_engine/native_engine.h" 25 #include "pixel_map_napi.h" 26 27 namespace OHOS { 28 namespace DistributedCollab { 29 using JsAbilityConnectionSessionListenerPtr = std::shared_ptr<JsAbilityConnectionSessionListener>; 30 struct AsyncConnectCallbackInfo { 31 napi_async_work asyncWork = nullptr; 32 napi_deferred deferred = nullptr; 33 napi_threadsafe_function tsfn = nullptr; 34 int32_t sessionId; 35 int32_t funResult; 36 ConnectResult result; 37 }; 38 39 struct AsyncCallbackInfo { 40 napi_async_work asyncWork = nullptr; 41 napi_deferred deferred = nullptr; 42 napi_threadsafe_function tsfn; 43 int32_t result; 44 int32_t sessionId; 45 std::string token; 46 std::string msg; 47 std::shared_ptr<AVTransDataBuffer> buffer = nullptr; 48 std::shared_ptr<Media::PixelMap> image = nullptr; 49 int32_t streamId; 50 StreamParams streamParam; 51 int32_t imageQuality = 30; 52 }; 53 54 enum BussinessErrorCode { 55 // Permission verification failed. 56 ERR_INVALID_PERMISSION = 201, 57 // The caller is not a system application. 58 ERR_NOT_SYSTEM_APP = 202, 59 // Input parameter error. 60 ERR_INVALID_PARAMS = 401, 61 // Multiple streams can not be created. 62 ERR_ONLY_SUPPORT_ONE_STREAM = 29425664, 63 // The stream at the receive end is not started. 64 ERR_RECEIVE_STREAM_NOT_START = 29425665, 65 }; 66 67 class JsAbilityConnectionManager final { 68 public: 69 JsAbilityConnectionManager() = default; 70 ~JsAbilityConnectionManager() = default; 71 72 static napi_value CreateAbilityConnectionSession(napi_env env, napi_callback_info info); 73 static napi_value DestroyAbilityConnectionSession(napi_env env, napi_callback_info info); 74 static napi_value GetPeerInfoById(napi_env env, napi_callback_info info); 75 static napi_value RegisterAbilityConnectionSessionCallback(napi_env env, napi_callback_info info); 76 static napi_value UnregisterAbilityConnectionSessionCallback(napi_env env, napi_callback_info info); 77 static napi_value Connect(napi_env env, napi_callback_info info); 78 static napi_value DisConnect(napi_env env, napi_callback_info info); 79 static napi_value AcceptConnect(napi_env env, napi_callback_info info); 80 static napi_value Reject(napi_env env, napi_callback_info info); 81 static napi_value SendMessage(napi_env env, napi_callback_info info); 82 static napi_value SendData(napi_env env, napi_callback_info info); 83 static napi_value SendImage(napi_env env, napi_callback_info info); 84 static napi_value CreateStream(napi_env env, napi_callback_info info); 85 static napi_value SetSurfaceId(napi_env env, napi_callback_info info); 86 static napi_value GetSurfaceId(napi_env env, napi_callback_info info); 87 static napi_value UpdateSurfaceParam(napi_env env, napi_callback_info info); 88 static napi_value DestroyStream(napi_env env, napi_callback_info info); 89 static napi_value StartStream(napi_env env, napi_callback_info info); 90 static napi_value StopStream(napi_env env, napi_callback_info info); 91 92 static napi_value OnCreateAbilityConnectionSession(napi_env env, napi_callback_info info); 93 94 private: 95 static bool JsToServiceName(const napi_env &env, const napi_value &jsValue, 96 std::string& serviceName); 97 static bool JsToAbilityInfo(const napi_env &env, const napi_value &jsValue, 98 std::shared_ptr<OHOS::AppExecFwk::AbilityInfo>& abilityInfo); 99 static bool JsToPeerInfo(const napi_env &env, const napi_value &jsValue, PeerInfo &peerInfo); 100 static int32_t JSToConnectOption(const napi_env &env, const napi_value &jsValue, ConnectOption &option); 101 static bool JsToStreamParam(const napi_env &env, const napi_value &jsValue, StreamParams &streamParam); 102 static bool GetStreamParamBitrate(const napi_env &env, const napi_value &jsValue, StreamParams &streamParam); 103 static bool JsToSurfaceParam(const napi_env &env, const napi_value &jsValue, SurfaceParams &surfaceParam); 104 105 static void ConnectThreadsafeFunctionCallback(napi_env env, napi_value js_callback, void* context, void* data); 106 static napi_status CreateConnectThreadsafeFunction(napi_env env, napi_value js_func, 107 napi_threadsafe_function* tsfn); 108 static void ExecuteConnect(napi_env env, void *data); 109 static void CompleteAsyncConnectWork(napi_env env, napi_status status, void* data); 110 static void ExecuteAcceptConnect(napi_env env, void *data); 111 static void ExecuteSendMessage(napi_env env, void *data); 112 static void ExecuteSendData(napi_env env, void *data); 113 static void ExecuteSendImage(napi_env env, void *data); 114 static void CompleteAsyncWork(napi_env env, napi_status status, void* data); 115 static void ExecuteCreateStream(napi_env env, void *data); 116 static void CompleteAsyncCreateStreamWork(napi_env env, napi_status status, void* data); 117 static void CreateSendDataAsyncWork(napi_env env, AsyncCallbackInfo* asyncCallbackInfo); 118 static void CreateStreamAsyncWork(napi_env env, AsyncCallbackInfo* asyncCallbackInfo); 119 static napi_value CreateSendImageAsyncWork(napi_env env, AsyncCallbackInfo* asyncCallbackInfo); 120 121 static bool IsSystemApp(); 122 static bool JsToInt32(const napi_env &env, const napi_value &value, 123 const std::string &valueName, int32_t &strValue); 124 static bool JsToString(const napi_env &env, const napi_value &value, const std::string &valueName, 125 std::string &strValue); 126 static bool JsObjectToString(const napi_env &env, const napi_value &object, const std::string &fieldStr, 127 std::string& fieldRef); 128 static bool JsObjectToBool(const napi_env &env, const napi_value &object, const std::string &fieldStr, 129 bool &fieldRef); 130 static bool JsObjectToInt(const napi_env &env, const napi_value &object, const std::string &fieldStr, 131 int32_t &fieldRef); 132 static int32_t CheckEventType(const std::string& eventType); 133 static bool UnwrapOptions(napi_env env, napi_value options, ConnectOption &connectOption); 134 static bool UnwrapStartOptions(napi_env env, napi_value startOptionsVal, ConnectOption &connectOption); 135 static bool UnwrapParameters(napi_env env, napi_value parameters, ConnectOption &option); 136 static bool IsTypeForNapiValue(napi_env env, napi_value param, napi_valuetype expectType); 137 static napi_value WrapPeerInfo(napi_env& env, const PeerInfo& peerInfo); 138 static int32_t CheckConnectOption(const ConnectOption &connectOption); 139 static napi_value ExecuteCreateSession(const std::string& serviceName, 140 std::shared_ptr<OHOS::AppExecFwk::AbilityInfo>& abilityInfo, PeerInfo& peerInfo, 141 ConnectOption& connectOption, const napi_env& env); 142 }; 143 144 napi_value JsAbilityConnectionManagerInit(napi_env env, napi_value exportObj); 145 } // namespace DistributedCollab 146 } // namespace OHOS 147 #endif // OHOS_DISTRIBUTED_COLLAB_SESSION_MANAGER_JS_ABILITY_CONNECTION_MANAGER_H