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