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_UTILS_H_
17 #define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_UTILS_H_
18 
19 #include <memory>
20 #include <set>
21 #include <vector>
22 
23 #include "datashare_predicates.h"
24 #include "datashare_result_set.h"
25 #include "file_asset.h"
26 #include "location_column.h"
27 #include "media_column.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 #ifdef NAPI_ASSERT
36 #undef NAPI_ASSERT
37 #endif
38 
39 #define CHECK_ARGS_WITH_MESSAGE(env, cond, msg)                 \
40     do {                                                            \
41         if (!(cond)) {                                    \
42             NapiError::ThrowError(env, JS_ERR_PARAMETER_INVALID, __FUNCTION__, __LINE__, msg); \
43             return nullptr;                                          \
44         }                                                           \
45     } while (0)
46 
47 #define CHECK_COND_WITH_MESSAGE(env, cond, msg)                 \
48     do {                                                            \
49         if (!(cond)) {                                    \
50             NapiError::ThrowError(env, OHOS_INVALID_PARAM_CODE, __FUNCTION__, __LINE__, msg); \
51             return nullptr;                                          \
52         }                                                           \
53     } while (0)
54 
55 #define NAPI_ASSERT(env, cond, msg) CHECK_ARGS_WITH_MESSAGE(env, cond, msg)
56 
57 #define GET_JS_ARGS(env, info, argc, argv, thisVar)                         \
58     do {                                                                    \
59         void *data;                                                         \
60         napi_get_cb_info(env, info, &(argc), argv, &(thisVar), &(data));    \
61     } while (0)
62 
63 #define GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar)                           \
64     do {                                                                                \
65         void *data;                                                                     \
66         status = napi_get_cb_info(env, info, nullptr, nullptr, &(thisVar), &(data));    \
67     } while (0)
68 
69 #define GET_JS_ASYNC_CB_REF(env, arg, count, cbRef)                                             \
70     do {                                                                                        \
71         napi_valuetype valueType = napi_undefined;                                              \
72         if ((napi_typeof(env, arg, &valueType) == napi_ok) && (valueType == napi_function)) {   \
73             napi_create_reference(env, arg, count, &(cbRef));                                   \
74         } else {                                                                                \
75             NAPI_ERR_LOG("invalid arguments");                                           \
76             NAPI_ASSERT(env, false, "type mismatch");                                           \
77         }                                                                                       \
78     } while (0)
79 
80 #define ASSERT_NULLPTR_CHECK(env, result)       \
81     do {                                        \
82         if ((result) == nullptr) {              \
83             napi_get_undefined(env, &(result)); \
84             return result;                      \
85         }                                       \
86     } while (0)
87 
88 #define NAPI_CREATE_PROMISE(env, callbackRef, deferred, result)     \
89     do {                                                            \
90         if ((callbackRef) == nullptr) {                             \
91             napi_create_promise(env, &(deferred), &(result));       \
92         }                                                           \
93     } while (0)
94 
95 #define NAPI_CREATE_RESOURCE_NAME(env, resource, resourceName, context)         \
96     do {                                                                            \
97         napi_create_string_utf8(env, resourceName, NAPI_AUTO_LENGTH, &(resource));  \
98         (context)->SetApiName(resourceName);                                        \
99     } while (0)
100 
101 #define CHECK_NULL_PTR_RETURN_UNDEFINED(env, ptr, ret, message)     \
102     do {                                                            \
103         if ((ptr) == nullptr) {                                     \
104             NAPI_ERR_LOG(message);                           \
105             napi_get_undefined(env, &(ret));                        \
106             return ret;                                             \
107         }                                                           \
108     } while (0)
109 
110 #define CHECK_NULL_PTR_RETURN_VOID(ptr, message)   \
111     do {                                           \
112         if ((ptr) == nullptr) {                    \
113             NAPI_ERR_LOG(message);          \
114             return;                                \
115         }                                          \
116     } while (0)
117 #define CHECK_IF_EQUAL(condition, errMsg, ...)   \
118     do {                                    \
119         if (!(condition)) {                 \
120             NAPI_ERR_LOG(errMsg, ##__VA_ARGS__);    \
121             return;                         \
122         }                                   \
123     } while (0)
124 
125 #define CHECK_COND_RET(cond, ret, message, ...)                          \
126     do {                                                            \
127         if (!(cond)) {                                              \
128             NAPI_ERR_LOG(message, ##__VA_ARGS__);                                  \
129             return ret;                                             \
130         }                                                           \
131     } while (0)
132 
133 #define CHECK_STATUS_RET(cond, message)                             \
134     do {                                                            \
135         napi_status __ret = (cond);                                 \
136         if (__ret != napi_ok) {                                     \
137             NAPI_ERR_LOG(message);                                  \
138             return __ret;                                           \
139         }                                                           \
140     } while (0)
141 
142 #define CHECK_NULLPTR_RET(ret)                                      \
143     do {                                                            \
144         if ((ret) == nullptr) {                                     \
145             return nullptr;                                         \
146         }                                                           \
147     } while (0)
148 
149 #define CHECK_ARGS_BASE(env, cond, err, retVal)                     \
150     do {                                                            \
151         if ((cond) != napi_ok) {                                    \
152             NapiError::ThrowError(env, err, __FUNCTION__, __LINE__); \
153             return retVal;                                          \
154         }                                                           \
155     } while (0)
156 
157 #define CHECK_ARGS(env, cond, err) CHECK_ARGS_BASE(env, cond, err, nullptr)
158 
159 #define CHECK_ARGS_THROW_INVALID_PARAM(env, cond) CHECK_ARGS(env, cond, OHOS_INVALID_PARAM_CODE)
160 
161 #define CHECK_ARGS_RET_VOID(env, cond, err) CHECK_ARGS_BASE(env, cond, err, NAPI_RETVAL_NOTHING)
162 
163 #define CHECK_COND(env, cond, err)                                  \
164     do {                                                            \
165         if (!(cond)) {                                              \
166             NapiError::ThrowError(env, err, __FUNCTION__, __LINE__); \
167             return nullptr;                                         \
168         }                                                           \
169     } while (0)
170 
171 #define RETURN_NAPI_TRUE(env)                                                 \
172     do {                                                                      \
173         napi_value result = nullptr;                                          \
174         CHECK_ARGS(env, napi_get_boolean(env, true, &result), JS_INNER_FAIL); \
175         return result;                                                        \
176     } while (0)
177 
178 #define RETURN_NAPI_UNDEFINED(env)                                        \
179     do {                                                                  \
180         napi_value result = nullptr;                                      \
181         CHECK_ARGS(env, napi_get_undefined(env, &result), JS_INNER_FAIL); \
182         return result;                                                    \
183     } while (0)
184 
185 namespace OHOS {
186 namespace Media {
187 #define EXPORT __attribute__ ((visibility ("default")))
188 
189 /* Constants for array index */
190 const int32_t PARAM0 = 0;
191 const int32_t PARAM1 = 1;
192 const int32_t PARAM2 = 2;
193 const int32_t PARAM3 = 3;
194 const int32_t PARAM4 = 4;
195 const int32_t PARAM5 = 5;
196 const int32_t PARAM6 = 6;
197 
198 /* Constants for array size */
199 const int32_t ARGS_ZERO = 0;
200 const int32_t ARGS_ONE = 1;
201 const int32_t ARGS_TWO = 2;
202 const int32_t ARGS_THREE = 3;
203 const int32_t ARGS_FOUR = 4;
204 const int32_t ARGS_FIVE = 5;
205 const int32_t ARGS_SIX = 6;
206 const int32_t ARGS_SEVEN = 7;
207 const int32_t ARG_BUF_SIZE = 384; // 256 for display name and 128 for relative path
208 constexpr uint32_t NAPI_INIT_REF_COUNT = 1;
209 
210 constexpr size_t NAPI_ARGC_MAX = 6;
211 
212 // Error codes
213 const int32_t ERR_DEFAULT = 0;
214 const int32_t ERR_MEM_ALLOCATION = 2;
215 const int32_t ERR_INVALID_OUTPUT = 3;
216 
217 const int32_t TRASH_SMART_ALBUM_ID = 1;
218 const std::string TRASH_SMART_ALBUM_NAME = "TrashAlbum";
219 const int32_t FAVORIT_SMART_ALBUM_ID = 2;
220 const std::string FAVORIT_SMART_ALBUM_NAME = "FavoritAlbum";
221 
222 const std::string API_VERSION = "api_version";
223 
224 const std::string PENDING_STATUS = "pending";
225 
226 enum NapiAssetType {
227     TYPE_DEFAULT = 0,
228     TYPE_AUDIO = 1,
229     TYPE_PHOTO = 2,
230     TYPE_ALBUM = 3,
231 };
232 
233 enum AlbumType {
234     TYPE_VIDEO_ALBUM = 0,
235     TYPE_IMAGE_ALBUM = 1,
236     TYPE_NONE = 2,
237 };
238 
239 enum FetchOptionType {
240     ASSET_FETCH_OPT = 0,
241     ALBUM_FETCH_OPT = 1
242 };
243 
244 enum HiddenPhotosDisplayMode {
245     ASSETS_MODE = 0,
246     ALBUMS_MODE = 1
247 };
248 
249 const std::vector<std::string> deliveryModeEnum {
250     "FAST_MODE", "HIGH_QUALITY_MODE", "BALANCE_MODE"
251 };
252 
253 const std::vector<std::string> sourceModeEnum {
254     "ORIGINAL_MODE", "EDITED_MODE"
255 };
256 
257 const std::vector<std::string> privateAlbumTypeNameEnum {
258     "TYPE_FAVORITE", "TYPE_TRASH", "TYPE_HIDE", "TYPE_SMART", "TYPE_SEARCH"
259 };
260 
261 const std::vector<std::string> AuthorizationModeEnum {
262     "SHORT_TIME_AUTHORIZATION"
263 };
264 
265 const std::vector<std::string> HIDDEN_PHOTOS_DISPLAY_MODE_ENUM {
266     "ASSETS_MODE", "ALBUMS_MODE"
267 };
268 
269 const std::vector<std::string> mediaTypesEnum {
270     "FILE", "IMAGE", "VIDEO", "AUDIO", "MEDIA", "ALBUM_LIST", "ALBUM_LIST_INFO"
271 };
272 
273 const std::vector<std::string> mediaTypesUserFileEnum {
274     "IMAGE", "VIDEO", "AUDIO"
275 };
276 
277 const std::vector<std::string> fileKeyEnum {
278     "ID", "RELATIVE_PATH", "DISPLAY_NAME", "PARENT", "MIME_TYPE", "MEDIA_TYPE", "SIZE",
279     "DATE_ADDED", "DATE_MODIFIED", "DATE_TAKEN", "TITLE", "ARTIST", "AUDIOALBUM", "DURATION",
280     "WIDTH", "HEIGHT", "ORIENTATION", "ALBUM_ID", "ALBUM_NAME"
281 };
282 
283 const std::vector<std::string> directoryEnum {
284     "DIR_CAMERA", "DIR_VIDEO", "DIR_IMAGE", "DIR_AUDIO", "DIR_DOCUMENTS", "DIR_DOWNLOAD"
285 };
286 
287 const std::vector<std::string> virtualAlbumTypeEnum {
288     "TYPE_FAVORITE", "TYPE_TRASH"
289 };
290 
291 const std::vector<std::string> directoryEnumValues {
292     "Camera/", "Videos/", "Pictures/", "Audios/", "Documents/", "Download/"
293 };
294 
295 const std::vector<std::string> systemAlbumSubType {
296     "FAVORITE", "VIDEO", "HIDDEN", "TRASH", "SCREENSHOT", "CAMERA", "IMAGE", "CLOUD_ENHANCEMENT"
297 };
298 
299 const std::vector<std::string> analysisAlbumSubType {
300     "GEOGRAPHY_LOCATION", "GEOGRAPHY_CITY", "SHOOTING_MODE", "PORTRAIT", "GROUP_PHOTO",
301     "HIGHLIGHT", "HIGHLIGHT_SUGGESTIONS"
302 };
303 
304 const std::vector<std::string> positionTypeEnum {
305     "LOCAL", "CLOUD", "BOTH"
306 };
307 
308 const std::vector<std::string> photoSubTypeEnum {
309     "DEFAULT", "SCREENSHOT", "CAMERA", "MOVING_PHOTO"
310 };
311 
312 const std::vector<std::string> photoPermissionTypeEnum {
313     "TEMPORARY_READ_IMAGEVIDEO", "PERSISTENT_READ_IMAGEVIDEO"
314 };
315 
316 const std::vector<std::string> hideSensitiveTypeEnum {
317     "HIDE_LOCATION_AND_SHOOTING_PARAM", "HIDE_LOCATION_ONLY", "HIDE_SHOOTING_PARAM_ONLY", "NO_HIDE_SENSITIVE_TYPE"
318 };
319 
320 const std::vector<std::string> notifyTypeEnum {
321     "NOTIFY_ADD", "NOTIFY_UPDATE", "NOTIFY_REMOVE", "NOTIFY_ALBUM_ADD_ASSET", "NOTIFY_ALBUM_REMOVE_ASSET"
322 };
323 
324 const std::vector<std::string> requestPhotoTypeEnum {
325     "REQUEST_ALL_THUMBNAILS", "REQUEST_FAST_THUMBNAIL", "REQUEST_QUALITY_THUMBNAIL"
326 };
327 
328 const std::vector<std::string> resourceTypeEnum {
329     "IMAGE_RESOURCE", "VIDEO_RESOURCE", "PHOTO_PROXY", "PRIVATE_MOVING_PHOTO_RESOURCE"
330 };
331 
332 const std::vector<std::string> dynamicRangeTypeEnum {
333     "SDR", "HDR"
334 };
335 
336 const std::vector<std::string> movingPhotoEffectModeEnum {
337     "DEFAULT", "BOUNCE_PLAY", "LOOP_PLAY", "LONG_EXPOSURE", "MULTI_EXPOSURE", "CINEMA_GRAPH"
338 };
339 
340 const std::vector<std::string> imageFileTypeEnum {
341     "JPEG", "HEIF"
342 };
343 
344 const std::vector<std::string> cloudEnhancementTaskStageEnum {
345     "TASK_STAGE_EXCEPTION", "TASK_STAGE_PREPARING", "TASK_STAGE_UPLOADING",
346     "TASK_STAGE_EXECUTING", "TASK_STAGE_DOWNLOADING", "TASK_STAGE_FAILED", "TASK_STAGE_COMPLETED"
347 };
348 
349 const std::vector<std::string> cloudEnhancementStateEnum {
350     "UNAVAILABLE", "AVAILABLE", "EXECUTING", "COMPLETED"
351 };
352 
353 const std::vector<std::string> videoEnhancementTypeEnum {
354     "QUALITY_ENHANCEMENT_LOCAL", "QUALITY_ENHANCEMENT_CLOUD", "QUALITY_ENHANCEMENT_LOCAL_AND_CLOUD"
355 };
356 
357 const std::vector<std::string> watermarkTypeEnum {
358     "DEFAULT", "BRAND_COMMON", "COMMON", "BRAND"
359 };
360 
361 const std::vector<std::string> cloudMediaDownloadTypeEnum {
362     "DOWNLOAD_FORCE", "DOWNLOAD_GENTLE"
363 };
364 
365 const std::vector<std::string> cloudMediaRetainTypeEnum {
366     "RETAIN_FORCE", "RETAIN_GENTLE"
367 };
368 
369 const std::vector<std::string> cloudMediaAssetTaskStatusEnum {
370     "DOWNLOADING", "PAUSED", "IDLE"
371 };
372 
373 const std::vector<std::string> cloudMediaTaskPauseCauseEnum {
374     "NO_PAUSE", "TEMPERATURE_LIMIT", "ROM_LIMIT", "NETWORK_FLOW_LIMIT", "WIFI_UNAVAILABLE",
375     "POWER_LIMIT", "BACKGROUND_TASK_UNAVAILABLE", "FREQUENT_USER_REQUESTS", "CLOUD_ERROR", "USER_PAUSED",
376 };
377 
378 const std::vector<std::string> fileKeyEnumValues {
379     MEDIA_DATA_DB_ID,
380     MEDIA_DATA_DB_RELATIVE_PATH,
381     MEDIA_DATA_DB_NAME,
382     MEDIA_DATA_DB_PARENT_ID,
383     MEDIA_DATA_DB_MIME_TYPE,
384     MEDIA_DATA_DB_MEDIA_TYPE,
385     MEDIA_DATA_DB_SIZE,
386     MEDIA_DATA_DB_DATE_ADDED,
387     MEDIA_DATA_DB_DATE_MODIFIED,
388     MEDIA_DATA_DB_DATE_TAKEN,
389     MEDIA_DATA_DB_TITLE,
390     MEDIA_DATA_DB_ARTIST,
391     MEDIA_DATA_DB_AUDIO_ALBUM,
392     MEDIA_DATA_DB_DURATION,
393     MEDIA_DATA_DB_WIDTH,
394     MEDIA_DATA_DB_HEIGHT,
395     MEDIA_DATA_DB_ORIENTATION,
396     MEDIA_DATA_DB_BUCKET_ID,
397     MEDIA_DATA_DB_BUCKET_NAME
398 };
399 
400 const std::vector<std::pair<std::string, std::string>> FILE_KEY_ENUM_PROPERTIES = {
401     std::make_pair("ID",                        MEDIA_DATA_DB_ID),
402     std::make_pair("RELATIVE_PATH",             MEDIA_DATA_DB_RELATIVE_PATH),
403     std::make_pair("DISPLAY_NAME",              MEDIA_DATA_DB_NAME),
404     std::make_pair("PARENT",                    MEDIA_DATA_DB_PARENT_ID),
405     std::make_pair("MIME_TYPE",                 MEDIA_DATA_DB_MIME_TYPE),
406     std::make_pair("MEDIA_TYPE",                MEDIA_DATA_DB_MEDIA_TYPE),
407     std::make_pair("SIZE",                      MEDIA_DATA_DB_SIZE),
408     std::make_pair("DATE_ADDED",                MEDIA_DATA_DB_DATE_ADDED),
409     std::make_pair("DATE_MODIFIED",             MEDIA_DATA_DB_DATE_MODIFIED),
410     std::make_pair("DATE_TAKEN",                MEDIA_DATA_DB_DATE_TAKEN),
411     std::make_pair("TITLE",                     MEDIA_DATA_DB_TITLE),
412     std::make_pair("ARTIST",                    MEDIA_DATA_DB_ARTIST),
413     std::make_pair("AUDIOALBUM",                MEDIA_DATA_DB_AUDIO_ALBUM),
414     std::make_pair("DURATION",                  MEDIA_DATA_DB_DURATION),
415     std::make_pair("WIDTH",                     MEDIA_DATA_DB_WIDTH),
416     std::make_pair("HEIGHT",                    MEDIA_DATA_DB_HEIGHT),
417     std::make_pair("ORIENTATION",               MEDIA_DATA_DB_ORIENTATION),
418     std::make_pair("ALBUM_ID",                  MEDIA_DATA_DB_BUCKET_ID),
419     std::make_pair("ALBUM_NAME",                MEDIA_DATA_DB_BUCKET_NAME)
420 };
421 
422 const std::vector<std::pair<std::string, std::string>> USERFILEMGR_FILEKEY_ENUM_PROPERTIES = {
423     std::make_pair("URI",                       MEDIA_DATA_DB_URI),
424     std::make_pair("RELATIVE_PATH",             MEDIA_DATA_DB_RELATIVE_PATH),
425     std::make_pair("DISPLAY_NAME",              MEDIA_DATA_DB_NAME),
426     std::make_pair("DATE_ADDED",                MEDIA_DATA_DB_DATE_ADDED),
427     std::make_pair("DATE_MODIFIED",             MEDIA_DATA_DB_DATE_MODIFIED),
428     std::make_pair("TITLE",                     MEDIA_DATA_DB_TITLE)
429 };
430 
431 const std::vector<std::pair<std::string, std::string>> AUDIOKEY_ENUM_PROPERTIES = {
432     std::make_pair("URI",                       MEDIA_DATA_DB_URI),
433     std::make_pair("DISPLAY_NAME",              MEDIA_DATA_DB_NAME),
434     std::make_pair("DATE_ADDED",                MEDIA_DATA_DB_DATE_ADDED),
435     std::make_pair("DATE_MODIFIED",             MEDIA_DATA_DB_DATE_MODIFIED),
436     std::make_pair("TITLE",                     MEDIA_DATA_DB_TITLE),
437     std::make_pair("ARTIST",                    MEDIA_DATA_DB_ARTIST),
438     std::make_pair("AUDIOALBUM",                MEDIA_DATA_DB_AUDIO_ALBUM),
439     std::make_pair("DURATION",                  MEDIA_DATA_DB_DURATION),
440     std::make_pair("FAVORITE",                  MEDIA_DATA_DB_IS_FAV),
441     std::make_pair("SIZE",                      MediaColumn::MEDIA_SIZE),
442     std::make_pair("PACKAGE_NAME",              MediaColumn::MEDIA_PACKAGE_NAME)
443 };
444 
445 const std::vector<std::pair<std::string, std::string>> IMAGEVIDEOKEY_ENUM_PROPERTIES = {
446     std::make_pair("URI",                       MEDIA_DATA_DB_URI),
447     std::make_pair("DISPLAY_NAME",              MediaColumn::MEDIA_NAME),
448     std::make_pair("DATE_ADDED",                MediaColumn::MEDIA_DATE_ADDED),
449     std::make_pair("FILE_TYPE",                 MediaColumn::MEDIA_TYPE),
450     std::make_pair("PHOTO_TYPE",                MediaColumn::MEDIA_TYPE),
451     std::make_pair("DATE_MODIFIED",             MediaColumn::MEDIA_DATE_MODIFIED),
452     std::make_pair("TITLE",                     MediaColumn::MEDIA_TITLE),
453     std::make_pair("DURATION",                  MediaColumn::MEDIA_DURATION),
454     std::make_pair("WIDTH",                     PhotoColumn::PHOTO_WIDTH),
455     std::make_pair("HEIGHT",                    PhotoColumn::PHOTO_HEIGHT),
456     std::make_pair("DATE_TAKEN",                MediaColumn::MEDIA_DATE_TAKEN),
457     std::make_pair("DATE_TAKEN_MS",             MEDIA_DATA_DB_DATE_TAKEN_MS),
458     std::make_pair("DETAIL_TIME",               PhotoColumn::PHOTO_DETAIL_TIME),
459     std::make_pair("ORIENTATION",               PhotoColumn::PHOTO_ORIENTATION),
460     std::make_pair("FAVORITE",                  MediaColumn::MEDIA_IS_FAV),
461     std::make_pair("MEDIA_TYPE",                MediaColumn::MEDIA_TYPE),
462     std::make_pair("DATE_TRASHED",              MediaColumn::MEDIA_DATE_TRASHED),
463     std::make_pair("POSITION",                  PhotoColumn::PHOTO_POSITION),
464     std::make_pair("HIDDEN",                    MediaColumn::MEDIA_HIDDEN),
465     std::make_pair("SIZE",                      MediaColumn::MEDIA_SIZE),
466     std::make_pair("PACKAGE_NAME",              MediaColumn::MEDIA_PACKAGE_NAME),
467     std::make_pair("CAMERA_SHOT_KEY",           PhotoColumn::CAMERA_SHOT_KEY),
468     std::make_pair("USER_COMMENT",              PhotoColumn::PHOTO_USER_COMMENT),
469     std::make_pair("DATE_YEAR",                 PhotoColumn::PHOTO_DATE_YEAR),
470     std::make_pair("DATE_MONTH",                PhotoColumn::PHOTO_DATE_MONTH),
471     std::make_pair("DATE_DAY",                  PhotoColumn::PHOTO_DATE_DAY),
472     std::make_pair("PENDING",                   PENDING_STATUS),
473     std::make_pair("DATE_ADDED_MS",             MEDIA_DATA_DB_DATE_ADDED_MS),
474     std::make_pair("DATE_MODIFIED_MS",          MEDIA_DATA_DB_DATE_MODIFIED_MS),
475     std::make_pair("DATE_TRASHED_MS",           MEDIA_DATA_DB_DATE_TRASHED_MS),
476     std::make_pair("PHOTO_SUBTYPE",             PhotoColumn::PHOTO_SUBTYPE),
477     std::make_pair("DYNAMIC_RANGE_TYPE",        PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE),
478     std::make_pair("LCD_SIZE",                  PhotoColumn::PHOTO_LCD_SIZE),
479     std::make_pair("THM_SIZE",                  PhotoColumn::PHOTO_THUMB_SIZE),
480     std::make_pair("MOVING_PHOTO_EFFECT_MODE",  PhotoColumn::MOVING_PHOTO_EFFECT_MODE),
481     std::make_pair("COVER_POSITION",            PhotoColumn::PHOTO_COVER_POSITION),
482     std::make_pair("BURST_COVER_LEVEL",         PhotoColumn::PHOTO_BURST_COVER_LEVEL),
483     std::make_pair("BURST_KEY",                 PhotoColumn::PHOTO_BURST_KEY),
484     std::make_pair("THUMBNAIL_READY",           PhotoColumn::PHOTO_THUMBNAIL_READY),
485     std::make_pair("CE_AVAILABLE",              PhotoColumn::PHOTO_CE_AVAILABLE),
486     std::make_pair("OWNER_ALBUM_ID",            PhotoColumn::PHOTO_OWNER_ALBUM_ID),
487     std::make_pair("THUMBNAIL_VISIBLE",         PhotoColumn::PHOTO_THUMBNAIL_VISIBLE),
488     std::make_pair("SUPPORTED_WATERMARK_TYPE",  PhotoColumn::SUPPORTED_WATERMARK_TYPE),
489 };
490 
491 const std::vector<std::pair<std::string, std::string>> ALBUMKEY_ENUM_PROPERTIES = {
492     std::make_pair("URI",                       MEDIA_DATA_DB_URI),
493     std::make_pair("ALBUM_NAME",                PhotoAlbumColumns::ALBUM_NAME),
494     std::make_pair("FILE_TYPE",                 MEDIA_DATA_DB_MEDIA_TYPE),
495     std::make_pair("DATE_ADDED",                MEDIA_DATA_DB_DATE_ADDED),
496     std::make_pair("DATE_MODIFIED",             MEDIA_DATA_DB_DATE_MODIFIED),
497 };
498 
499 const std::vector<std::pair<std::string, std::string>> DEFAULT_URI_ENUM_PROPERTIES = {
500     std::make_pair("DEFAULT_PHOTO_URI",         PhotoColumn::DEFAULT_PHOTO_URI),
501     std::make_pair("DEFAULT_ALBUM_URI",         PhotoAlbumColumns::DEFAULT_PHOTO_ALBUM_URI),
502     std::make_pair("DEFAULT_AUDIO_URI",         AudioColumn::DEFAULT_AUDIO_URI),
503     std::make_pair("DEFAULT_HIDDEN_ALBUM_URI",  PhotoAlbumColumns::DEFAULT_HIDDEN_ALBUM_URI),
504 };
505 
506 const std::map<std::string, std::pair<std::string, int32_t>> LOCATION_PARAM_MAP = {
507     { START_LATITUDE, { LATITUDE, DataShare::GREATER_THAN_OR_EQUAL_TO } },
508     { END_LATITUDE, { LATITUDE, DataShare::LESS_THAN } },
509     { START_LONGITUDE, { LONGITUDE, DataShare::GREATER_THAN_OR_EQUAL_TO } },
510     { END_LONGITUDE, { LONGITUDE, DataShare::LESS_THAN } },
511     { DIAMETER, { DIAMETER, DataShare::EQUAL_TO } },
512     { LANGUAGE, { LANGUAGE, DataShare::EQUAL_TO } },
513 };
514 
515 struct JSAsyncContextOutput {
516     napi_value error;
517     napi_value data;
518     bool status;
519 };
520 
521 struct NapiClassInfo {
522     std::string name;
523     napi_ref *ref;
524     napi_value (*constructor)(napi_env, napi_callback_info);
525     std::vector<napi_property_descriptor> props;
526 };
527 
528 const std::vector<std::string> ALBUM_COLUMN = {
529     PhotoAlbumColumns::ALBUM_ID,
530     PhotoAlbumColumns::ALBUM_TYPE,
531     PhotoAlbumColumns::ALBUM_SUBTYPE,
532     PhotoAlbumColumns::ALBUM_NAME,
533     PhotoAlbumColumns::ALBUM_COVER_URI,
534     PhotoAlbumColumns::ALBUM_COUNT,
535     PhotoAlbumColumns::ALBUM_IMAGE_COUNT,
536     PhotoAlbumColumns::ALBUM_VIDEO_COUNT,
537 };
538 
539 const std::vector<std::string> PHOTO_COLUMN = {
540     MEDIA_DATA_DB_ID,
541     MEDIA_DATA_DB_FILE_PATH,
542     MEDIA_DATA_DB_MEDIA_TYPE,
543     MEDIA_DATA_DB_NAME,
544     MEDIA_DATA_DB_SIZE,
545     MEDIA_DATA_DB_DATE_ADDED,
546     MEDIA_DATA_DB_DATE_MODIFIED,
547     MEDIA_DATA_DB_DURATION,
548     MEDIA_DATA_DB_WIDTH,
549     MEDIA_DATA_DB_HEIGHT,
550     MEDIA_DATA_DB_DATE_TAKEN,
551     MEDIA_DATA_DB_ORIENTATION,
552     MEDIA_DATA_DB_IS_FAV,
553     MEDIA_DATA_DB_TITLE,
554     MEDIA_DATA_DB_POSITION,
555     MEDIA_DATA_DB_DATE_TRASHED,
556     MediaColumn::MEDIA_HIDDEN,
557     PhotoColumn::PHOTO_USER_COMMENT,
558     PhotoColumn::CAMERA_SHOT_KEY,
559     PhotoColumn::PHOTO_DATE_YEAR,
560     PhotoColumn::PHOTO_DATE_MONTH,
561     PhotoColumn::PHOTO_DATE_DAY,
562     MEDIA_DATA_DB_TIME_PENDING,
563     PhotoColumn::PHOTO_SUBTYPE,
564     PhotoColumn::MOVING_PHOTO_EFFECT_MODE,
565     PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE,
566     PhotoColumn::PHOTO_THUMBNAIL_READY,
567     PhotoColumn::PHOTO_LCD_SIZE,
568     PhotoColumn::PHOTO_THUMB_SIZE,
569 };
570 
571 const std::set<std::string> TIME_COLUMN = {
572     MEDIA_DATA_DB_DATE_ADDED,
573     MEDIA_DATA_DB_DATE_MODIFIED,
574     MEDIA_DATA_DB_DATE_TRASHED,
575 };
576 
577 /* Util class used by napi asynchronous methods for making call to js callback function */
578 class MediaLibraryNapiUtils {
579 public:
GetTypeMap()580     static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> &GetTypeMap()
581     {
582         static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TYPE_MAP = {
583             {MEDIA_DATA_DB_ID, {TYPE_INT32, "fileId"}},
584             {MEDIA_DATA_DB_FILE_PATH, {TYPE_STRING, "data"}},
585             {MEDIA_DATA_DB_MEDIA_TYPE, {TYPE_INT32, "mediaType"}},
586             {MEDIA_DATA_DB_NAME, {TYPE_STRING, "displayName"}},
587             {MEDIA_DATA_DB_SIZE, {TYPE_INT64, "size"}},
588             {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAddedMs"}},
589             {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModifiedMs"}},
590             {MEDIA_DATA_DB_DURATION, {TYPE_INT64, "duration"}},
591             {MEDIA_DATA_DB_WIDTH, {TYPE_INT32, "width"}},
592             {MEDIA_DATA_DB_HEIGHT, {TYPE_INT32, "height"}},
593             {MEDIA_DATA_DB_DATE_TAKEN, {TYPE_INT64, "dateTaken"}},
594             {MEDIA_DATA_DB_ORIENTATION, {TYPE_INT32, "orientation"}},
595             {MEDIA_DATA_DB_IS_FAV, {TYPE_INT32, "isFavorite"}},
596             {MEDIA_DATA_DB_TITLE, {TYPE_STRING, "title"}},
597             {MEDIA_DATA_DB_POSITION, {TYPE_INT32, "position"}},
598             {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashedMs"}},
599             {MediaColumn::MEDIA_HIDDEN, {TYPE_INT32, "hidden"}},
600             {PhotoColumn::PHOTO_USER_COMMENT, {TYPE_STRING, "userComment"}},
601             {PhotoColumn::CAMERA_SHOT_KEY, {TYPE_STRING, "cameraShotKey"}},
602             {PhotoColumn::PHOTO_DATE_YEAR, {TYPE_STRING, "dateYear"}},
603             {PhotoColumn::PHOTO_DATE_MONTH, {TYPE_STRING, "dateMonth"}},
604             {PhotoColumn::PHOTO_DATE_DAY, {TYPE_STRING, "dateDay"}},
605             {MEDIA_DATA_DB_TIME_PENDING, {TYPE_INT64, "pending"}},
606             {PhotoColumn::PHOTO_SUBTYPE, {TYPE_INT32, "subtype"}},
607             {PhotoColumn::MOVING_PHOTO_EFFECT_MODE, {TYPE_INT32, "movingPhotoEffectMode"}},
608             {PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, {TYPE_INT32, "dynamicRangeType"}},
609             {PhotoColumn::PHOTO_THUMBNAIL_READY, {TYPE_INT64, "thumbnailModifiedMs"}},
610             {PhotoColumn::PHOTO_LCD_SIZE, {TYPE_STRING, "lcdSize"}},
611             {PhotoColumn::PHOTO_THUMB_SIZE, {TYPE_STRING, "thmSize"}},
612             {MEDIA_DATA_DB_COUNT, {TYPE_INT32, "count"}},
613             {PhotoAlbumColumns::ALBUM_ID, {TYPE_INT32, "albumId"}},
614             {PhotoAlbumColumns::ALBUM_TYPE, {TYPE_INT32, "albumType"}},
615             {PhotoAlbumColumns::ALBUM_SUBTYPE, {TYPE_INT32, "albumSubType"}},
616             {PhotoAlbumColumns::ALBUM_NAME, {TYPE_STRING, "albumName"}},
617             {PhotoAlbumColumns::ALBUM_COVER_URI, {TYPE_STRING, "coverUri"}},
618             {PhotoAlbumColumns::ALBUM_COUNT, {TYPE_INT32, "count"}},
619             {PhotoAlbumColumns::ALBUM_IMAGE_COUNT, {TYPE_INT32, "imageCount"}},
620             {PhotoAlbumColumns::ALBUM_VIDEO_COUNT, {TYPE_INT32, "videoCount"}},
621         };
622         return TYPE_MAP;
623     }
624 
GetTimeTypeMap()625     static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>>& GetTimeTypeMap()
626     {
627         static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TIME_TYPE_MAP = {
628             {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAdded"}},
629             {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModified"}},
630             {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashed"}},
631         };
632         return TIME_TYPE_MAP;
633     }
634 
635     static napi_value NapiDefineClass(napi_env env, napi_value exports, const NapiClassInfo &info);
636     EXPORT static napi_value NapiAddStaticProps(napi_env env, napi_value exports,
637         const std::vector<napi_property_descriptor> &staticProps);
638 
639     static napi_status GetUInt32(napi_env env, napi_value arg, uint32_t &value);
640     static napi_status GetInt32(napi_env env, napi_value arg, int32_t &value);
641     static napi_status GetDouble(napi_env env, napi_value arg, double &value);
642     static napi_status GetParamBool(napi_env env, napi_value arg, bool &result);
643     static napi_status GetUInt32Array(napi_env env, napi_value arg, std::vector<uint32_t> &param);
644     static napi_status GetParamFunction(napi_env env, napi_value arg, napi_ref &callbackRef);
645     static napi_status GetParamStringWithLength(napi_env env, napi_value arg, int32_t maxLen,
646         std::string &str);
647     static napi_status GetParamStringPathMax(napi_env env, napi_value arg, std::string &str);
648     static napi_status GetProperty(napi_env env, const napi_value arg, const std::string &propName,
649         std::string &propValue);
650     static napi_status GetArrayProperty(napi_env env, napi_value arg, const std::string &propName,
651         std::vector<std::string> &array);
652     static napi_status GetStringArray(napi_env env, napi_value arg, std::vector<std::string> &array);
653     static void UriAddTableName(std::string &uri, const std::string tableName);
654     static std::string GetFileIdFromUri(const std::string &uri);
655     static int32_t GetFileIdFromPhotoUri(const std::string &uri);
656     static MediaType GetMediaTypeFromUri(const std::string &uri);
657     template <class AsyncContext>
658     static napi_status GetPredicate(napi_env env, const napi_value arg, const std::string &propName,
659         AsyncContext &context, const FetchOptionType &fetchOptType);
660     template <class AsyncContext>
661     static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context);
662     template <class AsyncContext>
663     static bool HandleSpecialPredicate(AsyncContext &context,
664         std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType);
665     template <class AsyncContext>
666     static void UpdateMediaTypeSelections(AsyncContext *context);
667 
668     template <class AsyncContext>
669     static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext,
670         const size_t minArgs, const size_t maxArgs);
671 
672     template <class AsyncContext>
673     static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext,
674         const size_t minArgs, const size_t maxArgs);
675 
676     template <class AsyncContext>
677     static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType,
678         AsyncContext &context);
679 
680     template <class AsyncContext>
681     static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType,
682         AsyncContext &context);
683 
684     template <class AsyncContext>
685     static napi_status GetParamCallback(napi_env env, AsyncContext &context);
686 
687     template <class AsyncContext>
688     static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info,
689         AsyncContext &context);
690 
691     template <class AsyncContext>
692     static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool &param);
693 
694     template <class AsyncContext>
695     static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context,
696         std::string &param);
697     template <class AsyncContext>
698     static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info,
699     AsyncContext &context, std::vector<std::string> &array);
700 
701     template <class AsyncContext>
702     static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context,
703         int32_t &value);
704 
705     template <class AsyncContext>
706     static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context);
707 
708     static AssetType GetAssetType(MediaType type);
709 
710     static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition);
711 
712     template <class AsyncContext>
713     static bool GetLocationPredicate(AsyncContext &context,
714         std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate);
715 
716     static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet);
717 
718     static int TransErrorCode(const std::string &Name, int error);
719 
720     static void HandleError(napi_env env, int error, napi_value &errorObj, const std::string &Name);
721 
722     static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode,
723         const std::string errMsg);
724 
725     static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work,
726         const JSAsyncContextOutput &asyncContext);
727 
728     template <class AsyncContext>
729     static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext,
730         const std::string &resourceName,  void (*execute)(napi_env, void *),
731         void (*complete)(napi_env, napi_status, void *));
732 
733     static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value);
734 
735     static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName);
736 
737     static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName);
738 
739     static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg);
740 
741     static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize);
742 
743     static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[],
744         bool &isCallback);
745 
746     static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value);
747 
748     static napi_value GetDoubleArg(napi_env env, napi_value arg, double &value);
749 
750     static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value);
751 
752     static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn,
753         std::function<bool(const std::string &columnName)> isValidColumn, NapiAssetType assetType,
754         const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC);
755 
756     static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType,
757         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
758     static int32_t GetUserAlbumPredicates(const int32_t albumId,
759         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
760     static int32_t GetAnalysisAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
761     static int32_t GetFeaturedSinglePortraitAlbumPredicates(
762         const int32_t albumId, DataShare::DataSharePredicates &predicates);
763     static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
764     static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates);
765     static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates,
766         const bool hiddenOnly);
767     static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates);
768     static bool IsSystemApp();
769     static std::string GetStringFetchProperty(napi_env env, napi_value arg, bool &err, bool &present,
770         const std::string &propertyName);
771     EXPORT static std::string ParseResultSet2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet,
772         const std::vector<std::string> &cloumns);
773 
774     static std::string ParseAnalysisFace2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet,
775         const std::vector<std::string> &cloumns);
776 
777     static std::string GetStringValueByColumn(std::shared_ptr<DataShare::DataShareResultSet> resultSet,
778         const std::string columnName);
779 
780     static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values);
781     static napi_value GetUriArrayFromAssets(
782         napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values);
783     static napi_value GetStringArray(
784         napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values);
785     static void FixSpecialDateType(std::string &selections);
786     static std::string TransferUri(const std::string &oldUri);
787     static std::string GetFileIdFromUriString(const std::string& uri);
788     static std::string GetAlbumIdFromUriString(const std::string& uri);
789     static napi_value GetSharedPhotoAssets(const napi_env& env, std::vector<std::string>& albumIds,
790         bool isSingleResult = false);
791     static napi_value GetSharedAlbumAssets(const napi_env& env, std::vector<std::string>& fileIds);
792     static void HandleCoverSharedPhotoAsset(napi_env env, int32_t index, napi_value result,
793         const std::string& name, const std::shared_ptr<NativeRdb::ResultSet>& resultSet);
794     static napi_value GetNextRowObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet,
795         bool isShared = false);
796     static napi_value GetNextRowAlbumObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet);
797     static napi_value CreateValueByIndex(napi_env env, int32_t index, std::string name,
798         std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset);
799     static void handleTimeInfo(napi_env env, const std::string& name, napi_value result, int32_t index,
800         const std::shared_ptr<NativeRdb::ResultSet>& resultSet);
801 
802     template <class AsyncContext>
803     static napi_status ParsePredicates(napi_env env,
804         const napi_value arg, AsyncContext &context, const FetchOptionType &fetchOptType);
805 
806 private:
807     static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt);
808 };
809 
810 class NapiScopeHandler {
811 public:
812     NapiScopeHandler(napi_env env);
813     ~NapiScopeHandler();
814     bool IsValid();
815 
816 private:
817     napi_env env_;
818     napi_handle_scope scope_;
819     bool isValid_ = false;
820 };
821 } // namespace Media
822 } // namespace OHOS
823 
824 #endif  // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_UTILS_H_
825