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