• 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 #include <vector>
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 "photo_album.h"
33 #include "smart_album_asset.h"
34 #include "values_bucket.h"
35 #include "napi_remote_object.h"
36 #include "datashare_helper.h"
37 #include "datashare_predicates.h"
38 
39 namespace OHOS {
40 namespace Media {
41 static const std::string MEDIA_LIB_NAPI_CLASS_NAME = "MediaLibrary";
42 static const std::string USERFILE_MGR_NAPI_CLASS_NAME = "UserFileManager";
43 static const std::string PHOTOACCESSHELPER_NAPI_CLASS_NAME = "PhotoAccessHelper";
44 
45 enum ListenerType {
46     INVALID_LISTENER = -1,
47 
48     AUDIO_LISTENER,
49     VIDEO_LISTENER,
50     IMAGE_LISTENER,
51     FILE_LISTENER,
52     SMARTALBUM_LISTENER,
53     DEVICE_LISTENER,
54     REMOTEFILE_LISTENER,
55     ALBUM_LISTENER
56 };
57 
58 struct MediaChangeListener {
59     MediaType mediaType;
60     OHOS::DataShare::DataShareObserver::ChangeInfo changeInfo;
61     std::string strUri;
62 };
63 class MediaOnNotifyObserver;
64 class ChangeListenerNapi {
65 public:
66     class UvChangeMsg {
67     public:
UvChangeMsg(napi_env env,napi_ref ref,OHOS::DataShare::DataShareObserver::ChangeInfo & changeInfo,std::string strUri)68         UvChangeMsg(napi_env env, napi_ref ref,
69                     OHOS::DataShare::DataShareObserver::ChangeInfo &changeInfo,
70                     std::string strUri)
71             : env_(env), ref_(ref), changeInfo_(changeInfo),
72             strUri_(std::move(strUri)) {}
~UvChangeMsg()73         ~UvChangeMsg() {}
74         napi_env env_;
75         napi_ref ref_;
76         OHOS::DataShare::DataShareObserver::ChangeInfo changeInfo_;
77         uint8_t *data_;
78         std::string strUri_;
79     };
80 
ChangeListenerNapi(napi_env env)81     explicit ChangeListenerNapi(napi_env env) : env_(env) {}
82 
ChangeListenerNapi(const ChangeListenerNapi & listener)83     ChangeListenerNapi(const ChangeListenerNapi &listener)
84     {
85         this->env_ = listener.env_;
86         this->cbOnRef_ = listener.cbOnRef_;
87         this->cbOffRef_ = listener.cbOffRef_;
88     }
89 
90     ChangeListenerNapi& operator=(const ChangeListenerNapi &listener)
91     {
92         this->env_ = listener.env_;
93         this->cbOnRef_ = listener.cbOnRef_;
94         this->cbOffRef_ = listener.cbOffRef_;
95         return *this;
96     }
97 
~ChangeListenerNapi()98     ~ChangeListenerNapi(){};
99 
100     void OnChange(MediaChangeListener &listener, const napi_ref cbRef);
101     static napi_value SolveOnChange(napi_env env, UvChangeMsg *msg);
102     static string GetTrashAlbumUri();
103     static std::string trashAlbumUri_;
104     napi_ref cbOnRef_ = nullptr;
105     napi_ref cbOffRef_ = nullptr;
106     sptr<AAFwk::IDataAbilityObserver> audioDataObserver_ = nullptr;
107     sptr<AAFwk::IDataAbilityObserver> videoDataObserver_ = nullptr;
108     sptr<AAFwk::IDataAbilityObserver> imageDataObserver_ = nullptr;
109     sptr<AAFwk::IDataAbilityObserver> fileDataObserver_ = nullptr;
110     sptr<AAFwk::IDataAbilityObserver> smartAlbumDataObserver_ = nullptr;
111     sptr<AAFwk::IDataAbilityObserver> deviceDataObserver_ = nullptr;
112     sptr<AAFwk::IDataAbilityObserver> remoteFileDataObserver_ = nullptr;
113     sptr<AAFwk::IDataAbilityObserver> albumDataObserver_ = nullptr;
114     std::vector<std::shared_ptr<MediaOnNotifyObserver>> observers_;
115 private:
116     napi_env env_ = nullptr;
117 };
118 
119 class MediaObserver : public AAFwk::DataAbilityObserverStub {
120 public:
MediaObserver(const ChangeListenerNapi & listObj,MediaType mediaType)121     MediaObserver(const ChangeListenerNapi &listObj, MediaType mediaType) : listObj_(listObj)
122     {
123         mediaType_ = mediaType;
124     }
125 
126     ~MediaObserver() = default;
127 
OnChange()128     void OnChange() override
129     {
130         MediaChangeListener listener;
131         listener.mediaType = mediaType_;
132         listObj_.OnChange(listener, listObj_.cbOnRef_);
133     }
134 
135     ChangeListenerNapi listObj_;
136     MediaType mediaType_;
137 };
138 
139 class MediaOnNotifyObserver : public DataShare::DataShareObserver  {
140 public:
MediaOnNotifyObserver(const ChangeListenerNapi & listObj,std::string uri,napi_ref ref)141     MediaOnNotifyObserver(const ChangeListenerNapi &listObj, std::string uri, napi_ref ref) : listObj_(listObj)
142     {
143         uri_ = uri;
144         ref_ = ref;
145     }
146 
147     ~MediaOnNotifyObserver() = default;
148 
OnChange(const ChangeInfo & changeInfo)149     void OnChange(const ChangeInfo &changeInfo) override
150     {
151         MediaChangeListener listener;
152         listener.changeInfo = changeInfo;
153         listener.strUri = uri_;
154         listObj_.OnChange(listener, ref_);
155     }
156     ChangeListenerNapi listObj_;
157     std::string uri_;
158     napi_ref ref_;
159 };
160 class MediaLibraryNapi {
161 public:
162     static napi_value Init(napi_env env, napi_value exports);
163     static napi_value UserFileMgrInit(napi_env env, napi_value exports);
164     static napi_value PhotoAccessHelperInit(napi_env env, napi_value exports);
165 
166     MediaLibraryNapi();
167     ~MediaLibraryNapi();
168 
169     static std::mutex sUserFileClientMutex_;
170 
171 private:
172     static void MediaLibraryNapiDestructor(napi_env env, void *nativeObject, void *finalize_hint);
173     static napi_value MediaLibraryNapiConstructor(napi_env env, napi_callback_info info);
174 
175     static napi_value GetMediaLibraryNewInstance(napi_env env, napi_callback_info info);
176     static napi_value GetMediaLibraryNewInstanceAsync(napi_env env, napi_callback_info info);
177 
178     static napi_value JSGetPublicDirectory(napi_env env, napi_callback_info info);
179     static napi_value JSGetFileAssets(napi_env env, napi_callback_info info);
180     static napi_value JSGetAlbums(napi_env env, napi_callback_info info);
181 
182     static napi_value JSCreateAsset(napi_env env, napi_callback_info info);
183     static napi_value JSDeleteAsset(napi_env env, napi_callback_info info);
184 
185     static napi_value JSOnCallback(napi_env env, napi_callback_info info);
186     static napi_value JSOffCallback(napi_env env, napi_callback_info info);
187 
188     static napi_value JSRelease(napi_env env, napi_callback_info info);
189 
190     static napi_value JSGetActivePeers(napi_env env, napi_callback_info info);
191     static napi_value JSGetAllPeers(napi_env env, napi_callback_info info);
192     static napi_value CreateMediaTypeEnum(napi_env env);
193     static napi_value CreateFileKeyEnum(napi_env env);
194     static napi_value CreateDirectoryTypeEnum(napi_env env);
195     static napi_value CreateVirtualAlbumTypeEnum(napi_env env);
196     static napi_value CreatePrivateAlbumTypeEnum(napi_env env);
197     static napi_value CreatePhotoKeysEnum(napi_env env);
198 
199     static napi_value CreateMediaTypeUserFileEnum(napi_env env);
200 
201     static napi_value JSGetSmartAlbums(napi_env env, napi_callback_info info);
202     static napi_value JSGetPrivateAlbum(napi_env env, napi_callback_info info);
203     static napi_value JSCreateSmartAlbum(napi_env env, napi_callback_info info);
204     static napi_value JSDeleteSmartAlbum(napi_env env, napi_callback_info info);
205 
206     static napi_value JSStoreMediaAsset(napi_env env, napi_callback_info info);
207     static napi_value JSStartImagePreview(napi_env env, napi_callback_info info);
208     static napi_value JSGetMediaRemoteStub(napi_env env, napi_callback_info info);
209 
210     static napi_value GetUserFileMgr(napi_env env, napi_callback_info info);
211     static napi_value GetUserFileMgrAsync(napi_env env, napi_callback_info info);
212     static napi_value UserFileMgrCreatePhotoAsset(napi_env env, napi_callback_info info);
213     static napi_value UserFileMgrCreateAudioAsset(napi_env env, napi_callback_info info);
214     static napi_value UserFileMgrDeleteAsset(napi_env env, napi_callback_info info);
215     static napi_value UserFileMgrTrashAsset(napi_env env, napi_callback_info info);
216     static napi_value JSGetPhotoAlbums(napi_env env, napi_callback_info info);
217     static napi_value JSGetPhotoAssets(napi_env env, napi_callback_info info);
218     static napi_value JSGetAudioAssets(napi_env env, napi_callback_info info);
219     static napi_value UserFileMgrGetPrivateAlbum(napi_env env, napi_callback_info info);
220     static napi_value UserFileMgrCreateFileKeyEnum(napi_env env);
221     static napi_value UserFileMgrOnCallback(napi_env env, napi_callback_info info);
222     static napi_value UserFileMgrOffCallback(napi_env env, napi_callback_info info);
223     static napi_value CreateAudioKeyEnum(napi_env env);
224     static napi_value CreateImageVideoKeyEnum(napi_env env);
225     static napi_value CreateAlbumKeyEnum(napi_env env);
226     static napi_value CreatePositionTypeEnum(napi_env env);
227     static napi_value CreatePhotoSubTypeEnum(napi_env env);
228 
229     static napi_value GetPhotoAccessHelper(napi_env env, napi_callback_info info);
230     static napi_value GetPhotoAccessHelperAsync(napi_env env, napi_callback_info info);
231     static napi_value PhotoAccessHelperCreatePhotoAsset(napi_env env, napi_callback_info info);
232     static napi_value PhotoAccessHelperTrashAsset(napi_env env, napi_callback_info info);
233     static napi_value PhotoAccessHelperOnCallback(napi_env env, napi_callback_info info);
234     static napi_value PhotoAccessHelperOffCallback(napi_env env, napi_callback_info info);
235     static napi_value PhotoAccessGetPhotoAssets(napi_env env, napi_callback_info info);
236     static napi_value PhotoAccessCreatePhotoAlbum(napi_env env, napi_callback_info info);
237     static napi_value PhotoAccessDeletePhotoAlbums(napi_env env, napi_callback_info info);
238     static napi_value PhotoAccessGetPhotoAlbums(napi_env env, napi_callback_info info);
239 
240     static napi_value CreateAlbumTypeEnum(napi_env env);
241     static napi_value CreateAlbumSubTypeEnum(napi_env env);
242     static napi_value CreateNotifyTypeEnum(napi_env env);
243     static napi_value CreateDefaultChangeUriEnum(napi_env env);
244 
245     static napi_value CreatePhotoAlbum(napi_env env, napi_callback_info info);
246     static napi_value DeletePhotoAlbums(napi_env env, napi_callback_info info);
247     static napi_value GetPhotoAlbums(napi_env env, napi_callback_info info);
248     static napi_value JSGetPhotoIndex(napi_env env, napi_callback_info info);
249     static napi_value PhotoAccessGetPhotoIndex(napi_env env, napi_callback_info info);
250     int32_t GetListenerType(const std::string &str) const;
251     void RegisterChange(napi_env env, const std::string &type, ChangeListenerNapi &listObj);
252     void UnregisterChange(napi_env env, const std::string &type, ChangeListenerNapi &listObj);
253     void RegisterNotifyChange(napi_env env,
254         const std::string &uri, bool isDerived, napi_ref ref, ChangeListenerNapi &listObj);
255     void UnRegisterNotifyChange(napi_env env, const std::string &uri, napi_ref ref, ChangeListenerNapi &listObj);
256     static bool CheckRef(napi_env env,
257         napi_ref ref, ChangeListenerNapi &listObj, bool isOff, const std::string &uri);
258     napi_env env_;
259 
260     static thread_local napi_ref sConstructor_;
261     static thread_local napi_ref userFileMgrConstructor_;
262     static thread_local napi_ref photoAccessHelperConstructor_;
263     static thread_local napi_ref sMediaTypeEnumRef_;
264     static thread_local napi_ref sDirectoryEnumRef_;
265     static thread_local napi_ref sVirtualAlbumTypeEnumRef_;
266     static thread_local napi_ref sFileKeyEnumRef_;
267     static thread_local napi_ref sPrivateAlbumEnumRef_;
268 
269     static thread_local napi_ref sUserFileMgrFileKeyEnumRef_;
270     static thread_local napi_ref sAudioKeyEnumRef_;
271     static thread_local napi_ref sImageVideoKeyEnumRef_;
272     static thread_local napi_ref sPhotoKeysEnumRef_;
273     static thread_local napi_ref sAlbumKeyEnumRef_;
274     static thread_local napi_ref sAlbumType_;
275     static thread_local napi_ref sAlbumSubType_;
276     static thread_local napi_ref sPositionTypeEnumRef_;
277     static thread_local napi_ref sPhotoSubType_;
278     static thread_local napi_ref sNotifyType_;
279     static thread_local napi_ref sDefaultChangeUriRef_;
280 
281     static std::mutex sOnOffMutex_;
282 };
283 
284 const int32_t DEFAULT_PRIVATEALBUMTYPE = 3;
285 struct MediaLibraryAsyncContext : public NapiError {
286     napi_async_work work;
287     napi_deferred deferred;
288     napi_ref callbackRef;
289     bool status;
290     bool isDelete;
291     bool isCreateByComponent;
292     NapiAssetType assetType;
293     AlbumType albumType;
294     MediaLibraryNapi *objectInfo;
295     std::string selection;
296     std::vector<std::string> selectionArgs;
297     std::string order;
298     std::string uri;
299     std::string networkId;
300     std::string extendArgs;
301     std::unique_ptr<FetchResult<FileAsset>> fetchFileResult;
302     std::unique_ptr<FetchResult<AlbumAsset>> fetchAlbumResult;
303     std::unique_ptr<FetchResult<PhotoAlbum>> fetchPhotoAlbumResult;
304     std::unique_ptr<FetchResult<SmartAlbumAsset>> fetchSmartAlbumResult;
305     std::unique_ptr<FileAsset> fileAsset;
306     std::unique_ptr<PhotoAlbum> photoAlbumData;
307     std::unique_ptr<SmartAlbumAsset> smartAlbumData;
308     OHOS::DataShare::DataShareValuesBucket valuesBucket;
309     unsigned int dirType = 0;
310     int32_t privateAlbumType = DEFAULT_PRIVATEALBUMTYPE;
311     int32_t retVal;
312     std::string directoryRelativePath;
313     std::vector<std::unique_ptr<AlbumAsset>> albumNativeArray;
314     std::vector<std::unique_ptr<SmartAlbumAsset>> smartAlbumNativeArray;
315     std::vector<std::unique_ptr<SmartAlbumAsset>> privateSmartAlbumNativeArray;
316     Ability *ability_;
317     std::string storeMediaSrc;
318     int32_t imagePreviewIndex;
319     int32_t parentSmartAlbumId = 0;
320     int32_t smartAlbumId = -1;
321     size_t argc;
322     napi_value argv[NAPI_ARGC_MAX];
323     ResultNapiType resultNapiType;
324     std::string tableName;
325     std::vector<uint32_t> mediaTypes;
326     OHOS::DataShare::DataSharePredicates predicates;
327     std::vector<std::string> fetchColumn;
328     std::vector<std::string> uris;
329 };
330 
331 struct MediaLibraryInitContext : public NapiError  {
332     napi_async_work work;
333     napi_deferred deferred;
334     napi_ref callbackRef;
335     size_t argc;
336     napi_value argv[NAPI_ARGC_MAX];
337     napi_ref resultRef_;
338     sptr<IRemoteObject> token_;
339 };
340 } // namespace Media
341 } // namespace OHOS
342 
343 #endif  // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_LIBRARY_NAPI_H_
344