• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2024 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_MEDIALIBRARY_NAPI_SENDABLE_UTILS_H_
17 #define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_SENDABLE_UTILS_H_
18 
19 #include <memory>
20 #include <vector>
21 
22 #include "datashare_predicates.h"
23 #include "datashare_result_set.h"
24 #include "file_asset.h"
25 #include "location_column.h"
26 #include "media_column.h"
27 #include "medialibrary_napi_utils.h"
28 #include "medialibrary_db_const.h"
29 #include "medialibrary_napi_log.h"
30 #include "napi/native_api.h"
31 #include "napi/native_node_api.h"
32 #include "photo_album_column.h"
33 #include "rdb_store.h"
34 
35 namespace OHOS {
36 namespace Media {
37 struct SendableJSAsyncContextOutput {
38     napi_value error;
39     napi_value data;
40     bool status;
41 };
42 
43 /* Util class used by napi asynchronous methods for making call to js callback function */
44 class SendableMediaLibraryNapiUtils {
45 public:
GetTypeMap()46     static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> &GetTypeMap()
47     {
48         static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TYPE_MAP = {
49             {MEDIA_DATA_DB_ID, {TYPE_INT32, "fileId"}},
50             {MEDIA_DATA_DB_FILE_PATH, {TYPE_STRING, "data"}},
51             {MEDIA_DATA_DB_MEDIA_TYPE, {TYPE_INT32, "mediaType"}},
52             {MEDIA_DATA_DB_NAME, {TYPE_STRING, "displayName"}},
53             {MEDIA_DATA_DB_SIZE, {TYPE_INT64, "size"}},
54             {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAddedMs"}},
55             {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModifiedMs"}},
56             {MEDIA_DATA_DB_DURATION, {TYPE_INT64, "duration"}},
57             {MEDIA_DATA_DB_WIDTH, {TYPE_INT32, "width"}},
58             {MEDIA_DATA_DB_HEIGHT, {TYPE_INT32, "height"}},
59             {MEDIA_DATA_DB_DATE_TAKEN, {TYPE_INT64, "dateTaken"}},
60             {MEDIA_DATA_DB_ORIENTATION, {TYPE_INT32, "orientation"}},
61             {MEDIA_DATA_DB_IS_FAV, {TYPE_INT32, "isFavorite"}},
62             {MEDIA_DATA_DB_TITLE, {TYPE_STRING, "title"}},
63             {MEDIA_DATA_DB_POSITION, {TYPE_INT32, "position"}},
64             {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashedMs"}},
65             {MediaColumn::MEDIA_HIDDEN, {TYPE_INT32, "hidden"}},
66             {PhotoColumn::PHOTO_USER_COMMENT, {TYPE_STRING, "userComment"}},
67             {PhotoColumn::CAMERA_SHOT_KEY, {TYPE_STRING, "cameraShotKey"}},
68             {PhotoColumn::PHOTO_DATE_YEAR, {TYPE_STRING, "dateYear"}},
69             {PhotoColumn::PHOTO_DATE_MONTH, {TYPE_STRING, "dateMonth"}},
70             {PhotoColumn::PHOTO_DATE_DAY, {TYPE_STRING, "dateDay"}},
71             {MEDIA_DATA_DB_TIME_PENDING, {TYPE_INT64, "pending"}},
72             {PhotoColumn::PHOTO_SUBTYPE, {TYPE_INT32, "subtype"}},
73             {PhotoColumn::MOVING_PHOTO_EFFECT_MODE, {TYPE_INT32, "movingPhotoEffectMode"}},
74             {PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, {TYPE_INT32, "dynamicRangeType"}},
75             {PhotoColumn::PHOTO_THUMBNAIL_READY, {TYPE_INT64, "thumbnailModifiedMs"}},
76             {PhotoColumn::PHOTO_LCD_SIZE, {TYPE_STRING, "lcdSize"}},
77             {PhotoColumn::PHOTO_THUMB_SIZE, {TYPE_STRING, "thmSize"}},
78             {PhotoColumn::PHOTO_OWNER_ALBUM_ID, {TYPE_INT32, "ownerAlbumId"}},
79             {MEDIA_DATA_DB_COUNT, {TYPE_INT32, "count"}},
80             {PhotoAlbumColumns::ALBUM_ID, {TYPE_INT32, "albumId"}},
81             {PhotoAlbumColumns::ALBUM_TYPE, {TYPE_INT32, "albumType"}},
82             {PhotoAlbumColumns::ALBUM_SUBTYPE, {TYPE_INT32, "albumSubType"}},
83             {PhotoAlbumColumns::ALBUM_NAME, {TYPE_STRING, "albumName"}},
84             {PhotoAlbumColumns::ALBUM_COVER_URI, {TYPE_STRING, "coverUri"}},
85             {PhotoAlbumColumns::ALBUM_COUNT, {TYPE_INT32, "count"}},
86             {PhotoAlbumColumns::ALBUM_IMAGE_COUNT, {TYPE_INT32, "imageCount"}},
87             {PhotoAlbumColumns::ALBUM_VIDEO_COUNT, {TYPE_INT32, "videoCount"}},
88         };
89         return TYPE_MAP;
90     }
91 
GetTimeTypeMap()92     static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>>& GetTimeTypeMap()
93     {
94         static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TIME_TYPE_MAP = {
95             {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAdded"}},
96             {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModified"}},
97             {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashed"}},
98         };
99         return TIME_TYPE_MAP;
100     }
101 
102     static napi_status GetUInt32(napi_env env, napi_value arg, uint32_t &value);
103     static napi_status GetInt32(napi_env env, napi_value arg, int32_t &value);
104     static napi_status GetParamBool(napi_env env, napi_value arg, bool &result);
105     static napi_status GetParamFunction(napi_env env, napi_value arg, napi_ref &callbackRef);
106     static napi_status GetParamStringWithLength(napi_env env, napi_value arg, int32_t maxLen,
107         std::string &str);
108     static napi_status GetParamStringPathMax(napi_env env, napi_value arg, std::string &str);
109     static napi_status GetProperty(napi_env env, const napi_value arg, const std::string &propName,
110         std::string &propValue);
111     static napi_status GetArrayProperty(napi_env env, napi_value arg, const std::string &propName,
112         std::vector<std::string> &array);
113     static napi_status GetStringArray(napi_env env, napi_value arg, std::vector<std::string> &array);
114     static MediaType GetMediaTypeFromUri(const std::string &uri);
115     template <class AsyncContext>
116     static napi_status GetPredicate(napi_env env, const napi_value arg, const std::string &propName,
117         AsyncContext &context, const FetchOptionType &fetchOptType,
118         std::vector<DataShare::OperationItem> operations = {});
119     template <class AsyncContext>
120     static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context);
121     template <class AsyncContext>
122     static bool HandleSpecialPredicate(AsyncContext &context,
123         std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType,
124         std::vector<DataShare::OperationItem> operations = {});
125     template <class AsyncContext>
126     static void UpdateMediaTypeSelections(AsyncContext *context);
127 
128     template <class AsyncContext>
129     static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext,
130         const size_t minArgs, const size_t maxArgs);
131 
132     template <class AsyncContext>
133     static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext,
134         const size_t minArgs, const size_t maxArgs);
135 
136     template <class AsyncContext>
137     static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType,
138         AsyncContext &context, std::vector<DataShare::OperationItem> operations = {});
139 
140     template <class AsyncContext>
141     static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType,
142         AsyncContext &context);
143 
144     template <class AsyncContext>
145     static napi_status GetParamCallback(napi_env env, AsyncContext &context);
146 
147     template <class AsyncContext>
148     static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info,
149         AsyncContext &context);
150 
151     template <class AsyncContext>
152     static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool &param);
153 
154     template <class AsyncContext>
155     static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context,
156         std::string &param);
157     template <class AsyncContext>
158     static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info,
159     AsyncContext &context, std::vector<std::string> &array);
160 
161     template <class AsyncContext>
162     static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context,
163         int32_t &value);
164 
165     template <class AsyncContext>
166     static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context);
167 
168     static AssetType GetAssetType(MediaType type);
169 
170     static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition);
171 
172     template <class AsyncContext>
173     static bool GetLocationPredicate(AsyncContext &context,
174         std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate);
175 
176     static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet);
177 
178     static int TransErrorCode(const std::string &Name, int error);
179 
180     static void HandleError(napi_env env, int error, napi_value &errorObj, const std::string &Name);
181 
182     static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode,
183         const std::string errMsg);
184 
185     static void InvokeJSAsyncMethodWithoutWork(napi_env env, napi_deferred deferred, napi_ref callbackRef,
186         const SendableJSAsyncContextOutput &asyncContext);
187 
188     static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work,
189         const SendableJSAsyncContextOutput &asyncContext);
190 
191     template <class AsyncContext>
192     static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext,
193         const std::string &resourceName,  void (*execute)(napi_env, void *),
194         void (*complete)(napi_env, napi_status, void *));
195 
196     static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value);
197 
198     static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName);
199 
200     static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName);
201 
202     static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg);
203 
204     static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize);
205 
206     static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[],
207         bool &isCallback);
208 
209     static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value);
210 
211     static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value);
212 
213     static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn,
214         std::function<bool(const std::string &columnName)> isValidColumn, NapiAssetType assetType,
215         const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC);
216     static napi_value AddAssetColumns(napi_env env, std::vector<std::string> &fetchColumn,
217         std::function<bool(const std::string &columnName)> isValidColumn, std::set<std::string>& validFetchColumns,
218         const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC);
219 
220     static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType,
221         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
222     static int32_t GetUserAlbumPredicates(const int32_t albumId,
223         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
224     static int32_t GetAnalysisPhotoMapPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
225     static int32_t GetFeaturedSinglePortraitAlbumPredicates(
226         const int32_t albumId, DataShare::DataSharePredicates &predicates);
227     static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
228     static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates);
229     static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates,
230         const bool hiddenOnly);
231     static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates);
232     static bool IsSystemApp();
233 
234     static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values);
235     static napi_value GetStringArray(
236         napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values);
237     static napi_value GetNextRowObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet);
238     static napi_value CreateValueByIndex(napi_env env, int32_t index, std::string name,
239         std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset);
240     static void handleTimeInfo(napi_env env, const std::string& name, napi_value result,
241         int32_t index, const std::shared_ptr<NativeRdb::ResultSet>& resultSet);
242 
243     template <class AsyncContext>
244     static napi_status ParsePredicates(napi_env env,
245         const napi_value arg, AsyncContext &context, const FetchOptionType &fetchOptType);
246 
247 private:
248     static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt);
249 };
250 
251 class SendableNapiScopeHandler {
252 public:
253     SendableNapiScopeHandler(napi_env env);
254     ~SendableNapiScopeHandler();
255     bool IsValid();
256 
257 private:
258     napi_env env_;
259     napi_handle_scope scope_;
260     bool isValid_ = false;
261 };
262 } // namespace Media
263 } // namespace OHOS
264 
265 #endif  // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_SENDABLE_UTILS_H_
266