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 */