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 if (jsCallbackParamParser.GetCallbackFunction() == nullptr) { 88 napi_throw_error(env, std::to_string(INVALID_ARGUMENT).c_str(), "callback invalid argument"); 89 return nullptr; 90 } 91 MEDIA_INFO_LOG("On eventType: %{public}s", jsCallbackParamParser.GetCallbackName().c_str()); 92 93 return targetInstance->RegisterCallback(env, jsCallbackParamParser, false); 94 } 95 Once(napi_env env,napi_callback_info info)96 static napi_value Once(napi_env env, napi_callback_info info) 97 { 98 MEDIA_INFO_LOG("Once is called"); 99 CAMERA_SYNC_TRACE; 100 T* targetInstance = nullptr; 101 CameraNapiCallbackParamParser jsCallbackParamParser(env, info, targetInstance); 102 if (!jsCallbackParamParser.AssertStatus(INVALID_ARGUMENT, "invalid argument")) { 103 MEDIA_ERR_LOG("On get invalid argument"); 104 return nullptr; 105 } 106 if (jsCallbackParamParser.GetCallbackFunction() == nullptr) { 107 napi_throw_error(env, std::to_string(INVALID_ARGUMENT).c_str(), "callback invalid argument"); 108 return nullptr; 109 } 110 MEDIA_INFO_LOG("Once eventType: %{public}s", jsCallbackParamParser.GetCallbackName().c_str()); 111 return targetInstance->RegisterCallback(env, jsCallbackParamParser, true); 112 } 113 Off(napi_env env,napi_callback_info info)114 static napi_value Off(napi_env env, napi_callback_info info) 115 { 116 CAMERA_SYNC_TRACE; 117 T* targetInstance = nullptr; 118 CameraNapiCallbackParamParser jsCallbackParamParser(env, info, targetInstance); 119 if (!jsCallbackParamParser.AssertStatus(INVALID_ARGUMENT, "invalid argument")) { 120 MEDIA_ERR_LOG("On get invalid argument"); 121 return nullptr; 122 } 123 MEDIA_INFO_LOG("Off eventType: %{public}s", jsCallbackParamParser.GetCallbackName().c_str()); 124 return targetInstance->UnregisterCallback(env, jsCallbackParamParser); 125 } 126 }; 127 } // namespace CameraStandard 128 } // namespace OHOS 129 #endif /* CAMERA_NAPI_TEMPLATE_UTILS_H */