1fa7767c5Sopenharmony_ci/* 2fa7767c5Sopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd. 3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License. 5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at 6fa7767c5Sopenharmony_ci * 7fa7767c5Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fa7767c5Sopenharmony_ci * 9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and 13fa7767c5Sopenharmony_ci * limitations under the License. 14fa7767c5Sopenharmony_ci */ 15fa7767c5Sopenharmony_ci 16fa7767c5Sopenharmony_ci#include "common/log.h" 17fa7767c5Sopenharmony_ci#include "meta/any.h" 18fa7767c5Sopenharmony_ci#include <map> 19fa7767c5Sopenharmony_ci 20fa7767c5Sopenharmony_cinamespace { 21fa7767c5Sopenharmony_ciconstexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "Any" }; 22fa7767c5Sopenharmony_ci} 23fa7767c5Sopenharmony_ci 24fa7767c5Sopenharmony_cinamespace { 25fa7767c5Sopenharmony_ciusing namespace OHOS::Media; 26fa7767c5Sopenharmony_ciusing BaseTypesMap = std::map<std::string, AnyValueType>; 27fa7767c5Sopenharmony_ci 28fa7767c5Sopenharmony_ciconst BaseTypesMap &GetBaseTypesMap() 29fa7767c5Sopenharmony_ci{ 30fa7767c5Sopenharmony_ci static const BaseTypesMap baseTypeMap([]() { 31fa7767c5Sopenharmony_ci BaseTypesMap typeMap; 32fa7767c5Sopenharmony_ci Any defaultBool = (bool)true; 33fa7767c5Sopenharmony_ci typeMap[std::string(defaultBool.TypeName())] = AnyValueType::BOOL; 34fa7767c5Sopenharmony_ci Any defaultInt32 = (int32_t)0; 35fa7767c5Sopenharmony_ci typeMap[std::string(defaultInt32.TypeName())] = AnyValueType::INT32_T; 36fa7767c5Sopenharmony_ci Any defaultInt64 = (int64_t)0; 37fa7767c5Sopenharmony_ci typeMap[std::string(defaultInt64.TypeName())] = AnyValueType::INT64_T; 38fa7767c5Sopenharmony_ci Any defaultFoalt = (float)0.0; 39fa7767c5Sopenharmony_ci typeMap[std::string(defaultFoalt.TypeName())] = AnyValueType::FLOAT; 40fa7767c5Sopenharmony_ci Any defaultDouble = (double)0.0; 41fa7767c5Sopenharmony_ci typeMap[std::string(defaultDouble.TypeName())] = AnyValueType::DOUBLE; 42fa7767c5Sopenharmony_ci Any defaultString = std::string(); 43fa7767c5Sopenharmony_ci typeMap[std::string(defaultString.TypeName())] = AnyValueType::STRING; 44fa7767c5Sopenharmony_ci Any defaultVecUint8 = std::vector<uint8_t>(); 45fa7767c5Sopenharmony_ci typeMap[std::string(defaultVecUint8.TypeName())] = AnyValueType::VECTOR_UINT8; 46fa7767c5Sopenharmony_ci return typeMap; 47fa7767c5Sopenharmony_ci }()); 48fa7767c5Sopenharmony_ci return baseTypeMap; 49fa7767c5Sopenharmony_ci} 50fa7767c5Sopenharmony_ci} // namespace 51fa7767c5Sopenharmony_ci 52fa7767c5Sopenharmony_cinamespace OHOS { 53fa7767c5Sopenharmony_cinamespace Media { 54fa7767c5Sopenharmony_cibool Any::BaseTypesToParcel(const Any *operand, MessageParcel &parcel) noexcept 55fa7767c5Sopenharmony_ci{ 56fa7767c5Sopenharmony_ci auto iter = GetBaseTypesMap().find(std::string(operand->TypeName())); 57fa7767c5Sopenharmony_ci if (iter == GetBaseTypesMap().end()) { 58fa7767c5Sopenharmony_ci parcel.WriteInt32(static_cast<int32_t>(AnyValueType::INVALID_TYPE)); 59fa7767c5Sopenharmony_ci return false; 60fa7767c5Sopenharmony_ci } 61fa7767c5Sopenharmony_ci bool ret = parcel.WriteInt32(static_cast<int32_t>(iter->second)); 62fa7767c5Sopenharmony_ci switch (iter->second) { 63fa7767c5Sopenharmony_ci case AnyValueType::BOOL: 64fa7767c5Sopenharmony_ci ret = ret && parcel.WriteBool(*AnyCast<bool>(operand)); 65fa7767c5Sopenharmony_ci break; 66fa7767c5Sopenharmony_ci case AnyValueType::INT32_T: 67fa7767c5Sopenharmony_ci ret = ret && parcel.WriteInt32(*AnyCast<int32_t>(operand)); 68fa7767c5Sopenharmony_ci break; 69fa7767c5Sopenharmony_ci case AnyValueType::INT64_T: 70fa7767c5Sopenharmony_ci ret = ret && parcel.WriteInt64(*AnyCast<int64_t>(operand)); 71fa7767c5Sopenharmony_ci break; 72fa7767c5Sopenharmony_ci case AnyValueType::FLOAT: 73fa7767c5Sopenharmony_ci ret = ret && parcel.WriteFloat(*AnyCast<float>(operand)); 74fa7767c5Sopenharmony_ci break; 75fa7767c5Sopenharmony_ci case AnyValueType::DOUBLE: 76fa7767c5Sopenharmony_ci ret = ret && parcel.WriteDouble(*AnyCast<double>(operand)); 77fa7767c5Sopenharmony_ci break; 78fa7767c5Sopenharmony_ci case AnyValueType::STRING: 79fa7767c5Sopenharmony_ci ret = ret && parcel.WriteString(*AnyCast<std::string>(operand)); 80fa7767c5Sopenharmony_ci break; 81fa7767c5Sopenharmony_ci case AnyValueType::VECTOR_UINT8: 82fa7767c5Sopenharmony_ci ret = ret && parcel.WriteUInt8Vector(*AnyCast<std::vector<uint8_t>>(operand)); 83fa7767c5Sopenharmony_ci break; 84fa7767c5Sopenharmony_ci default: { 85fa7767c5Sopenharmony_ci parcel.WriteInt32(static_cast<int32_t>(AnyValueType::INVALID_TYPE)); 86fa7767c5Sopenharmony_ci return false; 87fa7767c5Sopenharmony_ci } 88fa7767c5Sopenharmony_ci } 89fa7767c5Sopenharmony_ci return ret; 90fa7767c5Sopenharmony_ci} 91fa7767c5Sopenharmony_ci 92fa7767c5Sopenharmony_cienum class StatusCodeFromParcel { 93fa7767c5Sopenharmony_ci SUCCESS = 0, 94fa7767c5Sopenharmony_ci ENUM_RETRY = 1, 95fa7767c5Sopenharmony_ci NO_RETRY = 2, 96fa7767c5Sopenharmony_ci}; 97fa7767c5Sopenharmony_ci 98fa7767c5Sopenharmony_ci// returnValue : 0 -- success; 1 -- retry for enum type; 2 -- failed no retry 99fa7767c5Sopenharmony_ciint Any::BaseTypesFromParcel(Any *operand, MessageParcel &parcel) noexcept 100fa7767c5Sopenharmony_ci{ 101fa7767c5Sopenharmony_ci AnyValueType type = static_cast<AnyValueType>(parcel.ReadInt32()); 102fa7767c5Sopenharmony_ci switch (type) { 103fa7767c5Sopenharmony_ci case AnyValueType::BOOL: { 104fa7767c5Sopenharmony_ci Any tmp(parcel.ReadBool()); 105fa7767c5Sopenharmony_ci operand->Swap(tmp); 106fa7767c5Sopenharmony_ci break; 107fa7767c5Sopenharmony_ci } 108fa7767c5Sopenharmony_ci case AnyValueType::INT32_T: { 109fa7767c5Sopenharmony_ci Any tmp(parcel.ReadInt32()); 110fa7767c5Sopenharmony_ci operand->Swap(tmp); 111fa7767c5Sopenharmony_ci break; 112fa7767c5Sopenharmony_ci } 113fa7767c5Sopenharmony_ci case AnyValueType::INT64_T: { 114fa7767c5Sopenharmony_ci Any tmp(parcel.ReadInt64()); 115fa7767c5Sopenharmony_ci operand->Swap(tmp); 116fa7767c5Sopenharmony_ci break; 117fa7767c5Sopenharmony_ci } 118fa7767c5Sopenharmony_ci case AnyValueType::FLOAT: { 119fa7767c5Sopenharmony_ci Any tmp(parcel.ReadFloat()); 120fa7767c5Sopenharmony_ci operand->Swap(tmp); 121fa7767c5Sopenharmony_ci break; 122fa7767c5Sopenharmony_ci } 123fa7767c5Sopenharmony_ci case AnyValueType::DOUBLE: { 124fa7767c5Sopenharmony_ci Any tmp(parcel.ReadDouble()); 125fa7767c5Sopenharmony_ci operand->Swap(tmp); 126fa7767c5Sopenharmony_ci break; 127fa7767c5Sopenharmony_ci } 128fa7767c5Sopenharmony_ci case AnyValueType::STRING: { 129fa7767c5Sopenharmony_ci Any tmp(parcel.ReadString()); 130fa7767c5Sopenharmony_ci operand->Swap(tmp); 131fa7767c5Sopenharmony_ci break; 132fa7767c5Sopenharmony_ci } 133fa7767c5Sopenharmony_ci case AnyValueType::VECTOR_UINT8: { 134fa7767c5Sopenharmony_ci std::vector<uint8_t> val; 135fa7767c5Sopenharmony_ci (void)parcel.ReadUInt8Vector(&val); 136fa7767c5Sopenharmony_ci Any tmp(val); 137fa7767c5Sopenharmony_ci operand->Swap(tmp); 138fa7767c5Sopenharmony_ci break; 139fa7767c5Sopenharmony_ci } 140fa7767c5Sopenharmony_ci case AnyValueType::INVALID_TYPE: 141fa7767c5Sopenharmony_ci return static_cast<int>(StatusCodeFromParcel::ENUM_RETRY); 142fa7767c5Sopenharmony_ci default: 143fa7767c5Sopenharmony_ci return static_cast<int>(StatusCodeFromParcel::NO_RETRY); 144fa7767c5Sopenharmony_ci } 145fa7767c5Sopenharmony_ci return static_cast<int>(StatusCodeFromParcel::SUCCESS); 146fa7767c5Sopenharmony_ci} 147fa7767c5Sopenharmony_ci 148fa7767c5Sopenharmony_ci/** 149fa7767c5Sopenharmony_ci * Get TypeName From function info. 150fa7767c5Sopenharmony_ci * Extract the Type name out of Function Info 151fa7767c5Sopenharmony_ci * @param functionInfo Function Info 152fa7767c5Sopenharmony_ci * @return Name of Type T ,Such as <b>bool int float double std::vector<unsigned char></b> etc. 153fa7767c5Sopenharmony_ci * @example In windows with MEDIA_NO_OHOS define, 154fa7767c5Sopenharmony_ci * FunctionInfo will be like <br> 155fa7767c5Sopenharmony_ci * static constexpr std::string_view OHOS::Media::Any::GetTypeName() 156fa7767c5Sopenharmony_ci * [with T = <b>bool</b>; std::string_view = std::basic_string_view<char>] <br> 157fa7767c5Sopenharmony_ci * with MEDIA_OHOS define, FunctionInfo will be like <br> 158fa7767c5Sopenharmony_ci * static std::string_view OHOS::Media::Any::GetTypeName() [T = <b>std::vector<unsigned char></b>] <br> 159fa7767c5Sopenharmony_ci * For EnumType , FunctionInfo will be like <br> 160fa7767c5Sopenharmony_ci * static std::string_view OHOS::Media::Any::GetTypeName() [T = <b>OHOS::Media::Plugins::VideoEncodeBitrateMode</b>] 161fa7767c5Sopenharmony_ci */ 162fa7767c5Sopenharmony_cistd::string_view Any::GetTypeNameFromFunctionInfo(const char* functionInfo) noexcept 163fa7767c5Sopenharmony_ci{ 164fa7767c5Sopenharmony_ci std::string_view stringInfo = functionInfo; 165fa7767c5Sopenharmony_ci std::string_view retType = "Unknown"; 166fa7767c5Sopenharmony_ci size_t beginIndex = stringInfo.find_first_of('='); 167fa7767c5Sopenharmony_ci if (beginIndex == std::string::npos) { 168fa7767c5Sopenharmony_ci MEDIA_LOG_E("GetTypeNameFromFunctionInfo failed. Function: " PUBLIC_LOG_S, stringInfo.data()); 169fa7767c5Sopenharmony_ci return retType; 170fa7767c5Sopenharmony_ci } else { 171fa7767c5Sopenharmony_ci beginIndex += 2; // 2 表示右移两位 172fa7767c5Sopenharmony_ci } 173fa7767c5Sopenharmony_ci#ifdef MEDIA_OHOS 174fa7767c5Sopenharmony_ci size_t endIndex = stringInfo.find_last_of(']'); 175fa7767c5Sopenharmony_ci#else 176fa7767c5Sopenharmony_ci size_t endIndex = stringInfo.find_last_of(';'); 177fa7767c5Sopenharmony_ci#endif 178fa7767c5Sopenharmony_ci FALSE_RETURN_V_MSG_E(endIndex != std::string::npos, 179fa7767c5Sopenharmony_ci retType, "GetTypeNameFromFunctionInfo find Type failed. Function: " PUBLIC_LOG_S, stringInfo.data()); 180fa7767c5Sopenharmony_ci std::string_view typeNameRet(functionInfo + beginIndex, endIndex - beginIndex); 181fa7767c5Sopenharmony_ci return typeNameRet; 182fa7767c5Sopenharmony_ci} 183fa7767c5Sopenharmony_ci} // namespace Media 184fa7767c5Sopenharmony_ci} // namespace OHOS