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