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> compatibleModeEnum { 266 "ORIGINAL_FORMAT_MODE", "COMPATIBLE_FORMAT_MODE" 267 }; 268 269 const std::vector<std::string> HIDDEN_PHOTOS_DISPLAY_MODE_ENUM { 270 "ASSETS_MODE", "ALBUMS_MODE" 271 }; 272 273 const std::vector<std::string> mediaTypesEnum { 274 "FILE", "IMAGE", "VIDEO", "AUDIO", "MEDIA", "ALBUM_LIST", "ALBUM_LIST_INFO" 275 }; 276 277 const std::vector<std::string> mediaTypesUserFileEnum { 278 "IMAGE", "VIDEO", "AUDIO" 279 }; 280 281 const std::vector<std::string> fileKeyEnum { 282 "ID", "RELATIVE_PATH", "DISPLAY_NAME", "PARENT", "MIME_TYPE", "MEDIA_TYPE", "SIZE", 283 "DATE_ADDED", "DATE_MODIFIED", "DATE_TAKEN", "TITLE", "ARTIST", "AUDIOALBUM", "DURATION", 284 "WIDTH", "HEIGHT", "ORIENTATION", "ALBUM_ID", "ALBUM_NAME" 285 }; 286 287 const std::vector<std::string> directoryEnum { 288 "DIR_CAMERA", "DIR_VIDEO", "DIR_IMAGE", "DIR_AUDIO", "DIR_DOCUMENTS", "DIR_DOWNLOAD" 289 }; 290 291 const std::vector<std::string> virtualAlbumTypeEnum { 292 "TYPE_FAVORITE", "TYPE_TRASH" 293 }; 294 295 const std::vector<std::string> directoryEnumValues { 296 "Camera/", "Videos/", "Pictures/", "Audios/", "Documents/", "Download/" 297 }; 298 299 const std::vector<std::string> systemAlbumSubType { 300 "FAVORITE", "VIDEO", "HIDDEN", "TRASH", "SCREENSHOT", "CAMERA", "IMAGE", "CLOUD_ENHANCEMENT" 301 }; 302 303 const std::vector<std::string> analysisAlbumSubType { 304 "GEOGRAPHY_LOCATION", "GEOGRAPHY_CITY", "SHOOTING_MODE", "PORTRAIT", "GROUP_PHOTO", 305 "HIGHLIGHT", "HIGHLIGHT_SUGGESTIONS" 306 }; 307 308 const std::vector<std::string> positionTypeEnum { 309 "LOCAL", "CLOUD", "BOTH" 310 }; 311 312 const std::vector<std::string> photoSubTypeEnum { 313 "DEFAULT", "SCREENSHOT", "CAMERA", "MOVING_PHOTO" 314 }; 315 316 const std::vector<std::string> photoPermissionTypeEnum { 317 "TEMPORARY_READ_IMAGEVIDEO", "PERSISTENT_READ_IMAGEVIDEO" 318 }; 319 320 const std::vector<std::string> hideSensitiveTypeEnum { 321 "HIDE_LOCATION_AND_SHOOTING_PARAM", "HIDE_LOCATION_ONLY", "HIDE_SHOOTING_PARAM_ONLY", "NO_HIDE_SENSITIVE_TYPE" 322 }; 323 324 const std::vector<std::string> notifyTypeEnum { 325 "NOTIFY_ADD", "NOTIFY_UPDATE", "NOTIFY_REMOVE", "NOTIFY_ALBUM_ADD_ASSET", "NOTIFY_ALBUM_REMOVE_ASSET" 326 }; 327 328 const std::vector<std::string> requestPhotoTypeEnum { 329 "REQUEST_ALL_THUMBNAILS", "REQUEST_FAST_THUMBNAIL", "REQUEST_QUALITY_THUMBNAIL" 330 }; 331 332 const std::vector<std::string> resourceTypeEnum { 333 "IMAGE_RESOURCE", "VIDEO_RESOURCE", "PHOTO_PROXY", "PRIVATE_MOVING_PHOTO_RESOURCE" 334 }; 335 336 const std::vector<std::string> dynamicRangeTypeEnum { 337 "SDR", "HDR" 338 }; 339 340 const std::vector<std::string> movingPhotoEffectModeEnum { 341 "DEFAULT", "BOUNCE_PLAY", "LOOP_PLAY", "LONG_EXPOSURE", "MULTI_EXPOSURE", "CINEMA_GRAPH" 342 }; 343 344 const std::vector<std::string> imageFileTypeEnum { 345 "JPEG", "HEIF" 346 }; 347 348 const std::vector<std::string> cloudEnhancementTaskStageEnum { 349 "TASK_STAGE_EXCEPTION", "TASK_STAGE_PREPARING", "TASK_STAGE_UPLOADING", 350 "TASK_STAGE_EXECUTING", "TASK_STAGE_DOWNLOADING", "TASK_STAGE_FAILED", "TASK_STAGE_COMPLETED" 351 }; 352 353 const std::vector<std::string> cloudEnhancementStateEnum { 354 "UNAVAILABLE", "AVAILABLE", "EXECUTING", "COMPLETED" 355 }; 356 357 const std::vector<std::string> videoEnhancementTypeEnum { 358 "QUALITY_ENHANCEMENT_LOCAL", "QUALITY_ENHANCEMENT_CLOUD", "QUALITY_ENHANCEMENT_LOCAL_AND_CLOUD" 359 }; 360 361 const std::vector<std::string> watermarkTypeEnum { 362 "DEFAULT", "BRAND_COMMON", "COMMON", "BRAND" 363 }; 364 365 const std::vector<std::string> cloudMediaDownloadTypeEnum { 366 "DOWNLOAD_FORCE", "DOWNLOAD_GENTLE" 367 }; 368 369 const std::vector<std::string> cloudMediaRetainTypeEnum { 370 "RETAIN_FORCE", "RETAIN_GENTLE" 371 }; 372 373 const std::vector<std::string> cloudMediaAssetTaskStatusEnum { 374 "DOWNLOADING", "PAUSED", "IDLE" 375 }; 376 377 const std::vector<std::string> cloudMediaTaskPauseCauseEnum { 378 "NO_PAUSE", "TEMPERATURE_LIMIT", "ROM_LIMIT", "NETWORK_FLOW_LIMIT", "WIFI_UNAVAILABLE", 379 "POWER_LIMIT", "BACKGROUND_TASK_UNAVAILABLE", "FREQUENT_USER_REQUESTS", "CLOUD_ERROR", "USER_PAUSED", 380 }; 381 382 const std::vector<std::string> fileKeyEnumValues { 383 MEDIA_DATA_DB_ID, 384 MEDIA_DATA_DB_RELATIVE_PATH, 385 MEDIA_DATA_DB_NAME, 386 MEDIA_DATA_DB_PARENT_ID, 387 MEDIA_DATA_DB_MIME_TYPE, 388 MEDIA_DATA_DB_MEDIA_TYPE, 389 MEDIA_DATA_DB_SIZE, 390 MEDIA_DATA_DB_DATE_ADDED, 391 MEDIA_DATA_DB_DATE_MODIFIED, 392 MEDIA_DATA_DB_DATE_TAKEN, 393 MEDIA_DATA_DB_TITLE, 394 MEDIA_DATA_DB_ARTIST, 395 MEDIA_DATA_DB_AUDIO_ALBUM, 396 MEDIA_DATA_DB_DURATION, 397 MEDIA_DATA_DB_WIDTH, 398 MEDIA_DATA_DB_HEIGHT, 399 MEDIA_DATA_DB_ORIENTATION, 400 MEDIA_DATA_DB_BUCKET_ID, 401 MEDIA_DATA_DB_BUCKET_NAME 402 }; 403 404 const std::vector<std::pair<std::string, std::string>> FILE_KEY_ENUM_PROPERTIES = { 405 std::make_pair("ID", MEDIA_DATA_DB_ID), 406 std::make_pair("RELATIVE_PATH", MEDIA_DATA_DB_RELATIVE_PATH), 407 std::make_pair("DISPLAY_NAME", MEDIA_DATA_DB_NAME), 408 std::make_pair("PARENT", MEDIA_DATA_DB_PARENT_ID), 409 std::make_pair("MIME_TYPE", MEDIA_DATA_DB_MIME_TYPE), 410 std::make_pair("MEDIA_TYPE", MEDIA_DATA_DB_MEDIA_TYPE), 411 std::make_pair("SIZE", MEDIA_DATA_DB_SIZE), 412 std::make_pair("DATE_ADDED", MEDIA_DATA_DB_DATE_ADDED), 413 std::make_pair("DATE_MODIFIED", MEDIA_DATA_DB_DATE_MODIFIED), 414 std::make_pair("DATE_TAKEN", MEDIA_DATA_DB_DATE_TAKEN), 415 std::make_pair("TITLE", MEDIA_DATA_DB_TITLE), 416 std::make_pair("ARTIST", MEDIA_DATA_DB_ARTIST), 417 std::make_pair("AUDIOALBUM", MEDIA_DATA_DB_AUDIO_ALBUM), 418 std::make_pair("DURATION", MEDIA_DATA_DB_DURATION), 419 std::make_pair("WIDTH", MEDIA_DATA_DB_WIDTH), 420 std::make_pair("HEIGHT", MEDIA_DATA_DB_HEIGHT), 421 std::make_pair("ORIENTATION", MEDIA_DATA_DB_ORIENTATION), 422 std::make_pair("ALBUM_ID", MEDIA_DATA_DB_BUCKET_ID), 423 std::make_pair("ALBUM_NAME", MEDIA_DATA_DB_BUCKET_NAME) 424 }; 425 426 const std::vector<std::pair<std::string, std::string>> USERFILEMGR_FILEKEY_ENUM_PROPERTIES = { 427 std::make_pair("URI", MEDIA_DATA_DB_URI), 428 std::make_pair("RELATIVE_PATH", MEDIA_DATA_DB_RELATIVE_PATH), 429 std::make_pair("DISPLAY_NAME", MEDIA_DATA_DB_NAME), 430 std::make_pair("DATE_ADDED", MEDIA_DATA_DB_DATE_ADDED), 431 std::make_pair("DATE_MODIFIED", MEDIA_DATA_DB_DATE_MODIFIED), 432 std::make_pair("TITLE", MEDIA_DATA_DB_TITLE) 433 }; 434 435 const std::vector<std::pair<std::string, std::string>> AUDIOKEY_ENUM_PROPERTIES = { 436 std::make_pair("URI", MEDIA_DATA_DB_URI), 437 std::make_pair("DISPLAY_NAME", MEDIA_DATA_DB_NAME), 438 std::make_pair("DATE_ADDED", MEDIA_DATA_DB_DATE_ADDED), 439 std::make_pair("DATE_MODIFIED", MEDIA_DATA_DB_DATE_MODIFIED), 440 std::make_pair("TITLE", MEDIA_DATA_DB_TITLE), 441 std::make_pair("ARTIST", MEDIA_DATA_DB_ARTIST), 442 std::make_pair("AUDIOALBUM", MEDIA_DATA_DB_AUDIO_ALBUM), 443 std::make_pair("DURATION", MEDIA_DATA_DB_DURATION), 444 std::make_pair("FAVORITE", MEDIA_DATA_DB_IS_FAV), 445 std::make_pair("SIZE", MediaColumn::MEDIA_SIZE), 446 std::make_pair("PACKAGE_NAME", MediaColumn::MEDIA_PACKAGE_NAME) 447 }; 448 449 const std::vector<std::pair<std::string, std::string>> IMAGEVIDEOKEY_ENUM_PROPERTIES = { 450 std::make_pair("URI", MEDIA_DATA_DB_URI), 451 std::make_pair("DISPLAY_NAME", MediaColumn::MEDIA_NAME), 452 std::make_pair("DATE_ADDED", MediaColumn::MEDIA_DATE_ADDED), 453 std::make_pair("FILE_TYPE", MediaColumn::MEDIA_TYPE), 454 std::make_pair("PHOTO_TYPE", MediaColumn::MEDIA_TYPE), 455 std::make_pair("DATE_MODIFIED", MediaColumn::MEDIA_DATE_MODIFIED), 456 std::make_pair("TITLE", MediaColumn::MEDIA_TITLE), 457 std::make_pair("DURATION", MediaColumn::MEDIA_DURATION), 458 std::make_pair("WIDTH", PhotoColumn::PHOTO_WIDTH), 459 std::make_pair("HEIGHT", PhotoColumn::PHOTO_HEIGHT), 460 std::make_pair("DATE_TAKEN", MediaColumn::MEDIA_DATE_TAKEN), 461 std::make_pair("DATE_TAKEN_MS", MEDIA_DATA_DB_DATE_TAKEN_MS), 462 std::make_pair("DETAIL_TIME", PhotoColumn::PHOTO_DETAIL_TIME), 463 std::make_pair("ORIENTATION", PhotoColumn::PHOTO_ORIENTATION), 464 std::make_pair("FAVORITE", MediaColumn::MEDIA_IS_FAV), 465 std::make_pair("MEDIA_TYPE", MediaColumn::MEDIA_TYPE), 466 std::make_pair("DATE_TRASHED", MediaColumn::MEDIA_DATE_TRASHED), 467 std::make_pair("POSITION", PhotoColumn::PHOTO_POSITION), 468 std::make_pair("HIDDEN", MediaColumn::MEDIA_HIDDEN), 469 std::make_pair("SIZE", MediaColumn::MEDIA_SIZE), 470 std::make_pair("PACKAGE_NAME", MediaColumn::MEDIA_PACKAGE_NAME), 471 std::make_pair("CAMERA_SHOT_KEY", PhotoColumn::CAMERA_SHOT_KEY), 472 std::make_pair("USER_COMMENT", PhotoColumn::PHOTO_USER_COMMENT), 473 std::make_pair("DATE_YEAR", PhotoColumn::PHOTO_DATE_YEAR), 474 std::make_pair("DATE_MONTH", PhotoColumn::PHOTO_DATE_MONTH), 475 std::make_pair("DATE_DAY", PhotoColumn::PHOTO_DATE_DAY), 476 std::make_pair("PENDING", PENDING_STATUS), 477 std::make_pair("DATE_ADDED_MS", MEDIA_DATA_DB_DATE_ADDED_MS), 478 std::make_pair("DATE_MODIFIED_MS", MEDIA_DATA_DB_DATE_MODIFIED_MS), 479 std::make_pair("DATE_TRASHED_MS", MEDIA_DATA_DB_DATE_TRASHED_MS), 480 std::make_pair("PHOTO_SUBTYPE", PhotoColumn::PHOTO_SUBTYPE), 481 std::make_pair("DYNAMIC_RANGE_TYPE", PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE), 482 std::make_pair("LCD_SIZE", PhotoColumn::PHOTO_LCD_SIZE), 483 std::make_pair("THM_SIZE", PhotoColumn::PHOTO_THUMB_SIZE), 484 std::make_pair("MOVING_PHOTO_EFFECT_MODE", PhotoColumn::MOVING_PHOTO_EFFECT_MODE), 485 std::make_pair("COVER_POSITION", PhotoColumn::PHOTO_COVER_POSITION), 486 std::make_pair("BURST_COVER_LEVEL", PhotoColumn::PHOTO_BURST_COVER_LEVEL), 487 std::make_pair("BURST_KEY", PhotoColumn::PHOTO_BURST_KEY), 488 std::make_pair("THUMBNAIL_READY", PhotoColumn::PHOTO_THUMBNAIL_READY), 489 std::make_pair("CE_AVAILABLE", PhotoColumn::PHOTO_CE_AVAILABLE), 490 std::make_pair("OWNER_ALBUM_ID", PhotoColumn::PHOTO_OWNER_ALBUM_ID), 491 std::make_pair("THUMBNAIL_VISIBLE", PhotoColumn::PHOTO_THUMBNAIL_VISIBLE), 492 std::make_pair("SUPPORTED_WATERMARK_TYPE", PhotoColumn::SUPPORTED_WATERMARK_TYPE), 493 }; 494 495 const std::vector<std::pair<std::string, std::string>> ALBUMKEY_ENUM_PROPERTIES = { 496 std::make_pair("URI", MEDIA_DATA_DB_URI), 497 std::make_pair("ALBUM_NAME", PhotoAlbumColumns::ALBUM_NAME), 498 std::make_pair("FILE_TYPE", MEDIA_DATA_DB_MEDIA_TYPE), 499 std::make_pair("DATE_ADDED", MEDIA_DATA_DB_DATE_ADDED), 500 std::make_pair("DATE_MODIFIED", MEDIA_DATA_DB_DATE_MODIFIED), 501 }; 502 503 const std::vector<std::pair<std::string, std::string>> DEFAULT_URI_ENUM_PROPERTIES = { 504 std::make_pair("DEFAULT_PHOTO_URI", PhotoColumn::DEFAULT_PHOTO_URI), 505 std::make_pair("DEFAULT_ALBUM_URI", PhotoAlbumColumns::DEFAULT_PHOTO_ALBUM_URI), 506 std::make_pair("DEFAULT_AUDIO_URI", AudioColumn::DEFAULT_AUDIO_URI), 507 std::make_pair("DEFAULT_HIDDEN_ALBUM_URI", PhotoAlbumColumns::DEFAULT_HIDDEN_ALBUM_URI), 508 }; 509 510 const std::map<std::string, std::pair<std::string, int32_t>> LOCATION_PARAM_MAP = { 511 { START_LATITUDE, { LATITUDE, DataShare::GREATER_THAN_OR_EQUAL_TO } }, 512 { END_LATITUDE, { LATITUDE, DataShare::LESS_THAN } }, 513 { START_LONGITUDE, { LONGITUDE, DataShare::GREATER_THAN_OR_EQUAL_TO } }, 514 { END_LONGITUDE, { LONGITUDE, DataShare::LESS_THAN } }, 515 { DIAMETER, { DIAMETER, DataShare::EQUAL_TO } }, 516 { LANGUAGE, { LANGUAGE, DataShare::EQUAL_TO } }, 517 }; 518 519 struct JSAsyncContextOutput { 520 napi_value error; 521 napi_value data; 522 bool status; 523 }; 524 525 struct NapiClassInfo { 526 std::string name; 527 napi_ref *ref; 528 napi_value (*constructor)(napi_env, napi_callback_info); 529 std::vector<napi_property_descriptor> props; 530 }; 531 532 const std::vector<std::string> ALBUM_COLUMN = { 533 PhotoAlbumColumns::ALBUM_ID, 534 PhotoAlbumColumns::ALBUM_TYPE, 535 PhotoAlbumColumns::ALBUM_SUBTYPE, 536 PhotoAlbumColumns::ALBUM_NAME, 537 PhotoAlbumColumns::ALBUM_COVER_URI, 538 PhotoAlbumColumns::ALBUM_COUNT, 539 PhotoAlbumColumns::ALBUM_IMAGE_COUNT, 540 PhotoAlbumColumns::ALBUM_VIDEO_COUNT, 541 }; 542 543 const std::vector<std::string> PHOTO_COLUMN = { 544 MEDIA_DATA_DB_ID, 545 MEDIA_DATA_DB_FILE_PATH, 546 MEDIA_DATA_DB_MEDIA_TYPE, 547 MEDIA_DATA_DB_NAME, 548 MEDIA_DATA_DB_SIZE, 549 MEDIA_DATA_DB_DATE_ADDED, 550 MEDIA_DATA_DB_DATE_MODIFIED, 551 MEDIA_DATA_DB_DURATION, 552 MEDIA_DATA_DB_WIDTH, 553 MEDIA_DATA_DB_HEIGHT, 554 MEDIA_DATA_DB_DATE_TAKEN, 555 MEDIA_DATA_DB_ORIENTATION, 556 MEDIA_DATA_DB_IS_FAV, 557 MEDIA_DATA_DB_TITLE, 558 MEDIA_DATA_DB_POSITION, 559 MEDIA_DATA_DB_DATE_TRASHED, 560 MediaColumn::MEDIA_HIDDEN, 561 PhotoColumn::PHOTO_USER_COMMENT, 562 PhotoColumn::CAMERA_SHOT_KEY, 563 PhotoColumn::PHOTO_DATE_YEAR, 564 PhotoColumn::PHOTO_DATE_MONTH, 565 PhotoColumn::PHOTO_DATE_DAY, 566 MEDIA_DATA_DB_TIME_PENDING, 567 PhotoColumn::PHOTO_SUBTYPE, 568 PhotoColumn::MOVING_PHOTO_EFFECT_MODE, 569 PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, 570 PhotoColumn::PHOTO_THUMBNAIL_READY, 571 PhotoColumn::PHOTO_LCD_SIZE, 572 PhotoColumn::PHOTO_THUMB_SIZE, 573 }; 574 575 const std::set<std::string> TIME_COLUMN = { 576 MEDIA_DATA_DB_DATE_ADDED, 577 MEDIA_DATA_DB_DATE_MODIFIED, 578 MEDIA_DATA_DB_DATE_TRASHED, 579 }; 580 581 /* Util class used by napi asynchronous methods for making call to js callback function */ 582 class MediaLibraryNapiUtils { 583 public: GetTypeMap()584 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> &GetTypeMap() 585 { 586 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TYPE_MAP = { 587 {MEDIA_DATA_DB_ID, {TYPE_INT32, "fileId"}}, 588 {MEDIA_DATA_DB_FILE_PATH, {TYPE_STRING, "data"}}, 589 {MEDIA_DATA_DB_MEDIA_TYPE, {TYPE_INT32, "mediaType"}}, 590 {MEDIA_DATA_DB_NAME, {TYPE_STRING, "displayName"}}, 591 {MEDIA_DATA_DB_SIZE, {TYPE_INT64, "size"}}, 592 {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAddedMs"}}, 593 {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModifiedMs"}}, 594 {MEDIA_DATA_DB_DURATION, {TYPE_INT64, "duration"}}, 595 {MEDIA_DATA_DB_WIDTH, {TYPE_INT32, "width"}}, 596 {MEDIA_DATA_DB_HEIGHT, {TYPE_INT32, "height"}}, 597 {MEDIA_DATA_DB_DATE_TAKEN, {TYPE_INT64, "dateTaken"}}, 598 {MEDIA_DATA_DB_ORIENTATION, {TYPE_INT32, "orientation"}}, 599 {MEDIA_DATA_DB_IS_FAV, {TYPE_INT32, "isFavorite"}}, 600 {MEDIA_DATA_DB_TITLE, {TYPE_STRING, "title"}}, 601 {MEDIA_DATA_DB_POSITION, {TYPE_INT32, "position"}}, 602 {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashedMs"}}, 603 {MediaColumn::MEDIA_HIDDEN, {TYPE_INT32, "hidden"}}, 604 {PhotoColumn::PHOTO_USER_COMMENT, {TYPE_STRING, "userComment"}}, 605 {PhotoColumn::CAMERA_SHOT_KEY, {TYPE_STRING, "cameraShotKey"}}, 606 {PhotoColumn::PHOTO_DATE_YEAR, {TYPE_STRING, "dateYear"}}, 607 {PhotoColumn::PHOTO_DATE_MONTH, {TYPE_STRING, "dateMonth"}}, 608 {PhotoColumn::PHOTO_DATE_DAY, {TYPE_STRING, "dateDay"}}, 609 {MEDIA_DATA_DB_TIME_PENDING, {TYPE_INT64, "pending"}}, 610 {PhotoColumn::PHOTO_SUBTYPE, {TYPE_INT32, "subtype"}}, 611 {PhotoColumn::MOVING_PHOTO_EFFECT_MODE, {TYPE_INT32, "movingPhotoEffectMode"}}, 612 {PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, {TYPE_INT32, "dynamicRangeType"}}, 613 {PhotoColumn::PHOTO_THUMBNAIL_READY, {TYPE_INT64, "thumbnailModifiedMs"}}, 614 {PhotoColumn::PHOTO_LCD_SIZE, {TYPE_STRING, "lcdSize"}}, 615 {PhotoColumn::PHOTO_THUMB_SIZE, {TYPE_STRING, "thmSize"}}, 616 {MEDIA_DATA_DB_COUNT, {TYPE_INT32, "count"}}, 617 {PhotoAlbumColumns::ALBUM_ID, {TYPE_INT32, "albumId"}}, 618 {PhotoAlbumColumns::ALBUM_TYPE, {TYPE_INT32, "albumType"}}, 619 {PhotoAlbumColumns::ALBUM_SUBTYPE, {TYPE_INT32, "albumSubType"}}, 620 {PhotoAlbumColumns::ALBUM_NAME, {TYPE_STRING, "albumName"}}, 621 {PhotoAlbumColumns::ALBUM_COVER_URI, {TYPE_STRING, "coverUri"}}, 622 {PhotoAlbumColumns::ALBUM_COUNT, {TYPE_INT32, "count"}}, 623 {PhotoAlbumColumns::ALBUM_IMAGE_COUNT, {TYPE_INT32, "imageCount"}}, 624 {PhotoAlbumColumns::ALBUM_VIDEO_COUNT, {TYPE_INT32, "videoCount"}}, 625 }; 626 return TYPE_MAP; 627 } 628 GetTimeTypeMap()629 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>>& GetTimeTypeMap() 630 { 631 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TIME_TYPE_MAP = { 632 {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAdded"}}, 633 {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModified"}}, 634 {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashed"}}, 635 }; 636 return TIME_TYPE_MAP; 637 } 638 639 static napi_value NapiDefineClass(napi_env env, napi_value exports, const NapiClassInfo &info); 640 EXPORT static napi_value NapiAddStaticProps(napi_env env, napi_value exports, 641 const std::vector<napi_property_descriptor> &staticProps); 642 643 static napi_status GetUInt32(napi_env env, napi_value arg, uint32_t &value); 644 static napi_status GetInt32(napi_env env, napi_value arg, int32_t &value); 645 static napi_status GetDouble(napi_env env, napi_value arg, double &value); 646 static napi_status GetParamBool(napi_env env, napi_value arg, bool &result); 647 static napi_status GetUInt32Array(napi_env env, napi_value arg, std::vector<uint32_t> ¶m); 648 static napi_status GetParamFunction(napi_env env, napi_value arg, napi_ref &callbackRef); 649 static napi_status GetParamStringWithLength(napi_env env, napi_value arg, int32_t maxLen, 650 std::string &str); 651 static napi_status GetParamStringPathMax(napi_env env, napi_value arg, std::string &str); 652 static napi_status GetProperty(napi_env env, const napi_value arg, const std::string &propName, 653 std::string &propValue); 654 static napi_status GetArrayProperty(napi_env env, napi_value arg, const std::string &propName, 655 std::vector<std::string> &array); 656 static napi_status GetStringArray(napi_env env, napi_value arg, std::vector<std::string> &array); 657 static void UriAddTableName(std::string &uri, const std::string tableName); 658 static std::string GetFileIdFromUri(const std::string &uri); 659 static int32_t GetFileIdFromPhotoUri(const std::string &uri); 660 static MediaType GetMediaTypeFromUri(const std::string &uri); 661 template <class AsyncContext> 662 static napi_status GetPredicate(napi_env env, const napi_value arg, const std::string &propName, 663 AsyncContext &context, const FetchOptionType &fetchOptType, 664 std::vector<DataShare::OperationItem> operations = {}); 665 template <class AsyncContext> 666 static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context); 667 template <class AsyncContext> 668 static bool HandleSpecialPredicate(AsyncContext &context, 669 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType, 670 std::vector<DataShare::OperationItem> operations = {}); 671 template <class AsyncContext> 672 static void UpdateMediaTypeSelections(AsyncContext *context); 673 674 template <class AsyncContext> 675 static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 676 const size_t minArgs, const size_t maxArgs); 677 678 template <class AsyncContext> 679 static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 680 const size_t minArgs, const size_t maxArgs); 681 682 template <class AsyncContext> 683 static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 684 AsyncContext &context, std::vector<DataShare::OperationItem> operations = {}); 685 686 template <class AsyncContext> 687 static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 688 AsyncContext &context); 689 690 template <class AsyncContext> 691 static napi_status GetParamCallback(napi_env env, AsyncContext &context); 692 693 template <class AsyncContext> 694 static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info, 695 AsyncContext &context); 696 697 template <class AsyncContext> 698 static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool ¶m); 699 700 template <class AsyncContext> 701 static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context, 702 std::string ¶m); 703 template <class AsyncContext> 704 static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info, 705 AsyncContext &context, std::vector<std::string> &array); 706 707 template <class AsyncContext> 708 static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context, 709 int32_t &value); 710 711 template <class AsyncContext> 712 static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context); 713 714 static AssetType GetAssetType(MediaType type); 715 716 static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition); 717 718 template <class AsyncContext> 719 static bool GetLocationPredicate(AsyncContext &context, 720 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate); 721 722 static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet); 723 724 static int TransErrorCode(const std::string &Name, int error); 725 726 static void HandleError(napi_env env, int error, napi_value &errorObj, const std::string &Name); 727 728 static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode, 729 const std::string errMsg); 730 731 static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work, 732 const JSAsyncContextOutput &asyncContext); 733 734 template <class AsyncContext> 735 static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext, 736 const std::string &resourceName, void (*execute)(napi_env, void *), 737 void (*complete)(napi_env, napi_status, void *)); 738 739 static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value); 740 741 static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName); 742 743 static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName); 744 745 static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg); 746 747 static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize); 748 749 static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[], 750 bool &isCallback); 751 752 static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value); 753 754 static napi_value GetDoubleArg(napi_env env, napi_value arg, double &value); 755 756 static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value); 757 758 static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn, 759 std::function<bool(const std::string &columnName)> isValidColumn, NapiAssetType assetType, 760 const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC); 761 762 static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType, 763 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 764 static int32_t GetUserAlbumPredicates(const int32_t albumId, 765 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 766 static int32_t GetAnalysisAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 767 static int32_t GetFeaturedSinglePortraitAlbumPredicates( 768 const int32_t albumId, DataShare::DataSharePredicates &predicates); 769 static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 770 static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates); 771 static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates, 772 const bool hiddenOnly); 773 static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates); 774 static bool IsSystemApp(); 775 static std::string GetStringFetchProperty(napi_env env, napi_value arg, bool &err, bool &present, 776 const std::string &propertyName); 777 EXPORT static std::string ParseResultSet2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 778 const std::vector<std::string> &cloumns); 779 780 static std::string ParseAnalysisFace2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 781 const std::vector<std::string> &cloumns); 782 783 static std::string GetStringValueByColumn(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 784 const std::string columnName); 785 786 static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values); 787 static napi_value GetUriArrayFromAssets( 788 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 789 static napi_value GetStringArray( 790 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 791 static void FixSpecialDateType(std::string &selections); 792 static std::string TransferUri(const std::string &oldUri); 793 static std::string GetFileIdFromUriString(const std::string& uri); 794 static std::string GetAlbumIdFromUriString(const std::string& uri); 795 static napi_value GetSharedPhotoAssets(const napi_env& env, std::vector<std::string>& albumIds, 796 bool isSingleResult = false); 797 static napi_value GetSharedAlbumAssets(const napi_env& env, std::vector<std::string>& fileIds); 798 static void HandleCoverSharedPhotoAsset(napi_env env, int32_t index, napi_value result, 799 const std::string& name, const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 800 static napi_value GetNextRowObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet, 801 bool isShared = false); 802 static napi_value GetNextRowAlbumObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet); 803 static napi_value CreateValueByIndex(napi_env env, int32_t index, std::string name, 804 std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset); 805 static void handleTimeInfo(napi_env env, const std::string& name, napi_value result, int32_t index, 806 const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 807 808 template <class AsyncContext> 809 static napi_status ParsePredicates(napi_env env, 810 const napi_value arg, AsyncContext &context, const FetchOptionType &fetchOptType); 811 812 private: 813 static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt); 814 }; 815 816 class NapiScopeHandler { 817 public: 818 NapiScopeHandler(napi_env env); 819 ~NapiScopeHandler(); 820 bool IsValid(); 821 822 private: 823 napi_env env_; 824 napi_handle_scope scope_; 825 bool isValid_ = false; 826 }; 827 } // namespace Media 828 } // namespace OHOS 829 830 #endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_UTILS_H_ 831