1 /*
2 * Copyright (C) 2021-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 #define MLOG_TAG "FileAsset"
16
17 #include "file_asset.h"
18
19 #include <fcntl.h>
20 #include <fstream>
21 #include <unistd.h>
22
23 #include "datashare_business_error.h"
24 #include "datashare_predicates.h"
25 #include "datashare_result_set.h"
26 #include "directory_ex.h"
27 #include "media_column.h"
28 #include "media_file_utils.h"
29 #include "media_log.h"
30 #include "medialibrary_db_const.h"
31 #include "medialibrary_helper_container.h"
32 #include "medialibrary_errno.h"
33 #include "medialibrary_type_const.h"
34 #include "uri.h"
35 #include "values_bucket.h"
36
37 using namespace std;
38
39 namespace OHOS {
40 namespace Media {
41 static constexpr int MAP_INT_MAX = 50;
FileAsset()42 FileAsset::FileAsset()
43 : albumUri_(DEFAULT_MEDIA_ALBUM_URI), resultNapiType_(ResultNapiType::TYPE_NAPI_MAX)
44 {
45 member_.reserve(MAP_INT_MAX);
46 }
47
GetId() const48 int32_t FileAsset::GetId() const
49 {
50 return GetInt32Member(MEDIA_DATA_DB_ID);
51 }
52
SetId(int32_t id)53 void FileAsset::SetId(int32_t id)
54 {
55 member_[MEDIA_DATA_DB_ID] = id;
56 }
57
GetCount() const58 int32_t FileAsset::GetCount() const
59 {
60 return count_;
61 }
62
SetCount(int32_t count)63 void FileAsset::SetCount(int32_t count)
64 {
65 count_ = count;
66 }
67
GetUri() const68 const string &FileAsset::GetUri() const
69 {
70 return GetStrMember(MEDIA_DATA_DB_URI);
71 }
72
SetUri(const string & uri)73 void FileAsset::SetUri(const string &uri)
74 {
75 member_[MEDIA_DATA_DB_URI] = uri;
76 }
77
GetPath() const78 const string &FileAsset::GetPath() const
79 {
80 return GetStrMember(MEDIA_DATA_DB_FILE_PATH);
81 }
82
SetPath(const string & path)83 void FileAsset::SetPath(const string &path)
84 {
85 member_[MEDIA_DATA_DB_FILE_PATH] = path;
86 }
87
GetRelativePath() const88 const string &FileAsset::GetRelativePath() const
89 {
90 return GetStrMember(MEDIA_DATA_DB_RELATIVE_PATH);
91 }
92
SetRelativePath(const string & relativePath)93 void FileAsset::SetRelativePath(const string &relativePath)
94 {
95 member_[MEDIA_DATA_DB_RELATIVE_PATH] = relativePath;
96 }
97
GetMimeType() const98 const string &FileAsset::GetMimeType() const
99 {
100 return GetStrMember(MEDIA_DATA_DB_MIME_TYPE);
101 }
102
SetMimeType(const string & mimeType)103 void FileAsset::SetMimeType(const string &mimeType)
104 {
105 member_[MEDIA_DATA_DB_MIME_TYPE] = mimeType;
106 }
107
GetMediaType() const108 MediaType FileAsset::GetMediaType() const
109 {
110 return static_cast<Media::MediaType>(GetInt32Member(MEDIA_DATA_DB_MEDIA_TYPE));
111 }
112
SetMediaType(MediaType mediaType)113 void FileAsset::SetMediaType(MediaType mediaType)
114 {
115 member_[MEDIA_DATA_DB_MEDIA_TYPE] = mediaType;
116 }
117
GetDisplayName() const118 const string &FileAsset::GetDisplayName() const
119 {
120 return GetStrMember(MEDIA_DATA_DB_NAME);
121 }
122
SetDisplayName(const string & displayName)123 void FileAsset::SetDisplayName(const string &displayName)
124 {
125 member_[MEDIA_DATA_DB_NAME] = displayName;
126 }
127
GetSize() const128 int64_t FileAsset::GetSize() const
129 {
130 return GetInt64Member(MEDIA_DATA_DB_SIZE);
131 }
132
SetSize(int64_t size)133 void FileAsset::SetSize(int64_t size)
134 {
135 member_[MEDIA_DATA_DB_SIZE] = size;
136 }
137
GetDateAdded() const138 int64_t FileAsset::GetDateAdded() const
139 {
140 return GetInt64Member(MEDIA_DATA_DB_DATE_ADDED);
141 }
142
SetDateAdded(int64_t dateAdded)143 void FileAsset::SetDateAdded(int64_t dateAdded)
144 {
145 member_[MEDIA_DATA_DB_DATE_ADDED] = dateAdded;
146 }
147
GetDateModified() const148 int64_t FileAsset::GetDateModified() const
149 {
150 return GetInt64Member(MEDIA_DATA_DB_DATE_MODIFIED);
151 }
152
SetDateModified(int64_t dateModified)153 void FileAsset::SetDateModified(int64_t dateModified)
154 {
155 member_[MEDIA_DATA_DB_DATE_MODIFIED] = dateModified;
156 }
157
GetTitle() const158 const string &FileAsset::GetTitle() const
159 {
160 return GetStrMember(MEDIA_DATA_DB_TITLE);
161 }
162
SetTitle(const string & title)163 void FileAsset::SetTitle(const string &title)
164 {
165 member_[MEDIA_DATA_DB_TITLE] = title;
166 }
167
GetArtist() const168 const string &FileAsset::GetArtist() const
169 {
170 return GetStrMember(MEDIA_DATA_DB_ARTIST);
171 }
172
SetArtist(const string & artist)173 void FileAsset::SetArtist(const string &artist)
174 {
175 member_[MEDIA_DATA_DB_ARTIST] = artist;
176 }
177
GetAlbum() const178 const string &FileAsset::GetAlbum() const
179 {
180 return GetStrMember(MEDIA_DATA_DB_ALBUM);
181 }
182
SetAlbum(const string & album)183 void FileAsset::SetAlbum(const string &album)
184 {
185 member_[MEDIA_DATA_DB_ALBUM] = album;
186 }
187
GetPosition() const188 int32_t FileAsset::GetPosition() const
189 {
190 return GetInt32Member(MEDIA_DATA_DB_POSITION);
191 }
192
SetPosition(int32_t position)193 void FileAsset::SetPosition(int32_t position)
194 {
195 member_[MEDIA_DATA_DB_POSITION] = position;
196 }
197
GetWidth() const198 int32_t FileAsset::GetWidth() const
199 {
200 return GetInt32Member(MEDIA_DATA_DB_WIDTH);
201 }
202
SetWidth(int32_t width)203 void FileAsset::SetWidth(int32_t width)
204 {
205 member_[MEDIA_DATA_DB_WIDTH] = width;
206 }
207
GetHeight() const208 int32_t FileAsset::GetHeight() const
209 {
210 return GetInt32Member(MEDIA_DATA_DB_HEIGHT);
211 }
212
SetHeight(int32_t height)213 void FileAsset::SetHeight(int32_t height)
214 {
215 member_[MEDIA_DATA_DB_HEIGHT] = height;
216 }
217
GetDuration() const218 int32_t FileAsset::GetDuration() const
219 {
220 return GetInt32Member(MEDIA_DATA_DB_DURATION);
221 }
222
SetDuration(int32_t duration)223 void FileAsset::SetDuration(int32_t duration)
224 {
225 member_[MEDIA_DATA_DB_DURATION] = duration;
226 }
227
GetOrientation() const228 int32_t FileAsset::GetOrientation() const
229 {
230 return GetInt32Member(MEDIA_DATA_DB_ORIENTATION);
231 }
232
SetOrientation(int32_t orientation)233 void FileAsset::SetOrientation(int32_t orientation)
234 {
235 member_[MEDIA_DATA_DB_ORIENTATION] = orientation;
236 }
237
GetAlbumId() const238 int32_t FileAsset::GetAlbumId() const
239 {
240 return GetInt32Member(MEDIA_DATA_DB_BUCKET_ID);
241 }
242
SetAlbumId(int32_t albumId)243 void FileAsset::SetAlbumId(int32_t albumId)
244 {
245 member_[MEDIA_DATA_DB_BUCKET_ID] = albumId;
246 }
247
GetAlbumName() const248 const string &FileAsset::GetAlbumName() const
249 {
250 return GetStrMember(MEDIA_DATA_DB_BUCKET_NAME);
251 }
252
SetAlbumName(const string & albumName)253 void FileAsset::SetAlbumName(const string &albumName)
254 {
255 member_[MEDIA_DATA_DB_BUCKET_NAME] = albumName;
256 }
257
GetParent() const258 int32_t FileAsset::GetParent() const
259 {
260 return GetInt32Member(MEDIA_DATA_DB_PARENT_ID);
261 }
262
SetParent(int32_t parent)263 void FileAsset::SetParent(int32_t parent)
264 {
265 member_[MEDIA_DATA_DB_PARENT_ID] = parent;
266 }
267
GetAlbumUri() const268 const string &FileAsset::GetAlbumUri() const
269 {
270 return albumUri_;
271 }
272
SetAlbumUri(const string & albumUri)273 void FileAsset::SetAlbumUri(const string &albumUri)
274 {
275 albumUri_ = albumUri;
276 }
277
GetDateTaken() const278 int64_t FileAsset::GetDateTaken() const
279 {
280 return GetInt64Member(MEDIA_DATA_DB_DATE_TAKEN);
281 }
282
SetDateTaken(int64_t dateTaken)283 void FileAsset::SetDateTaken(int64_t dateTaken)
284 {
285 member_[MEDIA_DATA_DB_DATE_TAKEN] = dateTaken;
286 }
287
GetTimePending() const288 int64_t FileAsset::GetTimePending() const
289 {
290 return GetInt64Member(MEDIA_DATA_DB_TIME_PENDING);
291 }
292
SetTimePending(int64_t timePending)293 void FileAsset::SetTimePending(int64_t timePending)
294 {
295 member_[MEDIA_DATA_DB_TIME_PENDING] = timePending;
296 }
297
IsFavorite() const298 bool FileAsset::IsFavorite() const
299 {
300 return GetInt32Member(MEDIA_DATA_DB_IS_FAV);
301 }
302
SetFavorite(bool isFavorite)303 void FileAsset::SetFavorite(bool isFavorite)
304 {
305 member_[MEDIA_DATA_DB_IS_FAV] = isFavorite;
306 }
307
GetDateTrashed() const308 int64_t FileAsset::GetDateTrashed() const
309 {
310 return GetInt64Member(MEDIA_DATA_DB_DATE_TRASHED);
311 }
312
SetDateTrashed(int64_t dateTrashed)313 void FileAsset::SetDateTrashed(int64_t dateTrashed)
314 {
315 member_[MEDIA_DATA_DB_DATE_TRASHED] = dateTrashed;
316 }
317
GetSelfId() const318 const string &FileAsset::GetSelfId() const
319 {
320 return GetStrMember(MEDIA_DATA_DB_SELF_ID);
321 }
322
SetSelfId(const string & selfId)323 void FileAsset::SetSelfId(const string &selfId)
324 {
325 member_[MEDIA_DATA_DB_SELF_ID] = selfId;
326 }
327
GetIsTrash() const328 int32_t FileAsset::GetIsTrash() const
329 {
330 if (resultNapiType_ == ResultNapiType::TYPE_USERFILE_MGR ||
331 resultNapiType_ == ResultNapiType::TYPE_PHOTOACCESS_HELPER) {
332 return static_cast<int32_t>(GetInt64Member(MediaColumn::MEDIA_DATE_TRASHED));
333 }
334
335 return GetInt32Member(MEDIA_DATA_DB_IS_TRASH);
336 }
337
SetIsTrash(int32_t isTrash)338 void FileAsset::SetIsTrash(int32_t isTrash)
339 {
340 member_[MEDIA_DATA_DB_IS_TRASH] = isTrash;
341 }
342
GetRecyclePath() const343 const string &FileAsset::GetRecyclePath() const
344 {
345 return GetStrMember(MEDIA_DATA_DB_RECYCLE_PATH);
346 }
347
SetRecyclePath(const string & recyclePath)348 void FileAsset::SetRecyclePath(const string &recyclePath)
349 {
350 member_[MEDIA_DATA_DB_RECYCLE_PATH] = recyclePath;
351 }
352
GetOwnerPackage() const353 const string FileAsset::GetOwnerPackage() const
354 {
355 return GetStrMember(MEDIA_DATA_DB_OWNER_PACKAGE);
356 }
357
SetOwnerPackage(const string & ownerPackage)358 void FileAsset::SetOwnerPackage(const string &ownerPackage)
359 {
360 member_[MEDIA_DATA_DB_OWNER_PACKAGE] = ownerPackage;
361 }
362
GetResultNapiType() const363 ResultNapiType FileAsset::GetResultNapiType() const
364 {
365 return resultNapiType_;
366 }
367
GetPackageName() const368 const string FileAsset::GetPackageName() const
369 {
370 return GetStrMember(MediaColumn::MEDIA_PACKAGE_NAME);
371 }
372
SetPackageName(const string & packageName)373 void FileAsset::SetPackageName(const string &packageName)
374 {
375 member_[MediaColumn::MEDIA_PACKAGE_NAME] = packageName;
376 }
377
SetResultNapiType(const ResultNapiType type)378 void FileAsset::SetResultNapiType(const ResultNapiType type)
379 {
380 resultNapiType_ = type;
381 }
382
GetPhotoSubType() const383 int32_t FileAsset::GetPhotoSubType() const
384 {
385 return GetInt32Member(PhotoColumn::PHOTO_SUBTYPE);
386 }
387
SetPhotoSubType(int32_t photoSubType)388 void FileAsset::SetPhotoSubType(int32_t photoSubType)
389 {
390 member_[PhotoColumn::PHOTO_SUBTYPE] = photoSubType;
391 }
392
GetCameraShotKey() const393 const std::string &FileAsset::GetCameraShotKey() const
394 {
395 return GetStrMember(PhotoColumn::CAMERA_SHOT_KEY);
396 }
397
SetCameraShotKey(const std::string & cameraShotKey)398 void FileAsset::SetCameraShotKey(const std::string &cameraShotKey)
399 {
400 member_[PhotoColumn::CAMERA_SHOT_KEY] = cameraShotKey;
401 }
402
IsHidden() const403 bool FileAsset::IsHidden() const
404 {
405 return GetInt32Member(MediaColumn::MEDIA_HIDDEN);
406 }
407
SetHidden(bool isHidden)408 void FileAsset::SetHidden(bool isHidden)
409 {
410 member_[MediaColumn::MEDIA_HIDDEN] = isHidden;
411 }
412
GetAllExif() const413 const std::string &FileAsset::GetAllExif() const
414 {
415 return GetStrMember(PhotoColumn::PHOTO_ALL_EXIF);
416 }
417
SetAllExif(const string & allExif)418 void FileAsset::SetAllExif(const string &allExif)
419 {
420 member_[PhotoColumn::PHOTO_ALL_EXIF] = allExif;
421 }
422
GetUserComment() const423 const std::string &FileAsset::GetUserComment() const
424 {
425 return GetStrMember(PhotoColumn::PHOTO_USER_COMMENT);
426 }
427
SetUserComment(const string & userComment)428 void FileAsset::SetUserComment(const string &userComment)
429 {
430 member_[PhotoColumn::PHOTO_USER_COMMENT] = userComment;
431 }
432
GetFilePath() const433 const std::string &FileAsset::GetFilePath() const
434 {
435 return GetStrMember(MediaColumn::MEDIA_FILE_PATH);
436 }
437
SetFilePath(const std::string & filePath)438 void FileAsset::SetFilePath(const std::string &filePath)
439 {
440 member_[MediaColumn::MEDIA_FILE_PATH] = filePath;
441 }
442
SetOpenStatus(int32_t fd,int32_t openStatus)443 void FileAsset::SetOpenStatus(int32_t fd, int32_t openStatus)
444 {
445 lock_guard<mutex> lock(openStatusMapMutex_);
446 if (openStatusMap_ == nullptr) {
447 openStatusMap_ = make_shared<unordered_map<int32_t, int32_t>>();
448 }
449 openStatusMap_->insert({fd, openStatus});
450 }
451
RemoveOpenStatus(int32_t fd)452 void FileAsset::RemoveOpenStatus(int32_t fd)
453 {
454 lock_guard<mutex> lock(openStatusMapMutex_);
455 if (openStatusMap_ == nullptr) {
456 return;
457 }
458 openStatusMap_->erase(fd);
459 }
460
GetOpenStatus(int32_t fd)461 int32_t FileAsset::GetOpenStatus(int32_t fd)
462 {
463 lock_guard<mutex> lock(openStatusMapMutex_);
464 if (openStatusMap_ == nullptr) {
465 return E_INVALID_VALUES;
466 }
467 if (openStatusMap_->find(fd) != openStatusMap_->end()) {
468 return openStatusMap_->at(fd);
469 } else {
470 MEDIA_ERR_LOG("can not find this fd: [%{public}d]", fd);
471 return E_INVALID_VALUES;
472 }
473 }
474
GetMemberMap()475 unordered_map<string, variant<int32_t, int64_t, string>> &FileAsset::GetMemberMap()
476 {
477 return member_;
478 }
479
GetMemberValue(const string & name)480 variant<int32_t, int64_t, string> &FileAsset::GetMemberValue(const string &name)
481 {
482 return member_[name];
483 }
484
GetStrMember(const string & name) const485 const string &FileAsset::GetStrMember(const string &name) const
486 {
487 return (member_.count(name) > 0) ? get<string>(member_.at(name)) : DEFAULT_STR;
488 }
489
GetInt32Member(const string & name) const490 int32_t FileAsset::GetInt32Member(const string &name) const
491 {
492 return (member_.count(name) > 0) ? get<int32_t>(member_.at(name)) : DEFAULT_INT32;
493 }
494
GetInt64Member(const string & name) const495 int64_t FileAsset::GetInt64Member(const string &name) const
496 {
497 return (member_.count(name) > 0) ? get<int64_t>(member_.at(name)) : DEFAULT_INT64;
498 }
499
GetPhotoIndex() const500 int32_t FileAsset::GetPhotoIndex() const
501 {
502 return GetInt32Member(PHOTO_INDEX);
503 }
504
CommitModify()505 void FileAsset::CommitModify()
506 {
507 if (!MediaFileUtils::CheckDisplayName(GetStrMember(MEDIA_DATA_DB_NAME))) {
508 MEDIA_ERR_LOG("CommitModify CheckDisplayName fail, fileUri=%{private}s", GetUri().c_str());
509 return;
510 }
511
512 shared_ptr<DataShare::DataShareHelper> dataShareHelper =
513 MediaLibraryHelperContainer::GetInstance()->GetDataShareHelper();
514 if (dataShareHelper == nullptr) {
515 MEDIA_ERR_LOG("Get DataShareHelper fail, fileUri=%{private}s", GetUri().c_str());
516 return;
517 }
518
519 string uri = MEDIALIBRARY_DATA_URI + "/" + Media::MEDIA_FILEOPRN + "/" + Media::MEDIA_FILEOPRN_MODIFYASSET;
520 Uri updateAssetUri(uri);
521 // use it in api10
522 string notifyUri = MediaFileUtils::GetMediaTypeUriV10(
523 static_cast<Media::MediaType>(GetInt32Member(MEDIA_DATA_DB_MEDIA_TYPE)));
524 DataShare::DataSharePredicates predicates;
525 DataShare::DataShareValuesBucket valuesBucket;
526 valuesBucket.Put(MEDIA_DATA_DB_DATE_ADDED, GetInt64Member(MEDIA_DATA_DB_DATE_ADDED));
527 valuesBucket.Put(MEDIA_DATA_DB_DATE_MODIFIED, GetInt64Member(MEDIA_DATA_DB_DATE_MODIFIED));
528 predicates.SetWhereClause(MEDIA_DATA_DB_ID + " = ? ");
529 predicates.SetWhereArgs({to_string(GetInt32Member(MEDIA_DATA_DB_ID))});
530 int32_t changedRows = dataShareHelper->Update(updateAssetUri, predicates, valuesBucket);
531 if (changedRows < 0) {
532 MEDIA_ERR_LOG("File asset modification failed, err: %{public}d", changedRows);
533 } else {
534 Uri modifyNotify(notifyUri);
535 dataShareHelper->NotifyChange(modifyNotify);
536 }
537 }
538
IsDirectory()539 bool FileAsset::IsDirectory()
540 {
541 int32_t mediaType = -1;
542 #ifdef MEDIALIBRARY_COMPATIBILITY
543 if ((GetMediaType() == MediaType::MEDIA_TYPE_AUDIO) ||
544 (GetMediaType() == MediaType::MEDIA_TYPE_IMAGE) ||
545 (GetMediaType() == MediaType::MEDIA_TYPE_VIDEO)) {
546 return false;
547 }
548 int64_t virtualId = MediaFileUtils::GetVirtualIdByType(GetId(), MediaType::MEDIA_TYPE_FILE);
549 vector<string> selectionArgs = { to_string(virtualId)};
550 #else
551 vector<string> selectionArgs = { to_string(GetId())};
552 #endif
553 shared_ptr<DataShare::DataShareHelper> dataShareHelper =
554 MediaLibraryHelperContainer::GetInstance()->GetDataShareHelper();
555 if (dataShareHelper == nullptr) {
556 MEDIA_ERR_LOG("Get DataShareHelper fail");
557 return false;
558 }
559 vector<string> columns = { MEDIA_DATA_DB_MEDIA_TYPE };
560 DataShare::DataSharePredicates predicates;
561 predicates.SetWhereClause(MEDIA_DATA_DB_ID + " = ?");
562 predicates.SetWhereArgs(selectionArgs);
563 string queryUri = MEDIALIBRARY_DATA_URI;
564 Uri uri(queryUri);
565 DataShare::DatashareBusinessError businessError;
566 shared_ptr<DataShare::DataShareResultSet> resultSet = dataShareHelper->Query(uri,
567 predicates, columns, &businessError);
568 if (resultSet == nullptr || resultSet->GoToFirstRow() != ERR_OK) {
569 MEDIA_ERR_LOG("Query IsDirectory failed");
570 return false;
571 }
572 int32_t index = 0;
573 if (resultSet->GetColumnIndex(MEDIA_DATA_DB_MEDIA_TYPE, index) != ERR_OK) {
574 MEDIA_ERR_LOG("Query Directory failed");
575 return false;
576 }
577 if (resultSet->GetInt(index, mediaType) != ERR_OK) {
578 MEDIA_ERR_LOG("Can not get file path");
579 return false;
580 }
581 return mediaType == static_cast<int>(MediaType::MEDIA_TYPE_ALBUM);
582 }
583 } // namespace Media
584 } // namespace OHOS
585