• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &param);
370     static napi_status GetInt32Array(napi_env env, napi_value arg, std::vector<int32_t> &param);
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 &param);
424 
425     template <class AsyncContext>
426     static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context,
427         std::string &param);
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