• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2025 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 FRAMEWORKS_ANI_SRC_INCLUDE_MEDIALIBRARY_ANI_UTILS_H
17 #define FRAMEWORKS_ANI_SRC_INCLUDE_MEDIALIBRARY_ANI_UTILS_H
18 
19 #include <memory>
20 #include <set>
21 #include <vector>
22 
23 #include "ani.h"
24 #include "ani_error.h"
25 #include "datashare_predicates.h"
26 #include "datashare_result_set.h"
27 #include "file_asset.h"
28 #include "file_asset_ani.h"
29 #include "location_column.h"
30 #include "media_column.h"
31 #include "media_library_enum_ani.h"
32 #include "medialibrary_client_errno.h"
33 #include "medialibrary_db_const.h"
34 #include "medialibrary_ani_log.h"
35 #include "photo_album_ani.h"
36 #include "photo_album_column.h"
37 #include "rdb_store.h"
38 
39 #define CHECK_COND_WITH_MESSAGE(env, cond, msg)                                                 \
40     do {                                                                                        \
41         if (!(cond)) {                                                                          \
42             AniError::ThrowError(env, OHOS_INVALID_PARAM_CODE, __FUNCTION__, __LINE__, msg);    \
43             return nullptr;                                                                     \
44         }                                                                                       \
45     } while (0)
46 
47 #define CHECK_COND_WITH_RET_MESSAGE(env, cond, ret, msg)                                        \
48     do {                                                                                        \
49         if (!(cond)) {                                                                          \
50             AniError::ThrowError(env, OHOS_INVALID_PARAM_CODE, __FUNCTION__, __LINE__, msg);    \
51             return ret;                                                                         \
52         }                                                                                       \
53     } while (0)
54 
55 #define CHECK_NULL_PTR_RETURN_UNDEFINED(env, ptr, ret, message)     \
56     do {                                                            \
57         if ((ptr) == nullptr) {                                     \
58             ANI_ERR_LOG(message);                                   \
59             GetUndefiend(env, &(ret));                              \
60             return ret;                                             \
61         }                                                           \
62     } while (0)
63 
64 #define CHECK_NULL_PTR_RETURN_VOID(ptr, message)    \
65     do {                                            \
66         if ((ptr) == nullptr) {                     \
67             ANI_ERR_LOG(message);                   \
68             return;                                 \
69         }                                           \
70     } while (0)
71 
72 #define CHECK_IF_EQUAL(condition, errMsg, ...)      \
73     do {                                            \
74         if (!(condition)) {                         \
75             ANI_ERR_LOG(errMsg, ##__VA_ARGS__);     \
76             return;                                 \
77         }                                           \
78     } while (0)
79 
80 #define CHECK_COND_RET(cond, ret, message, ...)                     \
81     do {                                                            \
82         if (!(cond)) {                                              \
83             ANI_ERR_LOG(message, ##__VA_ARGS__);                    \
84             return ret;                                             \
85         }                                                           \
86     } while (0)
87 
88 #define CHECK_STATUS_RET(cond, message, ...)                        \
89     do {                                                            \
90         ani_status __ret = (cond);                                  \
91         if (__ret != ANI_OK) {                                      \
92             ANI_ERR_LOG(message, ##__VA_ARGS__);                    \
93             return __ret;                                           \
94         }                                                           \
95     } while (0)
96 
97 #define CHECK_NULLPTR_RET(ret)                                      \
98     do {                                                            \
99         if ((ret) == nullptr) {                                     \
100             return nullptr;                                         \
101         }                                                           \
102     } while (0)
103 
104 #define CHECK_ARGS_RET_VOID(env, cond, err)                         \
105     do {                                                            \
106         if ((cond) != ANI_OK) {                                     \
107             AniError::ThrowError(env, err, __FUNCTION__, __LINE__); \
108             return;                                                 \
109         }                                                           \
110     } while (0)
111 
112 #define CHECK_COND(env, cond, err)                                  \
113     do {                                                            \
114         if (!(cond)) {                                              \
115             AniError::ThrowError(env, err, __FUNCTION__, __LINE__); \
116             return nullptr;                                         \
117         }                                                           \
118     } while (0)
119 
120 namespace OHOS {
121 namespace Media {
122 #define EXPORT __attribute__ ((visibility ("default")))
123 
124 // Error codes
125 const int32_t ERR_DEFAULT = 0;
126 const int32_t ERR_MEM_ALLOCATION = 2;
127 const int32_t ERR_INVALID_OUTPUT = 3;
128 
129 const int32_t TRASH_SMART_ALBUM_ID = 1;
130 const std::string TRASH_SMART_ALBUM_NAME = "TrashAlbum";
131 const int32_t FAVORIT_SMART_ALBUM_ID = 2;
132 const std::string FAVORIT_SMART_ALBUM_NAME = "FavoritAlbum";
133 
134 const std::string API_VERSION = "api_version";
135 
136 const std::string PENDING_STATUS = "pending";
137 
138 enum AniAssetType {
139     TYPE_DEFAULT = 0,
140     TYPE_AUDIO = 1,
141     TYPE_PHOTO = 2,
142     TYPE_ALBUM = 3,
143 };
144 
145 enum AlbumType {
146     TYPE_VIDEO_ALBUM = 0,
147     TYPE_IMAGE_ALBUM = 1,
148     TYPE_NONE = 2,
149 };
150 
151 enum FetchOptionType {
152     ASSET_FETCH_OPT = 0,
153     ALBUM_FETCH_OPT = 1
154 };
155 
156 enum HiddenPhotosDisplayMode {
157     ASSETS_MODE = 0,
158     ALBUMS_MODE = 1
159 };
160 
161 /* Util class used by ani methods for making call to js callback function */
162 class MediaLibraryAniUtils {
163 public:
GetTypeMap()164     static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> &GetTypeMap()
165     {
166         static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TYPE_MAP = {
167             {MEDIA_DATA_DB_ID, {TYPE_INT32, "fileId"}},
168             {MEDIA_DATA_DB_FILE_PATH, {TYPE_STRING, "data"}},
169             {MEDIA_DATA_DB_MEDIA_TYPE, {TYPE_INT32, "mediaType"}},
170             {MEDIA_DATA_DB_NAME, {TYPE_STRING, "displayName"}},
171             {MEDIA_DATA_DB_SIZE, {TYPE_INT64, "size"}},
172             {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAddedMs"}},
173             {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModifiedMs"}},
174             {MEDIA_DATA_DB_DURATION, {TYPE_INT64, "duration"}},
175             {MEDIA_DATA_DB_WIDTH, {TYPE_INT32, "width"}},
176             {MEDIA_DATA_DB_HEIGHT, {TYPE_INT32, "height"}},
177             {MEDIA_DATA_DB_DATE_TAKEN, {TYPE_INT64, "dateTaken"}},
178             {MEDIA_DATA_DB_ORIENTATION, {TYPE_INT32, "orientation"}},
179             {MEDIA_DATA_DB_IS_FAV, {TYPE_INT32, "isFavorite"}},
180             {MEDIA_DATA_DB_TITLE, {TYPE_STRING, "title"}},
181             {MEDIA_DATA_DB_POSITION, {TYPE_INT32, "position"}},
182             {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashedMs"}},
183             {MediaColumn::MEDIA_HIDDEN, {TYPE_INT32, "hidden"}},
184             {PhotoColumn::PHOTO_USER_COMMENT, {TYPE_STRING, "userComment"}},
185             {PhotoColumn::CAMERA_SHOT_KEY, {TYPE_STRING, "cameraShotKey"}},
186             {PhotoColumn::PHOTO_DATE_YEAR, {TYPE_STRING, "dateYear"}},
187             {PhotoColumn::PHOTO_DATE_MONTH, {TYPE_STRING, "dateMonth"}},
188             {PhotoColumn::PHOTO_DATE_DAY, {TYPE_STRING, "dateDay"}},
189             {MEDIA_DATA_DB_TIME_PENDING, {TYPE_INT64, "pending"}},
190             {PhotoColumn::PHOTO_SUBTYPE, {TYPE_INT32, "subtype"}},
191             {PhotoColumn::MOVING_PHOTO_EFFECT_MODE, {TYPE_INT32, "movingPhotoEffectMode"}},
192             {PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, {TYPE_INT32, "dynamicRangeType"}},
193             {PhotoColumn::PHOTO_THUMBNAIL_READY, {TYPE_INT64, "thumbnailModifiedMs"}},
194             {PhotoColumn::PHOTO_LCD_SIZE, {TYPE_STRING, "lcdSize"}},
195             {PhotoColumn::PHOTO_THUMB_SIZE, {TYPE_STRING, "thmSize"}},
196             {PhotoColumn::PHOTO_OWNER_ALBUM_ID, {TYPE_INT32, "ownerAlbumId"}},
197             {MEDIA_DATA_DB_COUNT, {TYPE_INT32, "count"}},
198             {PhotoAlbumColumns::ALBUM_ID, {TYPE_INT32, "albumId"}},
199             {PhotoAlbumColumns::ALBUM_TYPE, {TYPE_INT32, "albumType"}},
200             {PhotoAlbumColumns::ALBUM_SUBTYPE, {TYPE_INT32, "albumSubType"}},
201             {PhotoAlbumColumns::ALBUM_NAME, {TYPE_STRING, "albumName"}},
202             {PhotoAlbumColumns::ALBUM_COVER_URI, {TYPE_STRING, "coverUri"}},
203             {PhotoAlbumColumns::ALBUM_COUNT, {TYPE_INT32, "count"}},
204             {PhotoAlbumColumns::ALBUM_IMAGE_COUNT, {TYPE_INT32, "imageCount"}},
205             {PhotoAlbumColumns::ALBUM_VIDEO_COUNT, {TYPE_INT32, "videoCount"}},
206         };
207         return TYPE_MAP;
208     }
209 
GetTimeTypeMap()210     static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>>& GetTimeTypeMap()
211     {
212         static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TIME_TYPE_MAP = {
213             {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAdded"}},
214             {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModified"}},
215             {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashed"}},
216         };
217         return TIME_TYPE_MAP;
218     }
219 
220     static ani_boolean isArray(ani_env *env, ani_object object);
221     static ani_boolean isUndefined(ani_env *env, ani_object object);
222 
223     static ani_status GetBool(ani_env *env, ani_boolean arg, bool &value);
224     static ani_status GetBool(ani_env *env, ani_object arg, bool &value);
225 
226     static ani_status GetByte(ani_env *env, ani_byte arg, uint8_t &value);
227     static ani_status GetByte(ani_env *env, ani_object arg, uint8_t &value);
228 
229     static ani_status GetShort(ani_env *env, ani_short arg, int16_t &value);
230     static ani_status GetShort(ani_env *env, ani_object arg, int16_t &value);
231 
232     static ani_status GetInt32(ani_env *env, ani_int arg, int32_t &value);
233     static ani_status GetInt32(ani_env *env, ani_object arg, int32_t &value);
234 
235     static ani_status GetUint32(ani_env *env, ani_int arg, uint32_t &value);
236     static ani_status GetUint32(ani_env *env, ani_object arg, uint32_t &value);
237 
238     static ani_status GetInt64(ani_env *env, ani_long arg, int64_t &value);
239     static ani_status GetInt64(ani_env *env, ani_object arg, int64_t &value);
240 
241     static ani_status GetFloat(ani_env *env, ani_float arg, float &value);
242     static ani_status GetFloat(ani_env *env, ani_object arg, float &value);
243 
244     static ani_status GetDouble(ani_env *env, ani_double arg, double &value);
245     static ani_status GetDouble(ani_env *env, ani_object arg, double &value);
246 
247     static ani_status GetString(ani_env *env, ani_string arg, std::string &str);
248     static ani_status GetString(ani_env *env, ani_object arg, std::string &str);
249     static ani_status ToAniString(ani_env *env, const std::string &str, ani_string &aniStr);
250     static ani_status ToAniInt(ani_env *env, const std::int32_t &int32, ani_int &aniInt);
251     static ani_status ToAniLong(ani_env *env, const std::int64_t &int64, ani_long &aniLong);
252     static ani_status ToAniDouble(ani_env *env, const double &arg, ani_double &aniDouble);
253     static ani_status GetParamStringWithLength(ani_env *env, ani_string arg, int32_t maxLen, std::string &str);
254     static ani_status GetParamStringPathMax(ani_env *env, ani_string arg, std::string &str);
255     static ani_status GetParamStringPathMax(ani_env *env, ani_object arg, std::string &str);
256 
257     static ani_status ToAniBooleanObject(ani_env *env, bool src, ani_object &aniObj);
258     static ani_status ToAniIntObject(ani_env *env, int32_t src, ani_object &aniObj);
259     static ani_status ToAniLongObject(ani_env *env, int64_t src, ani_object &aniObj);
260     static ani_status ToAniDoubleObject(ani_env *env, double src, ani_object &aniObj);
261 
262     static ani_status GetUint32Array(ani_env *env, ani_object arg, std::vector<uint32_t> &array);
263     static ani_status ToAniInt32Array(ani_env *env, const std::vector<uint32_t> &array, ani_object &aniArray);
264     static ani_status GetStringArray(ani_env *env, ani_object arg, std::vector<std::string> &array);
265     static ani_status ToAniStringArray(ani_env *env, const std::vector<std::string> &array, ani_object &aniArray);
266 
267     static ani_status GetProperty(ani_env *env, ani_object arg, const std::string &propName, std::string &propValue);
268     static ani_status GetProperty(ani_env *env, ani_object arg, const std::string &propName, ani_object &propObj);
269     static ani_status GetArrayProperty(ani_env *env, ani_object arg, const std::string &propName,
270         std::vector<std::string> &array);
271 
272     static ani_status GetUriArrayFromAssets(ani_env *env, ani_object arg, std::vector<std::string> &array);
273     static ani_status ToFileAssetAniArray(ani_env *env, std::vector<std::unique_ptr<FileAsset>> &array,
274         ani_object &aniArray);
275     static ani_status ToFileAssetInfoAniArray(ani_env *env, std::vector<std::unique_ptr<FileAsset>> &array,
276         ani_object &aniArray);
277     static ani_status ToFileAssetAniPtr(ani_env *env, std::unique_ptr<FetchResult<FileAsset>> fileAsset,
278         ani_object &aniPtr);
279 
280     static ani_status GetPhotoAlbumAniArray(ani_env *env, ani_object arg, std::vector<PhotoAlbumAni*> &array);
281     static ani_status ToPhotoAlbumAniArray(ani_env *env, std::vector<unique_ptr<PhotoAlbum>> &array,
282         ani_object &aniArray);
283 
284     static ani_status GetArrayBuffer(ani_env *env, ani_object arg, std::unique_ptr<uint8_t[]> &buffer, size_t &size);
285 
286     static ani_status GetOptionalStringPathMaxField(ani_env *env, ani_object src,
287         const std::string &fieldName, std::string &value);
288     static ani_status GetOptionalEnumInt32Field(ani_env *env, ani_object src, const std::string &fieldName,
289         int32_t &value);
290     static ani_status GetOptionalEnumStringField(ani_env *env, ani_object src, const std::string &fieldName,
291         std::string &value);
292     static std::unordered_map<std::string, std::variant<int32_t, bool, std::string>> GetCreateOptions(
293         ani_env *env, ani_object src);
294     static std::unordered_map<std::string, std::variant<int32_t, bool, std::string>> GetPhotoCreateOptions(
295         ani_env *env, ani_object src);
296 
297     static DataShare::DataSharePredicates* UnwrapPredicate(ani_env *env, const ani_object predicates);
298     template <class AniContext>
299     static ani_status GetPredicate(ani_env *env, const ani_object fetchOptions, const std::string &propName,
300         AniContext &context, FetchOptionType fetchOptType);
301 
302     template <class AniContext>
303     static ani_status ParsePredicates(ani_env *env, const ani_object predicate, AniContext &context,
304         FetchOptionType fetchOptType);
305 
306     template <class AniContext>
307     static bool HandleSpecialPredicate(AniContext &context,
308         DataShare::DataSharePredicates *predicate, FetchOptionType fetchOptType);
309 
310     template <class AniContext>
311     static bool ProcessPredicateItems(AniContext& context, const vector<DataShare::OperationItem>& items,
312         vector<DataShare::OperationItem>& operations, FetchOptionType fetchOptType);
313 
314     template <class AniContext>
315     static bool HandleSpecialField(AniContext& context, const DataShare::OperationItem& item,
316         vector<DataShare::OperationItem>& operations, FetchOptionType fetchOptType);
317 
318     template <class AniContext>
319     static bool HandleNetworkIdField(AniContext& context, const DataShare::OperationItem& item, const string& value);
320 
321     template <class AniContext>
322     static bool HandleUriField(AniContext& context, const DataShare::OperationItem& item, const string& uriValue,
323         vector<DataShare::OperationItem>& operations, FetchOptionType fetchOptType);
324 
325     template <class AniContext>
326     static ani_status GetFetchOption(ani_env *env, ani_object fetchOptions, FetchOptionType fetchOptType,
327         AniContext &context);
328 
329     template <class AniContext>
330     static bool GetLocationPredicate(AniContext &context, DataShare::DataSharePredicates *predicate);
331 
332     static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet);
333 
334     static int TransErrorCode(const std::string &Name, int error);
335 
336     static void HandleError(ani_env *env, int error, ani_object &errorObj, const std::string &Name);
337 
338     static void CreateAniErrorObject(ani_env *env, ani_object &errorObj, const int32_t errCode,
339         const std::string &errMsg);
340 
341     static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value);
342 
343     static ani_status AddDefaultAssetColumns(ani_env *env, std::vector<std::string> &fetchColumn,
344         std::function<bool(const std::string &columnName)> isValidColumn, AniAssetType assetType,
345         const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC);
346 
347     static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType,
348         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
349     static int32_t GetUserAlbumPredicates(const int32_t albumId,
350         DataShare::DataSharePredicates &predicates, const bool hiddenOnly);
351     static int32_t GetAnalysisPhotoMapPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
352     static int32_t GetFeaturedSinglePortraitAlbumPredicates(
353         const int32_t albumId, DataShare::DataSharePredicates &predicates);
354     static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates);
355     static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates);
356     static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates,
357         const bool hiddenOnly);
358     static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates);
359     static bool IsSystemApp();
360 
361     EXPORT static std::string ParseResultSet2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet,
362         const std::vector<std::string> &cloumns);
363 
364     static std::string ParseAnalysisFace2JsonStr(std::shared_ptr<DataShare::DataShareResultSet> resultSet,
365         const std::vector<std::string> &cloumns);
366 
367     static std::string GetStringValueByColumn(std::shared_ptr<DataShare::DataShareResultSet> resultSet,
368         const std::string columnName);
369 
370     static ani_status FindClass(ani_env *env, const std::string &className, ani_class *cls);
371 
372     static ani_status FindClassMethod(ani_env *env, const std::string &className, const std::string &methodName,
373         ani_method *method);
374 };
375 
376 } // namespace Media
377 } // namespace OHOS
378 
379 #endif  // FRAMEWORKS_ANI_SRC_INCLUDE_MEDIALIBRARY_ANI_UTILS_H