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 
22 class ThreadSafeCallback {
23 public:
24     // can be called from any thread.
Release()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     }
Trigger()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 
43 protected:
44     virtual void Finalize(napi_env) = 0;
45     virtual void Invoked(napi_env) = 0;
ThreadSafeCallback(napi_env env,const char * n)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     }
Call(napi_env env,napi_value js_callback,void * context,void * inData)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     }
Final(napi_env env,void * finalize_data,void * finalize_hint)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     };
~ThreadSafeCallback()65     virtual ~ThreadSafeCallback()
66     {
67         // Called by final on JS thread.
68         Release();
69     }
70     napi_threadsafe_function termfun { nullptr };
71 };
72 
73 class AnimationJS : public BaseObject<AnimationJS>, public SceneResourceImpl {
74 public:
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 
81 private:
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