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