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_RENDER_3D_ANIMATION_JS_H
17#define OHOS_RENDER_3D_ANIMATION_JS_H
18
19#include "BaseObjectJS.h"
20#include "SceneResourceImpl.h"
21
22class ThreadSafeCallback {
23public:
24    // can be called from any thread.
25    void Release()
26    {
27        napi_status status;
28        if (termfun) {
29            status =
30                napi_release_threadsafe_function(termfun, napi_threadsafe_function_release_mode::napi_tsfn_release);
31            termfun = nullptr;
32        }
33    }
34    void Trigger()
35    {
36        napi_status status;
37        if (termfun) {
38            status =
39                napi_call_threadsafe_function(termfun, nullptr, napi_threadsafe_function_call_mode::napi_tsfn_blocking);
40        }
41    }
42
43protected:
44    virtual void Finalize(napi_env) = 0;
45    virtual void Invoked(napi_env) = 0;
46    ThreadSafeCallback(napi_env env, const char* n)
47    {
48        napi_status status;
49        napi_value name;
50        napi_create_string_latin1(env, n, NAPI_AUTO_LENGTH, &name);
51        status = napi_create_threadsafe_function(env, nullptr, nullptr, name, 1, 1, this, &ThreadSafeCallback::Final,
52            this, &ThreadSafeCallback::Call, &termfun);
53    }
54    static void Call(napi_env env, napi_value js_callback, void* context, void* inData)
55    {
56        ThreadSafeCallback* data = (ThreadSafeCallback*)context;
57        data->Invoked(env);
58    }
59    static void Final(napi_env env, void* finalize_data, void* finalize_hint)
60    {
61        ThreadSafeCallback* data = (ThreadSafeCallback*)finalize_data;
62        data->Finalize(env);
63        delete data;
64    };
65    virtual ~ThreadSafeCallback()
66    {
67        // Called by final on JS thread.
68        Release();
69    }
70    napi_threadsafe_function termfun { nullptr };
71};
72
73class AnimationJS : public BaseObject<AnimationJS>, public SceneResourceImpl {
74public:
75    static constexpr uint32_t ID = 70;
76    static void Init(napi_env env, napi_value exports);
77    AnimationJS(napi_env, napi_callback_info);
78    ~AnimationJS() override;
79    virtual void* GetInstanceImpl(uint32_t id) override;
80
81private:
82    napi_value GetEnabled(NapiApi::FunctionContext<>& ctx);
83    void SetEnabled(NapiApi::FunctionContext<bool>& ctx);
84    napi_value GetDuration(NapiApi::FunctionContext<>& ctx);
85    napi_value GetRunning(NapiApi::FunctionContext<>& ctx);
86    napi_value GetProgress(NapiApi::FunctionContext<>& ctx);
87
88    napi_value OnFinished(NapiApi::FunctionContext<NapiApi::Function>& ctx);
89    napi_value OnStarted(NapiApi::FunctionContext<NapiApi::Function>& ctx);
90
91    napi_value Pause(NapiApi::FunctionContext<>& ctx);
92    napi_value Restart(NapiApi::FunctionContext<>& ctx);
93    napi_value Seek(NapiApi::FunctionContext<float>& ctx);
94
95    napi_value Start(NapiApi::FunctionContext<>& ctx);
96    napi_value Stop(NapiApi::FunctionContext<>& ctx);
97    napi_value Finish(NapiApi::FunctionContext<>& ctx);
98
99    void DisposeNative() override;
100    void Finalize(napi_env env) override;
101
102    META_NS::IEvent::Token OnFinishedToken_ { 0 };
103    META_NS::IEvent::Token OnStartedToken_ { 0 };
104
105    // we don't actually own these two, as lifetime is controlled by napi_threadsafe_function
106    ThreadSafeCallback* OnStartedCB_ { nullptr };
107    ThreadSafeCallback* OnFinishedCB_ { nullptr };
108    NapiApi::WeakRef scene_;
109};
110#endif // OHOS_RENDER_3D_ANIMATION_JS_H
111