106f6ba60Sopenharmony_ci/* 206f6ba60Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 306f6ba60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 406f6ba60Sopenharmony_ci * you may not use this file except in compliance with the License. 506f6ba60Sopenharmony_ci * You may obtain a copy of the License at 606f6ba60Sopenharmony_ci * 706f6ba60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 806f6ba60Sopenharmony_ci * 906f6ba60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1006f6ba60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1106f6ba60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1206f6ba60Sopenharmony_ci * See the License for the specific language governing permissions and 1306f6ba60Sopenharmony_ci * limitations under the License. 1406f6ba60Sopenharmony_ci */ 1506f6ba60Sopenharmony_ci 1606f6ba60Sopenharmony_ci#ifndef HIDEBUG_ASYNCTASK_H_ 1706f6ba60Sopenharmony_ci#define HIDEBUG_ASYNCTASK_H_ 1806f6ba60Sopenharmony_ci 1906f6ba60Sopenharmony_ci#include "napi/native_api.h" 2006f6ba60Sopenharmony_ci 2106f6ba60Sopenharmony_ci#include <functional> 2206f6ba60Sopenharmony_ci#include <string> 2306f6ba60Sopenharmony_ci#include <type_traits> 2406f6ba60Sopenharmony_ci 2506f6ba60Sopenharmony_cinamespace OHOS { 2606f6ba60Sopenharmony_cinamespace HiviewDFX { 2706f6ba60Sopenharmony_ci 2806f6ba60Sopenharmony_cinapi_value CreateErrorMessage(napi_env env, const std::string& msg); 2906f6ba60Sopenharmony_ci 3006f6ba60Sopenharmony_cinapi_value CreateErrorMessage(napi_env env, const std::string& errCode, const std::string& msg); 3106f6ba60Sopenharmony_ci 3206f6ba60Sopenharmony_cinapi_value CreateUndefined(napi_env env); 3306f6ba60Sopenharmony_ci 3406f6ba60Sopenharmony_ciclass AsyncTask { 3506f6ba60Sopenharmony_cipublic: 3606f6ba60Sopenharmony_ci explicit AsyncTask(const std::string& resourceName): resourceName_(resourceName) {}; 3706f6ba60Sopenharmony_ci virtual ~AsyncTask() = default; 3806f6ba60Sopenharmony_ci 3906f6ba60Sopenharmony_ci template<typename T, typename = typename std::enable_if<std::is_base_of<AsyncTask, T>::value>::type> 4006f6ba60Sopenharmony_ci static napi_value GetPromise(napi_env env, std::function<void(T*)> setReqParam = [](T*) {}) 4106f6ba60Sopenharmony_ci { 4206f6ba60Sopenharmony_ci napi_value promise = nullptr; 4306f6ba60Sopenharmony_ci T* asyncTask = new (std::nothrow) T(); 4406f6ba60Sopenharmony_ci if (asyncTask == nullptr) { 4506f6ba60Sopenharmony_ci return nullptr; 4606f6ba60Sopenharmony_ci } 4706f6ba60Sopenharmony_ci setReqParam(asyncTask); 4806f6ba60Sopenharmony_ci if (!asyncTask->CreatePromise(env, promise)) { 4906f6ba60Sopenharmony_ci delete asyncTask; 5006f6ba60Sopenharmony_ci return nullptr; 5106f6ba60Sopenharmony_ci } 5206f6ba60Sopenharmony_ci return promise; 5306f6ba60Sopenharmony_ci }; 5406f6ba60Sopenharmony_ci 5506f6ba60Sopenharmony_ciprotected: 5606f6ba60Sopenharmony_ci napi_async_work worker_ = nullptr; 5706f6ba60Sopenharmony_ci napi_deferred deferred_ = nullptr; 5806f6ba60Sopenharmony_ci std::string resourceName_; 5906f6ba60Sopenharmony_ci virtual void Work(napi_env env) = 0; 6006f6ba60Sopenharmony_ci virtual void Done(napi_env env, napi_status status) = 0; 6106f6ba60Sopenharmony_ci 6206f6ba60Sopenharmony_ciprivate: 6306f6ba60Sopenharmony_ci bool CreatePromise(napi_env env, napi_value& promise); 6406f6ba60Sopenharmony_ci static void ExecuteCallBack(napi_env env, void* data); 6506f6ba60Sopenharmony_ci static void CompletedCallBack(napi_env env, napi_status status, void* data); 6606f6ba60Sopenharmony_ci}; 6706f6ba60Sopenharmony_ci} 6806f6ba60Sopenharmony_ci} 6906f6ba60Sopenharmony_ci 7006f6ba60Sopenharmony_ci#endif //HIDEBUG_ASYNCTASK_H_ 71