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