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
16 #ifndef OHOS_CLOUD_SYNC_SERVICE_FILE_DATA_CONVERTOR_H
17 #define OHOS_CLOUD_SYNC_SERVICE_FILE_DATA_CONVERTOR_H
18
19 #include <ctime>
20 #include <iostream>
21 #include <sstream>
22 #include <unordered_map>
23
24 #include "data_convertor.h"
25 #include "dfs_error.h"
26 #include "gallery_file_const.h"
27 #include "utils_log.h"
28
29 namespace OHOS {
30 namespace FileManagement {
31 namespace CloudSync {
32
33 /* thumb */
34 const std::string THUMB_SUFFIX = "THM";
35 const std::string LCD_SUFFIX = "LCD";
36
37 /* s -> ms */
38 const int32_t SECOND_TO_MILLISECOND = 1000;
39
40 /* ms -> s */
41 const int32_t MILLISECOND_TO_SECOND = 1000;
42
43 class FileDataConvertor : public DataConvertor {
44 public:
45 enum OperationType {
46 /* upload */
47 FILE_CREATE,
48 FILE_DELETE,
49 FILE_METADATA_MODIFY,
50 FILE_DATA_MODIFY,
51 /* download */
52 FILE_DOWNLOAD,
53 /*clean*/
54 FILE_CLEAN
55 };
56
57 enum PhotoSubType {
58 DEFAULT,
59 SCREENSHOT,
60 CAMERA
61 };
62
63 FileDataConvertor(int32_t userId, std::string &bundleName, OperationType type);
64 ~FileDataConvertor() = default;
65
66 int32_t Convert(DriveKit::DKRecord &record, NativeRdb::ResultSet &resultSet);
67 int32_t Convert(DriveKit::DKRecord &record, NativeRdb::ValuesBucket &valuesBucket);
68
69 std::string GetThumbPath(const std::string &path, const std::string &key);
70 std::string GetHmdfsLocalPath(const std::string &path);
71 std::string GetThumbPathInCloud(const std::string &path, const std::string &key);
72 std::string GetLocalPathToCloud(const std::string &path);
73 /* path conversion */
74 std::string GetLowerPath(const std::string &path);
75 std::string GetLowerTmpPath(const std::string &path);
76 std::string GetSandboxPath(const std::string &path);
77
78 private:
79 /* record id */
80 int32_t FillRecordId(DriveKit::DKRecord &record, NativeRdb::ResultSet &resultSet);
81
82 /* basic */
83 int32_t HandleAlbumId(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
84 int32_t HandleFileName(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
85 int32_t HandleHash(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
86 int32_t HandleSource(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
87 int32_t HandleFileType(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
88 int32_t HandleCreatedTime(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
89 int32_t HandleFavorite(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
90 int32_t HandleDescription(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
91 int32_t HandleRecycleTime(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
92 int32_t HandleRecycled(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
93 int32_t HandleSize(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
94 int32_t HandleMimeType(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
95 int32_t HandleEditedTime(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
96
97 int32_t HandleUniqueFileds(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
98 int32_t HandleCompatibleFileds(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
99
100 /* properties */
101 int32_t HandleProperties(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
102
103 int32_t HandleDuration(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
104 int32_t HandleHeight(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
105 int32_t HandleRotate(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
106 int32_t HandleWidth(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
107 int32_t HandlePosition(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
108 int32_t HandleDataModified(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
109 int32_t HandleDetailTime(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
110 int32_t HandleFileCreateTime(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
111 int32_t HandleFirstUpdateTime(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
112 int32_t HandleRelativeBucketId(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
113 int32_t HandleSourceFileName(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
114 int32_t HandleSourcePath(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
115 int32_t HandleTimeZone(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
116 int32_t HandleThumbSize(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
117 int32_t HandleLcdSize(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
118 /* properties - general */
119 int32_t HandleGeneral(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
120
121 int32_t HandleAttributes(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet);
122 /* attachments */
123 int32_t HandleAttachments(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
124
125 /* local info */
126 int32_t HandleLocalInfo(DriveKit::DKRecordData &data, NativeRdb::ResultSet &resultSet);
127
128 int32_t HandleContent(DriveKit::DKRecordData &data, std::string &path);
129 int32_t HandleThumbnail(DriveKit::DKRecordData &data, std::string &path);
130 int32_t HandleLcd(DriveKit::DKRecordData &data, std::string &path);
131
132 int32_t TryCompensateValue(const DriveKit::DKRecord &record, DriveKit::DKRecordData &data,
133 NativeRdb::ValuesBucket &valueBucket);
134 int32_t ExtractAttributeValue(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
135
136 /* compensate missing filed according gallery value*/
137 int32_t CompensateData(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
138 int32_t CompensateTitle(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
139 int32_t CompensateMediaType(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
140 int32_t CompensateDataAdded(const DriveKit::DKRecord &record, NativeRdb::ValuesBucket &valueBucket);
141 int32_t CompensateMetaDateModified(const DriveKit::DKRecord &record, NativeRdb::ValuesBucket &valueBucket);
142 int32_t CompensateSubtype(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
143 int32_t CompensateDuration(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
144
145 /* extract compatible value stored in properties */
146 int32_t ExtractCompatibleValue(const DriveKit::DKRecord &record,
147 DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
148 int32_t ExtractOrientation(DriveKit::DKRecordFieldMap &map, NativeRdb::ValuesBucket &valueBucket);
149 int32_t ExtractPosition(DriveKit::DKRecordFieldMap &map, NativeRdb::ValuesBucket &valueBucket);
150 int32_t ExtractHeight(DriveKit::DKRecordFieldMap &map, NativeRdb::ValuesBucket &valueBucket);
151 int32_t ExtractWidth(DriveKit::DKRecordFieldMap &map, NativeRdb::ValuesBucket &valueBucket);
152
153 int32_t ExtractSize(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
154 int32_t ExtractDisplayName(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
155 int32_t ExtractMimeType(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
156 int32_t ExtractDeviceName(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
157 int32_t ExtractDateModified(const DriveKit::DKRecord &record, NativeRdb::ValuesBucket &valueBucket);
158 int32_t ExtractDateTaken(const DriveKit::DKRecord &record, NativeRdb::ValuesBucket &valueBucket);
159 int32_t ExtractFavorite(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
160 int32_t ExtractDateTrashed(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket);
161 int32_t ExtractCloudId(const DriveKit::DKRecord &record, NativeRdb::ValuesBucket &valueBucket);
162
163 bool IfContainsAttributes(const DriveKit::DKRecord &record);
164
165 /* identifier */
166 int32_t userId_;
167 std::string bundleName_;
168 static std::string recordType_;
169 OperationType type_;
170
171 /* path */
172 static std::string prefix_;
173 static std::string suffix_;
174 static std::string sandboxPrefix_;
175 static std::string prefixLCD_;
176 static std::string suffixLCD_;
177 static std::string prefixCloud_;
178 static std::string suffixCloud_;
179 };
180
HandleFileName(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)181 inline int32_t FileDataConvertor::HandleFileName(DriveKit::DKRecordData &data,
182 NativeRdb::ResultSet &resultSet)
183 {
184 std::string displayName;
185 int32_t ret = GetString(Media::PhotoColumn::MEDIA_NAME, displayName, resultSet);
186 if (ret != E_OK) {
187 return ret;
188 }
189 data[FILE_FILE_NAME] = DriveKit::DKRecordField(displayName);
190 return E_OK;
191 }
192
HandleCreatedTime(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)193 inline int32_t FileDataConvertor::HandleCreatedTime(DriveKit::DKRecordData &data,
194 NativeRdb::ResultSet &resultSet)
195 {
196 int64_t val;
197 int32_t ret = GetLong(Media::PhotoColumn::MEDIA_DATE_ADDED, val, resultSet);
198 if (ret != E_OK) {
199 return ret;
200 }
201 /* no overflow: 64 >> 32 + 3 */
202 data[FILE_CREATED_TIME] = DriveKit::DKRecordField(std::to_string(val * SECOND_TO_MILLISECOND));
203 return E_OK;
204 }
205
HandleHash(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)206 inline int32_t FileDataConvertor::HandleHash(DriveKit::DKRecordData &data,
207 NativeRdb::ResultSet &resultSet)
208 {
209 data[FILE_HASH_ID] = DriveKit::DKRecordField("Md5_default_hash");
210 return E_OK;
211 }
212
HandleSize(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)213 inline int32_t FileDataConvertor::HandleSize(DriveKit::DKRecordData &data,
214 NativeRdb::ResultSet &resultSet)
215 {
216 int32_t val;
217 int32_t ret = GetInt(Media::PhotoColumn::MEDIA_SIZE, val, resultSet);
218 if (ret != E_OK) {
219 return ret;
220 }
221 data[FILE_SIZE] = DriveKit::DKRecordField(val);
222 return E_OK;
223 }
224
HandleSource(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)225 inline int32_t FileDataConvertor::HandleSource(DriveKit::DKRecordData &data,
226 NativeRdb::ResultSet &resultSet)
227 {
228 std::string val;
229 int32_t ret = GetString(Media::PhotoColumn::MEDIA_DEVICE_NAME, val, resultSet);
230 if (ret != E_OK) {
231 return ret;
232 }
233 data[FILE_SOURCE] = DriveKit::DKRecordField(val);
234 return E_OK;
235 }
236
HandleFileType(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)237 inline int32_t FileDataConvertor::HandleFileType(DriveKit::DKRecordData &data,
238 NativeRdb::ResultSet &resultSet)
239 {
240 int32_t val;
241 int32_t ret = GetInt(Media::PhotoColumn::MEDIA_TYPE, val, resultSet);
242 if (ret != E_OK) {
243 return ret;
244 }
245 data[FILE_FILETYPE] = DriveKit::DKRecordField(val ==
246 Media::MEDIA_TYPE_VIDEO ? FILE_TYPE_VIDEO : FILE_TYPE_IMAGE);
247 return E_OK;
248 }
249
HandleRecycled(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)250 inline int32_t FileDataConvertor::HandleRecycled(DriveKit::DKRecordData &data,
251 NativeRdb::ResultSet &resultSet)
252 {
253 int64_t val;
254 int32_t ret = GetLong(Media::PhotoColumn::MEDIA_DATE_TRASHED, val, resultSet);
255 if (ret != E_OK) {
256 return ret;
257 }
258 data[FILE_RECYCLED] = DriveKit::DKRecordField(!!val);
259 return E_OK;
260 }
261
HandleRecycleTime(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)262 inline int32_t FileDataConvertor::HandleRecycleTime(DriveKit::DKRecordData &data,
263 NativeRdb::ResultSet &resultSet)
264 {
265 int64_t val;
266 int32_t ret = GetLong(Media::PhotoColumn::MEDIA_DATE_TRASHED, val, resultSet);
267 if (ret != E_OK) {
268 return ret;
269 }
270 data[FILE_RECYCLE_TIME] = DriveKit::DKRecordField(std::to_string(val * SECOND_TO_MILLISECOND));
271 return E_OK;
272 }
273
HandleMimeType(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)274 inline int32_t FileDataConvertor::HandleMimeType(DriveKit::DKRecordData &data,
275 NativeRdb::ResultSet &resultSet)
276 {
277 std::string mimeType;
278 int32_t ret = GetString(Media::PhotoColumn::MEDIA_MIME_TYPE, mimeType, resultSet);
279 if (ret != E_OK) {
280 return ret;
281 }
282 data[FILE_MIME_TYPE] = DriveKit::DKRecordField(mimeType);
283 return E_OK;
284 }
285
286
HandleEditedTime(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)287 inline int32_t FileDataConvertor::HandleEditedTime(DriveKit::DKRecordData &data,
288 NativeRdb::ResultSet &resultSet)
289 {
290 int64_t val;
291 int32_t ret = GetLong(Media::PhotoColumn::MEDIA_DATE_MODIFIED, val, resultSet);
292 if (ret != E_OK) {
293 return ret;
294 }
295 data[FILE_EDITED_TIME] = DriveKit::DKRecordField(std::to_string(val * SECOND_TO_MILLISECOND));
296 return E_OK;
297 }
298
HandleFavorite(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)299 inline int32_t FileDataConvertor::HandleFavorite(DriveKit::DKRecordData &data,
300 NativeRdb::ResultSet &resultSet)
301 {
302 int32_t val;
303 int32_t ret = GetInt(Media::PhotoColumn::MEDIA_IS_FAV, val, resultSet);
304 if (ret != E_OK) {
305 return ret;
306 }
307 data[FILE_FAVORITE] = DriveKit::DKRecordField(!!val);
308 return E_OK;
309 }
310
311 /* properties */
HandleSourceFileName(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)312 inline int32_t FileDataConvertor::HandleSourceFileName(DriveKit::DKRecordFieldMap &map,
313 NativeRdb::ResultSet &resultSet)
314 {
315 std::string val;
316 int32_t ret = GetString(Media::PhotoColumn::MEDIA_NAME, val, resultSet);
317 if (ret != E_OK) {
318 return ret;
319 }
320 map[FILE_SOURCE_FILE_NAME] = DriveKit::DKRecordField(val);
321 return E_OK;
322 }
323
HandleFirstUpdateTime(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)324 inline int32_t FileDataConvertor::HandleFirstUpdateTime(DriveKit::DKRecordFieldMap &map,
325 NativeRdb::ResultSet &resultSet)
326 {
327 int64_t val;
328 int32_t ret = GetLong(Media::PhotoColumn::MEDIA_DATE_ADDED, val, resultSet);
329 if (ret != E_OK) {
330 return ret;
331 }
332 map[FILE_FIRST_UPDATE_TIME] = DriveKit::DKRecordField(std::to_string(val * SECOND_TO_MILLISECOND));
333 return E_OK;
334 }
335
HandleFileCreateTime(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)336 inline int32_t FileDataConvertor::HandleFileCreateTime(DriveKit::DKRecordFieldMap &map,
337 NativeRdb::ResultSet &resultSet)
338 {
339 int64_t val;
340 int32_t ret = GetLong(Media::PhotoColumn::MEDIA_DATE_ADDED, val, resultSet);
341 if (ret != E_OK) {
342 return ret;
343 }
344 map[FILE_FILE_CREATE_TIME] = DriveKit::DKRecordField(std::to_string(val * SECOND_TO_MILLISECOND));
345 return E_OK;
346 }
347
HandleSourcePath(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)348 inline int32_t FileDataConvertor::HandleSourcePath(DriveKit::DKRecordFieldMap &map,
349 NativeRdb::ResultSet &resultSet)
350 {
351 std::string displayName;
352 int32_t ret = GetString(Media::PhotoColumn::MEDIA_NAME, displayName, resultSet);
353 if (ret != E_OK) {
354 return ret;
355 }
356 map[FILE_SOURCE_PATH] = DriveKit::DKRecordField("/stroage/emulated/0/Pictures/Imports/" + displayName);
357 return E_OK;
358 }
359
HandleRelativeBucketId(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)360 inline int32_t FileDataConvertor::HandleRelativeBucketId(DriveKit::DKRecordFieldMap &map,
361 NativeRdb::ResultSet &resultSet)
362 {
363 return E_OK;
364 }
365
HandleDuration(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)366 inline int32_t FileDataConvertor::HandleDuration(DriveKit::DKRecordFieldMap &map,
367 NativeRdb::ResultSet &resultSet)
368 {
369 int32_t duration;
370 int32_t ret = GetInt(Media::PhotoColumn::MEDIA_DURATION, duration, resultSet);
371 if (ret != E_OK) {
372 return ret;
373 }
374 map[FILE_DURATION] = DriveKit::DKRecordField(duration);
375 return E_OK;
376 }
377
HandleHeight(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)378 inline int32_t FileDataConvertor::HandleHeight(DriveKit::DKRecordFieldMap &map,
379 NativeRdb::ResultSet &resultSet)
380 {
381 int32_t val;
382 int32_t ret = GetInt(Media::PhotoColumn::PHOTO_HEIGHT, val, resultSet);
383 if (ret != E_OK) {
384 return ret;
385 }
386 map[FILE_HEIGHT] = DriveKit::DKRecordField(val);
387 return E_OK;
388 }
389
HandleWidth(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)390 inline int32_t FileDataConvertor::HandleWidth(DriveKit::DKRecordFieldMap &map,
391 NativeRdb::ResultSet &resultSet)
392 {
393 int32_t val;
394 int32_t ret = GetInt(Media::PhotoColumn::PHOTO_WIDTH, val, resultSet);
395 if (ret != E_OK) {
396 return ret;
397 }
398 map[FILE_WIDTH] = DriveKit::DKRecordField(val);
399 return E_OK;
400 }
401
HandleDataModified(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)402 inline int32_t FileDataConvertor::HandleDataModified(DriveKit::DKRecordFieldMap &map,
403 NativeRdb::ResultSet &resultSet)
404 {
405 int64_t val;
406 int32_t ret = GetLong(Media::PhotoColumn::MEDIA_DATE_MODIFIED, val, resultSet);
407 if (ret != E_OK) {
408 return ret;
409 }
410 map[FILE_DATA_MODIFIED] = DriveKit::DKRecordField(std::to_string(val));
411 return E_OK;
412 }
413
HandleTimeZone(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)414 inline int32_t FileDataConvertor::HandleTimeZone(DriveKit::DKRecordFieldMap &map,
415 NativeRdb::ResultSet &resultSet)
416 {
417 map[FILE_TIME_ZONE] = DriveKit::DKRecordField("");
418 return E_OK;
419 }
420
HandleDescription(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)421 inline int32_t FileDataConvertor::HandleDescription(DriveKit::DKRecordData &data,
422 NativeRdb::ResultSet &resultSet)
423 {
424 data[FILE_DESCRIPTION] = DriveKit::DKRecordField("");
425 return E_OK;
426 }
HandleAlbumId(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)427 inline int32_t FileDataConvertor::HandleAlbumId(DriveKit::DKRecordData &data,
428 NativeRdb::ResultSet &resultSet)
429 {
430 return E_OK;
431 }
432
HandleLocalInfo(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)433 inline int32_t FileDataConvertor::HandleLocalInfo(DriveKit::DKRecordData &data,
434 NativeRdb::ResultSet &resultSet)
435 {
436 int32_t val;
437 int32_t ret = GetInt(Media::PhotoColumn::MEDIA_ID, val, resultSet);
438 if (ret != E_OK) {
439 return ret;
440 }
441 data[FILE_LOCAL_ID] = DriveKit::DKRecordField(val);
442 return E_OK;
443 }
444 } // namespace CloudSync
445 } // namespace FileManagement
446 } // namespace OHOS
447 #endif // OHOS_CLOUD_SYNC_SERVICE_FILE_DATA_CONVERTOR_H
448