• 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 
16 #include "file_data_convertor.h"
17 
18 #include <regex>
19 #include <unistd.h>
20 #include <sys/stat.h>
21 
22 #include "medialibrary_db_const.h"
23 #include "thumbnail_const.h"
24 
25 namespace OHOS {
26 namespace FileManagement {
27 namespace CloudSync {
28 using namespace std;
29 using namespace NativeRdb;
30 using namespace Media;
31 using DriveKit::DKLocalErrorCode;
32 
33 /* record type */
34 string FileDataConvertor::recordType_ = "media";
35 
36 /* path */
37 string FileDataConvertor::prefix_ = "/data/service/el2/";
38 string FileDataConvertor::suffix_ = "/hmdfs/account/files";
39 string FileDataConvertor::sandboxPrefix_ = "/storage/cloud/files";
40 string FileDataConvertor::prefixLCD_ = "/mnt/hmdfs/";
41 string FileDataConvertor::suffixLCD_ = "/account/device_view/local/files";
42 string FileDataConvertor::prefixCloud_ = "/storage/cloud/";
43 string FileDataConvertor::suffixCloud_ = "/files";
44 string FileDataConvertor::tmpSuffix_ = ".temp.download";
45 
46 constexpr size_t DEFAULT_TIME_SIZE = 32;
47 constexpr size_t FORMATTED_YEAR_SIZE = 4;
FileDataConvertor(int32_t userId,string & bundleName,OperationType type,const function<void (int32_t,NativeRdb::ResultSet & resultSet)> & func)48 FileDataConvertor::FileDataConvertor(int32_t userId, string &bundleName, OperationType type,
49     const function<void(int32_t, NativeRdb::ResultSet &resultSet)> &func) : userId_(userId),
50     bundleName_(bundleName), type_(type), errHandler_(func)
51 {
52 }
53 
Convert(DriveKit::DKRecord & record,NativeRdb::ResultSet & resultSet)54 int32_t FileDataConvertor::Convert(DriveKit::DKRecord &record, NativeRdb::ResultSet &resultSet)
55 {
56     DriveKit::DKRecordData data;
57 
58     /* process cloud sync unique fileds*/
59     RETURN_ON_ERR(HandleUniqueFileds(data, resultSet));
60 
61     /* process compatible fileds shared with gallery or gallery-specific fileds*/
62     RETURN_ON_ERR(HandleCompatibleFileds(data, resultSet));
63     record.SetRecordData(data);
64     record.SetRecordType(recordType_);
65     if (type_ == FILE_CREATE) {
66         record.SetNewCreate(true);
67     } else {
68         int32_t ret = FillRecordId(record, resultSet);
69         if (ret != E_OK) {
70             LOGE("fill record id err %{public}d", ret);
71             return ret;
72         }
73     }
74     return E_OK;
75 }
76 
ConvertAsset(DriveKit::DKRecord & record,NativeRdb::ResultSet & resultSet)77 int32_t FileDataConvertor::ConvertAsset(DriveKit::DKRecord &record, NativeRdb::ResultSet &resultSet)
78 {
79     DriveKit::DKRecordData data;
80     int32_t ret = FillRecordId(record, resultSet);
81     if (ret != E_OK) {
82         LOGE("fill record id err %{public}d", ret);
83         return ret;
84     }
85     string path;
86     DriveKit::DKRecordFieldMap map;
87     DataConvertor::GetString(Media::PhotoColumn::MEDIA_FILE_PATH, path, resultSet);
88     map[Media::PhotoColumn::MEDIA_FILE_PATH] = DriveKit::DKRecordField(path);
89     data[FILE_ATTRIBUTES] = DriveKit::DKRecordField(map);
90     record.SetRecordData(data);
91     record.SetRecordType(recordType_);
92     return E_OK;
93 }
94 
HandleErr(int32_t err,NativeRdb::ResultSet & resultSet)95 void FileDataConvertor::HandleErr(int32_t err, NativeRdb::ResultSet &resultSet)
96 {
97     if (errHandler_ != nullptr) {
98         errHandler_(err, resultSet);
99     }
100 }
101 
HandleUniqueFileds(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)102 int32_t FileDataConvertor::HandleUniqueFileds(DriveKit::DKRecordData &data,
103     NativeRdb::ResultSet &resultSet)
104 {
105     DriveKit::DKRecordFieldMap map;
106     /* store media unique fileds in attributes*/
107     RETURN_ON_ERR(HandleAttributes(map, resultSet));
108     data[FILE_ATTRIBUTES] = DriveKit::DKRecordField(map);
109     /* local info */
110     RETURN_ON_ERR(HandleLocalInfo(data, resultSet));
111     return E_OK;
112 }
113 
114 /* Cloud sync unique filed processing */
HandleAttributes(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)115 int32_t FileDataConvertor::HandleAttributes(DriveKit::DKRecordFieldMap &map,
116     NativeRdb::ResultSet &resultSet)
117 {
118     auto size = CLOUD_SYNC_UNIQUE_COLUMNS.size();
119     for (decltype(size) i = 0; i < size; i++) {
120         const string &key = CLOUD_SYNC_UNIQUE_COLUMNS[i];
121         DataType type = CLOUD_SYNC_UNIQUE_COLUMN_TYPES[i];
122         switch (type) {
123             case DataType::INT: {
124                 SET_RECORD_INT(key, resultSet, map);
125                 break;
126             }
127             case DataType::LONG: {
128                 SET_RECORD_LONG(key, resultSet, map);
129                 break;
130             }
131             case DataType::DOUBLE: {
132                 SET_RECORD_DOUBLE(key, resultSet, map);
133                 break;
134             }
135             case DataType::STRING: {
136                 SET_RECORD_STRING(key, resultSet, map);
137                 break;
138             }
139             case DataType::BOOL: {
140                 SET_RECORD_BOOL(key, resultSet, map);
141                 break;
142             }
143         }
144     }
145     RETURN_ON_ERR(HandleDataAdded(map, resultSet));
146     RETURN_ON_ERR(HandleDataModified(map, resultSet));
147     RETURN_ON_ERR(HandleThumbSize(map, resultSet));
148     RETURN_ON_ERR(HandleLcdSize(map, resultSet));
149     RETURN_ON_ERR(HandleFormattedDate(map, resultSet));
150     return E_OK;
151 }
152 
HandleCompatibleFileds(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)153 int32_t FileDataConvertor::HandleCompatibleFileds(DriveKit::DKRecordData &data,
154     NativeRdb::ResultSet &resultSet)
155 {
156     /* gallery-specific or shared fileds */
157     RETURN_ON_ERR(HandleFileName(data, resultSet));
158     RETURN_ON_ERR(HandleCreatedTime(data, resultSet));
159     RETURN_ON_ERR(HandleHash(data, resultSet));
160     RETURN_ON_ERR(HandleSize(data, resultSet));
161     RETURN_ON_ERR(HandleSource(data, resultSet));
162     RETURN_ON_ERR(HandleFileType(data, resultSet));
163     RETURN_ON_ERR(HandleRecycled(data, resultSet));
164     RETURN_ON_ERR(HandleRecycleTime(data, resultSet));
165     RETURN_ON_ERR(HandleFavorite(data, resultSet));
166     RETURN_ON_ERR(HandleDescription(data, resultSet));
167 
168     /* gallery expand fields */
169     RETURN_ON_ERR(HandleProperties(data, resultSet));
170 
171     /* cloud sdk extra feature*/
172     RETURN_ON_ERR(HandleAttachments(data, resultSet));
173 
174     /* cloudsync-specific fields */
175     RETURN_ON_ERR(HandleMimeType(data, resultSet));
176     RETURN_ON_ERR(HandleEditedTime(data, resultSet));
177     return E_OK;
178 }
179 
180 /* properties */
HandleProperties(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)181 int32_t FileDataConvertor::HandleProperties(DriveKit::DKRecordData &data,
182     NativeRdb::ResultSet &resultSet)
183 {
184     DriveKit::DKRecordFieldMap map;
185 
186     /* gallery expand properties */
187     RETURN_ON_ERR(HandleSourceFileName(map, resultSet));
188     RETURN_ON_ERR(HandleFirstUpdateTime(map, resultSet));
189     RETURN_ON_ERR(HandleFileCreateTime(map, resultSet));
190     RETURN_ON_ERR(HandleDetailTime(map, resultSet));
191     RETURN_ON_ERR(HandleSourcePath(map, resultSet));
192     RETURN_ON_ERR(HandleRelativeBucketId(map, resultSet));
193     RETURN_ON_ERR(HandlePosition(map, resultSet));
194     RETURN_ON_ERR(HandleRotate(map, resultSet));
195     RETURN_ON_ERR(HandleDuration(map, resultSet));
196 
197     /* Resolution is combined by cloud sdk, just upload height and width */
198     RETURN_ON_ERR(HandleHeight(map, resultSet));
199     RETURN_ON_ERR(HandleWidth(map, resultSet));
200     /* set map */
201     data[FILE_PROPERTIES] = DriveKit::DKRecordField(map);
202     return E_OK;
203 }
204 
205 /* attachments */
HandleAttachments(DriveKit::DKRecordData & data,NativeRdb::ResultSet & resultSet)206 int32_t FileDataConvertor::HandleAttachments(DriveKit::DKRecordData &data,
207     NativeRdb::ResultSet &resultSet)
208 {
209     if (type_ != FILE_CREATE && type_ != FILE_DATA_MODIFY) {
210         return E_OK;
211     }
212 
213     /* path */
214     string path;
215     int32_t ret = GetString(PhotoColumn::MEDIA_FILE_PATH, path, resultSet);
216     if (ret != E_OK) {
217         return ret;
218     }
219 
220     /* content */
221     ret = HandleContent(data, path);
222     if (ret != E_OK) {
223         LOGE("handle thumbnail err %{public}d", ret);
224         return ret;
225     }
226     /* thumb */
227     ret = HandleThumbnail(data, path);
228     if (ret != E_OK) {
229         LOGE("handle thumbnail err %{public}d", ret);
230         return ret;
231     }
232     /* lcd */
233     ret = HandleLcd(data, path);
234     if (ret != E_OK) {
235         LOGE("handle lcd err %{public}d", ret);
236         return ret;
237     }
238 
239     return E_OK;
240 }
241 
HandleHeight(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)242 int32_t FileDataConvertor::HandleHeight(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet)
243 {
244     int32_t val = 0;
245     int32_t ret = GetInt(Media::PhotoColumn::PHOTO_HEIGHT, val, resultSet);
246     if (ret != E_OK) {
247         LOGE("Get local height err %{public}d", ret);
248         return ret;
249     }
250     if (val == 0) {
251         LOGW("Get local height is 0 ");
252         return ret;
253     }
254     map[FILE_HEIGHT] = DriveKit::DKRecordField(val);
255     return E_OK;
256 }
257 
HandleWidth(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)258 int32_t FileDataConvertor::HandleWidth(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet)
259 {
260     int32_t val = 0;
261     int32_t ret = GetInt(Media::PhotoColumn::PHOTO_WIDTH, val, resultSet);
262     if (ret != E_OK) {
263         LOGE("Get local wdith err %{public}d", ret);
264         return ret;
265     }
266     if (val == 0) {
267         LOGW("Get local wdith is 0 ");
268         return ret;
269     }
270     map[FILE_WIDTH] = DriveKit::DKRecordField(val);
271     return E_OK;
272 }
273 
274 /* record id */
FillRecordId(DriveKit::DKRecord & record,NativeRdb::ResultSet & resultSet)275 int32_t FileDataConvertor::FillRecordId(DriveKit::DKRecord &record,
276     NativeRdb::ResultSet &resultSet)
277 {
278     string val;
279     int32_t ret = GetString(PhotoColumn::PHOTO_CLOUD_ID, val, resultSet);
280     if (ret != E_OK) {
281         return ret;
282     }
283     record.SetRecordId(val);
284     return E_OK;
285 }
286 
HandleThumbSize(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)287 int32_t FileDataConvertor::HandleThumbSize(DriveKit::DKRecordFieldMap &map,
288     NativeRdb::ResultSet &resultSet)
289 {
290     if (type_ != FILE_CREATE && type_ != FILE_DATA_MODIFY) {
291         return E_OK;
292     }
293 
294     string path;
295     int32_t ret = GetString(PhotoColumn::MEDIA_FILE_PATH, path, resultSet);
296     if (ret != E_OK) {
297         LOGE("get filepath failed");
298         return ret;
299     }
300 
301     string thumbnailPath = GetThumbPath(path, THUMB_SUFFIX);
302     struct stat fileStat;
303     int err = stat(thumbnailPath.c_str(), &fileStat);
304     if (err < 0) {
305         LOGE("get thumb size failed errno :%{public}d", errno);
306         return E_PATH;
307     }
308 
309     map[FILE_THUMB_SIZE] = DriveKit::DKRecordField(int64_t(fileStat.st_size));
310     return E_OK;
311 }
312 
HandleLcdSize(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)313 int32_t FileDataConvertor::HandleLcdSize(DriveKit::DKRecordFieldMap &map,
314     NativeRdb::ResultSet &resultSet)
315 {
316     if (type_ != FILE_CREATE && type_ != FILE_DATA_MODIFY) {
317         return E_OK;
318     }
319 
320     string path;
321     int32_t ret = GetString(PhotoColumn::MEDIA_FILE_PATH, path, resultSet);
322     if (ret != E_OK) {
323         LOGE("get filepath failed");
324         return ret;
325     }
326 
327     string lcdPath = GetThumbPath(path, LCD_SUFFIX);
328     struct stat fileStat;
329     int err = stat(lcdPath.c_str(), &fileStat);
330     if (err < 0) {
331         LOGE("get lcd size failed errno :%{public}d", errno);
332         return E_PATH;
333     }
334 
335     map[FILE_LCD_SIZE] = DriveKit::DKRecordField(int64_t(fileStat.st_size));
336     return E_OK;
337 }
338 
StrCreateTime(const string & format,int64_t time)339 string FileDataConvertor::StrCreateTime(const string &format, int64_t time)
340 {
341     char strTime[DEFAULT_TIME_SIZE] = "";
342     auto tm = localtime(&time);
343     if (tm != nullptr) {
344         (void)strftime(strTime, sizeof(strTime), format.c_str(), tm);
345         return strTime;
346     } else {
347         std::cout << "Failed to convert time." << std::endl;
348         return "";
349     }
350 }
351 
HandleFormattedDate(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)352 int32_t FileDataConvertor::HandleFormattedDate(DriveKit::DKRecordFieldMap &map, NativeRdb::ResultSet &resultSet)
353 {
354     string year;
355     string month;
356     string day;
357     RETURN_ON_ERR(GetString(PhotoColumn::PHOTO_DATE_YEAR, year, resultSet));
358     RETURN_ON_ERR(GetString(PhotoColumn::PHOTO_DATE_MONTH, month, resultSet));
359     RETURN_ON_ERR(GetString(PhotoColumn::PHOTO_DATE_DAY, day, resultSet));
360 
361     if (year.empty() || month.empty() || day.empty()) {
362         int64_t createTime = 0;
363         RETURN_ON_ERR(GetLong(PhotoColumn::MEDIA_DATE_ADDED, createTime, resultSet));
364         createTime = createTime / MILLISECOND_TO_SECOND;
365         year = StrCreateTime(PhotoColumn::PHOTO_DATE_YEAR_FORMAT, createTime);
366         month = StrCreateTime(PhotoColumn::PHOTO_DATE_MONTH_FORMAT, createTime);
367         day = StrCreateTime(PhotoColumn::PHOTO_DATE_DAY_FORMAT, createTime);
368     }
369 
370     map[PhotoColumn::PHOTO_DATE_YEAR] = DriveKit::DKRecordField(year);
371     map[PhotoColumn::PHOTO_DATE_MONTH] = DriveKit::DKRecordField(month);
372     map[PhotoColumn::PHOTO_DATE_DAY] = DriveKit::DKRecordField(day);
373     return E_OK;
374 }
375 
HandleDetailTime(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)376 int32_t FileDataConvertor::HandleDetailTime(DriveKit::DKRecordFieldMap &map,
377     NativeRdb::ResultSet &resultSet)
378 {
379     int64_t val;
380     int32_t ret = GetLong(Media::PhotoColumn::MEDIA_DATE_ADDED, val, resultSet);
381     if (ret != E_OK) {
382         return ret;
383     }
384     time_t dataAddedStamp = time_t(val / MILLISECOND_TO_SECOND);
385     struct tm timeinfo;
386     char buffer[80];
387     localtime_r(&dataAddedStamp, &timeinfo);
388     size_t size = strftime(buffer, sizeof(buffer), "%Y:%m:%d %H:%M:%S", &timeinfo);
389     if (size == 0) {
390         return E_OK;
391     }
392     std::string detailTime(buffer);
393     map[FILE_DETAIL_TIME] = DriveKit::DKRecordField(detailTime);
394     return E_OK;
395 }
396 
HandlePosition(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)397 int32_t FileDataConvertor::HandlePosition(DriveKit::DKRecordFieldMap &map,
398     NativeRdb::ResultSet &resultSet)
399 {
400     double latitudeVal;
401     double longitudeVal;
402     int32_t ret = GetDouble(Media::PhotoColumn::PHOTO_LATITUDE, latitudeVal, resultSet);
403     if (ret != E_OK) {
404         return ret;
405     }
406     ret = GetDouble(Media::PhotoColumn::PHOTO_LONGITUDE, longitudeVal, resultSet);
407     if (ret != E_OK) {
408         return ret;
409     }
410     std::stringstream latitudestream;
411     std::stringstream longitudestream;
412     latitudestream.precision(15); // 15:precision
413     longitudestream.precision(15); // 15:precision
414     latitudestream << latitudeVal;
415     longitudestream << longitudeVal;
416     std::string position = "{\"x\":\"" + latitudestream.str() + "\",\"y\":\"" + longitudestream.str() +"\"}";
417     map[FILE_POSITION] = DriveKit::DKRecordField(position);
418     return E_OK;
419 }
420 
HandleRotate(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)421 int32_t FileDataConvertor::HandleRotate(DriveKit::DKRecordFieldMap &map,
422     NativeRdb::ResultSet &resultSet)
423 {
424     int32_t val;
425     int32_t ret = GetInt(Media::PhotoColumn::PHOTO_ORIENTATION, val, resultSet);
426     if (ret != E_OK) {
427         return ret;
428     }
429     switch (val) {
430         case ROTATE_ANGLE_0:
431             val = ORIENTATION_NORMAL;
432             break;
433         case ROTATE_ANGLE_90:
434             val = ORIENTATION_ROTATE_90;
435             break;
436         case ROTATE_ANGLE_180:
437             val = ORIENTATION_ROTATE_180;
438             break;
439         case ROTATE_ANGLE_270:
440             val = ORIENTATION_ROTATE_270;
441             break;
442         default:
443             val = ORIENTATION_NORMAL;
444             break;
445     }
446     map[FILE_ROTATION] = DriveKit::DKRecordField(val);
447     return E_OK;
448 }
449 
450 /* properties - general */
HandleGeneral(DriveKit::DKRecordFieldMap & map,NativeRdb::ResultSet & resultSet)451 int32_t FileDataConvertor::HandleGeneral(DriveKit::DKRecordFieldMap &map,
452     NativeRdb::ResultSet &resultSet)
453 {
454     auto size = GALLERY_FILE_COLUMNS.size();
455     for (decltype(size) i = 0; i < size; i++) {
456         const string &key = GALLERY_FILE_COLUMNS[i];
457         DataType type = GALLERY_FILE_COLUMN_TYPES[i];
458         switch (type) {
459             case DataType::INT: {
460                 SET_RECORD_INT(key, resultSet, map);
461                 break;
462             }
463             case DataType::LONG: {
464                 SET_RECORD_LONG(key, resultSet, map);
465                 break;
466             }
467             case DataType::DOUBLE: {
468                 SET_RECORD_DOUBLE(key, resultSet, map);
469                 break;
470             }
471             case DataType::STRING: {
472                 SET_RECORD_STRING(key, resultSet, map);
473                 break;
474             }
475             case DataType::BOOL: {
476                 SET_RECORD_BOOL(key, resultSet, map);
477                 break;
478             }
479         }
480     }
481     return E_OK;
482 }
483 
484 /* attachments */
HandleContent(DriveKit::DKRecordData & data,string & path)485 int32_t FileDataConvertor::HandleContent(DriveKit::DKRecordData &data,
486     string &path)
487 {
488     string lowerPath = GetLowerPath(path);
489     if (access(lowerPath.c_str(), F_OK)) {
490         LOGE("content %{private}s doesn't exist", lowerPath.c_str());
491         return E_PATH;
492     }
493 
494     /* asset */
495     DriveKit::DKAsset content;
496     content.uri = move(lowerPath);
497     content.assetName = FILE_CONTENT;
498     content.operationType = DriveKit::DKAssetOperType::DK_ASSET_ADD;
499     data[FILE_CONTENT] = DriveKit::DKRecordField(content);
500     return E_OK;
501 }
502 
HandleThumbnail(DriveKit::DKRecordData & data,string & path)503 int32_t FileDataConvertor::HandleThumbnail(DriveKit::DKRecordData &data,
504     string &path)
505 {
506     string thumbnailPath = GetThumbPath(path, THUMB_SUFFIX);
507     if (access(thumbnailPath.c_str(), F_OK)) {
508         LOGE("thumbnail %{private}s doesn't exist", thumbnailPath.c_str());
509         return E_PATH;
510     }
511 
512     /* asset */
513     DriveKit::DKAsset content;
514     content.uri = move(thumbnailPath);
515     content.assetName = FILE_THUMBNAIL;
516     content.operationType = DriveKit::DKAssetOperType::DK_ASSET_ADD;
517     data[FILE_THUMBNAIL] = DriveKit::DKRecordField(content);
518     return E_OK;
519 }
520 
HandleLcd(DriveKit::DKRecordData & data,string & path)521 int32_t FileDataConvertor::HandleLcd(DriveKit::DKRecordData &data,
522     string &path)
523 {
524     string lcdPath = GetThumbPath(path, LCD_SUFFIX);
525     if (access(lcdPath.c_str(), F_OK)) {
526         LOGE("lcd %{private}s doesn't exist", lcdPath.c_str());
527         return E_PATH;
528     }
529 
530     /* asset */
531     DriveKit::DKAsset content;
532     content.uri = move(lcdPath);
533     content.assetName = FILE_LCD;
534     content.operationType = DriveKit::DKAssetOperType::DK_ASSET_ADD;
535     data[FILE_LCD] = DriveKit::DKRecordField(content);
536     return E_OK;
537 }
538 
GetLowerPath(const string & path)539 string FileDataConvertor::GetLowerPath(const string &path)
540 {
541     size_t pos = path.find_first_of(sandboxPrefix_);
542     if (pos == string::npos) {
543         LOGE("invalid path %{private}s", path.c_str());
544         return "";
545     }
546     return prefix_ + to_string(userId_) + suffix_ + path.substr(pos +
547         sandboxPrefix_.size());
548 }
549 
GetLowerTmpPath(const string & path)550 string FileDataConvertor::GetLowerTmpPath(const string &path)
551 {
552     string lowerPath = GetLowerPath(path);
553     if (lowerPath == "") {
554         return "";
555     }
556     return lowerPath + tmpSuffix_;
557 }
558 
GetSandboxPath(const string & path)559 string FileDataConvertor::GetSandboxPath(const string &path)
560 {
561     string localPrefix =  prefix_ + to_string(userId_) + suffix_;
562     size_t pos = path.find_first_of(localPrefix);
563     if (pos == string::npos) {
564         LOGE("invalid path %{private}s", path.c_str());
565         return "";
566     }
567     return sandboxPrefix_ + path.substr(pos + localPrefix.size());
568 }
569 
GetThumbPath(const string & path,const string & key)570 string FileDataConvertor::GetThumbPath(const string &path, const string &key)
571 {
572     if (path.length() < ROOT_MEDIA_DIR.length()) {
573         return "";
574     }
575     /* transform sandbox path */
576     return prefixLCD_ + to_string(userId_) + suffixLCD_ + "/" + Media::GetThumbnailPath(path,
577         key).substr(ROOT_MEDIA_DIR.length());
578 }
579 
GetThumbParentPath(const string & path)580 string FileDataConvertor::GetThumbParentPath(const string &path)
581 {
582     size_t pos = path.find_first_of(sandboxPrefix_);
583     if (pos == string::npos) {
584         LOGE("invalid path %{private}s", path.c_str());
585         return "";
586     }
587     /* transform sandbox path to hmdfs local path*/
588     return "/storage/cloud/" + to_string(userId_) + "/files/.thumbs" + path.substr(pos + sandboxPrefix_.size());
589 }
590 
GetHmdfsLocalPath(const string & path)591 string FileDataConvertor::GetHmdfsLocalPath(const string &path)
592 {
593     size_t pos = path.find_first_of(sandboxPrefix_);
594     if (pos == string::npos) {
595         LOGE("invalid path %{private}s", path.c_str());
596         return "";
597     }
598     /* transform sandbox path to hmdfs local path*/
599     return prefixLCD_ + to_string(userId_) + suffixLCD_ + path.substr(pos + sandboxPrefix_.size());
600 }
601 
GetThumbPathInCloud(const std::string & path,const std::string & key)602 string FileDataConvertor::GetThumbPathInCloud(const std::string &path, const std::string &key)
603 {
604     if (path.length() < ROOT_MEDIA_DIR.length()) {
605         return "";
606     }
607     return sandboxPrefix_ + "/" + Media::GetThumbnailPath(path, key).substr(ROOT_MEDIA_DIR.length());
608 }
609 
GetLocalPathToCloud(const std::string & path)610 string FileDataConvertor::GetLocalPathToCloud(const std::string &path)
611 {
612     string localPrefix = prefixLCD_ + to_string(userId_) + suffixLCD_;
613     size_t pos = path.find_first_of(localPrefix);
614     if (pos == string::npos || pos != 0) {
615         LOGE("invalid path %{private}s", path.c_str());
616         return "";
617     }
618 
619     return sandboxPrefix_ + path.substr(localPrefix.length());
620 }
621 
IfContainsAttributes(const DriveKit::DKRecord & record)622 bool FileDataConvertor::IfContainsAttributes(const DriveKit::DKRecord &record)
623 {
624     DriveKit::DKRecordData data;
625     record.GetRecordData(data);
626     if (data.find(FILE_ATTRIBUTES) != data.end()) {
627         DriveKit::DKRecordFieldMap attributes;
628         data[FILE_ATTRIBUTES].GetRecordMap(attributes);
629         return !(attributes.find(PhotoColumn::MEDIA_TITLE) == attributes.end());
630     }
631     return false;
632 }
633 
Convert(DriveKit::DKRecord & record,NativeRdb::ValuesBucket & valueBucket)634 int32_t FileDataConvertor::Convert(DriveKit::DKRecord &record, NativeRdb::ValuesBucket &valueBucket)
635 {
636     DriveKit::DKRecordData data;
637     record.GetRecordData(data);
638     if (!IfContainsAttributes(record)) {
639         int32_t ret = TryCompensateValue(record, data, valueBucket);
640         if (ret != E_OK) {
641             LOGE("record data lose key value");
642             return ret;
643         }
644     } else {
645         int32_t ret = ExtractAttributeValue(data, valueBucket);
646         if (ret != E_OK) {
647             LOGE("record data donnot have attributes set, need");
648             return ret;
649         }
650         RETURN_ON_ERR(CompensateTitle(data, valueBucket));
651     }
652     RETURN_ON_ERR(ExtractCompatibleValue(record, data, valueBucket));
653     return E_OK;
654 }
655 
TryCompensateValue(const DriveKit::DKRecord & record,DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)656 int32_t FileDataConvertor::TryCompensateValue(const DriveKit::DKRecord &record,
657     DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket)
658 {
659     RETURN_ON_ERR(CompensateData(data, valueBucket));
660     RETURN_ON_ERR(CompensateTitle(data, valueBucket));
661     RETURN_ON_ERR(CompensateMediaType(data, valueBucket));
662     RETURN_ON_ERR(CompensateMetaDateModified(record, valueBucket));
663     RETURN_ON_ERR(CompensateSubtype(data, valueBucket));
664     RETURN_ON_ERR(CompensateDuration(data, valueBucket));
665     return E_OK;
666 }
667 
CompensateData(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)668 int32_t FileDataConvertor::CompensateData(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket)
669 {
670     if (data.find(FILE_ATTRIBUTES) == data.end()) {
671         LOGE("record data cannot find attributes or size");
672         return E_INVAL_ARG;
673     }
674     DriveKit::DKRecordFieldMap attributes;
675     data[FILE_ATTRIBUTES].GetRecordMap(attributes);
676     string dataPath;
677     if (attributes[PhotoColumn::MEDIA_FILE_PATH].GetString(dataPath) != DKLocalErrorCode::NO_ERROR) {
678         LOGE("bad file_path in attributes");
679         return E_INVAL_ARG;
680     }
681     valueBucket.PutString(PhotoColumn::MEDIA_FILE_PATH, dataPath);
682     return E_OK;
683 }
684 
CompensateTitle(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)685 int32_t FileDataConvertor::CompensateTitle(DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket)
686 {
687     if (data.find(FILE_PROPERTIES) == data.end()) {
688         LOGW("record data cannot find properties");
689         return E_OK;
690     }
691     DriveKit::DKRecordFieldMap prop;
692     data[FILE_PROPERTIES].GetRecordMap(prop);
693     if (prop.find(FILE_SOURCE_FILE_NAME) == prop.end()) {
694         LOGE("record data cannot find title, ignore it");
695         return E_OK;
696     }
697     string sourceFileName;
698     if (prop[FILE_SOURCE_FILE_NAME].GetString(sourceFileName) != DKLocalErrorCode::NO_ERROR) {
699         LOGE("bad sourceFileName in props");
700         return E_INVAL_ARG;
701     }
702     string title = sourceFileName;
703     size_t pos = sourceFileName.find_last_of(".");
704     if (pos != string::npos) {
705         title = sourceFileName.substr(0, pos);
706     }
707     if (valueBucket.HasColumn(PhotoColumn::MEDIA_TITLE)) {
708         valueBucket.Delete(PhotoColumn::MEDIA_TITLE);
709     }
710     valueBucket.PutString(PhotoColumn::MEDIA_TITLE, title);
711     return E_OK;
712 }
713 
CompensateMediaType(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)714 int32_t FileDataConvertor::CompensateMediaType(DriveKit::DKRecordData &data,
715     NativeRdb::ValuesBucket &valueBucket)
716 {
717     if (data.find(FILE_FILETYPE) == data.end()) {
718         LOGE("record data cannot find properties");
719         return E_INVAL_ARG;
720     }
721     int32_t fileType;
722     if (data[FILE_FILETYPE].GetInt(fileType) != DKLocalErrorCode::NO_ERROR) {
723         LOGE("record data cannot find fileType");
724         return E_INVAL_ARG;
725     }
726     valueBucket.PutInt(PhotoColumn::MEDIA_TYPE, (fileType == FILE_TYPE_VIDEO) ?
727         MEDIA_TYPE_VIDEO : MEDIA_TYPE_IMAGE);
728     return E_OK;
729 }
730 
CompensateDataAdded(const DriveKit::DKRecord & record,NativeRdb::ValuesBucket & valueBucket)731 int32_t FileDataConvertor::CompensateDataAdded(const DriveKit::DKRecord &record,
732     NativeRdb::ValuesBucket &valueBucket)
733 {
734     DriveKit::DKRecordData data;
735     record.GetRecordData(data);
736     int64_t dataAdded = 0;
737     if (data.find(FILE_CREATED_TIME) != data.end()) {
738         data[FILE_CREATED_TIME].GetLong(dataAdded);
739     } else {
740         dataAdded = static_cast<int64_t>(record.GetCreateTime());
741     }
742     if (dataAdded == 0) {
743         LOGE("The createTime of record is incorrect");
744     }
745     valueBucket.PutLong(PhotoColumn::MEDIA_DATE_ADDED, dataAdded);
746     CompensateFormattedDate(dataAdded / MILLISECOND_TO_SECOND, valueBucket);
747     return E_OK;
748 }
749 
CompensateMetaDateModified(const DriveKit::DKRecord & record,NativeRdb::ValuesBucket & valueBucket)750 int32_t FileDataConvertor::CompensateMetaDateModified(const DriveKit::DKRecord &record,
751     NativeRdb::ValuesBucket &valueBucket)
752 {
753     uint64_t metaDataModified = record.GetEditedTime();
754 
755     // imputed value, may not be accurate
756     valueBucket.PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED, metaDataModified);
757     return E_OK;
758 }
759 
CompensateSubtype(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)760 int32_t FileDataConvertor::CompensateSubtype(DriveKit::DKRecordData &data,
761     NativeRdb::ValuesBucket &valueBucket)
762 {
763     if (data.find(FILE_PROPERTIES) == data.end()) {
764         LOGW("record data cannot find properties");
765         return E_OK;
766     }
767     DriveKit::DKRecordFieldMap prop;
768     data[FILE_PROPERTIES].GetRecordMap(prop);
769     if (prop.find(FILE_SOURCE_PATH) == prop.end()) {
770         valueBucket.PutInt(PhotoColumn::PHOTO_SUBTYPE, PhotoSubType::DEFAULT);
771         return E_OK;
772     }
773     string sourcePath;
774     if (prop[FILE_SOURCE_PATH].GetString(sourcePath) != DKLocalErrorCode::NO_ERROR) {
775         LOGE("bad Subtype in props");
776         valueBucket.PutInt(PhotoColumn::PHOTO_SUBTYPE, PhotoSubType::DEFAULT);
777         return E_OK;
778     }
779     int32_t subType = PhotoSubType::DEFAULT;
780     if (sourcePath.find("DCIM") != string::npos && sourcePath.find("Camera") != string::npos) {
781         subType = PhotoSubType::CAMERA;
782     } else if (sourcePath.find("Screenshots") != string::npos) {
783         subType = PhotoSubType::SCREENSHOT;
784     } else {
785         subType = PhotoSubType::DEFAULT;
786     }
787     valueBucket.PutInt(PhotoColumn::PHOTO_SUBTYPE, subType);
788     return E_OK;
789 }
790 
CompensateDuration(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)791 int32_t FileDataConvertor::CompensateDuration(DriveKit::DKRecordData &data,
792     NativeRdb::ValuesBucket &valueBucket)
793 {
794     if (data.find(FILE_PROPERTIES) == data.end()) {
795         LOGW("record data cannot find properties");
796         return E_OK;
797     }
798     DriveKit::DKRecordFieldMap prop;
799     data[FILE_PROPERTIES].GetRecordMap(prop);
800     if (prop.find(FILE_DURATION) == prop.end()) {
801         valueBucket.PutInt(PhotoColumn::MEDIA_DURATION, 0);
802         return E_OK;
803     }
804     int32_t duration = 0;
805     if (prop[FILE_DURATION].GetInt(duration) != DKLocalErrorCode::NO_ERROR) {
806         LOGE("bad duration in props");
807         valueBucket.PutInt(PhotoColumn::MEDIA_DURATION, 0);
808         return E_OK;
809     }
810     valueBucket.PutInt(PhotoColumn::MEDIA_DURATION, duration);
811     return E_OK;
812 }
813 
CompensateFormattedDate(const DriveKit::DKRecord & record,NativeRdb::ValuesBucket & valueBucket)814 int32_t FileDataConvertor::CompensateFormattedDate(const DriveKit::DKRecord &record,
815     NativeRdb::ValuesBucket &valueBucket)
816 {
817     LOGD("try to compensate formatted date");
818     DriveKit::DKRecordData data;
819     record.GetRecordData(data);
820     DriveKit::DKRecordFieldMap attributes = data[FILE_ATTRIBUTES];
821     string dateYear;
822     if (attributes.find(PhotoColumn::PHOTO_DATE_YEAR) != attributes.end() &&
823         attributes[PhotoColumn::PHOTO_DATE_YEAR].GetString(dateYear) == DriveKit::DKLocalErrorCode::NO_ERROR) {
824         if (dateYear.length() == FORMATTED_YEAR_SIZE && dateYear != "1970") {
825             LOGD("formatted date in cloud is correct");
826             return E_OK;
827         } else {
828             LOGE("formatted date in cloud is incorrect");
829             valueBucket.Delete(PhotoColumn::PHOTO_DATE_YEAR);
830             valueBucket.Delete(PhotoColumn::PHOTO_DATE_MONTH);
831             valueBucket.Delete(PhotoColumn::PHOTO_DATE_DAY);
832         }
833     }
834 
835     LOGI("record data cannot find formatted date");
836     uint64_t timeAdded = 0;
837     if (data.find(FILE_CREATED_TIME) != attributes.end()) {
838         int64_t sTimeAdded;
839         data[FILE_CREATED_TIME].GetLong(sTimeAdded);
840         timeAdded = static_cast<uint64_t>(sTimeAdded);
841     } else {
842         timeAdded = record.GetCreateTime();
843         if (timeAdded == 0) {
844             LOGE("cloud date is invalid");
845         }
846     }
847     CompensateFormattedDate(timeAdded / MILLISECOND_TO_SECOND, valueBucket);
848     return E_OK;
849 }
850 
CompensateFormattedDate(uint64_t dateAdded,NativeRdb::ValuesBucket & valueBucket)851 int32_t FileDataConvertor::CompensateFormattedDate(uint64_t dateAdded, NativeRdb::ValuesBucket &valueBucket)
852 {
853     string year = StrCreateTime(PhotoColumn::PHOTO_DATE_YEAR_FORMAT, dateAdded);
854     string month = StrCreateTime(PhotoColumn::PHOTO_DATE_MONTH_FORMAT, dateAdded);
855     string day = StrCreateTime(PhotoColumn::PHOTO_DATE_DAY_FORMAT, dateAdded);
856     valueBucket.PutString(PhotoColumn::PHOTO_DATE_YEAR, year);
857     valueBucket.PutString(PhotoColumn::PHOTO_DATE_MONTH, month);
858     valueBucket.PutString(PhotoColumn::PHOTO_DATE_DAY, day);
859     return E_OK;
860 }
ExtractAttributeValue(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)861 int32_t FileDataConvertor::ExtractAttributeValue(DriveKit::DKRecordData &data,
862     NativeRdb::ValuesBucket &valueBucket)
863 {
864     DriveKit::DKRecordFieldMap attributes = data[FILE_ATTRIBUTES];
865     auto size = CLOUD_SYNC_UNIQUE_COLUMNS.size() - NR_LOCAL_INFO;
866     for (decltype(size) i = 0; i < size; i++) {
867         auto field = CLOUD_SYNC_UNIQUE_COLUMNS[i];
868         auto type = CLOUD_SYNC_UNIQUE_COLUMN_TYPES[i];
869         if (attributes.find(field) == attributes.end()) {
870             LOGE("filed %s not found in record.attributes", field.c_str());
871             continue;
872         }
873         if (HandleField(attributes[field], valueBucket, field, type) != E_OK) {
874             LOGE("HandleField %s failed", field.c_str());
875         }
876     }
877     return E_OK;
878 }
879 
ExtractCompatibleValue(const DriveKit::DKRecord & record,DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)880 int32_t FileDataConvertor::ExtractCompatibleValue(const DriveKit::DKRecord &record,
881     DriveKit::DKRecordData &data, NativeRdb::ValuesBucket &valueBucket)
882 {
883     /* extract value in first level*/
884     RETURN_ON_ERR(ExtractSize(data, valueBucket));
885     RETURN_ON_ERR(ExtractDisplayName(data, valueBucket));
886     RETURN_ON_ERR(ExtractMimeType(data, valueBucket));
887     RETURN_ON_ERR(ExtractDeviceName(data, valueBucket));
888     RETURN_ON_ERR(CompensateDataAdded(record, valueBucket));
889     RETURN_ON_ERR(ExtractDateModified(record, valueBucket));
890     RETURN_ON_ERR(ExtractDateTaken(record, valueBucket));
891     RETURN_ON_ERR(ExtractFavorite(data, valueBucket));
892     RETURN_ON_ERR(ExtractDateTrashed(data, valueBucket));
893     RETURN_ON_ERR(ExtractCloudId(record, valueBucket));
894     RETURN_ON_ERR(ExtractDescription(data, valueBucket));
895 
896     if (data.find(FILE_PROPERTIES) == data.end()) {
897         LOGW("record data cannot find properties");
898         return E_OK;
899     }
900     DriveKit::DKRecordFieldMap prop;
901     data[FILE_PROPERTIES].GetRecordMap(prop);
902 
903     /* extract value in properties*/
904     RETURN_ON_ERR(ExtractOrientation(prop, valueBucket));
905     RETURN_ON_ERR(ExtractPosition(prop, valueBucket));
906     RETURN_ON_ERR(ExtractHeight(prop, valueBucket));
907     RETURN_ON_ERR(ExtractWidth(prop, valueBucket));
908     return E_OK;
909 }
910 
ExtractOrientation(DriveKit::DKRecordFieldMap & map,NativeRdb::ValuesBucket & valueBucket)911 int32_t FileDataConvertor::ExtractOrientation(DriveKit::DKRecordFieldMap &map,
912     NativeRdb::ValuesBucket &valueBucket)
913 {
914     if (map.find(FILE_ROTATION) == map.end()) {
915         LOGI("RecordFieldMap cannot find orientation");
916         return E_OK;
917     }
918     int32_t exifRotateValue;
919     if (map[FILE_ROTATION].GetInt(exifRotateValue) != DKLocalErrorCode::NO_ERROR) {
920         LOGE("extract orientation error");
921         return E_INVAL_ARG;
922     }
923     switch (exifRotateValue) {
924         case ORIENTATION_NORMAL:
925             exifRotateValue = ROTATE_ANGLE_0;
926             break;
927         case ORIENTATION_ROTATE_90:
928             exifRotateValue = ROTATE_ANGLE_90;
929             break;
930         case ORIENTATION_ROTATE_180:
931             exifRotateValue = ROTATE_ANGLE_180;
932             break;
933         case ORIENTATION_ROTATE_270:
934             exifRotateValue = ROTATE_ANGLE_270;
935             break;
936         default:
937             exifRotateValue = ROTATE_ANGLE_0;
938             break;
939     }
940     valueBucket.PutInt(PhotoColumn::PHOTO_ORIENTATION, exifRotateValue);
941     return E_OK;
942 }
943 
ExtractPosition(DriveKit::DKRecordFieldMap & map,NativeRdb::ValuesBucket & valueBucket)944 int32_t FileDataConvertor::ExtractPosition(DriveKit::DKRecordFieldMap &map,
945     NativeRdb::ValuesBucket &valueBucket)
946 {
947     if (map.find(FILE_POSITION) == map.end()) {
948         LOGI("RecordFieldMap cannot find position");
949         return E_OK;
950     }
951     string position;
952     if (map[FILE_POSITION].GetString(position) != DKLocalErrorCode::NO_ERROR) {
953         LOGE("extract orientation error");
954         return E_INVAL_ARG;
955     }
956     string latitude;
957     string longitude;
958     regex positionPattern("(-?\\d+\\.?\\d+|0).*?(-?\\d+\\.?\\d+|0)");
959     smatch match;
960     if (regex_search(position, match, positionPattern)) {
961         latitude = match[FIRST_MATCH_PARAM];
962         longitude = match[SECOND_MATCH_PARAM];
963     } else {
964         LOGE("position %{public}s extract latitude or longitude error", position.c_str());
965         return E_INVAL_ARG;
966     }
967     stringstream latitudestream(latitude);
968     stringstream longitudestream(longitude);
969     latitudestream.precision(15); // 15:precision
970     longitudestream.precision(15); // 15:precision
971     double latitudeValue;
972     double longitudeValue;
973     latitudestream >> latitudeValue;
974     longitudestream >> longitudeValue;
975 
976     valueBucket.PutDouble(PhotoColumn::PHOTO_LATITUDE, latitudeValue);
977     valueBucket.PutDouble(PhotoColumn::PHOTO_LONGITUDE, longitudeValue);
978     return E_OK;
979 }
980 
ExtractHeight(DriveKit::DKRecordFieldMap & map,NativeRdb::ValuesBucket & valueBucket)981 int32_t FileDataConvertor::ExtractHeight(DriveKit::DKRecordFieldMap &map,
982     NativeRdb::ValuesBucket &valueBucket)
983 {
984     if (map.find(FILE_HEIGHT) == map.end()) {
985         LOGI("RecordFieldMap cannot find height");
986         return E_OK;
987     }
988     int32_t height;
989     if (map[FILE_HEIGHT].GetInt(height) != DKLocalErrorCode::NO_ERROR) {
990         LOGE("extract height error");
991         return E_INVAL_ARG;
992     }
993     if (height == 0) {
994         LOGE("The height of the record is incorrect");
995     }
996     valueBucket.PutInt(PhotoColumn::PHOTO_HEIGHT, height);
997     return E_OK;
998 }
999 
ExtractWidth(DriveKit::DKRecordFieldMap & map,NativeRdb::ValuesBucket & valueBucket)1000 int32_t FileDataConvertor::ExtractWidth(DriveKit::DKRecordFieldMap &map,
1001     NativeRdb::ValuesBucket &valueBucket)
1002 {
1003     if (map.find(FILE_WIDTH) == map.end()) {
1004         LOGI("RecordFieldMap cannot find width");
1005         return E_OK;
1006     }
1007     int32_t width;
1008     if (map[FILE_WIDTH].GetInt(width) != DKLocalErrorCode::NO_ERROR) {
1009         LOGE("extract height error");
1010         return E_INVAL_ARG;
1011     }
1012     if (width == 0) {
1013         LOGE("The width of the record is incorrect");
1014     }
1015     valueBucket.PutInt(PhotoColumn::PHOTO_WIDTH, width);
1016     return E_OK;
1017 }
1018 
ExtractSize(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)1019 int32_t FileDataConvertor::ExtractSize(DriveKit::DKRecordData &data,
1020     NativeRdb::ValuesBucket &valueBucket)
1021 {
1022     if (data.find(FILE_SIZE) == data.end()) {
1023         LOGE("record data cannot find FILE_SIZE");
1024         return E_OK;
1025     }
1026     int64_t size;
1027     if (data[FILE_SIZE].GetLong(size) != DKLocalErrorCode::NO_ERROR) {
1028         LOGE("extract size error");
1029         return E_INVAL_ARG;
1030     }
1031     valueBucket.PutLong(PhotoColumn::MEDIA_SIZE, size);
1032     return E_OK;
1033 }
1034 
ExtractDisplayName(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)1035 int32_t FileDataConvertor::ExtractDisplayName(DriveKit::DKRecordData &data,
1036     NativeRdb::ValuesBucket &valueBucket)
1037 {
1038     if (data.find(FILE_FILE_NAME) == data.end()) {
1039         LOGI("record data cannot find FILE_FILE_NAME");
1040         return E_OK;
1041     }
1042     string displayName;
1043     if (data[FILE_FILE_NAME].GetString(displayName) != DKLocalErrorCode::NO_ERROR) {
1044         LOGE("extract displayName error");
1045         return E_INVAL_ARG;
1046     }
1047     valueBucket.PutString(PhotoColumn::MEDIA_NAME, displayName);
1048     return E_OK;
1049 }
1050 
ExtractMimeType(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)1051 int32_t FileDataConvertor::ExtractMimeType(DriveKit::DKRecordData &data,
1052     NativeRdb::ValuesBucket &valueBucket)
1053 {
1054     if (data.find(FILE_MIME_TYPE) == data.end()) {
1055         LOGI("record data cannot find FILE_MIME_TYPE");
1056         return E_OK;
1057     }
1058     string mimeType;
1059     if (data[FILE_MIME_TYPE].GetString(mimeType) != DKLocalErrorCode::NO_ERROR) {
1060         LOGE("extract mimeType error");
1061         return E_INVAL_ARG;
1062     }
1063     valueBucket.PutString(PhotoColumn::MEDIA_MIME_TYPE, mimeType);
1064     return E_OK;
1065 }
1066 
ExtractDeviceName(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)1067 int32_t FileDataConvertor::ExtractDeviceName(DriveKit::DKRecordData &data,
1068     NativeRdb::ValuesBucket &valueBucket)
1069 {
1070     if (data.find(FILE_SOURCE) == data.end()) {
1071         LOGI("record data cannot find FILE_SOURCE");
1072         return E_OK;
1073     }
1074     string deviceName;
1075     if (data[FILE_SOURCE].GetString(deviceName) != DKLocalErrorCode::NO_ERROR) {
1076         LOGE("extract deviceName error");
1077         return E_INVAL_ARG;
1078     }
1079     valueBucket.PutString(PhotoColumn::MEDIA_DEVICE_NAME, deviceName);
1080     return E_OK;
1081 }
1082 
ExtractDateModified(const DriveKit::DKRecord & record,NativeRdb::ValuesBucket & valueBucket)1083 int32_t FileDataConvertor::ExtractDateModified(const DriveKit::DKRecord &record,
1084     NativeRdb::ValuesBucket &valueBucket)
1085 {
1086     DriveKit::DKRecordData data;
1087     record.GetRecordData(data);
1088     int64_t dateModified = 0;
1089     if (data.find(FILE_ATTRIBUTES) != data.end()) {
1090         DriveKit::DKRecordFieldMap attributes;
1091         data[FILE_ATTRIBUTES].GetRecordMap(attributes);
1092         if (attributes.find(FILE_EDITED_TIME_MS) != attributes.end()) {
1093             if (attributes[FILE_EDITED_TIME_MS].GetLong(dateModified) == DKLocalErrorCode::NO_ERROR) {
1094                 valueBucket.PutLong(PhotoColumn::MEDIA_DATE_MODIFIED, dateModified);
1095                 return E_OK;
1096             }
1097         }
1098     }
1099     dateModified = static_cast<int64_t>(record.GetEditedTime());
1100     valueBucket.PutLong(PhotoColumn::MEDIA_DATE_MODIFIED, dateModified);
1101     return E_OK;
1102 }
1103 
ExtractDateTaken(const DriveKit::DKRecord & record,NativeRdb::ValuesBucket & valueBucket)1104 int32_t FileDataConvertor::ExtractDateTaken(const DriveKit::DKRecord &record,
1105     NativeRdb::ValuesBucket &valueBucket)
1106 {
1107     uint64_t dataTaken = record.GetCreateTime() / MILLISECOND_TO_SECOND;
1108     valueBucket.PutLong(PhotoColumn::MEDIA_DATE_TAKEN, dataTaken);
1109     return E_OK;
1110 }
1111 
ExtractFavorite(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)1112 int32_t FileDataConvertor::ExtractFavorite(DriveKit::DKRecordData &data,
1113     NativeRdb::ValuesBucket &valueBucket)
1114 {
1115     if (data.find(FILE_FAVORITE) == data.end()) {
1116         LOGI("record data cannot find FILE_FAVORITE");
1117         return E_OK;
1118     }
1119     bool isFavorite;
1120     if (data[FILE_FAVORITE].GetBool(isFavorite) != DKLocalErrorCode::NO_ERROR) {
1121         LOGE("extract isFavorite error");
1122         return E_INVAL_ARG;
1123     }
1124     valueBucket.PutInt(PhotoColumn::MEDIA_IS_FAV, isFavorite ? 1 : 0);
1125     return E_OK;
1126 }
1127 
ExtractDateTrashed(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)1128 int32_t FileDataConvertor::ExtractDateTrashed(DriveKit::DKRecordData &data,
1129     NativeRdb::ValuesBucket &valueBucket)
1130 {
1131     if (data.find(FILE_RECYCLE_TIME) == data.end() && data.find(FILE_RECYCLED) == data.end()) {
1132         return E_OK;
1133     }
1134     bool isRecycle = false;
1135     if (data[FILE_RECYCLED].GetBool(isRecycle) != DKLocalErrorCode::NO_ERROR) {
1136         LOGE("extract FILE_RECYCLED error");
1137         return E_INVAL_ARG;
1138     }
1139     if (isRecycle) {
1140         int64_t dataTrashed = 0;
1141         if (data[FILE_RECYCLE_TIME].GetLong(dataTrashed) != DKLocalErrorCode::NO_ERROR) {
1142             LOGE("extract dataTrashed error");
1143             return E_INVAL_ARG;
1144         }
1145         valueBucket.PutLong(PhotoColumn::MEDIA_DATE_TRASHED, dataTrashed);
1146     } else {
1147         valueBucket.PutLong(PhotoColumn::MEDIA_DATE_TRASHED, 0);
1148     }
1149     return E_OK;
1150 }
1151 
ExtractCloudId(const DriveKit::DKRecord & record,NativeRdb::ValuesBucket & valueBucket)1152 int32_t FileDataConvertor::ExtractCloudId(const DriveKit::DKRecord &record,
1153     NativeRdb::ValuesBucket &valueBucket)
1154 {
1155     string cloudId = record.GetRecordId();
1156     valueBucket.PutString(PhotoColumn::PHOTO_CLOUD_ID, cloudId);
1157     return E_OK;
1158 }
1159 
ExtractDescription(DriveKit::DKRecordData & data,NativeRdb::ValuesBucket & valueBucket)1160 int32_t FileDataConvertor::ExtractDescription(DriveKit::DKRecordData &data,
1161     NativeRdb::ValuesBucket &valueBucket)
1162 {
1163     if (data.find(FILE_DESCRIPTION) == data.end()) {
1164         LOGD("record data cannot find FILE_DESCRIPTION");
1165         return E_OK;
1166     }
1167     string description;
1168     if (data[FILE_DESCRIPTION].GetString(description) != DKLocalErrorCode::NO_ERROR) {
1169         LOGE("extract description error");
1170         return E_INVAL_ARG;
1171     }
1172     valueBucket.PutString(PhotoColumn::PHOTO_USER_COMMENT, description);
1173     return E_OK;
1174 }
1175 
1176 } // namespace CloudSync
1177 } // namespace FileManagement
1178 } // namespace OHOS
1179