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 CHECK_COND_WITH_ERR_MESSAGE(env, cond, err, msg) \ 56 do { \ 57 if (!(cond)) { \ 58 NapiError::ThrowError(env, err, __FUNCTION__, __LINE__, msg); \ 59 return nullptr; \ 60 } \ 61 } while (0) 62 63 #define NAPI_ASSERT(env, cond, msg) CHECK_ARGS_WITH_MESSAGE(env, cond, msg) 64 65 #define GET_JS_ARGS(env, info, argc, argv, thisVar) \ 66 do { \ 67 void *data; \ 68 napi_get_cb_info(env, info, &(argc), argv, &(thisVar), &(data)); \ 69 } while (0) 70 71 #define GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar) \ 72 do { \ 73 void *data; \ 74 status = napi_get_cb_info(env, info, nullptr, nullptr, &(thisVar), &(data)); \ 75 } while (0) 76 77 #define GET_JS_ASYNC_CB_REF(env, arg, count, cbRef) \ 78 do { \ 79 napi_valuetype valueType = napi_undefined; \ 80 if ((napi_typeof(env, arg, &valueType) == napi_ok) && (valueType == napi_function)) { \ 81 napi_create_reference(env, arg, count, &(cbRef)); \ 82 } else { \ 83 NAPI_ERR_LOG("invalid arguments"); \ 84 NAPI_ASSERT(env, false, "type mismatch"); \ 85 } \ 86 } while (0) 87 88 #define ASSERT_NULLPTR_CHECK(env, result) \ 89 do { \ 90 if ((result) == nullptr) { \ 91 napi_get_undefined(env, &(result)); \ 92 return result; \ 93 } \ 94 } while (0) 95 96 #define NAPI_CREATE_PROMISE(env, callbackRef, deferred, result) \ 97 do { \ 98 if ((callbackRef) == nullptr) { \ 99 napi_create_promise(env, &(deferred), &(result)); \ 100 } \ 101 } while (0) 102 103 #define NAPI_CREATE_RESOURCE_NAME(env, resource, resourceName, context) \ 104 do { \ 105 napi_create_string_utf8(env, resourceName, NAPI_AUTO_LENGTH, &(resource)); \ 106 (context)->SetApiName(resourceName); \ 107 } while (0) 108 109 #define CHECK_NULL_PTR_RETURN_UNDEFINED(env, ptr, ret, message) \ 110 do { \ 111 if ((ptr) == nullptr) { \ 112 NAPI_ERR_LOG(message); \ 113 napi_get_undefined(env, &(ret)); \ 114 return ret; \ 115 } \ 116 } while (0) 117 118 #define CHECK_NULL_PTR_RETURN_VOID(ptr, message) \ 119 do { \ 120 if ((ptr) == nullptr) { \ 121 NAPI_ERR_LOG(message); \ 122 return; \ 123 } \ 124 } while (0) 125 #define CHECK_IF_EQUAL(condition, errMsg, ...) \ 126 do { \ 127 if (!(condition)) { \ 128 NAPI_ERR_LOG(errMsg, ##__VA_ARGS__); \ 129 return; \ 130 } \ 131 } while (0) 132 133 #define CHECK_COND_RET(cond, ret, message, ...) \ 134 do { \ 135 if (!(cond)) { \ 136 NAPI_ERR_LOG(message, ##__VA_ARGS__); \ 137 return ret; \ 138 } \ 139 } while (0) 140 141 #define CHECK_STATUS_RET(cond, message) \ 142 do { \ 143 napi_status __ret = (cond); \ 144 if (__ret != napi_ok) { \ 145 NAPI_ERR_LOG(message); \ 146 return __ret; \ 147 } \ 148 } while (0) 149 150 #define CHECK_NULLPTR_RET(ret) \ 151 do { \ 152 if ((ret) == nullptr) { \ 153 return nullptr; \ 154 } \ 155 } while (0) 156 157 #define CHECK_ARGS_BASE(env, cond, err, retVal) \ 158 do { \ 159 if ((cond) != napi_ok) { \ 160 NapiError::ThrowError(env, err, __FUNCTION__, __LINE__); \ 161 return retVal; \ 162 } \ 163 } while (0) 164 165 #define CHECK_ARGS(env, cond, err) CHECK_ARGS_BASE(env, cond, err, nullptr) 166 167 #define CHECK_ARGS_THROW_INVALID_PARAM(env, cond) CHECK_ARGS(env, cond, OHOS_INVALID_PARAM_CODE) 168 169 #define CHECK_ARGS_RET_VOID(env, cond, err) CHECK_ARGS_BASE(env, cond, err, NAPI_RETVAL_NOTHING) 170 171 #define CHECK_COND(env, cond, err) \ 172 do { \ 173 if (!(cond)) { \ 174 NapiError::ThrowError(env, err, __FUNCTION__, __LINE__); \ 175 return nullptr; \ 176 } \ 177 } while (0) 178 179 #define RETURN_NAPI_TRUE(env) \ 180 do { \ 181 napi_value result = nullptr; \ 182 CHECK_ARGS(env, napi_get_boolean(env, true, &result), JS_INNER_FAIL); \ 183 return result; \ 184 } while (0) 185 186 #define RETURN_NAPI_UNDEFINED(env) \ 187 do { \ 188 napi_value result = nullptr; \ 189 CHECK_ARGS(env, napi_get_undefined(env, &result), JS_INNER_FAIL); \ 190 return result; \ 191 } while (0) 192 193 #define CHECK_ARGS_WITH_MEG(env, cond, err, msg) \ 194 do { \ 195 if (!(cond)) { \ 196 NapiError::ThrowError(env, err, __FUNCTION__, __LINE__, msg); \ 197 return nullptr; \ 198 } \ 199 } while (0) 200 namespace OHOS { 201 namespace Media { 202 #define EXPORT __attribute__ ((visibility ("default"))) 203 204 /* Constants for array index */ 205 const int32_t PARAM0 = 0; 206 const int32_t PARAM1 = 1; 207 const int32_t PARAM2 = 2; 208 const int32_t PARAM3 = 3; 209 const int32_t PARAM4 = 4; 210 const int32_t PARAM5 = 5; 211 const int32_t PARAM6 = 6; 212 213 /* Constants for array size */ 214 const int32_t ARGS_ZERO = 0; 215 const int32_t ARGS_ONE = 1; 216 const int32_t ARGS_TWO = 2; 217 const int32_t ARGS_THREE = 3; 218 const int32_t ARGS_FOUR = 4; 219 const int32_t ARGS_FIVE = 5; 220 const int32_t ARGS_SIX = 6; 221 const int32_t ARGS_SEVEN = 7; 222 const int32_t ARG_BUF_SIZE = 384; // 256 for display name and 128 for relative path 223 constexpr uint32_t NAPI_INIT_REF_COUNT = 1; 224 225 constexpr size_t NAPI_ARGC_MAX = 6; 226 227 // Error codes 228 const int32_t ERR_DEFAULT = 0; 229 const int32_t ERR_MEM_ALLOCATION = 2; 230 const int32_t ERR_INVALID_OUTPUT = 3; 231 232 const int32_t TRASH_SMART_ALBUM_ID = 1; 233 const std::string TRASH_SMART_ALBUM_NAME = "TrashAlbum"; 234 const int32_t FAVORIT_SMART_ALBUM_ID = 2; 235 const std::string FAVORIT_SMART_ALBUM_NAME = "FavoritAlbum"; 236 237 const std::string API_VERSION = "api_version"; 238 239 const std::string PENDING_STATUS = "pending"; 240 241 enum NapiAssetType { 242 TYPE_DEFAULT = 0, 243 TYPE_AUDIO = 1, 244 TYPE_PHOTO = 2, 245 TYPE_ALBUM = 3, 246 }; 247 248 enum AlbumType { 249 TYPE_VIDEO_ALBUM = 0, 250 TYPE_IMAGE_ALBUM = 1, 251 TYPE_NONE = 2, 252 }; 253 254 enum FetchOptionType { 255 ASSET_FETCH_OPT = 0, 256 ALBUM_FETCH_OPT = 1 257 }; 258 259 enum HiddenPhotosDisplayMode { 260 ASSETS_MODE = 0, 261 ALBUMS_MODE = 1 262 }; 263 264 struct JSAsyncContextOutput { 265 napi_value error; 266 napi_value data; 267 bool status; 268 napi_value realErr; 269 }; 270 271 struct NapiClassInfo { 272 std::string name; 273 napi_ref *ref; 274 napi_value (*constructor)(napi_env, napi_callback_info); 275 std::vector<napi_property_descriptor> props; 276 }; 277 278 typedef union ColumnUnion { ~ColumnUnion()279 ~ColumnUnion() {}; 280 std::string sval_; 281 int ival_; 282 int64_t lval_; 283 double dval_; 284 } ColumnUnion; 285 286 struct RowObject; 287 struct ColumnInfo { 288 std::string columnName_; 289 std::string tmpName_; 290 ColumnUnion tmpNameValue_{}; 291 std::string timeInfoKey_; 292 int64_t timeInfoVal_{0}; 293 int32_t thumbnailReady_{0}; 294 std::shared_ptr<RowObject> coverSharedPhotoAsset_; 295 }; 296 297 struct RowObject { 298 std::vector<std::shared_ptr<ColumnInfo>> columnVector_; 299 std::string dbUri_; 300 }; 301 302 /* Util class used by napi asynchronous methods for making call to js callback function */ 303 class MediaLibraryNapiUtils { 304 public: GetTypeMap()305 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> &GetTypeMap() 306 { 307 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TYPE_MAP = { 308 {MEDIA_DATA_DB_ID, {TYPE_INT32, "fileId"}}, 309 {MEDIA_DATA_DB_FILE_PATH, {TYPE_STRING, "data"}}, 310 {MEDIA_DATA_DB_MEDIA_TYPE, {TYPE_INT32, "mediaType"}}, 311 {MEDIA_DATA_DB_NAME, {TYPE_STRING, "displayName"}}, 312 {MEDIA_DATA_DB_SIZE, {TYPE_INT64, "size"}}, 313 {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAddedMs"}}, 314 {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModifiedMs"}}, 315 {MEDIA_DATA_DB_DURATION, {TYPE_INT64, "duration"}}, 316 {MEDIA_DATA_DB_WIDTH, {TYPE_INT32, "width"}}, 317 {MEDIA_DATA_DB_HEIGHT, {TYPE_INT32, "height"}}, 318 {MEDIA_DATA_DB_DATE_TAKEN, {TYPE_INT64, "dateTaken"}}, 319 {MEDIA_DATA_DB_ORIENTATION, {TYPE_INT32, "orientation"}}, 320 {MEDIA_DATA_DB_IS_FAV, {TYPE_INT32, "isFavorite"}}, 321 {MEDIA_DATA_DB_TITLE, {TYPE_STRING, "title"}}, 322 {MEDIA_DATA_DB_POSITION, {TYPE_INT32, "position"}}, 323 {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashedMs"}}, 324 {MediaColumn::MEDIA_HIDDEN, {TYPE_INT32, "hidden"}}, 325 {PhotoColumn::PHOTO_USER_COMMENT, {TYPE_STRING, "userComment"}}, 326 {PhotoColumn::CAMERA_SHOT_KEY, {TYPE_STRING, "cameraShotKey"}}, 327 {PhotoColumn::PHOTO_DATE_YEAR, {TYPE_STRING, "dateYear"}}, 328 {PhotoColumn::PHOTO_DATE_MONTH, {TYPE_STRING, "dateMonth"}}, 329 {PhotoColumn::PHOTO_DATE_DAY, {TYPE_STRING, "dateDay"}}, 330 {MEDIA_DATA_DB_TIME_PENDING, {TYPE_INT64, "pending"}}, 331 {PhotoColumn::PHOTO_SUBTYPE, {TYPE_INT32, "subtype"}}, 332 {PhotoColumn::MOVING_PHOTO_EFFECT_MODE, {TYPE_INT32, "movingPhotoEffectMode"}}, 333 {PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, {TYPE_INT32, "dynamicRangeType"}}, 334 {PhotoColumn::PHOTO_THUMBNAIL_READY, {TYPE_INT64, "thumbnailModifiedMs"}}, 335 {PhotoColumn::PHOTO_LCD_SIZE, {TYPE_STRING, "lcdSize"}}, 336 {PhotoColumn::PHOTO_THUMB_SIZE, {TYPE_STRING, "thmSize"}}, 337 {PhotoColumn::PHOTO_OWNER_ALBUM_ID, {TYPE_INT32, "ownerAlbumId"}}, 338 {MEDIA_DATA_DB_COUNT, {TYPE_INT32, "count"}}, 339 {PhotoAlbumColumns::ALBUM_ID, {TYPE_INT32, "albumId"}}, 340 {PhotoAlbumColumns::ALBUM_TYPE, {TYPE_INT32, "albumType"}}, 341 {PhotoAlbumColumns::ALBUM_SUBTYPE, {TYPE_INT32, "albumSubType"}}, 342 {PhotoAlbumColumns::ALBUM_NAME, {TYPE_STRING, "albumName"}}, 343 {PhotoAlbumColumns::ALBUM_COVER_URI, {TYPE_STRING, "coverUri"}}, 344 {PhotoAlbumColumns::ALBUM_COUNT, {TYPE_INT32, "count"}}, 345 {PhotoAlbumColumns::ALBUM_IMAGE_COUNT, {TYPE_INT32, "imageCount"}}, 346 {PhotoAlbumColumns::ALBUM_VIDEO_COUNT, {TYPE_INT32, "videoCount"}}, 347 }; 348 return TYPE_MAP; 349 } 350 GetTimeTypeMap()351 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>>& GetTimeTypeMap() 352 { 353 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TIME_TYPE_MAP = { 354 {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAdded"}}, 355 {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModified"}}, 356 {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashed"}}, 357 }; 358 return TIME_TYPE_MAP; 359 } 360 361 static napi_value NapiDefineClass(napi_env env, napi_value exports, const NapiClassInfo &info); 362 EXPORT static napi_value NapiAddStaticProps(napi_env env, napi_value exports, 363 const std::vector<napi_property_descriptor> &staticProps); 364 365 static napi_status GetUInt32(napi_env env, napi_value arg, uint32_t &value); 366 static napi_status GetInt32(napi_env env, napi_value arg, int32_t &value); 367 static napi_status GetDouble(napi_env env, napi_value arg, double &value); 368 static napi_status GetParamBool(napi_env env, napi_value arg, bool &result); 369 static napi_status GetUInt32Array(napi_env env, napi_value arg, std::vector<uint32_t> ¶m); 370 static napi_status GetInt32Array(napi_env env, napi_value arg, std::vector<int32_t> ¶m); 371 static napi_status GetParamFunction(napi_env env, napi_value arg, napi_ref &callbackRef); 372 static napi_status GetParamStringWithLength(napi_env env, napi_value arg, int32_t maxLen, 373 std::string &str); 374 static napi_status GetParamStringPathMax(napi_env env, napi_value arg, std::string &str); 375 static napi_status GetProperty(napi_env env, const napi_value arg, const std::string &propName, 376 std::string &propValue); 377 static napi_status GetArrayProperty(napi_env env, napi_value arg, const std::string &propName, 378 std::vector<std::string> &array); 379 static napi_status GetStringArrayFromInt32(napi_env env, napi_value arg, std::vector<std::string> &array); 380 static napi_status GetStringArray(napi_env env, napi_value arg, std::vector<std::string> &array); 381 static void UriAddTableName(std::string &uri, const std::string tableName); 382 static std::string GetFileIdFromUri(const std::string &uri); 383 static std::string GetUserIdFromUri(const std::string &uri); 384 static int32_t GetFileIdFromPhotoUri(const std::string &uri); 385 static MediaType GetMediaTypeFromUri(const std::string &uri); 386 template <class AsyncContext> 387 static napi_status GetPredicate(napi_env env, const napi_value arg, const std::string &propName, 388 AsyncContext &context, const FetchOptionType &fetchOptType, 389 std::vector<DataShare::OperationItem> operations = {}); 390 template <class AsyncContext> 391 static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context); 392 template <class AsyncContext> 393 static bool HandleSpecialPredicate(AsyncContext &context, 394 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType, 395 std::vector<DataShare::OperationItem> operations = {}); 396 template <class AsyncContext> 397 static void UpdateMediaTypeSelections(AsyncContext *context); 398 399 template <class AsyncContext> 400 static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 401 const size_t minArgs, const size_t maxArgs); 402 403 template <class AsyncContext> 404 static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 405 const size_t minArgs, const size_t maxArgs); 406 407 template <class AsyncContext> 408 static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 409 AsyncContext &context, std::vector<DataShare::OperationItem> operations = {}); 410 411 template <class AsyncContext> 412 static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 413 AsyncContext &context); 414 415 template <class AsyncContext> 416 static napi_status GetParamCallback(napi_env env, AsyncContext &context); 417 418 template <class AsyncContext> 419 static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info, 420 AsyncContext &context); 421 422 template <class AsyncContext> 423 static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool ¶m); 424 425 template <class AsyncContext> 426 static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context, 427 std::string ¶m); 428 template <class AsyncContext> 429 static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info, 430 AsyncContext &context, std::vector<std::string> &array); 431 432 template <class AsyncContext> 433 static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context, 434 int32_t &value); 435 436 template <class AsyncContext> 437 static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context); 438 439 static napi_value ParseAssetIdArray(napi_env env, napi_value arg, std::vector<std::string> &idArray); 440 441 static napi_value ParseIntegerArray(napi_env env, napi_value arg, std::vector<int32_t> &intArray); 442 443 static AssetType GetAssetType(MediaType type); 444 445 static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition); 446 447 template <class AsyncContext> 448 static bool GetLocationPredicate(AsyncContext &context, 449 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate); 450 451 static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet); 452 453 EXPORT static int TransErrorCode(const std::string &Name, int error); 454 455 static void HandleError( 456 napi_env env, int error, napi_value &errorObj, const std::string &Name, int32_t realErr = 0); 457 458 static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode, 459 const std::string errMsg); 460 461 static void InvokeJSAsyncMethodWithoutWork(napi_env env, napi_deferred deferred, napi_ref callbackRef, 462 const JSAsyncContextOutput &asyncContext); 463 464 static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work, 465 const JSAsyncContextOutput &asyncContext); 466 467 template <class AsyncContext> 468 static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext, 469 const std::string &resourceName, void (*execute)(napi_env, void *), 470 void (*complete)(napi_env, napi_status, void *)); 471 472 static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value); 473 474 static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName); 475 476 static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName); 477 478 static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg); 479 480 static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize); 481 482 static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[], 483 bool &isCallback); 484 485 static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value); 486 487 static napi_value GetDoubleArg(napi_env env, napi_value arg, double &value); 488 489 EXPORT static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value); 490 491 static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn, 492 std::function<bool(const std::string &columnName)> isValidColumn, NapiAssetType assetType, 493 const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC); 494 495 EXPORT static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType, 496 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 497 EXPORT static int32_t GetUserAlbumPredicates(const int32_t albumId, 498 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 499 EXPORT static int32_t GetAnalysisPhotoMapPredicates(const int32_t albumId, 500 DataShare::DataSharePredicates &predicates); 501 EXPORT static int32_t GetFeaturedSinglePortraitAlbumPredicates( 502 const int32_t albumId, DataShare::DataSharePredicates &predicates); 503 EXPORT static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 504 EXPORT static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates); 505 EXPORT static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates, 506 const bool hiddenOnly); 507 EXPORT static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates); 508 EXPORT static bool IsSystemApp(); 509 static std::string GetStringFetchProperty(napi_env env, napi_value arg, bool &err, bool &present, 510 const std::string &propertyName); 511 EXPORT static std::string ParseResultSet2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 512 const std::vector<std::string> &cloumns, const int32_t &analysisType = ANALYSIS_INVALID); 513 514 static std::string ParseColumnNeedCompatible(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 515 const int32_t &analysisType, const std::string &columnName); 516 517 static size_t GetActualSize(const std::vector<uint8_t>& buffer); 518 519 static std::vector<std::vector<double>> FeatureDeserialize(const std::vector<uint8_t> &buffer); 520 521 static std::string FeatureDeserializeToStr(const std::vector<uint8_t> &buffer); 522 523 static std::string ParseAnalysisFace2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 524 const std::vector<std::string> &cloumns, const int32_t &analysisType = ANALYSIS_INVALID); 525 526 static std::string GetStringValueByColumn(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 527 const std::string columnName); 528 529 static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values); 530 static napi_value GetUriArrayFromAssets( 531 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 532 static napi_value GetIdArrayFromAssets( 533 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 534 static napi_value GetStringArray( 535 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 536 static void FixSpecialDateType(std::string &selections); 537 static std::string TransferUri(const std::string &oldUri); 538 static std::string GetFileIdFromUriString(const std::string& uri); 539 static std::string GetAlbumIdFromUriString(const std::string& uri); 540 static napi_value GetSharedPhotoAssets(const napi_env& env, std::shared_ptr<NativeRdb::ResultSet> result, 541 int32_t size, bool isSingleResult = false); 542 static napi_value GetSharedAlbumAssets(const napi_env& env, std::shared_ptr<NativeRdb::ResultSet> result, 543 int32_t size); 544 static napi_value GetSharedPhotoAssets(const napi_env& env, std::vector<std::string>& fileIds, 545 bool isSingleResult); 546 static void HandleCoverSharedPhotoAsset(napi_env env, int32_t index, napi_value result, 547 const std::string& name, const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 548 static napi_value GetNextRowObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet, 549 bool isShared = false); 550 static napi_value GetNextRowAlbumObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet); 551 static napi_value CreateValueByIndex(napi_env env, int32_t index, std::string name, 552 std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset); 553 static void handleTimeInfo(napi_env env, const std::string& name, napi_value result, int32_t index, 554 const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 555 556 template <class AsyncContext> 557 static napi_status ParsePredicates(napi_env env, 558 const napi_value arg, AsyncContext &context, const FetchOptionType &fetchOptType); 559 560 static int ParseNextRowObject(std::shared_ptr<RowObject>& rowObj, std::shared_ptr<NativeRdb::ResultSet>& resultSet, 561 bool isShared); 562 static int ParseNextRowAlbumObject(std::shared_ptr<RowObject>& rowObj, 563 std::shared_ptr<NativeRdb::ResultSet> &resultSet); 564 static napi_value BuildNextRowObject(const napi_env& env, std::shared_ptr<RowObject>& rowObj, bool isShared); 565 static napi_value BuildNextRowAlbumObject(const napi_env& env, std::shared_ptr<RowObject>& rowObj); 566 static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt); 567 568 private: 569 static napi_value BuildValueByIndex(const napi_env& env, int32_t index, const std::string& name, 570 ColumnUnion& tmpNameValue); 571 static int ParseValueByIndex(std::shared_ptr<ColumnInfo>& columnInfo, int32_t index, const std::string& name, 572 std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset); 573 static int ParseTimeInfo(const std::string& name, std::shared_ptr<ColumnInfo>& columnInfo, int32_t index, 574 const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 575 static void BuildTimeInfo(const napi_env& env, const std::string& name, napi_value& result, int32_t index, 576 std::shared_ptr<ColumnInfo>& columnInfo); 577 static int ParseThumbnailReady(const std::string& name, std::shared_ptr<ColumnInfo>& columnInfo, int32_t index, 578 const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 579 static void BuildThumbnailReady(const napi_env& env, const std::string& name, napi_value& result, int32_t index, 580 std::shared_ptr<ColumnInfo>& columnInfo); 581 static int ParseCoverSharedPhotoAsset(int32_t index, std::shared_ptr<ColumnInfo>& columnInfo, 582 const std::string& name, const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 583 static int ParseSingleSharedPhotoAssets(std::shared_ptr<ColumnInfo>& columnInfo, 584 std::shared_ptr<NativeRdb::ResultSet>& result); 585 }; 586 587 class NapiScopeHandler { 588 public: 589 NapiScopeHandler(napi_env env); 590 ~NapiScopeHandler(); 591 bool IsValid(); 592 593 private: 594 napi_env env_; 595 napi_handle_scope scope_; 596 bool isValid_ = false; 597 }; 598 } // namespace Media 599 } // namespace OHOS 600 601 #endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_UTILS_H_ 602