1 /*
2  * Copyright (c) 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 OHOS_DISTRIBUTED_ABILITY_MANAGER_JS_CONTINUATION_MANAGER_H
17 #define OHOS_DISTRIBUTED_ABILITY_MANAGER_JS_CONTINUATION_MANAGER_H
18 
19 #include <utility>
20 
21 #include "continuation_extra_params.h"
22 #include "device_connect_status.h"
23 #include "js_device_selection_listener.h"
24 #include "native_engine/native_engine.h"
25 #include "nlohmann/json.hpp"
26 
27 namespace OHOS {
28 namespace DistributedSchedule {
29 using JsDeviceSelectionListenerPtr = std::shared_ptr<JsDeviceSelectionListener>;
30 
31 class JsContinuationManager final {
32 public:
33     JsContinuationManager() = default;
34     ~JsContinuationManager() = default;
35 
36     static void Finalizer(napi_env env, void* data, void* hint);
37     static napi_value Register(napi_env env, napi_callback_info info);
38     static napi_value Unregister(napi_env env, napi_callback_info info);
39     static napi_value RegisterDeviceSelectionCallback(napi_env env, napi_callback_info info);
40     static napi_value UnregisterDeviceSelectionCallback(napi_env env, napi_callback_info info);
41     static napi_value UpdateConnectStatus(napi_env env, napi_callback_info info);
42     static napi_value StartDeviceManager(napi_env env, napi_callback_info info);
43     static napi_value InitDeviceConnectStateObject(napi_env env, napi_callback_info info);
44     static napi_value InitContinuationModeObject(napi_env env, napi_callback_info info);
45     static napi_value RegisterContinuation(napi_env env, napi_callback_info info);
46     static napi_value UnregisterContinuation(napi_env env, napi_callback_info info);
47     static napi_value UpdateContinuationState(napi_env env, napi_callback_info info);
48     static napi_value StartContinuationDeviceManager(napi_env env, napi_callback_info info);
49 
50 private:
51     using CallbackPair = std::pair<std::unique_ptr<NativeReference>, sptr<JsDeviceSelectionListener>>;
52     napi_value OnRegister(napi_env env, napi_callback_info info);
53     napi_value OnUnregister(napi_env env, napi_callback_info info);
54     napi_value OnRegisterDeviceSelectionCallback(napi_env env, napi_callback_info info);
55     napi_value OnUnregisterDeviceSelectionCallback(napi_env env, napi_callback_info info);
56     napi_value OnUpdateConnectStatus(napi_env env, napi_callback_info info);
57     int32_t GetInfoForUpdateConnectStatus(napi_env env,
58         napi_value *argv, int32_t &token, std::string &deviceId, DeviceConnectStatus &deviceConnectStatus);
59     napi_value OnStartDeviceManager(napi_env env, napi_callback_info info);
60     int32_t CheckParamAndGetToken(napi_env env, size_t argc, napi_value *argv, int32_t &token);
61     napi_value OnInitDeviceConnectStateObject(napi_env env, napi_callback_info info);
62     napi_value OnInitContinuationModeObject(napi_env env, napi_callback_info info);
63     static napi_status SetEnumItem(const napi_env &env, napi_value object, const char* name, int32_t value);
64     napi_value OnRegisterContinuation(napi_env env, napi_callback_info info);
65     napi_value OnUnregisterContinuation(napi_env env, napi_callback_info info);
66     napi_value OnUpdateContinuationState(napi_env env, napi_callback_info info);
67     std::string GetErrorInfo(napi_env env, napi_callback_info info, int32_t &token,
68         std::string &deviceId, DeviceConnectStatus &deviceConnectStatus);
69     std::string GetErrorForStartContinuation(napi_env env, napi_callback_info info,
70         int32_t &token, int32_t &unwrapArgc, std::shared_ptr<ContinuationExtraParams> &continuationExtraParams);
71     std::string GetErrorInforForRegisterContination(napi_env env, napi_callback_info info,
72         size_t &unwrapArgc, std::shared_ptr<ContinuationExtraParams> &continuationExtraParams);
73     napi_value OnStartContinuationDeviceManager(napi_env env, napi_callback_info info);
74 
75     static bool IsCallbackValid(napi_env env, napi_value listenerObj);
76     bool IsCallbackRegistered(int32_t token, const std::string& cbType);
77     bool UnWrapContinuationExtraParams(const napi_env &env, const napi_value& options,
78         std::shared_ptr<ContinuationExtraParams>& continuationExtraParams);
79     bool UnwrapJsonByPropertyName(const napi_env &env, const napi_value& param,
80         const std::string& field, nlohmann::json& jsonObj);
81     static bool PraseJson(const napi_env &env, const napi_value& jsonField, const napi_value& jsProNameList,
82         uint32_t jsProCount, nlohmann::json& jsonObj);
83     static int32_t ErrorCodeReturn(int32_t code);
84     static std::string ErrorMessageReturn(int32_t code);
85     static std::string OnRegisterDeviceSelectionCallbackParameterCheck(napi_env env,
86         napi_callback_info info, std::string &cbType, int32_t &token, napi_value *jsListenerObj);
87     napi_value GenerateBusinessError(const napi_env &env, int32_t errCode, const std::string &errMsg);
88     std::mutex jsCbMapMutex_;
89     std::map<int32_t, std::map<std::string, CallbackPair>> jsCbMap_;
90 };
91 
92 napi_value JsContinuationManagerInit(napi_env env, napi_value exportObj);
93 } // namespace DistributedSchedule
94 } // namespace OHOS
95 #endif // OHOS_DISTRIBUTED_ABILITY_MANAGER_JS_CONTINUATION_MANAGER_H