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 OHOS_NAPI_ACE_PLUGIN_CALLBACK_H
17 #define OHOS_NAPI_ACE_PLUGIN_CALLBACK_H
18 
19 #include <atomic>
20 #include <condition_variable>
21 #include <mutex>
22 #include <string>
23 
24 #include "js_plugin_data.h"
25 
26 #include "core/components/plugin/plugin_component_callback.h"
27 
28 namespace OHOS::Ace::Napi {
29 using namespace OHOS::Ace;
30 
31 struct OnPluginUvWorkData {
32     AAFwk::Want want;
33     std::string sourceName;
34     std::string abilityName;
35     std::string data;
36     std::string extraData;
37     std::string name;
38     void* that = nullptr;
39 };
40 
41 class AceJSPluginRequestParam {
42 public:
AceJSPluginRequestParam(const AAFwk::Want & want,const std::string & name,const std::string & data,const std::string & jsonPath)43     AceJSPluginRequestParam(
44         const AAFwk::Want& want, const std::string& name, const std::string& data, const std::string& jsonPath)
45         : want_(want), name_(name), data_(data), jsonPath_(jsonPath)
46     {}
47     ~AceJSPluginRequestParam() = default;
48     bool operator==(const AceJSPluginRequestParam& param) const;
49     bool operator!=(const AceJSPluginRequestParam& param) const;
50 
51 public:
52     AAFwk::Want want_;
53     std::string name_;
54     std::string data_;
55     std::string jsonPath_;
56 
57     ACE_DISALLOW_COPY_AND_MOVE(AceJSPluginRequestParam);
58 };
59 
60 class JSPluginCallback : public PluginComponentCallBack {
61 public:
62     JSPluginCallback(CallBackType eventType, ACECallbackInfo& cbInfo, ACEAsyncJSCallbackInfo* jsCallbackInfo);
63     virtual ~JSPluginCallback();
64     void SetWant(const AAFwk::Want& want);
65     AAFwk::Want& GetWant();
66     void SetRequestParam(const std::shared_ptr<AceJSPluginRequestParam>& param);
67     bool OnEventStrictEquals(CallBackType eventType, const AAFwk::Want& want, ACECallbackInfo& cbInfo);
68     bool RequestStrictEquals(CallBackType eventType, const AAFwk::Want& want, ACECallbackInfo& cbInfo,
69         const std::shared_ptr<AceJSPluginRequestParam>& param);
70 
71     size_t GetID(void);
72     int32_t GetContainerId() override;
73     void OnPushEvent(const AAFwk::Want& want, const PluginComponentTemplate& pluginTemplate, const std::string& data,
74         const std::string& extraData) override;
75     void OnRequestEvent(const AAFwk::Want& want, const std::string& name, const std::string& data) override;
76     void OnRequestCallBack(
77         const PluginComponentTemplate& pluginTemplate, const std::string& data, const std::string& extraData) override;
78 
79 private:
80     void DestroyAllResource(void);
81     void SendRequestEventResult(napi_value jsObject);
82     napi_value MakeCallbackParamForRequest(
83         const PluginComponentTemplate& pluginTemplate, const std::string& data, const std::string& extraData);
84     napi_value MakePluginTemplateObject(const PluginComponentTemplate& pluginTemplate);
85     void OnPushEventInner(const OnPluginUvWorkData* workData);
86     void OnRequestEventInner(const OnPluginUvWorkData* workData);
87     void OnRequestCallBackInner(const OnPluginUvWorkData* workData);
88 
89     AAFwk::Want want_;
90     ACECallbackInfo cbInfo_;
91     CallBackType eventType_;
92     std::shared_ptr<AceJSPluginRequestParam> requestParam_ = nullptr;
93     static std::atomic_size_t uuid_;
94     OnPluginUvWorkData uvWorkData_;
95     ACEAsyncJSCallbackInfo* asyncJSCallbackInfo_ = nullptr;
96 };
97 } // namespace OHOS::Ace::Napi
98 #endif // OHOS_NAPI_ACE_PLUGIN_CALLBACK_H
99