• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 public:
198     std::mutex sMediaAssetMutex_;
199     static inline SafeMap<std::string, ProgressHandler*> progressHandlerMap_;
200 };
201 } // Media
202 } // OHOS
203 #endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_ASSET_MANAGER_NAPI_H
204