• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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