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