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 ¶m); 150 151 template <class AsyncContext> 152 static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context, 153 std::string ¶m); 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