• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_MEDIALIBRARY_NAPI_UTILS_H_
17 #define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_UTILS_H_
18 
19 #include <memory>
20 #include <vector>
21 
22 #include "datashare_predicates.h"
23 #include "datashare_result_set.h"
24 #include "location_column.h"
25 #include "media_column.h"
26 #include "medialibrary_db_const.h"
27 #include "medialibrary_napi_log.h"
28 #include "napi/native_api.h"
29 #include "napi/native_node_api.h"
30 #include "photo_album_column.h"
31 
32 #ifdef NAPI_ASSERT
33 #undef NAPI_ASSERT
34 #endif
35 
36 #define CHECK_ARGS_WITH_MESSAGE(env, cond, msg)                 \
37     do {                                                            \
38         if (!(cond)) {                                    \
39             NapiError::ThrowError(env, JS_ERR_PARAMETER_INVALID, __FUNCTION__, __LINE__, msg); \
40             return nullptr;                                          \
41         }                                                           \
42     } while (0)
43 
44 #define CHECK_COND_WITH_MESSAGE(env, cond, msg)                 \
45     do {                                                            \
46         if (!(cond)) {                                    \
47             NapiError::ThrowError(env, OHOS_INVALID_PARAM_CODE, __FUNCTION__, __LINE__, msg); \
48             return nullptr;                                          \
49         }                                                           \
50     } while (0)
51 
52 #define NAPI_ASSERT(env, cond, msg) CHECK_ARGS_WITH_MESSAGE(env, cond, msg)
53 
54 #define GET_JS_ARGS(env, info, argc, argv, thisVar)                         \
55     do {                                                                    \
56         void *data;                                                         \
57         napi_get_cb_info(env, info, &(argc), argv, &(thisVar), &(data));    \
58     } while (0)
59 
60 #define GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar)                           \
61     do {                                                                                \
62         void *data;                                                                     \
63         status = napi_get_cb_info(env, info, nullptr, nullptr, &(thisVar), &(data));    \
64     } while (0)
65 
66 #define GET_JS_ASYNC_CB_REF(env, arg, count, cbRef)                                             \
67     do {                                                                                        \
68         napi_valuetype valueType = napi_undefined;                                              \
69         if ((napi_typeof(env, arg, &valueType) == napi_ok) && (valueType == napi_function)) {   \
70             napi_create_reference(env, arg, count, &(cbRef));                                   \
71         } else {                                                                                \
72             NAPI_ERR_LOG("invalid arguments");                                           \
73             NAPI_ASSERT(env, false, "type mismatch");                                           \
74         }                                                                                       \
75     } while (0)
76 
77 #define ASSERT_NULLPTR_CHECK(env, result)       \
78     do {                                        \
79         if ((result) == nullptr) {              \
80             napi_get_undefined(env, &(result)); \
81             return result;                      \
82         }                                       \
83     } while (0)
84 
85 #define NAPI_CREATE_PROMISE(env, callbackRef, deferred, result)     \
86     do {                                                            \
87         if ((callbackRef) == nullptr) {                             \
88             napi_create_promise(env, &(deferred), &(result));       \
89         }                                                           \
90     } while (0)
91 
92 #define NAPI_CREATE_RESOURCE_NAME(env, resource, resourceName, context)         \
93     do {                                                                            \
94         napi_create_string_utf8(env, resourceName, NAPI_AUTO_LENGTH, &(resource));  \
95         (context)->SetApiName(resourceName);                                        \
96     } while (0)
97 
98 #define CHECK_NULL_PTR_RETURN_UNDEFINED(env, ptr, ret, message)     \
99     do {                                                            \
100         if ((ptr) == nullptr) {                                     \
101             NAPI_ERR_LOG(message);                           \
102             napi_get_undefined(env, &(ret));                        \
103             return ret;                                             \
104         }                                                           \
105     } while (0)
106 
107 #define CHECK_NULL_PTR_RETURN_VOID(ptr, message)   \
108     do {                                           \
109         if ((ptr) == nullptr) {                    \
110             NAPI_ERR_LOG(message);          \
111             return;                                \
112         }                                          \
113     } while (0)
114 #define CHECK_IF_EQUAL(condition, errMsg)   \
115     do {                                    \
116         if (!(condition)) {                 \
117             NAPI_ERR_LOG(errMsg);    \
118             return;                         \
119         }                                   \
120     } while (0)
121 
122 #define CHECK_COND_RET(cond, ret, message)                          \
123     do {                                                            \
124         if (!(cond)) {                                              \
125             NAPI_ERR_LOG(message);                                  \
126             return ret;                                             \
127         }                                                           \
128     } while (0)
129 
130 #define CHECK_STATUS_RET(cond, message)                             \
131     do {                                                            \
132         napi_status __ret = (cond);                                 \
133         if (__ret != napi_ok) {                                     \
134             NAPI_ERR_LOG(message);                                  \
135             return __ret;                                           \
136         }                                                           \
137     } while (0)
138 
139 #define CHECK_NULLPTR_RET(ret)                                      \
140     do {                                                            \
141         if ((ret) == nullptr) {                                     \
142             return nullptr;                                         \
143         }                                                           \
144     } while (0)
145 
146 #define CHECK_ARGS_BASE(env, cond, err, retVal)                     \
147     do {                                                            \
148         if ((cond) != napi_ok) {                                    \
149             NapiError::ThrowError(env, err, __FUNCTION__, __LINE__); \
150             return retVal;                                          \
151         }                                                           \
152     } while (0)
153 
154 #define CHECK_ARGS(env, cond, err) CHECK_ARGS_BASE(env, cond, err, nullptr)
155 
156 #define CHECK_ARGS_THROW_INVALID_PARAM(env, cond) CHECK_ARGS(env, cond, OHOS_INVALID_PARAM_CODE)
157 
158 #define CHECK_ARGS_RET_VOID(env, cond, err) CHECK_ARGS_BASE(env, cond, err, NAPI_RETVAL_NOTHING)
159 
160 #define CHECK_COND(env, cond, err)                                  \
161     do {                                                            \
162         if (!(cond)) {                                              \
163             NapiError::ThrowError(env, err, __FUNCTION__, __LINE__); \
164             return nullptr;                                         \
165         }                                                           \
166     } while (0)
167 
168 #define RETURN_NAPI_TRUE(env)                                                 \
169     do {                                                                      \
170         napi_value result = nullptr;                                          \
171         CHECK_ARGS(env, napi_get_boolean(env, true, &result), JS_INNER_FAIL); \
172         return result;                                                        \
173     } while (0)
174 
175 #define RETURN_NAPI_UNDEFINED(env)                                        \
176     do {                                                                  \
177         napi_value result = nullptr;                                      \
178         CHECK_ARGS(env, napi_get_undefined(env, &result), JS_INNER_FAIL); \
179         return result;                                                    \
180     } while (0)
181 
182 namespace OHOS {
183 namespace Media {
184 /* Constants for array index */
185 const int32_t PARAM0 = 0;
186 const int32_t PARAM1 = 1;
187 const int32_t PARAM2 = 2;
188 const int32_t PARAM3 = 3;
189 const int32_t PARAM4 = 4;
190 
191 /* Constants for array size */
192 const int32_t ARGS_ZERO = 0;
193 const int32_t ARGS_ONE = 1;
194 const int32_t ARGS_TWO = 2;
195 const int32_t ARGS_THREE = 3;
196 const int32_t ARGS_FOUR = 4;
197 const int32_t ARGS_FIVE = 5;
198 const int32_t ARG_BUF_SIZE = 384; // 256 for display name and 128 for relative path
199 constexpr uint32_t NAPI_INIT_REF_COUNT = 1;
200 
201 constexpr size_t NAPI_ARGC_MAX = 5;
202 
203 // Error codes
204 const int32_t ERR_DEFAULT = 0;
205 const int32_t ERR_MEM_ALLOCATION = 2;
206 const int32_t ERR_INVALID_OUTPUT = 3;
207 
208 const int32_t TRASH_SMART_ALBUM_ID = 1;
209 const std::string TRASH_SMART_ALBUM_NAME = "TrashAlbum";
210 const int32_t FAVORIT_SMART_ALBUM_ID = 2;
211 const std::string FAVORIT_SMART_ALBUM_NAME = "FavoritAlbum";
212 
213 const std::string API_VERSION = "api_version";
214 
215 const std::string PENDING_STATUS = "pending";
216 
217 enum NapiAssetType {
218     TYPE_DEFAULT = 0,
219     TYPE_AUDIO = 1,
220     TYPE_PHOTO = 2,
221     TYPE_ALBUM = 3,
222 };
223 
224 enum AlbumType {
225     TYPE_VIDEO_ALBUM = 0,
226     TYPE_IMAGE_ALBUM = 1,
227     TYPE_NONE = 2,
228 };
229 
230 enum FetchOptionType {
231     ASSET_FETCH_OPT = 0,
232     ALBUM_FETCH_OPT = 1
233 };
234 
235 enum HiddenPhotosDisplayMode {
236     ASSETS_MODE = 0,
237     ALBUMS_MODE = 1
238 };
239 
240 const std::vector<std::string> privateAlbumTypeNameEnum {
241     "TYPE_FAVORITE", "TYPE_TRASH", "TYPE_HIDE", "TYPE_SMART", "TYPE_SEARCH"
242 };
243 
244 const std::vector<std::string> deliveryModeEnum {
245     "FAST_MODE", "HIGH_QUALITY_MODE", "BALANCE_MODE"
246 };
247 
248 const std::vector<std::string> sourceModeEnum {
249     "ORIGINAL_MODE", "EDITED_MODE"
250 };
251 
252 const std::vector<std::string> HIDDEN_PHOTOS_DISPLAY_MODE_ENUM {
253     "ASSETS_MODE", "ALBUMS_MODE"
254 };
255 
256 const std::vector<std::string> mediaTypesEnum {
257     "FILE", "IMAGE", "VIDEO", "AUDIO", "MEDIA", "ALBUM_LIST", "ALBUM_LIST_INFO"
258 };
259 
260 const std::vector<std::string> mediaTypesUserFileEnum {
261     "IMAGE", "VIDEO", "AUDIO"
262 };
263 
264 const std::vector<std::string> fileKeyEnum {
265     "ID", "RELATIVE_PATH", "DISPLAY_NAME", "PARENT", "MIME_TYPE", "MEDIA_TYPE", "SIZE",
266     "DATE_ADDED", "DATE_MODIFIED", "DATE_TAKEN", "TITLE", "ARTIST", "AUDIOALBUM", "DURATION",
267     "WIDTH", "HEIGHT", "ORIENTATION", "ALBUM_ID", "ALBUM_NAME"
268 };
269 
270 const std::vector<std::string> directoryEnum {
271     "DIR_CAMERA", "DIR_VIDEO", "DIR_IMAGE", "DIR_AUDIO", "DIR_DOCUMENTS", "DIR_DOWNLOAD"
272 };
273 
274 const std::vector<std::string> virtualAlbumTypeEnum {
275     "TYPE_FAVORITE", "TYPE_TRASH"
276 };
277 
278 const std::vector<std::string> directoryEnumValues {
279     "Camera/",
280     "Videos/",
281     "Pictures/",
282     "Audios/",
283     "Documents/",
284     "Download/"
285 };
286 
287 const std::vector<std::string> systemAlbumSubType {
288     "FAVORITE", "VIDEO", "HIDDEN", "TRASH", "SCREENSHOT", "CAMERA", "IMAGE"
289 };
290 
291 const std::vector<std::string> analysisAlbumSubType {
292     "CLASSIFY", "GEOGRAPHY_LOCATION", "GEOGRAPHY_CITY", "SHOOTING_MODE", "PORTRAIT"
293 };
294 
295 const std::vector<std::string> positionTypeEnum {
296     "LOCAL", "CLOUD", "BOTH"
297 };
298 
299 const std::vector<std::string> photoSubTypeEnum {
300     "DEFAULT", "SCREENSHOT", "CAMERA"
301 };
302 
303 const std::vector<std::string> notifyTypeEnum {
304     "NOTIFY_ADD", "NOTIFY_UPDATE", "NOTIFY_REMOVE", "NOTIFY_ALBUM_ADD_ASSET", "NOTIFY_ALBUM_REMOVE_ASSET"
305 };
306 
307 const std::vector<std::string> requestPhotoTypeEnum {
308     "REQUEST_ALL_THUMBNAILS", "REQUEST_FAST_THUMBNAIL", "REQUEST_QUALITY_THUMBNAIL"
309 };
310 
311 const std::vector<std::string> resourceTypeEnum {
312     "IMAGE_RESOURCE", "VIDEO_RESOURCE", "PHOTO_PROXY"
313 };
314 
315 const std::vector<std::string> fileKeyEnumValues {
316     MEDIA_DATA_DB_ID,
317     MEDIA_DATA_DB_RELATIVE_PATH,
318     MEDIA_DATA_DB_NAME,
319     MEDIA_DATA_DB_PARENT_ID,
320     MEDIA_DATA_DB_MIME_TYPE,
321     MEDIA_DATA_DB_MEDIA_TYPE,
322     MEDIA_DATA_DB_SIZE,
323     MEDIA_DATA_DB_DATE_ADDED,
324     MEDIA_DATA_DB_DATE_MODIFIED,
325     MEDIA_DATA_DB_DATE_TAKEN,
326     MEDIA_DATA_DB_TITLE,
327     MEDIA_DATA_DB_ARTIST,
328     MEDIA_DATA_DB_AUDIO_ALBUM,
329     MEDIA_DATA_DB_DURATION,
330     MEDIA_DATA_DB_WIDTH,
331     MEDIA_DATA_DB_HEIGHT,
332     MEDIA_DATA_DB_ORIENTATION,
333     MEDIA_DATA_DB_BUCKET_ID,
334     MEDIA_DATA_DB_BUCKET_NAME
335 };
336 
337 const std::vector<std::pair<std::string, std::string>> FILE_KEY_ENUM_PROPERTIES = {
338     std::make_pair("ID",                        MEDIA_DATA_DB_ID),
339     std::make_pair("RELATIVE_PATH",             MEDIA_DATA_DB_RELATIVE_PATH),
340     std::make_pair("DISPLAY_NAME",              MEDIA_DATA_DB_NAME),
341     std::make_pair("PARENT",                    MEDIA_DATA_DB_PARENT_ID),
342     std::make_pair("MIME_TYPE",                 MEDIA_DATA_DB_MIME_TYPE),
343     std::make_pair("MEDIA_TYPE",                MEDIA_DATA_DB_MEDIA_TYPE),
344     std::make_pair("SIZE",                      MEDIA_DATA_DB_SIZE),
345     std::make_pair("DATE_ADDED",                MEDIA_DATA_DB_DATE_ADDED),
346     std::make_pair("DATE_MODIFIED",             MEDIA_DATA_DB_DATE_MODIFIED),
347     std::make_pair("DATE_TAKEN",                MEDIA_DATA_DB_DATE_TAKEN),
348     std::make_pair("TITLE",                     MEDIA_DATA_DB_TITLE),
349     std::make_pair("ARTIST",                    MEDIA_DATA_DB_ARTIST),
350     std::make_pair("AUDIOALBUM",                MEDIA_DATA_DB_AUDIO_ALBUM),
351     std::make_pair("DURATION",                  MEDIA_DATA_DB_DURATION),
352     std::make_pair("WIDTH",                     MEDIA_DATA_DB_WIDTH),
353     std::make_pair("HEIGHT",                    MEDIA_DATA_DB_HEIGHT),
354     std::make_pair("ORIENTATION",               MEDIA_DATA_DB_ORIENTATION),
355     std::make_pair("ALBUM_ID",                  MEDIA_DATA_DB_BUCKET_ID),
356     std::make_pair("ALBUM_NAME",                MEDIA_DATA_DB_BUCKET_NAME)
357 };
358 
359 const std::vector<std::pair<std::string, std::string>> USERFILEMGR_FILEKEY_ENUM_PROPERTIES = {
360     std::make_pair("URI",                       MEDIA_DATA_DB_URI),
361     std::make_pair("RELATIVE_PATH",             MEDIA_DATA_DB_RELATIVE_PATH),
362     std::make_pair("DISPLAY_NAME",              MEDIA_DATA_DB_NAME),
363     std::make_pair("DATE_ADDED",                MEDIA_DATA_DB_DATE_ADDED),
364     std::make_pair("DATE_MODIFIED",             MEDIA_DATA_DB_DATE_MODIFIED),
365     std::make_pair("TITLE",                     MEDIA_DATA_DB_TITLE)
366 };
367 
368 const std::vector<std::pair<std::string, std::string>> AUDIOKEY_ENUM_PROPERTIES = {
369     std::make_pair("URI",                       MEDIA_DATA_DB_URI),
370     std::make_pair("DISPLAY_NAME",              MEDIA_DATA_DB_NAME),
371     std::make_pair("DATE_ADDED",                MEDIA_DATA_DB_DATE_ADDED),
372     std::make_pair("DATE_MODIFIED",             MEDIA_DATA_DB_DATE_MODIFIED),
373     std::make_pair("TITLE",                     MEDIA_DATA_DB_TITLE),
374     std::make_pair("ARTIST",                    MEDIA_DATA_DB_ARTIST),
375     std::make_pair("AUDIOALBUM",                MEDIA_DATA_DB_AUDIO_ALBUM),
376     std::make_pair("DURATION",                  MEDIA_DATA_DB_DURATION),
377     std::make_pair("FAVORITE",                  MEDIA_DATA_DB_IS_FAV),
378     std::make_pair("SIZE",                      MediaColumn::MEDIA_SIZE),
379     std::make_pair("PACKAGE_NAME",              MediaColumn::MEDIA_PACKAGE_NAME)
380 };
381 
382 const std::vector<std::pair<std::string, std::string>> IMAGEVIDEOKEY_ENUM_PROPERTIES = {
383     std::make_pair("URI",                       MEDIA_DATA_DB_URI),
384     std::make_pair("DISPLAY_NAME",              MediaColumn::MEDIA_NAME),
385     std::make_pair("DATE_ADDED",                MediaColumn::MEDIA_DATE_ADDED),
386     std::make_pair("FILE_TYPE",                 MediaColumn::MEDIA_TYPE),
387     std::make_pair("PHOTO_TYPE",                MediaColumn::MEDIA_TYPE),
388     std::make_pair("DATE_MODIFIED",             MediaColumn::MEDIA_DATE_MODIFIED),
389     std::make_pair("TITLE",                     MediaColumn::MEDIA_TITLE),
390     std::make_pair("DURATION",                  MediaColumn::MEDIA_DURATION),
391     std::make_pair("WIDTH",                     PhotoColumn::PHOTO_WIDTH),
392     std::make_pair("HEIGHT",                    PhotoColumn::PHOTO_HEIGHT),
393     std::make_pair("DATE_TAKEN",                MediaColumn::MEDIA_DATE_TAKEN),
394     std::make_pair("ORIENTATION",               PhotoColumn::PHOTO_ORIENTATION),
395     std::make_pair("FAVORITE",                  MediaColumn::MEDIA_IS_FAV),
396     std::make_pair("MEDIA_TYPE",                MediaColumn::MEDIA_TYPE),
397     std::make_pair("DATE_TRASHED",              MediaColumn::MEDIA_DATE_TRASHED),
398     std::make_pair("POSITION",                  PhotoColumn::PHOTO_POSITION),
399     std::make_pair("HIDDEN",                    MediaColumn::MEDIA_HIDDEN),
400     std::make_pair("SIZE",                      MediaColumn::MEDIA_SIZE),
401     std::make_pair("PACKAGE_NAME",              MediaColumn::MEDIA_PACKAGE_NAME),
402     std::make_pair("CAMERA_SHOT_KEY",           PhotoColumn::CAMERA_SHOT_KEY),
403     std::make_pair("USER_COMMENT",              PhotoColumn::PHOTO_USER_COMMENT),
404     std::make_pair("DATE_YEAR",                 PhotoColumn::PHOTO_DATE_YEAR),
405     std::make_pair("DATE_MONTH",                PhotoColumn::PHOTO_DATE_MONTH),
406     std::make_pair("DATE_DAY",                  PhotoColumn::PHOTO_DATE_DAY),
407     std::make_pair("PENDING",                   PENDING_STATUS),
408 };
409 
410 const std::vector<std::pair<std::string, std::string>> ALBUMKEY_ENUM_PROPERTIES = {
411     std::make_pair("URI",                       MEDIA_DATA_DB_URI),
412     std::make_pair("ALBUM_NAME",                PhotoAlbumColumns::ALBUM_NAME),
413     std::make_pair("FILE_TYPE",                 MEDIA_DATA_DB_MEDIA_TYPE),
414     std::make_pair("DATE_ADDED",                MEDIA_DATA_DB_DATE_ADDED),
415     std::make_pair("DATE_MODIFIED",             MEDIA_DATA_DB_DATE_MODIFIED)
416 };
417 
418 const std::vector<std::pair<std::string, std::string>> DEFAULT_URI_ENUM_PROPERTIES = {
419     std::make_pair("DEFAULT_PHOTO_URI",         PhotoColumn::DEFAULT_PHOTO_URI),
420     std::make_pair("DEFAULT_ALBUM_URI",         PhotoAlbumColumns::DEFAULT_PHOTO_ALBUM_URI),
421     std::make_pair("DEFAULT_AUDIO_URI",         AudioColumn::DEFAULT_AUDIO_URI),
422     std::make_pair("DEFAULT_HIDDEN_ALBUM_URI",  PhotoAlbumColumns::DEFAULT_HIDDEN_ALBUM_URI),
423 };
424 
425 const std::map<std::string, std::pair<std::string, int32_t>> LOCATION_PARAM_MAP = {
426     { START_LATITUDE, { LATITUDE, DataShare::GREATER_THAN_OR_EQUAL_TO } },
427     { END_LATITUDE, { LATITUDE, DataShare::LESS_THAN } },
428     { START_LONGITUDE, { LONGITUDE, DataShare::GREATER_THAN_OR_EQUAL_TO } },
429     { END_LONGITUDE, { LONGITUDE, DataShare::LESS_THAN } },
430     { DIAMETER, { DIAMETER, DataShare::EQUAL_TO } },
431     { LANGUAGE, { LANGUAGE, DataShare::EQUAL_TO } },
432 };
433 
434 struct JSAsyncContextOutput {
435     napi_value error;
436     napi_value data;
437     bool status;
438 };
439 
440 struct NapiClassInfo {
441     std::string name;
442     napi_ref *ref;
443     napi_value (*constructor)(napi_env, napi_callback_info);
444     std::vector<napi_property_descriptor> props;
445 };
446 
447 /* Util class used by napi asynchronous methods for making call to js callback function */
448 class MediaLibraryNapiUtils {
449 public:
450     static napi_value NapiDefineClass(napi_env env, napi_value exports, const NapiClassInfo &info);
451     static napi_value NapiAddStaticProps(napi_env env, napi_value exports,
452         const std::vector<napi_property_descriptor> &staticProps);
453 
454     static napi_status GetUInt32(napi_env env, napi_value arg, uint32_t &value);
455     static napi_status GetInt32(napi_env env, napi_value arg, int32_t &value);
456     static napi_status GetDouble(napi_env env, napi_value arg, double &value);
457     static napi_status GetParamBool(napi_env env, napi_value arg, bool &result);
458     static napi_status GetUInt32Array(napi_env env, napi_value arg, std::vector<uint32_t> &param);
459     static napi_status GetParamFunction(napi_env env, napi_value arg, napi_ref &callbackRef);
460     static napi_status GetParamStringWithLength(napi_env env, napi_value arg, int32_t maxLen,
461         std::string &str);
462     static napi_status GetParamStringPathMax(napi_env env, napi_value arg, std::string &str);
463     static napi_status GetProperty(napi_env env, const napi_value arg, const std::string &propName,
464         std::string &propValue);
465     static napi_status GetArrayProperty(napi_env env, napi_value arg, const std::string &propName,
466         std::vector<std::string> &array);
467     static napi_status GetStringArray(napi_env env, napi_value arg, std::vector<std::string> &array);
468     static void UriAddTableName(std::string &uri, const std::string tableName);
469     static std::string GetFileIdFromUri(const std::string &uri);
470     static MediaType GetMediaTypeFromUri(const std::string &uri);
471     template <class AsyncContext>
472     static napi_status GetPredicate(napi_env env, const napi_value arg, const std::string &propName,
473         AsyncContext &context, const FetchOptionType &fetchOptType);
474     template <class AsyncContext>
475     static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context);
476     template <class AsyncContext>
477     static bool HandleSpecialPredicate(AsyncContext &context,
478         std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType);
479     template <class AsyncContext>
480     static void UpdateMediaTypeSelections(AsyncContext *context);
481 
482     template <class AsyncContext>
483     static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext,
484         const size_t minArgs, const size_t maxArgs);
485 
486     template <class AsyncContext>
487     static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext,
488         const size_t minArgs, const size_t maxArgs);
489 
490     template <class AsyncContext>
491     static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType,
492         AsyncContext &context);
493 
494     template <class AsyncContext>
495     static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType,
496         AsyncContext &context);
497 
498     template <class AsyncContext>
499     static napi_status GetParamCallback(napi_env env, AsyncContext &context);
500 
501     template <class AsyncContext>
502     static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info,
503         AsyncContext &context);
504 
505     template <class AsyncContext>
506     static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool &param);
507 
508     template <class AsyncContext>
509     static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context,
510         std::string &param);
511     template <class AsyncContext>
512     static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info,
513     AsyncContext &context, std::vector<std::string> &array);
514 
515     template <class AsyncContext>
516     static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context,
517         int32_t &value);
518 
519     template <class AsyncContext>
520     static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context);
521 
522     static AssetType GetAssetType(MediaType type);
523 
524     static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition);
525 
526     template <class AsyncContext>
527     static bool GetLocationPredicate(AsyncContext &context,
528         std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate);
529 
530     static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet);
531 
532     static int TransErrorCode(const std::string &Name, int error);
533 
534     static void HandleError(napi_env env, int error, napi_value &errorObj, const std::string &Name);
535 
536     static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode,
537         const std::string errMsg);
538 
539     static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work,
540         const JSAsyncContextOutput &asyncContext);
541 
542     template <class AsyncContext>
543     static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext,
544         const std::string &resourceName,  void (*execute)(napi_env, void *),
545         void (*complete)(napi_env, napi_status, void *));
546 
547     static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value);
548 
549     static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName);
550 
551     static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName);
552 
553     static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg);
554 
555     static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize);
556 
557     static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[],
558         bool &isCallback);
559 
560     static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value);
561 
562     static napi_value GetDoubleArg(napi_env env, napi_value arg, double &value);
563 
564     static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value);
565 
566     static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn,
567         std::function<bool(const std::string &columnName)> isValidColumn,
568         const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC);
569 
570     static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType,
571         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
572     static int32_t GetUserAlbumPredicates(const int32_t albumId,
573         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
574     static int32_t GetAnalysisAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
575     static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
576     static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates);
577     static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates,
578         const bool hiddenOnly);
579     static bool IsSystemApp();
580     static std::string GetStringFetchProperty(napi_env env, napi_value arg, bool &err, bool &present,
581         const std::string &propertyName);
582     static std::string ParseResultSet2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet,
583         const std::vector<std::string> &cloumns);
584     static std::string GetStringValueByColumn(std::shared_ptr<DataShare::DataShareResultSet> resultSet,
585         const std::string columnName);
586 
587     static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values);
588     static napi_value GetUriArrayFromAssets(
589         napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values);
590     static napi_value GetStringArray(
591         napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values);
592     static void FixSpecialDateType(std::string &selections);
593     static std::string TransferUri(const std::string &oldUri);
594 
595 private:
596     static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt);
597 };
598 
599 class NapiScopeHandler {
600 public:
601     NapiScopeHandler(napi_env env);
602     ~NapiScopeHandler();
603     bool IsValid();
604 
605 private:
606     napi_env env_;
607     napi_handle_scope scope_;
608     bool isValid_ = false;
609 };
610 } // namespace Media
611 } // namespace OHOS
612 
613 #endif  // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_UTILS_H_
614