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 "fa_ability_context.h"
23 #include "avmetadatahelper.h"
24 #include "datashare_result_set.h"
25 #include "image_source.h"
26 #include "rdb_helper.h"
27 #include "rdb_predicates.h"
28 #include "single_kvstore.h"
29 #include "thumbnail_const.h"
30 #include "thumbnail_data.h"
31 
32 namespace OHOS {
33 namespace Media {
34 #define EXPORT __attribute__ ((visibility ("default")))
35 struct ThumbRdbOpt {
36     EXPORT std::shared_ptr<NativeRdb::RdbStore> store;
37 #ifdef DISTRIBUTED
38     EXPORT std::shared_ptr<DistributedKv::SingleKvStore> kvStore;
39 #endif
40     EXPORT std::shared_ptr<AbilityRuntime::Context> context;
41     EXPORT std::string networkId;
42     EXPORT std::string path;
43     EXPORT std::string table;
44     EXPORT std::string udid;
45     EXPORT std::string row;
46     EXPORT std::string uri;
47     EXPORT std::string dateAdded;
48     EXPORT std::string dateTaken;
49     EXPORT std::string fileUri;
50     EXPORT std::string fileId;
51     EXPORT Size screenSize;
52 };
53 
54 class ThumbnailUtils {
55 public:
56     EXPORT ThumbnailUtils() = delete;
57     EXPORT ~ThumbnailUtils() = delete;
58     // utils
59     EXPORT static bool ResizeImage(const std::vector<uint8_t> &data, const Size &size,
60         std::unique_ptr<PixelMap> &pixelMap);
61     EXPORT static bool CompressImage(std::shared_ptr<PixelMap> &pixelMap, std::vector<uint8_t> &data,
62         bool isHigh = false, bool isAstc = false, bool forceSdr = true);
63     EXPORT static bool CleanThumbnailInfo(ThumbRdbOpt &opts, bool withThumb, bool withLcd = false);
64 
65     // RDB Store Query
66     EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryThumbnailInfo(ThumbRdbOpt &opts,
67         ThumbnailData &data, int &err);
68 #ifdef DISTRIBUTED
69     EXPORT static bool QueryRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
70     // KV Store
71     EXPORT static bool RemoveDataFromKv(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore,
72         const std::string &key);
73     EXPORT static bool IsImageExist(const std::string &key, const std::string &networkId,
74         const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore);
75     EXPORT static bool DeleteDistributeLcdData(ThumbRdbOpt &opts, ThumbnailData &thumbnailData);
76 #endif
77     EXPORT static bool DeleteThumbFile(ThumbnailData &data, ThumbnailType type);
78     EXPORT static bool DeleteThumbExDir(ThumbnailData &data);
79     EXPORT static bool DeleteBeginTimestampDir(ThumbnailData &data);
80 #ifdef DISTRIBUTED
81     EXPORT static bool DeleteDistributeThumbnailInfo(ThumbRdbOpt &opts);
82 #endif
83 
84     EXPORT static bool DeleteOriginImage(ThumbRdbOpt &opts);
85     EXPORT static bool DoDeleteMonthAndYearAstc(ThumbRdbOpt &opts);
86     // Steps
87     EXPORT static bool LoadSourceImage(ThumbnailData &data);
88     EXPORT static bool GenTargetPixelmap(ThumbnailData &data, const Size &desiredSize);
89 
90     EXPORT static int TrySaveFile(ThumbnailData &Data, ThumbnailType type);
91     EXPORT static bool UpdateLcdInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
92     EXPORT static bool UpdateVisitTime(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
93     EXPORT static bool UpdateHighlightInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
94     EXPORT static bool UpdateLcdReadyStatus(ThumbRdbOpt &opts, ThumbnailData &data, int &err, LcdReady status);
95     EXPORT static bool DoUpdateAstcDateTaken(ThumbRdbOpt &opts, ThumbnailData &data);
96 #ifdef DISTRIBUTED
97     EXPORT static bool DoUpdateRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
98 #endif
99 
100     // RDB Store generate and aging
101     EXPORT static bool QueryLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err);
102     EXPORT static bool QueryDistributeLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err);
103     EXPORT static bool QueryAgingLcdInfos(ThumbRdbOpt &opts, int LcdLimit,
104         std::vector<ThumbnailData> &infos, int &err);
105 #ifdef DISTRIBUTED
106     EXPORT static bool QueryAgingDistributeLcdInfos(ThumbRdbOpt &opts, int LcdLimit,
107         std::vector<ThumbnailData> &infos, int &err);
108 #endif
109     EXPORT static bool QueryNoLcdInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
110     EXPORT static bool QueryNoThumbnailInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
111     EXPORT static bool QueryUpgradeThumbnailInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos,
112         bool isWifiConnected, int &err);
113     EXPORT static bool QueryNoAstcInfosRestored(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
114     EXPORT static bool QueryNoAstcInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
115     EXPORT static bool QueryNewThumbnailCount(ThumbRdbOpt &opts, const int64_t &time, int &count, int &err);
116     EXPORT static bool QueryNoAstcInfosOnDemand(ThumbRdbOpt &opts,
117         std::vector<ThumbnailData> &infos, NativeRdb::RdbPredicates &rdbPredicate, int &err);
118     EXPORT static bool QueryNoHighlightInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
119     EXPORT static bool QueryNoHighlightPath(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
120     EXPORT static bool QueryHighlightTriggerPath(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
121     EXPORT static std::string GetHighlightValue(const std::string &str, const std::string &key);
122     EXPORT static bool GetHighlightTracks(ThumbRdbOpt &opts, std::vector<int> &trackInfos, int32_t &err);
123 
124 #ifdef DISTRIBUTED
125     EXPORT static bool QueryDeviceThumbnailRecords(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
126 #endif
127     EXPORT static bool QueryLcdCountByTime(const int64_t &time, const bool &before, ThumbRdbOpt &opts, int &outLcdCount,
128         int &err);
129     EXPORT static bool ResizeThumb(int& width, int& height);
130     EXPORT static bool ResizeLcd(int& width, int& height);
131     EXPORT static bool IsSupportGenAstc();
132     EXPORT static void QueryThumbnailDataFromFileId(ThumbRdbOpt &opts, const std::string &id,
133         ThumbnailData &data, int &err);
134     EXPORT static bool CheckDateTaken(ThumbRdbOpt &opts, ThumbnailData &data);
135     EXPORT static void GetThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &outData);
136     EXPORT static bool ScaleThumbnailFromSource(ThumbnailData &data, bool isSourceEx);
137     EXPORT static bool ScaleTargetPixelMap(std::shared_ptr<PixelMap> &dataSource, const Size &targetSize,
138         const AntiAliasingOption &option);
139     EXPORT static bool CenterScaleEx(std::shared_ptr<PixelMap> &dataSource, const Size &desiredSize,
140         const std::string path);
141     EXPORT static std::string GetThumbnailSuffix(ThumbnailType type);
142 
143     EXPORT static void RecordStartGenerateStats(ThumbnailData::GenerateStats &stats, GenerateScene scene,
144         LoadSourceType sourceType);
145     EXPORT static void RecordCostTimeAndReport(ThumbnailData::GenerateStats &stats);
146 
147     EXPORT static bool GenerateOldKvStoreKey(const std::string &fieldId, const std::string &dateAdded,
148         std::string &key);
149     EXPORT static bool GenerateKvStoreKey(const std::string &fileId, const std::string &dateKey, std::string &key);
150     EXPORT static bool GetLocalThumbSize(const ThumbnailData &data, const ThumbnailType& type, Size& size);
151     EXPORT static void SetThumbnailSizeValue(NativeRdb::ValuesBucket& values, Size& size, const std::string& column);
152     EXPORT static bool LoadVideoFile(ThumbnailData &data, Size &desiredSize);
153     EXPORT static bool CheckCloudThumbnailDownloadFinish(const std::shared_ptr<NativeRdb::RdbStore> &rdbStorePtr);
154     EXPORT static bool QueryOldKeyAstcInfos(const std::shared_ptr<NativeRdb::RdbStore> &rdbStorePtr,
155         const std::string &table, std::vector<ThumbnailData> &infos);
156 
157 private:
158     EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryThumbnailSet(ThumbRdbOpt &opts);
159     EXPORT static int SaveThumbDataToLocalDir(ThumbnailData &data, const std::string &suffix,
160         uint8_t *output, const int writeSize);
161     EXPORT static int ToSaveFile(ThumbnailData &data, const std::string &fileName,
162         uint8_t *output, const int &writeSize);
163     EXPORT static int SaveFileCreateDir(const std::string &path, const std::string &suffix, std::string &fileName);
164     EXPORT static int SaveFileCreateDirHighlight(const std::string &path, const std::string &suffix,
165         std::string &fileName, const std::string &timeStamp);
166     EXPORT static int32_t SetSource(std::shared_ptr<AVMetadataHelper> avMetadataHelper, const std::string &path);
167     EXPORT static int64_t UTCTimeMilliSeconds();
168     EXPORT static void ParseQueryResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet,
169         ThumbnailData &data, int &err, const std::vector<std::string> &column);
170     EXPORT static void ParseStringResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet,
171         int index, std::string &data, int &err);
172     EXPORT static void ParseHighlightQueryResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet,
173        ThumbnailData &data, int &err);
174 
175     EXPORT static bool CheckResultSetCount(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, int &err);
176     // utils
177     EXPORT static bool LoadImageFile(ThumbnailData &data, Size &desiredSize);
178     EXPORT static bool LoadAudioFileInfo(std::shared_ptr<AVMetadataHelper> avMetadataHelper, ThumbnailData &data,
179         Size &desiredSize, uint32_t &errCode);
180     EXPORT static bool LoadAudioFile(ThumbnailData &data, Size &desiredSize);
181     EXPORT static bool ConvertStrToInt32(const std::string &str, int32_t &ret);
182     EXPORT static bool ParseVideoSize(std::shared_ptr<AVMetadataHelper> &avMetadataHelper,
183         int32_t &videoWidth, int32_t &videoHeight);
184 #ifdef DISTRIBUTED
185     // RDB Store
186     EXPORT static bool GetUdidByNetworkId(ThumbRdbOpt &opts, const std::string &networkId,
187         std::string &outUdid, int &err);
188     EXPORT static bool UpdateRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
189     EXPORT static bool InsertRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
190     EXPORT static bool CleanDistributeLcdInfo(ThumbRdbOpt &opts);
191 #endif
192 
193     // scale
194     EXPORT static bool ScaleFastThumb(ThumbnailData &data, const Size &size);
195 
196     EXPORT static int SaveAstcDataToKvStore(ThumbnailData &data, const ThumbnailType &type);
197     EXPORT static bool DeleteAstcDataFromKvStore(ThumbRdbOpt &opts, const ThumbnailType &type);
198     EXPORT static bool UpdateAstcDateTakenFromKvStore(ThumbRdbOpt &opts, const ThumbnailData &data);
199 };
200 } // namespace Media
201 } // namespace OHOS
202 
203 #endif // FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_
204