1 /* 2 * Copyright (C) 2022 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 FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_ 17 #define FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_ 18 19 #include <mutex> 20 #include <condition_variable> 21 22 #include "ability_context.h" 23 #include "avmetadatahelper.h" 24 #include "rdb_helper.h" 25 #include "single_kvstore.h" 26 #include "thumbnail_datashare_bridge.h" 27 28 namespace OHOS { 29 namespace Media { 30 struct ThumbRdbOpt { 31 std::shared_ptr<NativeRdb::RdbStore> store; 32 std::shared_ptr<DistributedKv::SingleKvStore> kvStore; 33 std::shared_ptr<AbilityRuntime::Context> context; 34 std::string networkId; 35 std::string table; 36 std::string udid; 37 std::string row; 38 std::string uri; 39 int32_t size{0}; 40 }; 41 42 struct ThumbnailData { ThumbnailDataThumbnailData43 ThumbnailData() {} ~ThumbnailDataThumbnailData44 virtual ~ThumbnailData() 45 { 46 source = nullptr; 47 thumbnail.clear(); 48 lcd.clear(); 49 } 50 int mediaType{0}; 51 int64_t dateModified{0}; 52 float degrees; 53 std::shared_ptr<PixelMap> source; 54 std::vector<uint8_t> thumbnail; 55 std::vector<uint8_t> lcd; 56 std::string id; 57 std::string udid; 58 std::string path; 59 std::string hashKey; 60 std::string thumbnailKey; 61 std::string lcdKey; 62 std::string suffix; 63 }; 64 65 struct ThumbnailRdbData { 66 int mediaType; 67 int64_t dateModified{0}; 68 std::string id; 69 std::string path; 70 std::string thumbnailKey; 71 std::string lcdKey; 72 }; 73 74 class ThumbnailUtils { 75 public: 76 ThumbnailUtils() = delete; 77 ~ThumbnailUtils() = delete; 78 // utils 79 static bool ResizeImage(const std::vector<uint8_t> &data, const Size &size, std::unique_ptr<PixelMap> &pixelMap); 80 static bool CompressImage(std::shared_ptr<PixelMap> &pixelMap, const Size &size, std::vector<uint8_t> &data, 81 float degrees); 82 static void ThumbnailDataCopy(ThumbnailData &data, ThumbnailRdbData &rdbData); 83 static bool CleanThumbnailInfo(ThumbRdbOpt &opts, bool withThumb, bool withLcd = false); 84 85 // URI utils 86 std::string GetDeviceIdByUri(const std::string &uri); 87 static bool UpdateRemotePath(std::string &path, const std::string &networkId); 88 89 // RDB Store Query 90 static std::shared_ptr<NativeRdb::AbsSharedResultSet> QueryThumbnailSet(ThumbRdbOpt &opts); 91 static std::shared_ptr<NativeRdb::AbsSharedResultSet> QueryThumbnailInfo(ThumbRdbOpt &opts, 92 ThumbnailData &data, int &err); 93 static bool QueryRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 94 95 // KV Store 96 static bool RemoveDataFromKv(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, const std::string &key); 97 static bool IsImageExist(const std::string &key, const std::string &networkId, 98 const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore); 99 static bool DeleteLcdData(ThumbRdbOpt &opts, ThumbnailData &data); 100 static bool DeleteDistributeLcdData(ThumbRdbOpt &opts, ThumbnailData &thumbnailData); 101 static bool ClearThumbnailAllRecord(ThumbRdbOpt &opts, ThumbnailData &thumbnailData); 102 static bool GetKvResultSet(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, const std::string &key, 103 const std::string &networkId, std::shared_ptr<DataShare::ResultSetBridge> &outResultSet); 104 static bool DeleteOriginImage(ThumbRdbOpt &opts, ThumbnailData &thumbnailData); 105 // Steps 106 static bool LoadSourceImage(ThumbnailData &data); 107 static bool GenThumbnailKey(ThumbnailData &data); 108 static bool CreateThumbnailData(ThumbnailData &data); 109 static DistributedKv::Status SaveThumbnailData(ThumbnailData &data, const std::string &networkId, 110 const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore); 111 112 static bool GenLcdKey(ThumbnailData &data); 113 static bool CreateLcdData(ThumbnailData &data, int32_t lcdSize); 114 static DistributedKv::Status SaveLcdData(ThumbnailData &data, const std::string &networkId, 115 const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore); 116 static bool UpdateThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 117 static bool UpdateVisitTime(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 118 static bool DoUpdateRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 119 120 // RDB Store generate and aging 121 static bool QueryHasLcdFiles(ThumbRdbOpt &opts, std::vector<ThumbnailRdbData> &infos, int &err); 122 static bool QueryHasThumbnailFiles(ThumbRdbOpt &opts, std::vector<ThumbnailRdbData> &infos, int &err); 123 static bool QueryLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err); 124 static bool QueryDistributeLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err); 125 static bool QueryAgingLcdInfos(ThumbRdbOpt &opts, int LcdLimit, 126 std::vector<ThumbnailRdbData> &infos, int &err); 127 static bool QueryAgingDistributeLcdInfos(ThumbRdbOpt &opts, int LcdLimit, 128 std::vector<ThumbnailRdbData> &infos, int &err); 129 static bool QueryNoLcdInfos(ThumbRdbOpt &opts, int LcdLimit, std::vector<ThumbnailRdbData> &infos, int &err); 130 static bool QueryNoThumbnailInfos(ThumbRdbOpt &opts, std::vector<ThumbnailRdbData> &infos, int &err); 131 static bool QueryDeviceThumbnailRecords(ThumbRdbOpt &opts, std::vector<ThumbnailRdbData> &infos, int &err); 132 133 static bool SyncPushTable(ThumbRdbOpt &opts, std::vector<std::string> &devices, bool isBlock = false); 134 static bool SyncPullTable(ThumbRdbOpt &opts, std::vector<std::string> &devices, bool isBlock = false); 135 static DistributedKv::Status SyncPushKvstore(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, 136 const std::string key, const std::string &networkId); 137 static DistributedKv::Status SyncPullKvstore(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, 138 const std::string key, const std::string &networkId); 139 private: 140 const int RETRY_COUNT = 3; 141 static int32_t SetSource(std::shared_ptr<AVMetadataHelper> avMetadataHelper, const std::string &path); 142 static int64_t UTCTimeSeconds(); 143 static void ParseQueryResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, 144 ThumbnailRdbData &data, int &err); 145 static void ParseStringResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, 146 int index, std::string &data, int &err); 147 148 static bool CheckResultSetCount(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, int &err); 149 static bool CheckResultSetColumn(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, int &err); 150 // utils 151 static bool LoadImageFile(const std::string &path, std::shared_ptr<PixelMap> &pixelMap, float °rees); 152 static bool LoadVideoFile(const std::string &path, std::shared_ptr<PixelMap> &pixelMap, float °rees); 153 static bool LoadAudioFile(const std::string &path, std::shared_ptr<PixelMap> &pixelMap, float °rees); 154 static bool GenKey(ThumbnailData &data, std::string &key); 155 static std::string GetUdid(); 156 // KV Store 157 static DistributedKv::Status SaveImage(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, 158 const std::string &key, const std::vector<uint8_t> &image); 159 160 // RDB Store 161 static bool GetRemoteThumbnailInfo(ThumbRdbOpt &opts, const std::string &id, 162 const std::string &udid, int &err); 163 static bool GetUdidByNetworkId(ThumbRdbOpt &opts, const std::string &networkId, 164 std::string &outUdid, int &err); 165 static bool UpdateRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 166 static bool InsertRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 167 static bool CleanDistributeLcdInfo(ThumbRdbOpt &opts); 168 static bool DeleteDistributeThumbnailInfo(ThumbRdbOpt &opts); 169 }; 170 171 class SyncStatus { 172 public: 173 std::condition_variable cond_; 174 std::mutex mtx_; 175 bool isSyncComplete_{false}; 176 }; 177 178 class MediaLibrarySyncCallback : public DistributedKv::KvStoreSyncCallback { 179 public: 180 MediaLibrarySyncCallback() = default; ~MediaLibrarySyncCallback()181 ~MediaLibrarySyncCallback() override {} 182 void SyncCompleted(const std::map<std::string, DistributedKv::Status> &results) override; 183 bool WaitFor(); 184 private: 185 SyncStatus status_; 186 }; 187 } // namespace Media 188 } // namespace OHOS 189 190 #endif // FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_ 191