1 /*
2 * Copyright (c) 2022-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 #include "tlv_object.h"
16
17 #include "securec.h"
18 #include "unified_meta.h"
19 #include "want.h"
20 namespace OHOS::MiscServices {
21
Write(std::vector<std::uint8_t> & buffer,uint16_t type,std::monostate value)22 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, std::monostate value)
23 {
24 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
25 return false;
26 }
27 cursor_ += sizeof(TLVHead);
28 return true;
29 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,void * value)30 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, void* value)
31 {
32 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
33 return false;
34 }
35 cursor_ += sizeof(TLVHead);
36 return true;
37 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,bool value)38 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, bool value)
39 {
40 return WriteBasic(buffer, type, (int8_t)(value));
41 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,int8_t value)42 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, int8_t value)
43 {
44 return WriteBasic(buffer, type, value);
45 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,int16_t value)46 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, int16_t value)
47 {
48 return WriteBasic(buffer, type, value);
49 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,double value)50 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, double value)
51 {
52 return WriteBasic(buffer, type, value);
53 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,int32_t value)54 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, int32_t value)
55 {
56 return WriteBasic(buffer, type, value);
57 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,int64_t value)58 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, int64_t value)
59 {
60 return WriteBasic(buffer, type, value);
61 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,uint32_t value)62 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, uint32_t value)
63 {
64 return WriteBasic(buffer, type, value);
65 }
Write(std::vector<std::uint8_t> & buffer,uint16_t type,const std::string & value)66 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, const std::string &value)
67 {
68 if (!HasExpectBuffer(buffer, sizeof(TLVHead) + value.size())) {
69 return false;
70 }
71 auto *tlvHead = reinterpret_cast<TLVHead *>(buffer.data() + cursor_);
72 tlvHead->tag = HostToNet(type);
73 tlvHead->len = HostToNet((uint32_t)value.size());
74 if (!value.empty()) {
75 auto err = memcpy_s(tlvHead->value, value.size(), value.c_str(), value.size());
76 if (err != EOK) {
77 return false;
78 }
79 }
80
81 cursor_ += sizeof(TLVHead) + value.size();
82 return true;
83 }
84
Write(std::vector<std::uint8_t> & buffer,uint16_t type,const RawMem & value)85 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, const RawMem &value)
86 {
87 if (!HasExpectBuffer(buffer, sizeof(TLVHead) + value.bufferLen)) {
88 return false;
89 }
90 auto *tlvHead = reinterpret_cast<TLVHead *>(buffer.data() + cursor_);
91 tlvHead->tag = HostToNet(type);
92 cursor_ += sizeof(TLVHead);
93
94 if (value.bufferLen != 0 && value.buffer != 0) {
95 auto err = memcpy_s(buffer.data() + cursor_, buffer.size() - cursor_,
96 reinterpret_cast<const void *>(value.buffer), value.bufferLen);
97 if (err != EOK) {
98 return false;
99 }
100 }
101 cursor_ += value.bufferLen;
102 tlvHead->len = HostToNet((uint32_t)value.bufferLen);
103 return true;
104 }
105
Write(std::vector<std::uint8_t> & buffer,uint16_t type,const AAFwk::Want & value)106 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, const AAFwk::Want &value)
107 {
108 return Write(buffer, type, ParcelUtil::Parcelable2Raw(&value));
109 }
110
Write(std::vector<std::uint8_t> & buffer,uint16_t type,const Media::PixelMap & value)111 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, const Media::PixelMap &value)
112 {
113 std::vector<std::uint8_t> u8Value;
114 if (!value.EncodeTlv(u8Value)) {
115 return false;
116 }
117 return Write(buffer, type, u8Value);
118 }
119
Write(std::vector<std::uint8_t> & buffer,uint16_t type,const Object & value)120 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, const Object &value)
121 {
122 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
123 return false;
124 }
125 auto tagCursor = cursor_;
126 cursor_ += sizeof(TLVHead);
127 auto valueCursor = cursor_;
128 for (const auto& [key, val] : value.value_) {
129 if (!Write(buffer, TAG_MAP_KEY, key)) {
130 return false;
131 }
132 if (!Write(buffer, TAG_MAP_VALUE_TYPE, val)) {
133 return false;
134 }
135 }
136 WriteHead(buffer, type, tagCursor, cursor_ - valueCursor);
137 return true;
138 }
139
Write(std::vector<std::uint8_t> & buffer,uint16_t type,std::map<std::string,std::vector<uint8_t>> & value)140 bool TLVObject::Write(
141 std::vector<std::uint8_t> &buffer, uint16_t type, std::map<std::string, std::vector<uint8_t>> &value)
142 {
143 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
144 return false;
145 }
146 auto tagCursor = cursor_;
147 cursor_ += sizeof(TLVHead);
148 auto valueCursor = cursor_;
149
150 bool ret = true;
151 for (auto &item : value) {
152 ret = ret && Write(buffer, TAG_MAP_KEY, item.first);
153 ret = ret && Write(buffer, TAG_MAP_VALUE, item.second);
154 }
155 WriteHead(buffer, type, tagCursor, cursor_ - valueCursor);
156 return ret;
157 }
158
159 template<typename _InTp>
WriteVariant(std::vector<std::uint8_t> & buffer,uint16_t type,uint32_t step,const _InTp & input)160 bool TLVObject::WriteVariant(std::vector<std::uint8_t>& buffer, uint16_t type, uint32_t step, const _InTp &input)
161 {
162 return true;
163 }
164
165 template<typename _InTp, typename _First, typename... _Rest>
WriteVariant(std::vector<std::uint8_t> & buffer,uint16_t type,uint32_t step,const _InTp & input)166 bool TLVObject::WriteVariant(std::vector<std::uint8_t>& buffer, uint16_t type, uint32_t step, const _InTp &input)
167 {
168 if (step == input.index()) {
169 auto val = std::get<_First>(input);
170 return Write(buffer, type, val);
171 }
172 return WriteVariant<_InTp, _Rest...>(buffer, type, step + 1, input);
173 }
174
175 template<typename... _Types>
Write(std::vector<std::uint8_t> & buffer,uint16_t type,const std::variant<_Types...> & input)176 bool TLVObject::Write(std::vector<std::uint8_t>& buffer, uint16_t type, const std::variant<_Types...> &input)
177 {
178 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
179 return false;
180 }
181 auto tagCursor = cursor_;
182 cursor_ += sizeof(TLVHead);
183 auto valueCursor = cursor_;
184
185 uint32_t index = static_cast<uint32_t>(input.index());
186 if (!Write(buffer, TAG_VARIANT_INDEX, index)) {
187 return false;
188 }
189 WriteVariant<decltype(input), _Types...>(buffer, TAG_VARIANT_VALUE, 0, input);
190 WriteHead(buffer, type, tagCursor, cursor_ - valueCursor);
191 return true;
192 }
193
194 template<>
Write(std::vector<std::uint8_t> & buffer,uint16_t type,const EntryValue & input)195 bool TLVObject::Write(std::vector<std::uint8_t>& buffer, uint16_t type, const EntryValue& input)
196 {
197 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
198 return false;
199 }
200 auto tagCursor = cursor_;
201 cursor_ += sizeof(TLVHead);
202 auto valueCursor = cursor_;
203
204 uint32_t index = static_cast<uint32_t>(input.index());
205 if (!Write(buffer, TAG_VARIANT_INDEX, index)) {
206 return false;
207 }
208 WriteVariant<decltype(input), std::monostate, int32_t, int64_t, double, bool, std::string, std::vector<uint8_t>,
209 std::shared_ptr<OHOS::AAFwk::Want>, std::shared_ptr<OHOS::Media::PixelMap>, std::shared_ptr<Object>,
210 nullptr_t>(buffer, TAG_VARIANT_VALUE, 0, input);
211 WriteHead(buffer, type, tagCursor, cursor_ - valueCursor);
212 return true;
213 }
214
Write(std::vector<std::uint8_t> & buffer,uint16_t type,const Details & value)215 bool TLVObject::Write(std::vector<std::uint8_t>& buffer, uint16_t type, const Details& value)
216 {
217 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
218 return false;
219 }
220 auto tagCursor = cursor_;
221 cursor_ += sizeof(TLVHead);
222 auto valueCursor = cursor_;
223 for (auto &[key, val] : value) {
224 if (!Write(buffer, TAG_MAP_KEY, key)) {
225 return false;
226 }
227 if (!Write(buffer, TAG_MAP_VALUE_TYPE, val)) {
228 return false;
229 }
230 }
231 WriteHead(buffer, type, tagCursor, cursor_ - valueCursor);
232 return true;
233 }
234
Write(std::vector<std::uint8_t> & buffer,uint16_t type,TLVObject & value)235 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, TLVObject &value)
236 {
237 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
238 return false;
239 }
240 auto tagCursor = cursor_;
241 cursor_ += sizeof(TLVHead);
242 auto valueCursor = cursor_;
243 bool ret = value.Encode(buffer, cursor_, buffer.size());
244 WriteHead(buffer, type, tagCursor, cursor_ - valueCursor);
245 return ret;
246 }
247
Write(std::vector<std::uint8_t> & buffer,uint16_t type,std::vector<uint8_t> & value)248 bool TLVObject::Write(std::vector<std::uint8_t> &buffer, uint16_t type, std::vector<uint8_t> &value)
249 {
250 if (!HasExpectBuffer(buffer, sizeof(TLVHead) + value.size())) {
251 return false;
252 }
253 WriteHead(buffer, type, cursor_, value.size());
254 cursor_ += sizeof(TLVHead);
255
256 if (!value.empty()) {
257 auto err = memcpy_s(buffer.data() + cursor_, buffer.size() - cursor_, value.data(), value.size());
258 if (err != EOK) {
259 return false;
260 }
261 }
262 cursor_ += value.size();
263 return true;
264 }
ReadHead(const std::vector<std::uint8_t> & buffer,TLVHead & head)265 bool TLVObject::ReadHead(const std::vector<std::uint8_t> &buffer, TLVHead &head)
266 {
267 if (!HasExpectBuffer(buffer, sizeof(TLVHead))) {
268 return false;
269 }
270 const auto *pHead = reinterpret_cast<const TLVHead *>(buffer.data() + cursor_);
271 if (!HasExpectBuffer(buffer, NetToHost(pHead->len)) &&
272 !HasExpectBuffer(buffer, NetToHost(pHead->len) + sizeof(TLVHead))) {
273 return false;
274 }
275 head.tag = NetToHost(pHead->tag);
276 head.len = NetToHost(pHead->len);
277 cursor_ += sizeof(TLVHead);
278 return true;
279 }
ReadValue(const std::vector<std::uint8_t> & buffer,std::monostate & value,const TLVHead & head)280 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, std::monostate &value, const TLVHead &head)
281 {
282 return true;
283 }
ReadValue(const std::vector<std::uint8_t> & buffer,void * value,const TLVHead & head)284 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, void *value, const TLVHead &head)
285 {
286 return true;
287 }
ReadValue(const std::vector<std::uint8_t> & buffer,bool & value,const TLVHead & head)288 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, bool &value, const TLVHead &head)
289 {
290 return ReadBasicValue(buffer, value, head);
291 }
ReadValue(const std::vector<std::uint8_t> & buffer,int8_t & value,const TLVHead & head)292 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, int8_t &value, const TLVHead &head)
293 {
294 return ReadBasicValue(buffer, value, head);
295 }
ReadValue(const std::vector<std::uint8_t> & buffer,int16_t & value,const TLVHead & head)296 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, int16_t &value, const TLVHead &head)
297 {
298 return ReadBasicValue(buffer, value, head);
299 }
ReadValue(const std::vector<std::uint8_t> & buffer,int32_t & value,const TLVHead & head)300 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, int32_t &value, const TLVHead &head)
301 {
302 return ReadBasicValue(buffer, value, head);
303 }
304
ReadValue(const std::vector<std::uint8_t> & buffer,int64_t & value,const TLVHead & head)305 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, int64_t &value, const TLVHead &head)
306 {
307 return ReadBasicValue(buffer, value, head);
308 }
ReadValue(const std::vector<std::uint8_t> & buffer,double & value,const TLVHead & head)309 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, double &value, const TLVHead &head)
310 {
311 return ReadBasicValue(buffer, value, head);
312 }
ReadValue(const std::vector<std::uint8_t> & buffer,uint32_t & value,const TLVHead & head)313 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, uint32_t &value, const TLVHead &head)
314 {
315 return ReadBasicValue(buffer, value, head);
316 }
ReadValue(const std::vector<std::uint8_t> & buffer,std::string & value,const TLVHead & head)317 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, std::string &value, const TLVHead &head)
318 {
319 if (!HasExpectBuffer(buffer, head.len)) {
320 return false;
321 }
322 value.append(reinterpret_cast<const char *>(buffer.data() + cursor_), head.len);
323 cursor_ += head.len;
324 return true;
325 }
ReadValue(const std::vector<std::uint8_t> & buffer,RawMem & rawMem,const TLVHead & head)326 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, RawMem &rawMem, const TLVHead &head)
327 {
328 if (!HasExpectBuffer(buffer, head.len)) {
329 return false;
330 }
331 rawMem.buffer = (uintptr_t)(buffer.data() + cursor_);
332 rawMem.bufferLen = head.len;
333 cursor_ += head.len;
334 return true;
335 }
336
ReadValue(const std::vector<std::uint8_t> & buffer,TLVObject & value,const TLVHead & head)337 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, TLVObject &value, const TLVHead &head)
338 {
339 return value.Decode(buffer, cursor_, cursor_ + head.len);
340 }
ReadValue(const std::vector<std::uint8_t> & buffer,std::vector<uint8_t> & value,const TLVHead & head)341 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, std::vector<uint8_t> &value, const TLVHead &head)
342 {
343 if (!HasExpectBuffer(buffer, head.len)) {
344 return false;
345 }
346 std::vector<uint8_t> buff(buffer.data() + cursor_, buffer.data() + cursor_ + head.len);
347 value = std::move(buff);
348 cursor_ += head.len;
349 return true;
350 }
ReadValue(const std::vector<std::uint8_t> & buffer,std::map<std::string,std::vector<uint8_t>> & value,const TLVHead & head)351 bool TLVObject::ReadValue(
352 const std::vector<std::uint8_t> &buffer, std::map<std::string, std::vector<uint8_t>> &value, const TLVHead &head)
353 {
354 auto mapEnd = cursor_ + head.len;
355 for (; cursor_ < mapEnd;) {
356 // item key
357 TLVHead keyHead{};
358 bool ret = ReadHead(buffer, keyHead);
359 std::string itemKey;
360 ret = ret && ReadValue(buffer, itemKey, keyHead);
361
362 // item value
363 TLVHead valueHead{};
364 ret = ret && ReadHead(buffer, valueHead);
365 std::vector<uint8_t> itemValue(0);
366 ret = ret && ReadValue(buffer, itemValue, valueHead);
367 if (!ret) {
368 return false;
369 }
370 value.emplace(itemKey, itemValue);
371 }
372 return true;
373 }
374
375 template<typename _OutTp>
ReadVariant(const std::vector<std::uint8_t> & buffer,uint32_t step,uint32_t index,_OutTp & output,const TLVHead & head)376 bool TLVObject::ReadVariant(const std::vector<std::uint8_t>& buffer, uint32_t step, uint32_t index, _OutTp& output,
377 const TLVHead& head)
378 {
379 return true;
380 }
381
382 template<typename _OutTp, typename _First, typename... _Rest>
ReadVariant(const std::vector<std::uint8_t> & buffer,uint32_t step,uint32_t index,_OutTp & value,const TLVHead & head)383 bool TLVObject::ReadVariant(const std::vector<std::uint8_t>& buffer, uint32_t step, uint32_t index, _OutTp& value,
384 const TLVHead& head)
385 {
386 if (step == index) {
387 TLVHead valueHead{};
388 ReadHead(buffer, valueHead);
389 _First output{};
390 auto success = ReadValue(buffer, output, valueHead);
391 value = output;
392 return success;
393 }
394 return ReadVariant<_OutTp, _Rest...>(buffer, step + 1, index, value, head);
395 }
396
397 template<typename... _Types>
ReadValue(const std::vector<std::uint8_t> & buffer,std::variant<_Types...> & value,const TLVHead & head)398 bool TLVObject::ReadValue(const std::vector<std::uint8_t>& buffer, std::variant<_Types...>& value, const TLVHead& head)
399 {
400 TLVHead valueHead{};
401 ReadHead(buffer, valueHead);
402 uint32_t index = 0;
403 if (!ReadValue(buffer, index, valueHead)) {
404 return false;
405 }
406 return ReadVariant<decltype(value), _Types...>(buffer, 0, index, value, valueHead);
407 }
408
409 template<>
ReadValue(const std::vector<std::uint8_t> & buffer,EntryValue & value,const TLVHead & head)410 bool TLVObject::ReadValue(const std::vector<std::uint8_t>& buffer, EntryValue& value, const TLVHead& head)
411 {
412 TLVHead valueHead{};
413 ReadHead(buffer, valueHead);
414 uint32_t index = 0;
415 if (!ReadValue(buffer, index, valueHead)) {
416 return false;
417 }
418 return ReadVariant<decltype(value), std::monostate, int32_t, int64_t, double, bool, std::string,
419 std::vector<uint8_t>, std::shared_ptr<OHOS::AAFwk::Want>, std::shared_ptr<OHOS::Media::PixelMap>,
420 std::shared_ptr<Object>, nullptr_t>(buffer, 0, index, value, valueHead);
421 }
422
ReadValue(const std::vector<std::uint8_t> & buffer,Details & value,const TLVHead & head)423 bool TLVObject::ReadValue(const std::vector<std::uint8_t>& buffer, Details& value, const TLVHead& head)
424 {
425 auto mapEnd = cursor_ + head.len;
426 while (cursor_ < mapEnd) {
427 TLVHead keyHead{};
428 if (!ReadHead(buffer, keyHead)) {
429 return false;
430 }
431 std::string itemKey = "";
432 if (!ReadValue(buffer, itemKey, keyHead)) {
433 return false;
434 }
435 TLVHead variantHead{};
436 if (!ReadHead(buffer, variantHead)) {
437 return false;
438 }
439 ValueType itemValue;
440 if (!ReadValue(buffer, itemValue, variantHead)) {
441 return false;
442 }
443 value.emplace(itemKey, itemValue);
444 }
445 return true;
446 }
447
ReadValue(const std::vector<std::uint8_t> & buffer,Object & value,const TLVHead & head)448 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, Object &value, const TLVHead &head)
449 {
450 auto mapEnd = cursor_ + head.len;
451 while (cursor_ < mapEnd) {
452 TLVHead keyHead{};
453 if (!ReadHead(buffer, keyHead)) {
454 return false;
455 }
456 std::string itemKey = "";
457 if (!ReadValue(buffer, itemKey, keyHead)) {
458 return false;
459 }
460 TLVHead valueHead{};
461 if (!ReadHead(buffer, valueHead)) {
462 return false;
463 }
464 EntryValue itemValue;
465 if (!ReadValue(buffer, itemValue, head)) {
466 return false;
467 }
468 value.value_.emplace(itemKey, itemValue);
469 }
470 return true;
471 }
472
ReadValue(const std::vector<std::uint8_t> & buffer,AAFwk::Want & value,const TLVHead & head)473 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, AAFwk::Want &value, const TLVHead &head)
474 {
475 RawMem rawMem{};
476 if (!ReadValue(buffer, rawMem, head)) {
477 return false;
478 }
479 auto ret = ParcelUtil::Raw2Parcelable<AAFwk::Want>(rawMem);
480 if (!ret) {
481 return false;
482 }
483 value = *(ret);
484 return true;
485 }
486
ReadValue(const std::vector<std::uint8_t> & buffer,std::shared_ptr<Media::PixelMap> & value,const TLVHead & head)487 bool TLVObject::ReadValue(const std::vector<std::uint8_t> &buffer, std::shared_ptr<Media::PixelMap> &value,
488 const TLVHead &head)
489 {
490 std::vector<std::uint8_t> u8Value;
491 if (!ReadValue(buffer, u8Value, head)) {
492 return false;
493 }
494 value = Vector2PixelMap(u8Value);
495 return true;
496 }
497
Encode(std::vector<std::uint8_t> & buffer,size_t & cursor,size_t total)498 bool TLVObject::Encode(std::vector<std::uint8_t> &buffer, size_t &cursor, size_t total)
499 {
500 cursor_ = cursor;
501 total_ = total;
502 bool ret = Encode(buffer);
503 cursor = cursor_;
504 return ret;
505 }
Decode(const std::vector<std::uint8_t> & buffer,size_t & cursor,size_t total)506 bool TLVObject::Decode(const std::vector<std::uint8_t> &buffer, size_t &cursor, size_t total)
507 {
508 cursor_ = cursor;
509 total_ = total;
510 bool ret = Decode(buffer);
511 cursor = cursor_;
512 return ret;
513 }
514
Vector2PixelMap(std::vector<std::uint8_t> & value)515 std::shared_ptr<Media::PixelMap> TLVObject::Vector2PixelMap(std::vector<std::uint8_t> &value)
516 {
517 if (value.size() == 0) {
518 return nullptr;
519 }
520 return std::shared_ptr<Media::PixelMap> (Media::PixelMap::DecodeTlv(value));
521 }
522
PixelMap2Vector(std::shared_ptr<Media::PixelMap> pixelMap)523 std::vector<std::uint8_t> TLVObject::PixelMap2Vector(std::shared_ptr<Media::PixelMap> pixelMap)
524 {
525 if (pixelMap == nullptr) {
526 return {};
527 }
528 std::vector<std::uint8_t> value;
529 if (!pixelMap->EncodeTlv(value)) {
530 return {};
531 }
532 return value;
533 }
534 } // namespace OHOS::MiscServices
535