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 struct JSAsyncContextOutput { 250 napi_value error; 251 napi_value data; 252 bool status; 253 }; 254 255 struct NapiClassInfo { 256 std::string name; 257 napi_ref *ref; 258 napi_value (*constructor)(napi_env, napi_callback_info); 259 std::vector<napi_property_descriptor> props; 260 }; 261 262 typedef union ColumnUnion { ~ColumnUnion()263 ~ColumnUnion() {}; 264 std::string sval_; 265 int ival_; 266 int64_t lval_; 267 double dval_; 268 } ColumnUnion; 269 270 struct RowObject; 271 struct ColumnInfo { 272 std::string columnName_; 273 std::string tmpName_; 274 ColumnUnion tmpNameValue_{}; 275 std::string timeInfoKey_; 276 int64_t timeInfoVal_{0}; 277 int32_t thumbnailReady_{0}; 278 std::shared_ptr<RowObject> coverSharedPhotoAsset_; 279 }; 280 281 struct RowObject { 282 std::vector<std::shared_ptr<ColumnInfo>> columnVector_; 283 std::string dbUri_; 284 }; 285 286 /* Util class used by napi asynchronous methods for making call to js callback function */ 287 class MediaLibraryNapiUtils { 288 public: GetTypeMap()289 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> &GetTypeMap() 290 { 291 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TYPE_MAP = { 292 {MEDIA_DATA_DB_ID, {TYPE_INT32, "fileId"}}, 293 {MEDIA_DATA_DB_FILE_PATH, {TYPE_STRING, "data"}}, 294 {MEDIA_DATA_DB_MEDIA_TYPE, {TYPE_INT32, "mediaType"}}, 295 {MEDIA_DATA_DB_NAME, {TYPE_STRING, "displayName"}}, 296 {MEDIA_DATA_DB_SIZE, {TYPE_INT64, "size"}}, 297 {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAddedMs"}}, 298 {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModifiedMs"}}, 299 {MEDIA_DATA_DB_DURATION, {TYPE_INT64, "duration"}}, 300 {MEDIA_DATA_DB_WIDTH, {TYPE_INT32, "width"}}, 301 {MEDIA_DATA_DB_HEIGHT, {TYPE_INT32, "height"}}, 302 {MEDIA_DATA_DB_DATE_TAKEN, {TYPE_INT64, "dateTaken"}}, 303 {MEDIA_DATA_DB_ORIENTATION, {TYPE_INT32, "orientation"}}, 304 {MEDIA_DATA_DB_IS_FAV, {TYPE_INT32, "isFavorite"}}, 305 {MEDIA_DATA_DB_TITLE, {TYPE_STRING, "title"}}, 306 {MEDIA_DATA_DB_POSITION, {TYPE_INT32, "position"}}, 307 {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashedMs"}}, 308 {MediaColumn::MEDIA_HIDDEN, {TYPE_INT32, "hidden"}}, 309 {PhotoColumn::PHOTO_USER_COMMENT, {TYPE_STRING, "userComment"}}, 310 {PhotoColumn::CAMERA_SHOT_KEY, {TYPE_STRING, "cameraShotKey"}}, 311 {PhotoColumn::PHOTO_DATE_YEAR, {TYPE_STRING, "dateYear"}}, 312 {PhotoColumn::PHOTO_DATE_MONTH, {TYPE_STRING, "dateMonth"}}, 313 {PhotoColumn::PHOTO_DATE_DAY, {TYPE_STRING, "dateDay"}}, 314 {MEDIA_DATA_DB_TIME_PENDING, {TYPE_INT64, "pending"}}, 315 {PhotoColumn::PHOTO_SUBTYPE, {TYPE_INT32, "subtype"}}, 316 {PhotoColumn::MOVING_PHOTO_EFFECT_MODE, {TYPE_INT32, "movingPhotoEffectMode"}}, 317 {PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, {TYPE_INT32, "dynamicRangeType"}}, 318 {PhotoColumn::PHOTO_THUMBNAIL_READY, {TYPE_INT64, "thumbnailModifiedMs"}}, 319 {PhotoColumn::PHOTO_LCD_SIZE, {TYPE_STRING, "lcdSize"}}, 320 {PhotoColumn::PHOTO_THUMB_SIZE, {TYPE_STRING, "thmSize"}}, 321 {PhotoColumn::PHOTO_OWNER_ALBUM_ID, {TYPE_INT32, "ownerAlbumId"}}, 322 {MEDIA_DATA_DB_COUNT, {TYPE_INT32, "count"}}, 323 {PhotoAlbumColumns::ALBUM_ID, {TYPE_INT32, "albumId"}}, 324 {PhotoAlbumColumns::ALBUM_TYPE, {TYPE_INT32, "albumType"}}, 325 {PhotoAlbumColumns::ALBUM_SUBTYPE, {TYPE_INT32, "albumSubType"}}, 326 {PhotoAlbumColumns::ALBUM_NAME, {TYPE_STRING, "albumName"}}, 327 {PhotoAlbumColumns::ALBUM_COVER_URI, {TYPE_STRING, "coverUri"}}, 328 {PhotoAlbumColumns::ALBUM_COUNT, {TYPE_INT32, "count"}}, 329 {PhotoAlbumColumns::ALBUM_IMAGE_COUNT, {TYPE_INT32, "imageCount"}}, 330 {PhotoAlbumColumns::ALBUM_VIDEO_COUNT, {TYPE_INT32, "videoCount"}}, 331 }; 332 return TYPE_MAP; 333 } 334 GetTimeTypeMap()335 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>>& GetTimeTypeMap() 336 { 337 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TIME_TYPE_MAP = { 338 {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAdded"}}, 339 {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModified"}}, 340 {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashed"}}, 341 }; 342 return TIME_TYPE_MAP; 343 } 344 345 static napi_value NapiDefineClass(napi_env env, napi_value exports, const NapiClassInfo &info); 346 EXPORT static napi_value NapiAddStaticProps(napi_env env, napi_value exports, 347 const std::vector<napi_property_descriptor> &staticProps); 348 349 static napi_status GetUInt32(napi_env env, napi_value arg, uint32_t &value); 350 static napi_status GetInt32(napi_env env, napi_value arg, int32_t &value); 351 static napi_status GetDouble(napi_env env, napi_value arg, double &value); 352 static napi_status GetParamBool(napi_env env, napi_value arg, bool &result); 353 static napi_status GetUInt32Array(napi_env env, napi_value arg, std::vector<uint32_t> ¶m); 354 static napi_status GetParamFunction(napi_env env, napi_value arg, napi_ref &callbackRef); 355 static napi_status GetParamStringWithLength(napi_env env, napi_value arg, int32_t maxLen, 356 std::string &str); 357 static napi_status GetParamStringPathMax(napi_env env, napi_value arg, std::string &str); 358 static napi_status GetProperty(napi_env env, const napi_value arg, const std::string &propName, 359 std::string &propValue); 360 static napi_status GetArrayProperty(napi_env env, napi_value arg, const std::string &propName, 361 std::vector<std::string> &array); 362 static napi_status GetStringArrayFromInt32(napi_env env, napi_value arg, std::vector<std::string> &array); 363 static napi_status GetStringArray(napi_env env, napi_value arg, std::vector<std::string> &array); 364 static void UriAddTableName(std::string &uri, const std::string tableName); 365 static std::string GetFileIdFromUri(const std::string &uri); 366 static std::string GetUserIdFromUri(const std::string &uri); 367 static int32_t GetFileIdFromPhotoUri(const std::string &uri); 368 static MediaType GetMediaTypeFromUri(const std::string &uri); 369 template <class AsyncContext> 370 static napi_status GetPredicate(napi_env env, const napi_value arg, const std::string &propName, 371 AsyncContext &context, const FetchOptionType &fetchOptType, 372 std::vector<DataShare::OperationItem> operations = {}); 373 template <class AsyncContext> 374 static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context); 375 template <class AsyncContext> 376 static bool HandleSpecialPredicate(AsyncContext &context, 377 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType, 378 std::vector<DataShare::OperationItem> operations = {}); 379 template <class AsyncContext> 380 static void UpdateMediaTypeSelections(AsyncContext *context); 381 382 template <class AsyncContext> 383 static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 384 const size_t minArgs, const size_t maxArgs); 385 386 template <class AsyncContext> 387 static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 388 const size_t minArgs, const size_t maxArgs); 389 390 template <class AsyncContext> 391 static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 392 AsyncContext &context, std::vector<DataShare::OperationItem> operations = {}); 393 394 template <class AsyncContext> 395 static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 396 AsyncContext &context); 397 398 template <class AsyncContext> 399 static napi_status GetParamCallback(napi_env env, AsyncContext &context); 400 401 template <class AsyncContext> 402 static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info, 403 AsyncContext &context); 404 405 template <class AsyncContext> 406 static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool ¶m); 407 408 template <class AsyncContext> 409 static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context, 410 std::string ¶m); 411 template <class AsyncContext> 412 static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info, 413 AsyncContext &context, std::vector<std::string> &array); 414 415 template <class AsyncContext> 416 static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context, 417 int32_t &value); 418 419 template <class AsyncContext> 420 static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context); 421 422 static napi_value ParseAssetIdArray(napi_env env, napi_value arg, std::vector<std::string> &idArray); 423 424 static napi_value ParseIntegerArray(napi_env env, napi_value arg, std::vector<int32_t> &intArray); 425 426 static AssetType GetAssetType(MediaType type); 427 428 static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition); 429 430 template <class AsyncContext> 431 static bool GetLocationPredicate(AsyncContext &context, 432 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate); 433 434 static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet); 435 436 EXPORT static int TransErrorCode(const std::string &Name, int error); 437 438 static void HandleError(napi_env env, int error, napi_value &errorObj, const std::string &Name); 439 440 static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode, 441 const std::string errMsg); 442 443 static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work, 444 const JSAsyncContextOutput &asyncContext); 445 446 template <class AsyncContext> 447 static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext, 448 const std::string &resourceName, void (*execute)(napi_env, void *), 449 void (*complete)(napi_env, napi_status, void *)); 450 451 static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value); 452 453 static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName); 454 455 static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName); 456 457 static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg); 458 459 static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize); 460 461 static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[], 462 bool &isCallback); 463 464 static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value); 465 466 static napi_value GetDoubleArg(napi_env env, napi_value arg, double &value); 467 468 EXPORT static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value); 469 470 static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn, 471 std::function<bool(const std::string &columnName)> isValidColumn, NapiAssetType assetType, 472 const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC); 473 474 EXPORT static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType, 475 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 476 EXPORT static int32_t GetUserAlbumPredicates(const int32_t albumId, 477 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 478 EXPORT static int32_t GetAnalysisAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 479 EXPORT static int32_t GetFeaturedSinglePortraitAlbumPredicates( 480 const int32_t albumId, DataShare::DataSharePredicates &predicates); 481 EXPORT static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 482 EXPORT static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates); 483 EXPORT static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates, 484 const bool hiddenOnly); 485 EXPORT static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates); 486 EXPORT static bool IsSystemApp(); 487 static std::string GetStringFetchProperty(napi_env env, napi_value arg, bool &err, bool &present, 488 const std::string &propertyName); 489 EXPORT static std::string ParseResultSet2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 490 const std::vector<std::string> &cloumns); 491 492 static std::string ParseAnalysisFace2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 493 const std::vector<std::string> &cloumns); 494 495 static std::string GetStringValueByColumn(std::shared_ptr<DataShare::DataShareResultSet> resultSet, 496 const std::string columnName); 497 498 static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values); 499 static napi_value GetUriArrayFromAssets( 500 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 501 static napi_value GetIdArrayFromAssets( 502 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 503 static napi_value GetStringArray( 504 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 505 static void FixSpecialDateType(std::string &selections); 506 static std::string TransferUri(const std::string &oldUri); 507 static std::string GetFileIdFromUriString(const std::string& uri); 508 static std::string GetAlbumIdFromUriString(const std::string& uri); 509 static napi_value GetSharedPhotoAssets(const napi_env& env, std::shared_ptr<NativeRdb::ResultSet> result, 510 int32_t size, bool isSingleResult = false); 511 static napi_value GetSharedAlbumAssets(const napi_env& env, std::shared_ptr<NativeRdb::ResultSet> result, 512 int32_t size); 513 static napi_value GetSharedPhotoAssets(const napi_env& env, std::vector<std::string>& fileIds, 514 bool isSingleResult); 515 static void HandleCoverSharedPhotoAsset(napi_env env, int32_t index, napi_value result, 516 const std::string& name, const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 517 static napi_value GetNextRowObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet, 518 bool isShared = false); 519 static napi_value GetNextRowAlbumObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet); 520 static napi_value CreateValueByIndex(napi_env env, int32_t index, std::string name, 521 std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset); 522 static void handleTimeInfo(napi_env env, const std::string& name, napi_value result, int32_t index, 523 const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 524 525 template <class AsyncContext> 526 static napi_status ParsePredicates(napi_env env, 527 const napi_value arg, AsyncContext &context, const FetchOptionType &fetchOptType); 528 529 static int ParseNextRowObject(std::shared_ptr<RowObject>& rowObj, std::shared_ptr<NativeRdb::ResultSet>& resultSet, 530 bool isShared); 531 static int ParseNextRowAlbumObject(std::shared_ptr<RowObject>& rowObj, 532 std::shared_ptr<NativeRdb::ResultSet> &resultSet); 533 static napi_value BuildNextRowObject(const napi_env& env, std::shared_ptr<RowObject>& rowObj, bool isShared); 534 static napi_value BuildNextRowAlbumObject(const napi_env& env, std::shared_ptr<RowObject>& rowObj); 535 static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt); 536 537 private: 538 static napi_value BuildValueByIndex(const napi_env& env, int32_t index, const std::string& name, 539 ColumnUnion& tmpNameValue); 540 static int ParseValueByIndex(std::shared_ptr<ColumnInfo>& columnInfo, int32_t index, const std::string& name, 541 std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset); 542 static int ParseTimeInfo(const std::string& name, std::shared_ptr<ColumnInfo>& columnInfo, int32_t index, 543 const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 544 static void BuildTimeInfo(const napi_env& env, const std::string& name, napi_value& result, int32_t index, 545 std::shared_ptr<ColumnInfo>& columnInfo); 546 static int ParseThumbnailReady(const std::string& name, std::shared_ptr<ColumnInfo>& columnInfo, int32_t index, 547 const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 548 static void BuildThumbnailReady(const napi_env& env, const std::string& name, napi_value& result, int32_t index, 549 std::shared_ptr<ColumnInfo>& columnInfo); 550 static int ParseCoverSharedPhotoAsset(int32_t index, std::shared_ptr<ColumnInfo>& columnInfo, 551 const std::string& name, const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 552 static int ParseSingleSharedPhotoAssets(std::shared_ptr<ColumnInfo>& columnInfo, 553 std::shared_ptr<NativeRdb::ResultSet>& result); 554 }; 555 556 class NapiScopeHandler { 557 public: 558 NapiScopeHandler(napi_env env); 559 ~NapiScopeHandler(); 560 bool IsValid(); 561 562 private: 563 napi_env env_; 564 napi_handle_scope scope_; 565 bool isValid_ = false; 566 }; 567 } // namespace Media 568 } // namespace OHOS 569 570 #endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_UTILS_H_ 571