1 /*
2  * Copyright (c) 2024-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 CAMERA_NAPI_TEMPLATE_UTILS_H
17 #define CAMERA_NAPI_TEMPLATE_UTILS_H
18 
19 #include <map>
20 
21 #include "camera_error_code.h"
22 #include "camera_log.h"
23 #include "camera_napi_const.h"
24 #include "camera_napi_event_emitter.h"
25 #include "camera_napi_utils.h"
26 
27 namespace OHOS {
28 namespace CameraStandard {
29 template<typename T>
30 class EnumHelper {
31 public:
EnumHelper(const std::map<T,std::string> && origin,const T defaultValue)32     EnumHelper(const std::map<T, std::string>&& origin, const T defaultValue)
33     {
34         _mapEnum2String = std::move(origin);
35         _mapString2Enum = GenString2EnumMap(_mapEnum2String);
36         _defaultValue = defaultValue;
37     }
38 
ToEnum(const std::string & str)39     T ToEnum(const std::string& str)
40     {
41         auto item = _mapString2Enum.find(str);
42         if (item != _mapString2Enum.end()) {
43             return item->second;
44         }
45         return _defaultValue;
46     }
47 
GetKeyString(T enumValue)48     const std::string& GetKeyString(T enumValue)
49     {
50         const static std::string EMPTY_STRING = "";
51         auto item = _mapEnum2String.find(enumValue);
52         if (item == _mapEnum2String.end()) {
53             return EMPTY_STRING;
54         }
55         return item->second;
56     }
57 
58 private:
59     std::map<T, std::string> _mapEnum2String;
60     std::map<std::string, T> _mapString2Enum;
61     T _defaultValue;
62 
GenString2EnumMap(std::map<T,std::string> enum2StringMap)63     static std::map<std::string, T> GenString2EnumMap(std::map<T, std::string> enum2StringMap)
64     {
65         std::map<std::string, T> result;
66         for (const auto& item : enum2StringMap) {
67             result.emplace(std::make_pair(item.second, item.first));
68         }
69         return result;
70     };
71 };
72 
73 template<typename T, typename = std::enable_if_t<std::is_base_of_v<CameraNapiEventEmitter<T>, T>>>
74 class ListenerTemplate {
75 public:
On(napi_env env,napi_callback_info info)76     static napi_value On(napi_env env, napi_callback_info info)
77     {
78         MEDIA_INFO_LOG("On is called");
79         CAMERA_SYNC_TRACE;
80 
81         T* targetInstance = nullptr;
82         CameraNapiCallbackParamParser jsCallbackParamParser(env, info, targetInstance);
83         if (!jsCallbackParamParser.AssertStatus(INVALID_ARGUMENT, "invalid argument")) {
84             MEDIA_ERR_LOG("On get invalid argument");
85             return nullptr;
86         }
87         MEDIA_INFO_LOG("On eventType: %{public}s", jsCallbackParamParser.GetCallbackName().c_str());
88 
89         return targetInstance->RegisterCallback(env, jsCallbackParamParser, false);
90     }
91 
Once(napi_env env,napi_callback_info info)92     static napi_value Once(napi_env env, napi_callback_info info)
93     {
94         MEDIA_INFO_LOG("Once is called");
95         CAMERA_SYNC_TRACE;
96         T* targetInstance = nullptr;
97         CameraNapiCallbackParamParser jsCallbackParamParser(env, info, targetInstance);
98         if (!jsCallbackParamParser.AssertStatus(INVALID_ARGUMENT, "invalid argument")) {
99             MEDIA_ERR_LOG("On get invalid argument");
100             return nullptr;
101         }
102 
103         MEDIA_INFO_LOG("Once eventType: %{public}s", jsCallbackParamParser.GetCallbackName().c_str());
104         return targetInstance->RegisterCallback(env, jsCallbackParamParser, true);
105     }
106 
Off(napi_env env,napi_callback_info info)107     static napi_value Off(napi_env env, napi_callback_info info)
108     {
109         MEDIA_INFO_LOG("Off is called");
110         CAMERA_SYNC_TRACE;
111         T* targetInstance = nullptr;
112         CameraNapiCallbackParamParser jsCallbackParamParser(env, info, targetInstance);
113         if (!jsCallbackParamParser.AssertStatus(INVALID_ARGUMENT, "invalid argument")) {
114             MEDIA_ERR_LOG("On get invalid argument");
115             return nullptr;
116         }
117         MEDIA_INFO_LOG("Off eventType: %{public}s", jsCallbackParamParser.GetCallbackName().c_str());
118         return targetInstance->UnregisterCallback(env, jsCallbackParamParser);
119     }
120 };
121 } // namespace CameraStandard
122 } // namespace OHOS
123 #endif /* CAMERA_NAPI_TEMPLATE_UTILS_H */