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