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_FILE_ASSET_NAPI_H_ 17 #define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_FILE_ASSET_NAPI_H_ 18 19 #include <mutex> 20 21 #include "file_asset.h" 22 #include "medialibrary_type_const.h" 23 #include "media_thumbnail_helper.h" 24 #include "napi/native_api.h" 25 #include "napi/native_node_api.h" 26 #include "napi_error.h" 27 #include "pixel_map_napi.h" 28 #include "values_bucket.h" 29 #include "napi_remote_object.h" 30 #include "datashare_predicates.h" 31 #include "datashare_abs_result_set.h" 32 #include "datashare_helper.h" 33 #include "foundation/ability/ability_runtime/interfaces/kits/native/appkit/ability_runtime/context/context.h" 34 35 namespace OHOS { 36 namespace Media { 37 static const std::string FILE_ASSET_NAPI_CLASS_NAME = "FileAsset"; 38 static const std::string USERFILEMGR_FILEASSET_NAPI_CLASS_NAME = "UserFileMgrFileAsset"; 39 static const std::string PHOTOACCESSHELPER_FILEASSET_NAPI_CLASS_NAME = "PhotoAccessHelperFileAsset"; 40 41 class FileAssetNapi { 42 public: 43 FileAssetNapi(); 44 ~FileAssetNapi(); 45 46 static napi_value Init(napi_env env, napi_value exports); 47 static napi_value UserFileMgrInit(napi_env env, napi_value exports); 48 static napi_value PhotoAccessHelperInit(napi_env env, napi_value exports); 49 static napi_value CreateFileAsset(napi_env env, std::unique_ptr<FileAsset> &iAsset); 50 51 std::string GetFileDisplayName() const; 52 std::string GetRelativePath() const; 53 std::string GetFilePath() const; 54 std::string GetTitle() const; 55 std::string GetFileUri() const; 56 int32_t GetFileId() const; 57 int32_t GetOrientation() const; 58 MediaType GetMediaType() const; 59 std::string GetNetworkId() const; 60 bool IsFavorite() const; 61 void SetFavorite(bool isFavorite); 62 bool IsTrash() const; 63 void SetTrash(bool isTrash); 64 bool IsHidden() const; 65 void SetHidden(bool isHidden); 66 std::string GetAllExif() const; 67 std::string GetUserComment() const; 68 69 private: 70 static void FileAssetNapiDestructor(napi_env env, void *nativeObject, void *finalize_hint); 71 static napi_value FileAssetNapiConstructor(napi_env env, napi_callback_info info); 72 73 static napi_value JSGetFileId(napi_env env, napi_callback_info info); 74 static napi_value JSGetFileUri(napi_env env, napi_callback_info info); 75 static napi_value JSGetFileDisplayName(napi_env env, napi_callback_info info); 76 static napi_value JSGetFilePath(napi_env env, napi_callback_info info); 77 static napi_value JSGetMimeType(napi_env env, napi_callback_info info); 78 static napi_value JSGetMediaType(napi_env env, napi_callback_info info); 79 static napi_value JSGetTitle(napi_env env, napi_callback_info info); 80 static napi_value JSGetArtist(napi_env env, napi_callback_info info); 81 static napi_value JSGetAlbum(napi_env env, napi_callback_info info); 82 static napi_value JSGetSize(napi_env env, napi_callback_info info); 83 static napi_value JSGetAlbumId(napi_env env, napi_callback_info info); 84 static napi_value JSGetAlbumName(napi_env env, napi_callback_info info); 85 static napi_value JSGetDateAdded(napi_env env, napi_callback_info info); 86 static napi_value JSGetDateModified(napi_env env, napi_callback_info info); 87 static napi_value JSGetOrientation(napi_env env, napi_callback_info info); 88 static napi_value JSGetWidth(napi_env env, napi_callback_info info); 89 static napi_value JSGetHeight(napi_env env, napi_callback_info info); 90 static napi_value JSGetDuration(napi_env env, napi_callback_info info); 91 static napi_value JSGetRelativePath(napi_env env, napi_callback_info info); 92 static napi_value JSGetDateTrashed(napi_env env, napi_callback_info info); 93 static napi_value JSSetFileDisplayName(napi_env env, napi_callback_info info); 94 static napi_value JSSetRelativePath(napi_env env, napi_callback_info info); 95 static napi_value JSSetTitle(napi_env env, napi_callback_info info); 96 static napi_value JSSetOrientation(napi_env env, napi_callback_info info); 97 98 static napi_value JSParent(napi_env env, napi_callback_info info); 99 static napi_value JSGetAlbumUri(napi_env env, napi_callback_info info); 100 static napi_value JSGetDateTaken(napi_env env, napi_callback_info info); 101 static napi_value JSIsDirectory(napi_env env, napi_callback_info info); 102 static napi_value JSCommitModify(napi_env env, napi_callback_info info); 103 static napi_value JSOpen(napi_env env, napi_callback_info info); 104 static napi_value JSClose(napi_env env, napi_callback_info info); 105 static napi_value JSGetThumbnail(napi_env env, napi_callback_info info); 106 static napi_value JSFavorite(napi_env env, napi_callback_info info); 107 static napi_value JSIsFavorite(napi_env env, napi_callback_info info); 108 static napi_value JSTrash(napi_env env, napi_callback_info info); 109 static napi_value JSIsTrash(napi_env env, napi_callback_info info); 110 static napi_value JSGetCount(napi_env env, napi_callback_info info); 111 void UpdateFileAssetInfo(); 112 static napi_value UserFileMgrSet(napi_env env, napi_callback_info info); 113 static napi_value UserFileMgrGet(napi_env env, napi_callback_info info); 114 static napi_value UserFileMgrOpen(napi_env env, napi_callback_info info); 115 static napi_value UserFileMgrClose(napi_env env, napi_callback_info info); 116 static napi_value UserFileMgrCommitModify(napi_env env, napi_callback_info info); 117 static napi_value UserFileMgrFavorite(napi_env env, napi_callback_info info); 118 static napi_value UserFileMgrGetThumbnail(napi_env env, napi_callback_info info); 119 static napi_value JSGetReadOnlyFd(napi_env env, napi_callback_info info); 120 static napi_value UserFileMgrSetHidden(napi_env env, napi_callback_info info); 121 static napi_value UserFileMgrSetPending(napi_env env, napi_callback_info info); 122 static napi_value JSGetExif(napi_env env, napi_callback_info info); 123 static napi_value UserFileMgrSetUserComment(napi_env env, napi_callback_info info); 124 125 static napi_value PhotoAccessHelperOpen(napi_env env, napi_callback_info info); 126 static napi_value PhotoAccessHelperClose(napi_env env, napi_callback_info info); 127 static napi_value PhotoAccessHelperCommitModify(napi_env env, napi_callback_info info); 128 static napi_value PhotoAccessHelperFavorite(napi_env env, napi_callback_info info); 129 static napi_value PhotoAccessHelperGetThumbnail(napi_env env, napi_callback_info info); 130 static napi_value PhotoAccessHelperSetHidden(napi_env env, napi_callback_info info); 131 static napi_value PhotoAccessHelperSetPending(napi_env env, napi_callback_info info); 132 static napi_value PhotoAccessHelperSetUserComment(napi_env env, napi_callback_info info); 133 134 bool HandleParamSet(const std::string &inputKey, const std::string &value, ResultNapiType resultNapiType); 135 napi_env env_; 136 137 static thread_local napi_ref sConstructor_; 138 static thread_local napi_ref userFileMgrConstructor_; 139 static thread_local napi_ref photoAccessHelperConstructor_; 140 static thread_local FileAsset *sFileAsset_; 141 std::shared_ptr<FileAsset> fileAssetPtr = nullptr; 142 std::unordered_map<std::string, std::variant<int32_t, int64_t, std::string>> member_; 143 }; 144 struct FileAssetAsyncContext : public NapiError { 145 napi_async_work work; 146 napi_deferred deferred; 147 napi_ref callbackRef; 148 bool status; 149 FileAssetNapi *objectInfo; 150 std::shared_ptr<FileAsset> objectPtr = nullptr; 151 OHOS::DataShare::DataShareValuesBucket valuesBucket; 152 int32_t thumbWidth; 153 int32_t thumbHeight; 154 bool isDirectory; 155 int32_t changedRows; 156 int32_t fd; 157 bool isFavorite = false; 158 bool isTrash = false; 159 bool isHidden = false; 160 bool isPending = false; 161 std::string networkId; 162 std::shared_ptr<PixelMap> pixelmap; 163 164 size_t argc; 165 napi_value argv[NAPI_ARGC_MAX]; 166 ResultNapiType resultNapiType; 167 std::string userComment; 168 }; 169 } // namespace Media 170 } // namespace OHOS 171 172 #endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_FILE_ASSET_NAPI_H_ 173