1 /* 2 * Copyright (C) 2023 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_ASSET_MANAGER_NAPI_H 17 #define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_ASSET_MANAGER_NAPI_H 18 19 #include <mutex> 20 #include <vector> 21 #include <map> 22 23 #include "data_ability_helper.h" 24 #include "data_ability_observer_stub.h" 25 #include "data_ability_predicates.h" 26 #include "media_asset_data_handler.h" 27 #include "media_file_utils.h" 28 #include "media_library_napi.h" 29 #include "napi_base_context.h" 30 #include "napi_error.h" 31 #include "napi/native_api.h" 32 #include "napi/native_node_api.h" 33 34 namespace OHOS { 35 namespace Media { 36 using MediaAssetDataHandlerPtr = std::shared_ptr<NapiMediaAssetDataHandler>; 37 enum class MultiStagesCapturePhotoStatus { 38 QUERY_INNER_FAIL = 0, 39 HIGH_QUALITY_STATUS, 40 LOW_QUALITY_STATUS, 41 }; 42 43 enum ProgressReturnInfoType : int32_t { 44 INFO_TYPE_TRANSCODER_COMPLETED = 0, 45 INFO_TYPE_PROGRESS_UPDATE, 46 INFO_TYPE_ERROR, 47 }; 48 49 struct AssetHandler { 50 std::string photoId; 51 std::string requestId; 52 std::string requestUri; 53 MediaAssetDataHandlerPtr dataHandler; 54 napi_threadsafe_function threadSafeFunc; 55 MultiStagesCapturePhotoStatus photoQuality = MultiStagesCapturePhotoStatus::HIGH_QUALITY_STATUS; 56 bool needsExtraInfo = false; 57 bool isError = false; 58 AssetHandlerAssetHandler59 AssetHandler(const std::string &photoId, const std::string &requestId, const std::string &uri, 60 const MediaAssetDataHandlerPtr &handler, napi_threadsafe_function func) 61 : photoId(photoId), requestId(requestId), requestUri(uri), dataHandler(handler), threadSafeFunc(func) {} 62 }; 63 64 struct RetProgressValue { 65 int32_t progress; 66 int32_t type; 67 std::string errorMsg; RetProgressValueRetProgressValue68 RetProgressValue() : progress(0), type(0), errorMsg("") {} 69 }; 70 71 struct ProgressHandler { 72 napi_env env; 73 napi_threadsafe_function progressFunc; 74 std::string requestId; 75 RetProgressValue retProgressValue; 76 napi_ref progressRef; ProgressHandlerProgressHandler77 ProgressHandler(napi_env env, napi_threadsafe_function func, const std::string &requestId, 78 napi_ref progressRef) : env(env), progressFunc(func), 79 requestId(requestId), progressRef(progressRef) {} 80 }; 81 82 struct MediaAssetManagerAsyncContext : NapiError { 83 napi_async_work work; 84 napi_deferred deferred; 85 napi_ref callbackRef; 86 87 size_t argc = ARGS_FIVE; 88 napi_value argv[ARGS_FIVE] = {nullptr}; 89 int fileId = -1; // default value of request file id 90 int userId = -1; 91 std::string photoUri; 92 std::string photoId; 93 std::string displayName; 94 std::string photoPath; 95 std::string requestId; 96 napi_value requestIdNapiValue; 97 napi_value dataHandler; 98 napi_ref dataHandlerRef; 99 std::string destUri; 100 DeliveryMode deliveryMode; 101 SourceMode sourceMode; 102 ReturnDataType returnDataType; 103 bool hasReadPermission; 104 bool needsExtraInfo; 105 MultiStagesCapturePhotoStatus photoQuality = MultiStagesCapturePhotoStatus::HIGH_QUALITY_STATUS; 106 napi_ref dataHandlerRef2; 107 napi_threadsafe_function onDataPreparedPtr; 108 napi_threadsafe_function onDataPreparedPtr2; 109 napi_threadsafe_function onProgressPtr; 110 napi_ref progressHandlerRef; 111 PhotoSubType subType; 112 bool hasProcessPhoto; 113 AssetHandler *assetHandler = nullptr; 114 CompatibleMode compatibleMode; 115 napi_value mediaAssetProgressHandler; 116 ProgressHandler *progressHandler = nullptr; 117 }; 118 119 class MultiStagesTaskObserver : public DataShare::DataShareObserver { 120 public: MultiStagesTaskObserver(int fileId)121 MultiStagesTaskObserver(int fileId) 122 : fileId_(fileId) {}; 123 void OnChange(const ChangeInfo &changelnfo) override; 124 private: 125 int fileId_; 126 }; 127 128 struct WriteData { 129 std::string requestUri; 130 std::string destUri; 131 bool isSource; 132 napi_env env; 133 CompatibleMode compatibleMode; 134 }; 135 136 class MediaAssetManagerNapi { 137 public: 138 MediaAssetManagerNapi() = default; 139 ~MediaAssetManagerNapi() = default; 140 EXPORT static napi_value Init(napi_env env, napi_value exports); 141 static MultiStagesCapturePhotoStatus QueryPhotoStatus(int fileId, const string& photoUri, 142 std::string &photoId, bool hasReadPermission, int32_t userId); 143 static void NotifyMediaDataPrepared(AssetHandler *assetHandler); 144 static void NotifyOnProgress(int32_t type, int32_t progress, std::string requestId); 145 static void NotifyDataPreparedWithoutRegister(napi_env env, MediaAssetManagerAsyncContext *asyncContext); 146 static void OnDataPrepared(napi_env env, napi_value cb, void *context, void *data); 147 static void OnProgress(napi_env env, napi_value cb, void *context, void *data); 148 static void RegisterTaskObserver(napi_env env, MediaAssetManagerAsyncContext *asyncContext); 149 static void GetByteArrayNapiObject(const std::string &requestUri, napi_value &arrayBuffer, bool isSource, 150 napi_env env); 151 static void GetImageSourceNapiObject(const std::string &fileUri, napi_value &imageSourceNapiObj, bool isSource, 152 napi_env env); 153 static void GetPictureNapiObject(const std::string &fileUri, napi_value &imageSourceNapiObj, bool isSource, 154 napi_env env, bool& isPicture); 155 static void WriteDataToDestPath(WriteData &writeData, napi_value &resultNapiValue, std::string requestId); 156 void RegisterCallback(std::function<void(int, int)> cb); 157 158 private: 159 static napi_value Constructor(napi_env env, napi_callback_info info); 160 static void Destructor(napi_env env, void *nativeObject, void *finalizeHint); 161 static bool InitUserFileClient(napi_env env, napi_callback_info info, const int32_t userId = -1); 162 static napi_status ParseRequestMediaArgs(napi_env env, napi_callback_info info, 163 unique_ptr<MediaAssetManagerAsyncContext> &asyncContext); 164 static napi_status ParseEfficentRequestMediaArgs(napi_env env, napi_callback_info info, 165 unique_ptr<MediaAssetManagerAsyncContext> &asyncContext); 166 static napi_value JSRequestImage(napi_env env, napi_callback_info info); 167 static napi_value JSRequestEfficientIImage(napi_env env, napi_callback_info info); 168 static napi_value JSRequestImageData(napi_env env, napi_callback_info info); 169 static napi_value JSRequestMovingPhoto(napi_env env, napi_callback_info info); 170 static napi_value JSRequestVideoFile(napi_env env, napi_callback_info info); 171 static napi_value JSCancelRequest(napi_env env, napi_callback_info info); 172 static napi_value JSLoadMovingPhoto(napi_env env, napi_callback_info info); 173 static void ProcessImage(const int fileId, const int deliveryMode); 174 static void CancelProcessImage(const std::string &photoId); 175 static void AddImage(const int fileId, DeliveryMode deliveryMode); 176 static void OnHandleRequestImage(napi_env env, MediaAssetManagerAsyncContext *asyncContext); 177 static void OnHandleRequestVideo(napi_env env, MediaAssetManagerAsyncContext *asyncContext); 178 static void OnHandleProgress(napi_env env, MediaAssetManagerAsyncContext *asyncContext); 179 static void SendFile(napi_env env, int srcFd, int destFd, napi_value &result, off_t fileSize); 180 static int32_t GetFdFromSandBoxUri(const std::string &sandBoxUri); 181 182 static napi_status CreateDataHandlerRef(napi_env env, const unique_ptr<MediaAssetManagerAsyncContext> &context, 183 napi_ref &dataHandlerRef); 184 static napi_status CreateProgressHandlerRef(napi_env env, const unique_ptr<MediaAssetManagerAsyncContext> &context, 185 napi_ref &dataHandlerRef); 186 static napi_status CreateOnDataPreparedThreadSafeFunc(napi_env env, 187 const unique_ptr<MediaAssetManagerAsyncContext> &context, napi_threadsafe_function &threadSafeFunc); 188 static napi_status CreateOnProgressThreadSafeFunc(napi_env env, 189 unique_ptr<MediaAssetManagerAsyncContext> &context, napi_threadsafe_function &progressFunc); 190 static void JSRequestExecute(napi_env env, void *data); 191 static void JSRequestVideoFileExecute(napi_env env, void *data); 192 static void JSRequestComplete(napi_env env, napi_status, void *data); 193 static void JSCancelRequestExecute(napi_env env, void *data); 194 static void JSCancelRequestComplete(napi_env env, napi_status, void *data); 195 static bool CreateOnProgressHandlerInfo(napi_env env, unique_ptr<MediaAssetManagerAsyncContext> &asyncContext); 196 static void ReleaseSafeFunc(napi_threadsafe_function &progressFunc); 197 static bool CreateMovingPhotoHandlerInfo(napi_env env, unique_ptr<MediaAssetManagerAsyncContext> &asyncContext); 198 static napi_status CreateMovingPhotoThreadSafeFunc(napi_env env, 199 unique_ptr<MediaAssetManagerAsyncContext> &context, napi_threadsafe_function &progressFunc); 200 public: 201 std::mutex sMediaAssetMutex_; 202 static inline SafeMap<std::string, ProgressHandler*> progressHandlerMap_; 203 }; 204 } // Media 205 } // OHOS 206 #endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_ASSET_MANAGER_NAPI_H 207