1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef MEDIALIBRARY_PHOTO_OPERATIONS_H 17 #define MEDIALIBRARY_PHOTO_OPERATIONS_H 18 19 #include <memory> 20 #include <shared_mutex> 21 #include <string> 22 #include <vector> 23 24 #include "abs_shared_result_set.h" 25 #include "file_asset.h" 26 #include "medialibrary_asset_operations.h" 27 #include "medialibrary_command.h" 28 #include "picture.h" 29 30 namespace OHOS { 31 namespace Media { 32 33 class AlbumData { 34 public: 35 AlbumData() = default; 36 ~AlbumData() = default; 37 std::vector<bool> isHidden = {}; 38 }; 39 40 #define EXPORT __attribute__ ((visibility ("default"))) 41 class MediaLibraryPhotoOperations : public MediaLibraryAssetOperations { 42 public: 43 EXPORT static int32_t Create(MediaLibraryCommand &cmd); 44 EXPORT static std::shared_ptr<NativeRdb::ResultSet> Query(MediaLibraryCommand &cmd, 45 const std::vector<std::string> &columns); 46 EXPORT static int32_t Update(MediaLibraryCommand &cmd); 47 EXPORT static int32_t Delete(MediaLibraryCommand &cmd); 48 EXPORT static int32_t Open(MediaLibraryCommand &cmd, const std::string &mode); 49 EXPORT static int32_t Close(MediaLibraryCommand &cmd); 50 EXPORT static int32_t SubmitCache(MediaLibraryCommand &cmd); 51 EXPORT static int32_t CommitEditInsert(MediaLibraryCommand &cmd); 52 EXPORT static int32_t RevertToOrigin(MediaLibraryCommand &cmd); 53 EXPORT static void DeleteRevertMessage(const std::string &path); 54 EXPORT static std::shared_ptr<NativeRdb::ResultSet> ScanMovingPhoto(MediaLibraryCommand &cmd, 55 const std::vector<std::string> &columns); 56 EXPORT static void StoreThumbnailSize(const std::string& photoId, const std::string& photoPath); 57 EXPORT static bool HasDroppedThumbnailSize(const std::string& photoId); 58 EXPORT static int32_t AddFilters(MediaLibraryCommand &cmd); 59 EXPORT static int32_t ProcessMultistagesPhoto(bool isEdited, const std::string &path, 60 const uint8_t *addr, const long bytes, int32_t fileId); 61 EXPORT static int32_t ScanFileWithoutAlbumUpdate(MediaLibraryCommand &cmd); 62 EXPORT static int32_t ProcessMultistagesPhotoForPicture(bool isEdited, const std::string &path, 63 std::shared_ptr<Media::Picture> &picture, int32_t fileId, const std::string &mime_type); 64 EXPORT static int32_t Save(bool isEdited, const std::string &path, 65 const uint8_t *addr, const long bytes, int32_t fileId); 66 EXPORT static int32_t AddFiltersToPicture(std::shared_ptr<Media::Picture>& inPicture, 67 const std::string &outputPath, std::string &editdata, const std::string &mime_type, 68 bool isHighQualityPicture); 69 EXPORT static int32_t SavePicture(const int32_t &fileType, const int32_t &fileId); 70 EXPORT static int32_t GetPicture(const int32_t &fileId, std::shared_ptr<Media::Picture> &picture, 71 bool isCleanImmediately, std::string &photoId, bool &isHighQualityPicture); 72 EXPORT static int32_t FinishRequestPicture(MediaLibraryCommand &cmd); 73 EXPORT static int64_t CloneSingleAsset(MediaLibraryCommand &cmd); 74 EXPORT static int32_t AddFiltersForCloudEnhancementPhoto(int32_t fileId, const std::string& assetPath, 75 const std::string& editDataCameraSourcePath, const std::string& mimeType); 76 EXPORT static int32_t ProcessMultistagesVideo(bool isEdited, const std::string &path); 77 EXPORT static int32_t RemoveTempVideo(const std::string &path); 78 EXPORT static void UpdateSourcePath(const std::vector<std::string> &whereArgs); 79 EXPORT static void TrashPhotosSendNotify(std::vector<std::string> ¬ifyUris, 80 std::shared_ptr<AlbumData> AlbumData = nullptr); 81 82 private: 83 static int32_t CreateV9(MediaLibraryCommand &cmd); 84 static int32_t CreateV10(MediaLibraryCommand &cmd); 85 static int32_t DeletePhoto(const std::shared_ptr<FileAsset> &fileAsset, MediaLibraryApi api); 86 static int32_t UpdateV9(MediaLibraryCommand &cmd); 87 static int32_t UpdateV10(MediaLibraryCommand &cmd); 88 static int32_t TrashPhotos(MediaLibraryCommand &cmd); 89 static void SolvePhotoAlbumInCreate(MediaLibraryCommand &cmd, FileAsset &fileAsset); 90 static int32_t OpenCache(MediaLibraryCommand &cmd, const std::string &mode, bool &isCacheOperation); 91 static int32_t DeleteCache(MediaLibraryCommand &cmd); 92 static int32_t OpenEditOperation(MediaLibraryCommand &cmd, bool &isSkip); 93 static int32_t RequestEditData(MediaLibraryCommand &cmd); 94 static int32_t RequestEditSource(MediaLibraryCommand &cmd); 95 static int32_t CommitEditOpen(MediaLibraryCommand &cmd); 96 static int32_t CommitEditOpenExecute(const std::shared_ptr<FileAsset> &fileAsset); 97 static int32_t CommitEditInsertExecute(const std::shared_ptr<FileAsset> &fileAsset, 98 const std::string &editData); 99 static int32_t DoRevertEdit(const std::shared_ptr<FileAsset> &fileAsset); 100 static int32_t RevertMovingPhotoVideo(const std::shared_ptr<FileAsset> &fileAsset, 101 const std::string &path, const std::string &sourceVideoPath, int32_t subtype); 102 static int32_t ParseMediaAssetEditData(MediaLibraryCommand &cmd, std::string &editData); 103 static void ParseCloudEnhancementEditData(std::string& editData); 104 static bool IsSetEffectMode(MediaLibraryCommand &cmd); 105 static bool IsContainsData(MediaLibraryCommand &cm); 106 static bool IsCameraEditData(MediaLibraryCommand &cmd); 107 static int32_t ReadEditdataFromFile(const std::string &editDataPath, std::string &editData); 108 static int32_t SaveEditDataCamera(MediaLibraryCommand &cmd, const std::string &assetPath, 109 std::string &editData); 110 static int32_t SaveSourceAndEditData(const std::shared_ptr<FileAsset> &fileAsset, const std::string &editData); 111 static int32_t SaveSourceVideoFile(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset, 112 const std::string &assetPath); 113 static int32_t AddFiltersExecute(MediaLibraryCommand& cmd, const std::shared_ptr<FileAsset>& fileAsset, 114 const std::string &cachePath); 115 static int32_t SubmitEditCacheExecute(MediaLibraryCommand &cmd, 116 const std::shared_ptr<FileAsset> &fileAsset, const std::string &cachePath); 117 static int32_t SubmitCacheExecute(MediaLibraryCommand &cmd, 118 const std::shared_ptr<FileAsset> &fileAsset, const std::string &cachePath); 119 static int32_t SubmitEffectModeExecute(MediaLibraryCommand &cmd); 120 static int32_t SubmitEditMovingPhotoExecute(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset); 121 static int32_t GetMovingPhotoCachePath(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset, 122 std::string &imageCachePath, std::string &videoCachePath); 123 static bool CheckCacheCmd(MediaLibraryCommand &cmd, int32_t subtype, const std::string &displayName); 124 static int32_t MoveCacheFile(MediaLibraryCommand &cmd, int32_t subtype, 125 const std::string &cachePath, const std::string &destPath); 126 static int32_t UpdateMovingPhotoSubtype(int32_t fileId, int32_t currentPhotoSubType); 127 static int32_t UpdateFileAsset(MediaLibraryCommand &cmd); 128 static int32_t UpdateExif(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset); 129 static int32_t BatchSetUserComment(MediaLibraryCommand &cmd); 130 static int32_t BatchSetOwnerAlbumId(MediaLibraryCommand &cmd); 131 static int32_t AddFiltersToPhoto(const std::string &inputPath, const std::string &outputPath, 132 const std::string &editdata, const std::string &photoStatus = ""); 133 static int32_t RevertToOriginalEffectMode(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset, 134 bool &isNeedScan); 135 static bool IsNeedRevertEffectMode(MediaLibraryCommand& cmd, const std::shared_ptr<FileAsset>& fileAsset, 136 int32_t& effectMode); 137 static void ProcessEditedEffectMode(MediaLibraryCommand& cmd, int32_t effectMode); 138 static int32_t SaveCameraPhoto(MediaLibraryCommand &cmd); 139 static std::shared_ptr<FileAsset> GetFileAsset(MediaLibraryCommand &cmd); 140 static int32_t SetVideoEnhancementAttr(MediaLibraryCommand &cmd); 141 static int32_t ForceSavePicture(MediaLibraryCommand& cmd); 142 static int32_t DegenerateMovingPhoto(MediaLibraryCommand &cmd); 143 static int32_t UpdateOwnerAlbumId(MediaLibraryCommand &cmd); 144 private: 145 static int32_t UpdateExtension(const int32_t &fileId, std::string &mimeType, const int32_t &fileType, 146 std::string &oldFilePath); 147 static void UpdateEditDataPath(std::string filePath, const std::string &extension); 148 static void DeleteAbnormalFile(std::string &assetPath, const int32_t &fileId, const std::string &oldFilePath); 149 static std::mutex saveCameraPhotoMutex_; 150 static std::condition_variable condition_; 151 static std::string lastPhotoId_; 152 }; 153 154 class PhotoEditingRecord { 155 public: 156 EXPORT explicit PhotoEditingRecord(); 157 EXPORT static std::shared_ptr<PhotoEditingRecord> GetInstance(); 158 159 EXPORT bool StartCommitEdit(int32_t fileId); 160 EXPORT void EndCommitEdit(int32_t fileId); 161 EXPORT bool StartRevert(int32_t fileId); 162 EXPORT void EndRevert(int32_t fileId); 163 EXPORT bool IsInRevertOperation(int32_t fileId); 164 EXPORT bool IsInEditOperation(int32_t fileId); 165 166 private: 167 static std::mutex mutex_; 168 static std::shared_ptr<PhotoEditingRecord> instance_; 169 std::shared_mutex addMutex_; 170 std::set<int32_t> editingPhotoSet_; 171 std::set<int32_t> revertingPhotoSet_; 172 }; 173 } // namespace Media 174 } // namespace OHOS 175 176 #endif // OHOS_MEDIALIBRARY_PHOTO_OPERATIONS_H