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