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_SENDABLE_UTILS_H_
17 #define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_SENDABLE_UTILS_H_
18 
19 #include <memory>
20 #include <vector>
21 
22 #include "datashare_predicates.h"
23 #include "datashare_result_set.h"
24 #include "file_asset.h"
25 #include "location_column.h"
26 #include "media_column.h"
27 #include "medialibrary_napi_utils.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 namespace OHOS {
36 namespace Media {
37 struct SendableJSAsyncContextOutput {
38     napi_value error;
39     napi_value data;
40     bool status;
41 };
42 
43 /* Util class used by napi asynchronous methods for making call to js callback function */
44 class SendableMediaLibraryNapiUtils {
45 public:
GetTypeMap()46     static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> &GetTypeMap()
47     {
48         static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TYPE_MAP = {
49             {MEDIA_DATA_DB_ID, {TYPE_INT32, "fileId"}},
50             {MEDIA_DATA_DB_FILE_PATH, {TYPE_STRING, "data"}},
51             {MEDIA_DATA_DB_MEDIA_TYPE, {TYPE_INT32, "mediaType"}},
52             {MEDIA_DATA_DB_NAME, {TYPE_STRING, "displayName"}},
53             {MEDIA_DATA_DB_SIZE, {TYPE_INT64, "size"}},
54             {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAddedMs"}},
55             {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModifiedMs"}},
56             {MEDIA_DATA_DB_DURATION, {TYPE_INT64, "duration"}},
57             {MEDIA_DATA_DB_WIDTH, {TYPE_INT32, "width"}},
58             {MEDIA_DATA_DB_HEIGHT, {TYPE_INT32, "height"}},
59             {MEDIA_DATA_DB_DATE_TAKEN, {TYPE_INT64, "dateTaken"}},
60             {MEDIA_DATA_DB_ORIENTATION, {TYPE_INT32, "orientation"}},
61             {MEDIA_DATA_DB_IS_FAV, {TYPE_INT32, "isFavorite"}},
62             {MEDIA_DATA_DB_TITLE, {TYPE_STRING, "title"}},
63             {MEDIA_DATA_DB_POSITION, {TYPE_INT32, "position"}},
64             {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashedMs"}},
65             {MediaColumn::MEDIA_HIDDEN, {TYPE_INT32, "hidden"}},
66             {PhotoColumn::PHOTO_USER_COMMENT, {TYPE_STRING, "userComment"}},
67             {PhotoColumn::CAMERA_SHOT_KEY, {TYPE_STRING, "cameraShotKey"}},
68             {PhotoColumn::PHOTO_DATE_YEAR, {TYPE_STRING, "dateYear"}},
69             {PhotoColumn::PHOTO_DATE_MONTH, {TYPE_STRING, "dateMonth"}},
70             {PhotoColumn::PHOTO_DATE_DAY, {TYPE_STRING, "dateDay"}},
71             {MEDIA_DATA_DB_TIME_PENDING, {TYPE_INT64, "pending"}},
72             {PhotoColumn::PHOTO_SUBTYPE, {TYPE_INT32, "subtype"}},
73             {PhotoColumn::MOVING_PHOTO_EFFECT_MODE, {TYPE_INT32, "movingPhotoEffectMode"}},
74             {PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, {TYPE_INT32, "dynamicRangeType"}},
75             {PhotoColumn::PHOTO_THUMBNAIL_READY, {TYPE_INT64, "thumbnailModifiedMs"}},
76             {PhotoColumn::PHOTO_LCD_SIZE, {TYPE_STRING, "lcdSize"}},
77             {PhotoColumn::PHOTO_THUMB_SIZE, {TYPE_STRING, "thmSize"}},
78             {MEDIA_DATA_DB_COUNT, {TYPE_INT32, "count"}},
79             {PhotoAlbumColumns::ALBUM_ID, {TYPE_INT32, "albumId"}},
80             {PhotoAlbumColumns::ALBUM_TYPE, {TYPE_INT32, "albumType"}},
81             {PhotoAlbumColumns::ALBUM_SUBTYPE, {TYPE_INT32, "albumSubType"}},
82             {PhotoAlbumColumns::ALBUM_NAME, {TYPE_STRING, "albumName"}},
83             {PhotoAlbumColumns::ALBUM_COVER_URI, {TYPE_STRING, "coverUri"}},
84             {PhotoAlbumColumns::ALBUM_COUNT, {TYPE_INT32, "count"}},
85             {PhotoAlbumColumns::ALBUM_IMAGE_COUNT, {TYPE_INT32, "imageCount"}},
86             {PhotoAlbumColumns::ALBUM_VIDEO_COUNT, {TYPE_INT32, "videoCount"}},
87         };
88         return TYPE_MAP;
89     }
90 
GetTimeTypeMap()91     static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>>& GetTimeTypeMap()
92     {
93         static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TIME_TYPE_MAP = {
94             {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAdded"}},
95             {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModified"}},
96             {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashed"}},
97         };
98         return TIME_TYPE_MAP;
99     }
100 
101     static napi_status GetUInt32(napi_env env, napi_value arg, uint32_t &value);
102     static napi_status GetInt32(napi_env env, napi_value arg, int32_t &value);
103     static napi_status GetParamBool(napi_env env, napi_value arg, bool &result);
104     static napi_status GetParamFunction(napi_env env, napi_value arg, napi_ref &callbackRef);
105     static napi_status GetParamStringWithLength(napi_env env, napi_value arg, int32_t maxLen,
106         std::string &str);
107     static napi_status GetParamStringPathMax(napi_env env, napi_value arg, std::string &str);
108     static napi_status GetProperty(napi_env env, const napi_value arg, const std::string &propName,
109         std::string &propValue);
110     static napi_status GetArrayProperty(napi_env env, napi_value arg, const std::string &propName,
111         std::vector<std::string> &array);
112     static napi_status GetStringArray(napi_env env, napi_value arg, std::vector<std::string> &array);
113     static MediaType GetMediaTypeFromUri(const std::string &uri);
114     template <class AsyncContext>
115     static napi_status GetPredicate(napi_env env, const napi_value arg, const std::string &propName,
116         AsyncContext &context, const FetchOptionType &fetchOptType);
117     template <class AsyncContext>
118     static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context);
119     template <class AsyncContext>
120     static bool HandleSpecialPredicate(AsyncContext &context,
121         std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType);
122     template <class AsyncContext>
123     static void UpdateMediaTypeSelections(AsyncContext *context);
124 
125     template <class AsyncContext>
126     static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext,
127         const size_t minArgs, const size_t maxArgs);
128 
129     template <class AsyncContext>
130     static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext,
131         const size_t minArgs, const size_t maxArgs);
132 
133     template <class AsyncContext>
134     static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType,
135         AsyncContext &context);
136 
137     template <class AsyncContext>
138     static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType,
139         AsyncContext &context);
140 
141     template <class AsyncContext>
142     static napi_status GetParamCallback(napi_env env, AsyncContext &context);
143 
144     template <class AsyncContext>
145     static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info,
146         AsyncContext &context);
147 
148     template <class AsyncContext>
149     static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool &param);
150 
151     template <class AsyncContext>
152     static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context,
153         std::string &param);
154     template <class AsyncContext>
155     static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info,
156     AsyncContext &context, std::vector<std::string> &array);
157 
158     template <class AsyncContext>
159     static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context,
160         int32_t &value);
161 
162     template <class AsyncContext>
163     static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context);
164 
165     static AssetType GetAssetType(MediaType type);
166 
167     static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition);
168 
169     template <class AsyncContext>
170     static bool GetLocationPredicate(AsyncContext &context,
171         std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate);
172 
173     static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet);
174 
175     static int TransErrorCode(const std::string &Name, int error);
176 
177     static void HandleError(napi_env env, int error, napi_value &errorObj, const std::string &Name);
178 
179     static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode,
180         const std::string errMsg);
181 
182     static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work,
183         const SendableJSAsyncContextOutput &asyncContext);
184 
185     template <class AsyncContext>
186     static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext,
187         const std::string &resourceName,  void (*execute)(napi_env, void *),
188         void (*complete)(napi_env, napi_status, void *));
189 
190     static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value);
191 
192     static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName);
193 
194     static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName);
195 
196     static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg);
197 
198     static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize);
199 
200     static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[],
201         bool &isCallback);
202 
203     static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value);
204 
205     static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value);
206 
207     static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn,
208         std::function<bool(const std::string &columnName)> isValidColumn, NapiAssetType assetType,
209         const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC);
210     static napi_value AddAssetColumns(napi_env env, std::vector<std::string> &fetchColumn,
211         std::function<bool(const std::string &columnName)> isValidColumn, std::set<std::string>& validFetchColumns,
212         const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC);
213     static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType,
214         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
215     static int32_t GetUserAlbumPredicates(const int32_t albumId,
216         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
217     static int32_t GetAnalysisAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
218     static int32_t GetFeaturedSinglePortraitAlbumPredicates(
219         const int32_t albumId, DataShare::DataSharePredicates &predicates);
220     static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
221     static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates);
222     static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates,
223         const bool hiddenOnly);
224     static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates);
225     static bool IsSystemApp();
226 
227     static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values);
228     static napi_value GetStringArray(
229         napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values);
230     static napi_value GetNextRowObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet);
231     static napi_value CreateValueByIndex(napi_env env, int32_t index, std::string name,
232         std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset);
233     static void handleTimeInfo(napi_env env, const std::string& name, napi_value result,
234         int32_t index, const std::shared_ptr<NativeRdb::ResultSet>& resultSet);
235 
236     template <class AsyncContext>
237     static napi_status ParsePredicates(napi_env env,
238         const napi_value arg, AsyncContext &context, const FetchOptionType &fetchOptType);
239 
240 private:
241     static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt);
242 };
243 
244 class SendableNapiScopeHandler {
245 public:
246     SendableNapiScopeHandler(napi_env env);
247     ~SendableNapiScopeHandler();
248     bool IsValid();
249 
250 private:
251     napi_env env_;
252     napi_handle_scope scope_;
253     bool isValid_ = false;
254 };
255 } // namespace Media
256 } // namespace OHOS
257 
258 #endif  // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_SENDABLE_UTILS_H_
259