1 /* 2 * Copyright (C) 2022-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 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 "datashare_result_set.h" 25 #include "rdb_helper.h" 26 #include "single_kvstore.h" 27 #include "thumbnail_const.h" 28 #include "thumbnail_datashare_bridge.h" 29 30 namespace OHOS { 31 namespace Media { 32 struct ThumbRdbOpt { 33 std::shared_ptr<NativeRdb::RdbStore> store; 34 std::shared_ptr<DistributedKv::SingleKvStore> kvStore; 35 std::shared_ptr<AbilityRuntime::Context> context; 36 std::string networkId; 37 std::string path; 38 std::string table; 39 std::string udid; 40 std::string row; 41 std::string uri; 42 Size screenSize; 43 }; 44 45 struct ThumbnailData { ThumbnailDataThumbnailData46 ThumbnailData() {} ~ThumbnailDataThumbnailData47 virtual ~ThumbnailData() 48 { 49 source = nullptr; 50 thumbnail.clear(); 51 lcd.clear(); 52 } 53 int mediaType{-1}; 54 int64_t dateModified{0}; 55 float degrees; 56 std::shared_ptr<PixelMap> source; 57 std::vector<uint8_t> thumbnail; 58 std::vector<uint8_t> lcd; 59 std::string id; 60 std::string cloudId; 61 std::string udid; 62 std::string path; 63 std::string thumbnailKey; 64 std::string lcdKey; 65 }; 66 67 class ThumbnailUtils { 68 public: 69 ThumbnailUtils() = delete; 70 ~ThumbnailUtils() = delete; 71 // utils 72 static bool ResizeImage(const std::vector<uint8_t> &data, const Size &size, std::unique_ptr<PixelMap> &pixelMap); 73 static bool CompressImage(std::shared_ptr<PixelMap> &pixelMap, std::vector<uint8_t> &data); 74 static bool CleanThumbnailInfo(ThumbRdbOpt &opts, bool withThumb, bool withLcd = false); 75 static int GetPixelMapFromResult(const std::shared_ptr<DataShare::DataShareResultSet> &resultSet, const Size &size, 76 std::unique_ptr<PixelMap> &outPixelMap); 77 78 // URI utils 79 static bool UpdateRemotePath(std::string &path, const std::string &networkId); 80 81 // RDB Store Query 82 static std::shared_ptr<NativeRdb::ResultSet> QueryThumbnailSet(ThumbRdbOpt &opts); 83 static std::shared_ptr<NativeRdb::ResultSet> QueryThumbnailInfo(ThumbRdbOpt &opts, 84 ThumbnailData &data, int &err); 85 static bool QueryRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 86 87 // KV Store 88 static bool RemoveDataFromKv(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, const std::string &key); 89 #ifdef DISTRIBUTED 90 static bool IsImageExist(const std::string &key, const std::string &networkId, 91 const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore); 92 static bool DeleteLcdData(ThumbRdbOpt &opts, ThumbnailData &data); 93 static bool DeleteDistributeLcdData(ThumbRdbOpt &opts, ThumbnailData &thumbnailData); 94 #endif 95 static bool DeleteThumbFile(ThumbnailData &data, ThumbnailType type); 96 static bool DeleteDistributeThumbnailInfo(ThumbRdbOpt &opts); 97 98 static bool GetKvResultSet(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, const std::string &key, 99 const std::string &networkId, std::shared_ptr<DataShare::ResultSetBridge> &outResultSet); 100 static bool DeleteOriginImage(ThumbRdbOpt &opts); 101 static std::string GetThumbPath(const std::string &path, const std::string &key); 102 // Steps 103 static bool LoadSourceImage(ThumbnailData &data, const Size &desiredSize, const bool isThumbnail = true); 104 static bool GenTargetPixelmap(ThumbnailData &data, const Size &desiredSize); 105 static DistributedKv::Status SaveThumbnailData(ThumbnailData &data, const std::string &networkId, 106 const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore); 107 108 static DistributedKv::Status SaveLcdData(ThumbnailData &data, const std::string &networkId, 109 const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore); 110 static int TrySaveFile(ThumbnailData &Data, ThumbnailType type); 111 static bool UpdateLcdInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 112 static bool UpdateVisitTime(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 113 static bool DoUpdateRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 114 115 // RDB Store generate and aging 116 static bool QueryHasLcdFiles(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err); 117 static bool QueryHasThumbnailFiles(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err); 118 static bool QueryLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err); 119 static bool QueryDistributeLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err); 120 static bool QueryAgingLcdInfos(ThumbRdbOpt &opts, int LcdLimit, 121 std::vector<ThumbnailData> &infos, int &err); 122 static bool QueryAgingDistributeLcdInfos(ThumbRdbOpt &opts, int LcdLimit, 123 std::vector<ThumbnailData> &infos, int &err); 124 static bool QueryNoLcdInfos(ThumbRdbOpt &opts, int LcdLimit, std::vector<ThumbnailData> &infos, int &err); 125 static bool QueryNoThumbnailInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err); 126 static bool QueryDeviceThumbnailRecords(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err); 127 128 private: 129 static int32_t SetSource(std::shared_ptr<AVMetadataHelper> avMetadataHelper, const std::string &path); 130 static int64_t UTCTimeMilliSeconds(); 131 static void ParseQueryResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, 132 ThumbnailData &data, int &err); 133 static void ParseStringResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, 134 int index, std::string &data, int &err); 135 136 static bool CheckResultSetCount(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, int &err); 137 // utils 138 static Size ConvertDecodeSize(const Size &sourceSize, const Size &desiredSize, const bool isThumbnail); 139 static bool LoadImageFile(ThumbnailData &data, const bool isThumbnail, const Size &desiredSize); 140 static bool LoadVideoFile(ThumbnailData &data, const bool isThumbnail, const Size &desiredSize); 141 static bool LoadAudioFile(ThumbnailData &data, const bool isThumbnail, const Size &desiredSize); 142 static std::string GetUdid(); 143 // KV Store 144 static DistributedKv::Status SaveImage(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, 145 const std::string &key, const std::vector<uint8_t> &image); 146 147 // RDB Store 148 static bool GetRemoteThumbnailInfo(ThumbRdbOpt &opts, const std::string &id, 149 const std::string &udid, int &err); 150 static bool GetUdidByNetworkId(ThumbRdbOpt &opts, const std::string &networkId, 151 std::string &outUdid, int &err); 152 static bool UpdateRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 153 static bool InsertRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 154 static bool CleanDistributeLcdInfo(ThumbRdbOpt &opts); 155 }; 156 } // namespace Media 157 } // namespace OHOS 158 159 #endif // FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_ 160