1 /*
2  * Copyright (C) 2022-2024 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_ITHUMBNAIL_HELPER_H_
17 #define FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_ITHUMBNAIL_HELPER_H_
18 
19 #include <map>
20 #include <memory>
21 #include <shared_mutex>
22 
23 #include "ability_connect_callback_stub.h"
24 #include "ability_context.h"
25 #include "datashare_proxy.h"
26 #include "datashare_values_bucket.h"
27 #include "medialibrary_sync_operation.h"
28 #include "result_set_bridge.h"
29 #include "thumbnail_const.h"
30 #include "thumbnail_generate_worker.h"
31 #include "thumbnail_utils.h"
32 #include "pixel_map.h"
33 
34 namespace OHOS {
35 namespace Media {
36 enum WaitStatus {
37     INSERT,
38     WAIT_SUCCESS,
39     WAIT_CONTINUE,
40     WAIT_FAILED,
41     TIMEOUT,
42 };
43 
44 enum CloudLoadType {
45     NONE,
46     CLOUD_READ_THUMB,
47     CLOUD_READ_LCD,
48     CLOUD_DOWNLOAD,
49 };
50 
51 enum CloudReadStatus {
52     START,
53     SUCCESS,
54     FAIL,
55 };
56 
57 class ThumbnailSyncStatus {
58 public:
59     std::condition_variable cond_;
60     std::mutex mtx_;
61     bool isSyncComplete_{false};
62     bool isCreateThumbnailSuccess_{false};
63     std::atomic<CloudReadStatus> CloudLoadThumbnailStatus_{START};
64     std::atomic<CloudReadStatus> CloudLoadLcdStatus_{START};
65     std::atomic<CloudLoadType> cloudLoadType_{NONE};
66 };
67 
68 using ThumbnailMap = std::map<std::string, std::shared_ptr<ThumbnailSyncStatus>>;
69 class ThumbnailWait {
70 public:
71     ThumbnailWait(bool release);
72     ~ThumbnailWait();
73 
74     WaitStatus InsertAndWait(const std::string &id, ThumbnailType type);
75     WaitStatus CloudInsertAndWait(const std::string &id, CloudLoadType cloudLoadType);
76     void CheckAndWait(const std::string &id, bool isLcd);
77     void UpdateThumbnailMap();
78     void UpdateCloudLoadThumbnailMap(CloudLoadType cloudLoadType, bool isLoadSuccess);
79 
80 private:
81     void Notify();
82     std::string id_;
83     bool needRelease_{false};
84     static ThumbnailMap thumbnailMap_;
85     static std::shared_mutex mutex_;
86 };
87 
88 class IThumbnailHelper {
89 public:
90     IThumbnailHelper() = default;
91     virtual ~IThumbnailHelper() = default;
92     EXPORT static void CreateLcdAndThumbnail(std::shared_ptr<ThumbnailTaskData> &data);
93     EXPORT static bool DoCreateLcdAndThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, WaitStatus &ret);
94     EXPORT static void CreateLcd(std::shared_ptr<ThumbnailTaskData> &data);
95     EXPORT static void CreateThumbnail(std::shared_ptr<ThumbnailTaskData> &data);
96     EXPORT static void CreateAstc(std::shared_ptr<ThumbnailTaskData> &data);
97     EXPORT static void CreateAstcEx(std::shared_ptr<ThumbnailTaskData> &data);
98     EXPORT static void AddThumbnailGenerateTask(ThumbnailGenerateExecute executor, ThumbRdbOpt &opts,
99         ThumbnailData &thumbData, const ThumbnailTaskType &taskType, const ThumbnailTaskPriority &priority);
100     EXPORT static void AddThumbnailGenBatchTask(ThumbnailGenerateExecute executor,
101         ThumbRdbOpt &opts, ThumbnailData &thumbData, int32_t requestId = 0);
102     EXPORT static std::unique_ptr<PixelMap> GetPixelMap(const std::vector<uint8_t> &image, Size &size);
103     EXPORT static bool DoCreateLcd(ThumbRdbOpt &opts, ThumbnailData &data, WaitStatus &ret);
104     EXPORT static bool DoCreateThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, WaitStatus &ret);
105     EXPORT static bool DoCreateAstc(ThumbRdbOpt &opts, ThumbnailData &data);
106     EXPORT static bool DoCreateAstcEx(ThumbRdbOpt &opts, ThumbnailData &data, WaitStatus &ret);
107     EXPORT static bool DoRotateThumbnail(ThumbRdbOpt &opts, ThumbnailData &data);
108     EXPORT static bool DoRotateThumbnailEx(ThumbRdbOpt &opts, ThumbnailData &data, int32_t fd, ThumbnailType thumbType);
109     EXPORT static bool IsPureCloudImage(ThumbRdbOpt &opts);
110     EXPORT static void DeleteMonthAndYearAstc(std::shared_ptr<ThumbnailTaskData> &data);
111     EXPORT static void UpdateAstcDateTaken(std::shared_ptr<ThumbnailTaskData> &data);
112     EXPORT static bool UpdateThumbnailState(const ThumbRdbOpt &opts, ThumbnailData &data, const bool isSuccess);
113 private:
114     EXPORT static bool GenThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, const ThumbnailType type);
115     EXPORT static bool GenThumbnailEx(ThumbRdbOpt &opts, ThumbnailData &data);
116     EXPORT static bool TryLoadSource(ThumbRdbOpt &opts, ThumbnailData &data);
117     EXPORT static bool GenMonthAndYearAstcData(ThumbnailData &data, const ThumbnailType type);
118     EXPORT static bool UpdateSuccessState(const ThumbRdbOpt &opts, const ThumbnailData &data);
119     EXPORT static bool UpdateFailState(const ThumbRdbOpt &opts, const ThumbnailData &data);
120     EXPORT static int32_t UpdateThumbDbState(const ThumbRdbOpt &opts, const ThumbnailData &data);
121     EXPORT static bool IsCreateThumbnailSuccess(ThumbRdbOpt &opts, ThumbnailData &data);
122     EXPORT static bool IsCreateThumbnailExSuccess(ThumbRdbOpt &opts, ThumbnailData &data);
123     EXPORT static bool IsCreateLcdSuccess(ThumbRdbOpt &opts, ThumbnailData &data);
124     EXPORT static bool IsCreateLcdExSuccess(ThumbRdbOpt &opts, ThumbnailData &data);
125 };
126 } // namespace Media
127 } // namespace OHOS
128 
129 #endif  // FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_ITHUMBNAIL_HELPER_H_
130