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