• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2023 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 #include "dps_metadata_info.h"
17 #include <message_parcel.h>
18 #include "dp_log.h"
19 
20 #define DPS_MAX_USER_DATA_COUNT 1000
21 
22 namespace OHOS {
23 namespace CameraStandard {
24 
ReadFromParcel(MessageParcel & parcel)25 DpsMetadataError DpsMetadata::ReadFromParcel(MessageParcel &parcel)
26 {
27     int32_t size = parcel.ReadInt32();
28     if (size > DPS_MAX_USER_DATA_COUNT || size < 0) {
29         return DPS_METADATA_INTERNAL_ERROR;
30     }
31 
32     DpsMetadataError ret = DPS_METADATA_OK;
33     for (int32_t i = 0; i < size; i++) {
34         auto key = parcel.ReadString();
35         auto type = static_cast<DpsDataType>(parcel.ReadInt32());
36         switch (type) {
37             case DpsDataType::i32: {
38                 ret = Set(key, type, parcel.ReadInt32());
39                 break;
40             }
41             case DpsDataType::i64: {
42                 ret = Set(key, type, parcel.ReadInt64());
43                 break;
44             }
45             case DpsDataType::f64: {
46                 ret = Set(key, type, parcel.ReadDouble());
47                 break;
48             }
49             case DpsDataType::string: {
50                 ret = Set(key, type, parcel.ReadString());
51                 break;
52             }
53             default: break;
54         }
55 
56         if (ret != DPS_METADATA_OK) {
57             break;
58         }
59     }
60     return ret;
61 }
62 
WriteToParcel(MessageParcel & parcel) const63 DpsMetadataError DpsMetadata::WriteToParcel(MessageParcel &parcel) const
64 {
65     // LCOV_EXCL_START
66     parcel.WriteInt32(datas.size());
67     for (const auto &[key, data] : datas) {
68         parcel.WriteString(key);
69         parcel.WriteInt32(static_cast<int32_t>(data.type));
70         switch (data.type) {
71             case DpsDataType::i32: {
72                 int32_t i32 = -1;
73                 auto dpVal = std::any_cast<int32_t>(&data.val);
74                 if (dpVal != nullptr) {
75                     i32 = *dpVal;
76                 }
77                 parcel.WriteInt32(i32);
78                 break;
79             }
80             case DpsDataType::i64: {
81                 int64_t i64 = -1;
82                 auto dpVal = std::any_cast<int64_t>(&data.val);
83                 if (dpVal != nullptr) {
84                     i64 = *dpVal;
85                 }
86                 parcel.WriteInt64(i64);
87                 break;
88             }
89             case DpsDataType::f64: {
90                 double f64 = -1;
91                 auto dpVal = std::any_cast<double>(&data.val);
92                 if (dpVal != nullptr) {
93                     f64 = *dpVal;
94                 }
95                 parcel.WriteDouble(f64);
96                 break;
97             }
98             case DpsDataType::string: {
99                 std::string string = "-1";
100                 auto dpVal = std::any_cast<std::string>(&data.val);
101                 if (dpVal != nullptr) {
102                     string = *dpVal;
103                 }
104                 parcel.WriteString(string);
105                 break;
106             }
107             default:
108                 break;
109         }
110     }
111     // LCOV_EXCL_STOP
112     return DPS_METADATA_OK;
113 }
114 
Marshalling(Parcel & parcel) const115 bool DpsMetadata::Marshalling(Parcel& parcel) const
116 {
117     // LCOV_EXCL_START
118     DpsMetadataError ret = WriteToParcel(static_cast<MessageParcel&>(parcel));
119     DP_CHECK_ERROR_RETURN_RET_LOG(ret != DPS_METADATA_OK, false, "DpsMetadata Marshalling fail");
120     return true;
121     // LCOV_EXCL_STOP
122 }
123 
Unmarshalling(Parcel & parcel)124 DpsMetadata* DpsMetadata::Unmarshalling(Parcel& parcel)
125 {
126     DpsMetadata* metadata = new (std::nothrow) DpsMetadata();
127     DP_CHECK_ERROR_RETURN_RET_LOG(metadata == nullptr, nullptr, "create DpsMetadata fail");
128     metadata->ReadFromParcel(static_cast<MessageParcel&>(parcel));
129     return metadata;
130 }
131 
Get(const std::string & key,int32_t & value) const132 DpsMetadataError DpsMetadata::Get(const std::string &key, int32_t &value) const
133 {
134     return Get<int32_t>(key, DpsDataType::i32, value);
135 }
136 
Get(const std::string & key,int64_t & value) const137 DpsMetadataError DpsMetadata::Get(const std::string &key, int64_t &value) const
138 {
139     return Get<int64_t>(key, DpsDataType::i64, value);
140 }
141 
Get(const std::string & key,double & value) const142 DpsMetadataError DpsMetadata::Get(const std::string &key, double &value) const
143 {
144     return Get<double>(key, DpsDataType::f64, value);
145 }
146 
Get(const std::string & key,std::string & value) const147 DpsMetadataError DpsMetadata::Get(const std::string &key, std::string &value) const
148 {
149     return Get<std::string>(key, DpsDataType::string, value);
150 }
151 
Set(const std::string & key,int32_t value)152 DpsMetadataError DpsMetadata::Set(const std::string &key, int32_t value)
153 {
154     return Set(key, DpsDataType::i32, value);
155 }
156 
Set(const std::string & key,int64_t value)157 DpsMetadataError DpsMetadata::Set(const std::string &key, int64_t value)
158 {
159     return Set(key, DpsDataType::i64, value);
160 }
161 
Set(const std::string & key,double value)162 DpsMetadataError DpsMetadata::Set(const std::string &key, double value)
163 {
164     return Set(key, DpsDataType::f64, value);
165 }
166 
Set(const std::string & key,const std::string & value)167 DpsMetadataError DpsMetadata::Set(const std::string &key, const std::string& value)
168 {
169     return Set(key, DpsDataType::string, value);
170 }
171 
172 template<class T>
Get(const std::string & key,DpsDataType type,T & value) const173 DpsMetadataError DpsMetadata::Get(const std::string &key, DpsDataType type, T &value) const
174 {
175     auto it = datas.find(key);
176     DP_CHECK_RETURN_RET(it == datas.end(), DPS_METADATA_ERROR_NO_ENTRY);
177     DP_CHECK_RETURN_RET(it->second.type != type, DPS_METADATA_ERROR_TYPE_ERROR);
178     auto dpVal = std::any_cast<T>(&it->second.val);
179     DP_CHECK_RETURN_RET(dpVal == nullptr, DPS_METADATA_ERROR_TYPE_ERROR);
180     value = *dpVal;
181     return DPS_METADATA_OK;
182 }
183 
Set(const std::string & key,DpsDataType type,const std::any & val)184 DpsMetadataError DpsMetadata::Set(const std::string &key, DpsDataType type, const std::any& val)
185 {
186     auto it = datas.find(key);
187     DP_CHECK_RETURN_RET(it == datas.end() && datas.size() > DPS_MAX_USER_DATA_COUNT,
188         DPS_METADATA_ERROR_OUT_OF_RANGE);
189     datas[key].type = type;
190     datas[key].val = val;
191     return DPS_METADATA_OK;
192 }
193 
194 } // namespace CameraStandard
195 } // namespace OHOS
196