• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "virtual_cloud_data_translate.h"
16 
17 #include "parcel.h"
18 
19 namespace DistributedDB {
CalculateLens(const Asset & asset)20 uint32_t CalculateLens(const Asset &asset)
21 {
22     uint32_t len = 0;
23     len += Parcel::GetUInt32Len();
24     len += Parcel::GetStringLen(asset.name);
25     len += Parcel::GetStringLen(asset.uri);
26     len += Parcel::GetStringLen(asset.modifyTime);
27     len += Parcel::GetStringLen(asset.createTime);
28     len += Parcel::GetStringLen(asset.size);
29     len += Parcel::GetStringLen(asset.hash);
30     len += Parcel::GetInt64Len();
31     len += Parcel::GetInt64Len();
32     return len;
33 }
34 
CalculateLens(const Assets & assets)35 uint32_t CalculateLens(const Assets &assets)
36 {
37     uint32_t len = 0;
38     for (const auto &asset : assets) {
39         len += CalculateLens(asset);
40     }
41     return len;
42 }
43 
WriteAsset(Parcel & parcel,const Asset & asset)44 void WriteAsset(Parcel &parcel, const Asset &asset)
45 {
46     parcel.WriteUInt32(asset.version);
47     parcel.WriteString(asset.name);
48     parcel.WriteString(asset.uri);
49     parcel.WriteString(asset.modifyTime);
50     parcel.WriteString(asset.createTime);
51     parcel.WriteString(asset.size);
52     parcel.WriteString(asset.hash);
53     parcel.WriteUInt32(asset.status);
54     parcel.WriteInt64(asset.timestamp);
55 }
56 
ReadAsset(Parcel & parcel,Asset & asset)57 void ReadAsset(Parcel &parcel, Asset &asset)
58 {
59     parcel.ReadUInt32(asset.version);
60     parcel.ReadString(asset.name);
61     parcel.ReadString(asset.uri);
62     parcel.ReadString(asset.modifyTime);
63     parcel.ReadString(asset.createTime);
64     parcel.ReadString(asset.size);
65     parcel.ReadString(asset.hash);
66     parcel.ReadUInt32(asset.status);
67     parcel.ReadInt64(asset.timestamp);
68 }
69 
AssetToBlob(const Asset & asset)70 std::vector<uint8_t> VirtualCloudDataTranslate::AssetToBlob(const Asset &asset)
71 {
72     uint32_t srcLen = CalculateLens(asset);
73     std::vector<uint8_t> result(srcLen, 0);
74     Parcel parcel(result.data(), result.size());
75     WriteAsset(parcel, asset);
76     return result;
77 }
78 
AssetsToBlob(const Assets & assets)79 std::vector<uint8_t> VirtualCloudDataTranslate::AssetsToBlob(const Assets &assets)
80 {
81     // first is vector size
82     uint32_t srcLen = 0;
83     srcLen += Parcel::GetUInt32Len();
84     srcLen += CalculateLens(assets);
85     std::vector<uint8_t> result(srcLen, 0);
86     Parcel parcel(result.data(), result.size());
87     parcel.WriteUInt32(assets.size());
88     for (const auto &asset : assets) {
89         WriteAsset(parcel, asset);
90     }
91     return result;
92 }
BlobToAsset(const std::vector<uint8_t> & blob)93 Asset VirtualCloudDataTranslate::BlobToAsset(const std::vector<uint8_t> &blob)
94 {
95     Parcel parcel(const_cast<uint8_t *>(blob.data()), blob.size());
96     Asset asset;
97     ReadAsset(parcel, asset);
98     return asset;
99 }
BlobToAssets(const std::vector<uint8_t> & blob)100 Assets VirtualCloudDataTranslate::BlobToAssets(const std::vector<uint8_t> &blob)
101 {
102     std::vector<uint8_t> inputData = blob;
103     Parcel parcel(inputData.data(), inputData.size());
104     uint32_t count = 0;
105     parcel.ReadUInt32(count);
106     Assets assets;
107     assets.resize(count);
108     for (uint32_t i = 0; i < count; i++) {
109         ReadAsset(parcel, assets[i]);
110     }
111     return assets;
112 }
113 }