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()44     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 {
DECLARE_ACE_TYPE(DataProviderManager,DataProviderManagerInterface)72     DECLARE_ACE_TYPE(DataProviderManager, DataProviderManagerInterface)
73 public:
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;
GetDataProviderThumbnailResFromUri(const std::string &)78     void* GetDataProviderThumbnailResFromUri(const std::string& /* uriStr */) override
79     {
80         return nullptr;
81     };
GetDataProviderFile(const std::string &,const std::string &)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 {
DECLARE_ACE_TYPE(DataProviderManagerStandard,DataProviderManagerInterface)95     DECLARE_ACE_TYPE(DataProviderManagerStandard, DataProviderManagerInterface)
96 
97 public:
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 
112 private:
113     void InitHelper();
114 
115     std::shared_mutex helperMutex_;
116     DataAbilityHelperImpl dataAbilityHelperImpl_;
117     RefPtr<DataAbilityHelper> helper_;
118 
119     ACE_DISALLOW_COPY_AND_MOVE(DataProviderManagerStandard);
120 };
121 
122 } // namespace OHOS::Ace
123 
124 #endif // FOUNDATION_ACE_ACE_ENGINE_FRAMEWORKS_BASE_RESOURCE_DATA_PROVIDER_MANAGER_H
125