1 /*
2  * Copyright (c) 2021-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 FOUNDATION_ACE_ACE_ENGINE_FRAMEWORKS_BASE_RESOURCE_DATA_PROVIDER_MANAGER_H
17 #define FOUNDATION_ACE_ACE_ENGINE_FRAMEWORKS_BASE_RESOURCE_DATA_PROVIDER_MANAGER_H
18 
19 #include <cstdint>
20 #include <functional>
21 #include <memory>
22 #include <mutex>
23 #include <shared_mutex>
24 #include <string>
25 #include <type_traits>
26 
27 #include "base/memory/ace_type.h"
28 #include "base/resource/data_ability_helper.h"
29 #include "base/utils/noncopyable.h"
30 
31 namespace OHOS::Ace {
32 
33 class DataProviderRes {
34 public:
DataProviderRes(std::unique_ptr<void, decltype(&std::free)>&& data, int64_t size)35     DataProviderRes(std::unique_ptr<void, decltype(&std::free)>&& data, int64_t size)
36         : data_(std::move(data)), size_(size)
37     {}
38     ~DataProviderRes() = default;
39 
GetData()40     std::unique_ptr<void, decltype(&std::free)>&& GetData()
41     {
42         return std::move(data_);
43     }
GetSize() const44     int64_t GetSize() const
45     {
46         return size_;
47     }
48 
49 private:
50     std::unique_ptr<void, decltype(&std::free)> data_;
51     int64_t size_ = 0;
52 
53     ACE_DISALLOW_COPY_AND_MOVE(DataProviderRes);
54 };
55 
56 class DataProviderManagerInterface : public AceType {
57     DECLARE_ACE_TYPE(DataProviderManagerInterface, AceType)
58 
59 public:
60     DataProviderManagerInterface() = default;
61     ~DataProviderManagerInterface() override = default;
62 
63     virtual std::unique_ptr<DataProviderRes> GetDataProviderResFromUri(const std::string& uriStr) = 0;
64     virtual void* GetDataProviderThumbnailResFromUri(const std::string& uriStr) = 0;
65     virtual int32_t GetDataProviderFile(const std::string& uriStr, const std::string& mode) = 0;
66 
67     ACE_DISALLOW_COPY_AND_MOVE(DataProviderManagerInterface);
68 };
69 
70 using DataProviderImpl = std::function<std::unique_ptr<DataProviderRes>(const std::string& uriStr)>;
71 class DataProviderManager : public DataProviderManagerInterface {
72     DECLARE_ACE_TYPE(DataProviderManager, DataProviderManagerInterface)
73 public:
DataProviderManager(DataProviderImpl dataProvider)74     explicit DataProviderManager(DataProviderImpl dataProvider) : platformImpl_(std::move(dataProvider)) {}
75     ~DataProviderManager() override = default;
76 
77     std::unique_ptr<DataProviderRes> GetDataProviderResFromUri(const std::string& uriStr) override;
78     void* GetDataProviderThumbnailResFromUri(const std::string& /* uriStr */) override
79     {
80         return nullptr;
81     };
82     int32_t GetDataProviderFile(const std::string& /* uriStr */, const std::string& /* mode */) override
83     {
84         return -1;
85     }
86 
87 private:
88     DataProviderImpl platformImpl_;
89 
90     ACE_DISALLOW_COPY_AND_MOVE(DataProviderManager);
91 };
92 
93 using DataAbilityHelperImpl = std::function<RefPtr<DataAbilityHelper>()>;
94 class ACE_FORCE_EXPORT DataProviderManagerStandard : public DataProviderManagerInterface {
95     DECLARE_ACE_TYPE(DataProviderManagerStandard, DataProviderManagerInterface)
96 
97 public:
DataProviderManagerStandard(DataAbilityHelperImpl dataAbilityHelperImpl)98     explicit DataProviderManagerStandard(DataAbilityHelperImpl dataAbilityHelperImpl)
99         : dataAbilityHelperImpl_(std::move(dataAbilityHelperImpl))
100     {}
101 
102     ~DataProviderManagerStandard() override = default;
103 
104     std::unique_ptr<DataProviderRes> GetDataProviderResFromUri(const std::string& uriStr) override;
105     void* GetDataProviderThumbnailResFromUri(const std::string& uriStr) override;
106 
107     int32_t GetDataProviderFile(const std::string& uriStr, const std::string& mode) override;
108     int32_t ReadMovingPhotoVideo(const std::string &uri);
109     std::string GetMovingPhotoImageUri(const std::string& uri);
110     int64_t GetMovingPhotoDateModified(const std::string& uri);
111     int64_t GetMovingPhotoCoverPosition(const std::string& columnName, const std::string& value,
112         std::vector<std::string>& columns);
113     std::string GetMovingPhotoImagePath(const std::string& uri);
114 
115 private:
116     void InitHelper();
117 
118     std::shared_mutex helperMutex_;
119     DataAbilityHelperImpl dataAbilityHelperImpl_;
120     RefPtr<DataAbilityHelper> helper_;
121 
122     ACE_DISALLOW_COPY_AND_MOVE(DataProviderManagerStandard);
123 };
124 
125 } // namespace OHOS::Ace
126 
127 #endif // FOUNDATION_ACE_ACE_ENGINE_FRAMEWORKS_BASE_RESOURCE_DATA_PROVIDER_MANAGER_H
128