• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_LIBRARY_NAPI_H_
17 #define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_LIBRARY_NAPI_H_
18 
19 #include <mutex>
20 
21 #include "abs_shared_result_set.h"
22 #include "album_napi.h"
23 #include "data_ability_helper.h"
24 #include "data_ability_observer_stub.h"
25 #include "data_ability_predicates.h"
26 #include "fetch_file_result_napi.h"
27 #include "file_asset_napi.h"
28 #include "napi_base_context.h"
29 #include "napi/native_api.h"
30 #include "napi/native_node_api.h"
31 #include "napi_error.h"
32 #include "smart_album_asset.h"
33 #include "values_bucket.h"
34 #include "napi_remote_object.h"
35 #include "datashare_helper.h"
36 #include "datashare_predicates.h"
37 
38 namespace OHOS {
39 namespace Media {
40 static const std::string MEDIA_LIB_NAPI_CLASS_NAME = "MediaLibrary";
41 static const std::string USERFILE_MGR_NAPI_CLASS_NAME = "UserFileManager";
42 
43 enum ListenerType {
44     INVALID_LISTENER = -1,
45 
46     AUDIO_LISTENER,
47     VIDEO_LISTENER,
48     IMAGE_LISTENER,
49     FILE_LISTENER,
50     SMARTALBUM_LISTENER,
51     DEVICE_LISTENER,
52     REMOTEFILE_LISTENER,
53     ALBUM_LISTENER
54 };
55 
56 struct MediaChangeListener {
57     MediaType mediaType;
58 };
59 
60 class ChangeListenerNapi {
61 public:
62     class UvChangeMsg {
63     public:
UvChangeMsg(napi_env env,napi_ref ref)64         UvChangeMsg(napi_env env, napi_ref ref) : env_(env), ref_(ref) {}
~UvChangeMsg()65         ~UvChangeMsg() {}
66         napi_env env_;
67         napi_ref ref_;
68     };
69 
ChangeListenerNapi(napi_env env)70     explicit ChangeListenerNapi(napi_env env) : env_(env) {}
71 
ChangeListenerNapi(const ChangeListenerNapi & listener)72     ChangeListenerNapi(const ChangeListenerNapi &listener)
73     {
74         this->env_ = listener.env_;
75         this->cbOnRef_ = listener.cbOnRef_;
76         this->cbOffRef_ = listener.cbOffRef_;
77     }
78 
79     ChangeListenerNapi& operator=(const ChangeListenerNapi &listener)
80     {
81         this->env_ = listener.env_;
82         this->cbOnRef_ = listener.cbOnRef_;
83         this->cbOffRef_ = listener.cbOffRef_;
84         return *this;
85     }
86 
87     ~ChangeListenerNapi() = default;
88 
89     void OnChange(const MediaChangeListener &listener, const napi_ref cbRef);
90 
91     napi_ref cbOnRef_ = nullptr;
92     napi_ref cbOffRef_ = nullptr;
93     sptr<AAFwk::IDataAbilityObserver> audioDataObserver_ = nullptr;
94     sptr<AAFwk::IDataAbilityObserver> videoDataObserver_ = nullptr;
95     sptr<AAFwk::IDataAbilityObserver> imageDataObserver_ = nullptr;
96     sptr<AAFwk::IDataAbilityObserver> fileDataObserver_ = nullptr;
97     sptr<AAFwk::IDataAbilityObserver> smartAlbumDataObserver_ = nullptr;
98     sptr<AAFwk::IDataAbilityObserver> deviceDataObserver_ = nullptr;
99     sptr<AAFwk::IDataAbilityObserver> remoteFileDataObserver_ = nullptr;
100     sptr<AAFwk::IDataAbilityObserver> albumDataObserver_ = nullptr;
101 
102 private:
103     napi_env env_ = nullptr;
104 };
105 
106 class MediaObserver : public AAFwk::DataAbilityObserverStub {
107 public:
MediaObserver(const ChangeListenerNapi & listObj,MediaType mediaType)108     MediaObserver(const ChangeListenerNapi &listObj, MediaType mediaType) : listObj_(listObj)
109     {
110         mediaType_ = mediaType;
111     }
112 
113     ~MediaObserver() = default;
114 
OnChange()115     void OnChange() override
116     {
117         MediaChangeListener listener;
118         listener.mediaType = mediaType_;
119         listObj_.OnChange(listener, listObj_.cbOnRef_);
120     }
121 
122     ChangeListenerNapi listObj_;
123     MediaType mediaType_;
124 };
125 
126 class MediaLibraryNapi {
127 public:
128     static napi_value Init(napi_env env, napi_value exports);
129     static napi_value UserFileMgrInit(napi_env env, napi_value exports);
130 
131     MediaLibraryNapi();
132     ~MediaLibraryNapi();
133 
134     ResultNapiType resultNapiType_;
135 
136 private:
137     static void MediaLibraryNapiDestructor(napi_env env, void *nativeObject, void *finalize_hint);
138     static napi_value MediaLibraryNapiConstructor(napi_env env, napi_callback_info info);
139 
140     static napi_value GetMediaLibraryNewInstance(napi_env env, napi_callback_info info);
141 
142     static napi_value JSGetPublicDirectory(napi_env env, napi_callback_info info);
143     static napi_value JSGetFileAssets(napi_env env, napi_callback_info info);
144     static napi_value JSGetAlbums(napi_env env, napi_callback_info info);
145 
146     static napi_value JSCreateAsset(napi_env env, napi_callback_info info);
147     static napi_value JSDeleteAsset(napi_env env, napi_callback_info info);
148 
149     static napi_value JSOnCallback(napi_env env, napi_callback_info info);
150     static napi_value JSOffCallback(napi_env env, napi_callback_info info);
151 
152     static napi_value JSRelease(napi_env env, napi_callback_info info);
153 
154     static napi_value JSGetActivePeers(napi_env env, napi_callback_info info);
155     static napi_value JSGetAllPeers(napi_env env, napi_callback_info info);
156     static napi_value CreateMediaTypeEnum(napi_env env);
157     static napi_value CreateFileKeyEnum(napi_env env);
158     static napi_value CreateDirectoryTypeEnum(napi_env env);
159     static napi_value CreateVirtualAlbumTypeEnum(napi_env env);
160     static napi_value CreatePrivateAlbumTypeEnum(napi_env env);
161 
162     static napi_value CreateMediaTypeUserFileEnum(napi_env env);
163 
164     static napi_value JSGetSmartAlbums(napi_env env, napi_callback_info info);
165     static napi_value JSGetPrivateAlbum(napi_env env, napi_callback_info info);
166     static napi_value JSCreateSmartAlbum(napi_env env, napi_callback_info info);
167     static napi_value JSDeleteSmartAlbum(napi_env env, napi_callback_info info);
168 
169     static napi_value JSStoreMediaAsset(napi_env env, napi_callback_info info);
170     static napi_value JSStartImagePreview(napi_env env, napi_callback_info info);
171     static napi_value JSGetMediaRemoteStub(napi_env env, napi_callback_info info);
172 
173     static napi_value GetUserFileMgr(napi_env env, napi_callback_info info);
174     static napi_value UserFileMgrCreateAsset(napi_env env, napi_callback_info info);
175     static napi_value UserFileMgrTrashAsset(napi_env env, napi_callback_info info);
176     static napi_value UserFileMgrGetAlbums(napi_env env, napi_callback_info info);
177     static napi_value UserFileMgrGetPhotoAssets(napi_env env, napi_callback_info info);
178     static napi_value UserFileMgrGetAudioAssets(napi_env env, napi_callback_info info);
179     static napi_value UserFileMgrGetPrivateAlbum(napi_env env, napi_callback_info info);
180     static napi_value UserFileMgrCreateFileKeyEnum(napi_env env);
181     static napi_value CreateAudioKeyEnum(napi_env env);
182     static napi_value CreateImageVideoKeyEnum(napi_env env);
183     static napi_value CreateAlbumKeyEnum(napi_env env);
184 
185     int32_t GetListenerType(const std::string &str) const;
186     void RegisterChange(napi_env env, const std::string &type, ChangeListenerNapi &listObj);
187     void UnregisterChange(napi_env env, const std::string &type, ChangeListenerNapi &listObj);
188 
189     napi_env env_;
190 
191     static thread_local napi_ref sConstructor_;
192     static thread_local napi_ref userFileMgrConstructor_;
193     static thread_local napi_ref sMediaTypeEnumRef_;
194     static thread_local napi_ref sDirectoryEnumRef_;
195     static thread_local napi_ref sVirtualAlbumTypeEnumRef_;
196     static thread_local napi_ref sFileKeyEnumRef_;
197     static thread_local napi_ref sPrivateAlbumEnumRef_;
198 
199     static thread_local napi_ref sUserFileMgrFileKeyEnumRef_;
200     static thread_local napi_ref sAudioKeyEnumRef_;
201     static thread_local napi_ref sImageVideoKeyEnumRef_;
202     static thread_local napi_ref sAlbumKeyEnumRef_;
203 
204     static std::mutex sUserFileClientMutex_;
205 };
206 
207 const int32_t DEFAULT_PRIVATEALBUMTYPE = 3;
208 struct MediaLibraryAsyncContext : public NapiError {
209     napi_async_work work;
210     napi_deferred deferred;
211     napi_ref callbackRef;
212     bool status;
213     bool isDelete;
214     NapiAssetType assetType;
215     AlbumType albumType;
216     MediaLibraryNapi *objectInfo;
217     std::string selection;
218     std::vector<std::string> selectionArgs;
219     std::string order;
220     std::string uri;
221     std::string networkId;
222     std::string extendArgs;
223     std::unique_ptr<FetchResult<FileAsset>> fetchFileResult;
224     std::unique_ptr<FetchResult<AlbumAsset>> fetchAlbumResult;
225     std::unique_ptr<FetchResult<SmartAlbumAsset>> fetchSmartAlbumResult;
226     std::unique_ptr<FileAsset> fileAsset;
227     std::unique_ptr<SmartAlbumAsset> smartAlbumData;
228     OHOS::DataShare::DataShareValuesBucket valuesBucket;
229     unsigned int dirType = 0;
230     int32_t privateAlbumType = DEFAULT_PRIVATEALBUMTYPE;
231     int32_t retVal;
232     std::string directoryRelativePath;
233     std::vector<std::unique_ptr<AlbumAsset>> albumNativeArray;
234     std::vector<std::unique_ptr<SmartAlbumAsset>> smartAlbumNativeArray;
235     std::vector<std::unique_ptr<SmartAlbumAsset>> privateSmartAlbumNativeArray;
236     Ability *ability_;
237     std::string storeMediaSrc;
238     int32_t imagePreviewIndex;
239 
240     size_t argc;
241     napi_value argv[NAPI_ARGC_MAX];
242     ResultNapiType resultNapiType;
243     std::string typeMask;
244     std::vector<uint32_t> mediaTypes;
245     OHOS::DataShare::DataSharePredicates predicates;
246     std::vector<std::string> fetchColumn;
247 };
248 } // namespace Media
249 } // namespace OHOS
250 
251 #endif  // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_LIBRARY_NAPI_H_
252