• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &degrees);
152     static bool LoadVideoFile(const std::string &path, std::shared_ptr<PixelMap> &pixelMap, float &degrees);
153     static bool LoadAudioFile(const std::string &path, std::shared_ptr<PixelMap> &pixelMap, float &degrees);
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