• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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