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