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> ¶m); 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 ¶m); 507 508 template <class AsyncContext> 509 static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context, 510 std::string ¶m); 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