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 {PhotoColumn::PHOTO_OWNER_ALBUM_ID, {TYPE_INT32, "ownerAlbumId"}}, 79 {MEDIA_DATA_DB_COUNT, {TYPE_INT32, "count"}}, 80 {PhotoAlbumColumns::ALBUM_ID, {TYPE_INT32, "albumId"}}, 81 {PhotoAlbumColumns::ALBUM_TYPE, {TYPE_INT32, "albumType"}}, 82 {PhotoAlbumColumns::ALBUM_SUBTYPE, {TYPE_INT32, "albumSubType"}}, 83 {PhotoAlbumColumns::ALBUM_NAME, {TYPE_STRING, "albumName"}}, 84 {PhotoAlbumColumns::ALBUM_COVER_URI, {TYPE_STRING, "coverUri"}}, 85 {PhotoAlbumColumns::ALBUM_COUNT, {TYPE_INT32, "count"}}, 86 {PhotoAlbumColumns::ALBUM_IMAGE_COUNT, {TYPE_INT32, "imageCount"}}, 87 {PhotoAlbumColumns::ALBUM_VIDEO_COUNT, {TYPE_INT32, "videoCount"}}, 88 }; 89 return TYPE_MAP; 90 } 91 GetTimeTypeMap()92 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>>& GetTimeTypeMap() 93 { 94 static const std::unordered_map<std::string, std::pair<ResultSetDataType, std::string>> TIME_TYPE_MAP = { 95 {MEDIA_DATA_DB_DATE_ADDED, {TYPE_INT64, "dateAdded"}}, 96 {MEDIA_DATA_DB_DATE_MODIFIED, {TYPE_INT64, "dateModified"}}, 97 {MEDIA_DATA_DB_DATE_TRASHED, {TYPE_INT64, "dateTrashed"}}, 98 }; 99 return TIME_TYPE_MAP; 100 } 101 102 static napi_status GetUInt32(napi_env env, napi_value arg, uint32_t &value); 103 static napi_status GetInt32(napi_env env, napi_value arg, int32_t &value); 104 static napi_status GetParamBool(napi_env env, napi_value arg, bool &result); 105 static napi_status GetParamFunction(napi_env env, napi_value arg, napi_ref &callbackRef); 106 static napi_status GetParamStringWithLength(napi_env env, napi_value arg, int32_t maxLen, 107 std::string &str); 108 static napi_status GetParamStringPathMax(napi_env env, napi_value arg, std::string &str); 109 static napi_status GetProperty(napi_env env, const napi_value arg, const std::string &propName, 110 std::string &propValue); 111 static napi_status GetArrayProperty(napi_env env, napi_value arg, const std::string &propName, 112 std::vector<std::string> &array); 113 static napi_status GetStringArray(napi_env env, napi_value arg, std::vector<std::string> &array); 114 static MediaType GetMediaTypeFromUri(const std::string &uri); 115 template <class AsyncContext> 116 static napi_status GetPredicate(napi_env env, const napi_value arg, const std::string &propName, 117 AsyncContext &context, const FetchOptionType &fetchOptType, 118 std::vector<DataShare::OperationItem> operations = {}); 119 template <class AsyncContext> 120 static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context); 121 template <class AsyncContext> 122 static bool HandleSpecialPredicate(AsyncContext &context, 123 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType, 124 std::vector<DataShare::OperationItem> operations = {}); 125 template <class AsyncContext> 126 static void UpdateMediaTypeSelections(AsyncContext *context); 127 128 template <class AsyncContext> 129 static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 130 const size_t minArgs, const size_t maxArgs); 131 132 template <class AsyncContext> 133 static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 134 const size_t minArgs, const size_t maxArgs); 135 136 template <class AsyncContext> 137 static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 138 AsyncContext &context, std::vector<DataShare::OperationItem> operations = {}); 139 140 template <class AsyncContext> 141 static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 142 AsyncContext &context); 143 144 template <class AsyncContext> 145 static napi_status GetParamCallback(napi_env env, AsyncContext &context); 146 147 template <class AsyncContext> 148 static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info, 149 AsyncContext &context); 150 151 template <class AsyncContext> 152 static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool ¶m); 153 154 template <class AsyncContext> 155 static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context, 156 std::string ¶m); 157 template <class AsyncContext> 158 static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info, 159 AsyncContext &context, std::vector<std::string> &array); 160 161 template <class AsyncContext> 162 static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context, 163 int32_t &value); 164 165 template <class AsyncContext> 166 static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context); 167 168 static AssetType GetAssetType(MediaType type); 169 170 static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition); 171 172 template <class AsyncContext> 173 static bool GetLocationPredicate(AsyncContext &context, 174 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate); 175 176 static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet); 177 178 static int TransErrorCode(const std::string &Name, int error); 179 180 static void HandleError(napi_env env, int error, napi_value &errorObj, const std::string &Name); 181 182 static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode, 183 const std::string errMsg); 184 185 static void InvokeJSAsyncMethodWithoutWork(napi_env env, napi_deferred deferred, napi_ref callbackRef, 186 const SendableJSAsyncContextOutput &asyncContext); 187 188 static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work, 189 const SendableJSAsyncContextOutput &asyncContext); 190 191 template <class AsyncContext> 192 static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext, 193 const std::string &resourceName, void (*execute)(napi_env, void *), 194 void (*complete)(napi_env, napi_status, void *)); 195 196 static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value); 197 198 static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName); 199 200 static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName); 201 202 static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg); 203 204 static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize); 205 206 static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[], 207 bool &isCallback); 208 209 static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value); 210 211 static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value); 212 213 static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn, 214 std::function<bool(const std::string &columnName)> isValidColumn, NapiAssetType assetType, 215 const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC); 216 static napi_value AddAssetColumns(napi_env env, std::vector<std::string> &fetchColumn, 217 std::function<bool(const std::string &columnName)> isValidColumn, std::set<std::string>& validFetchColumns, 218 const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC); 219 220 static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType, 221 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 222 static int32_t GetUserAlbumPredicates(const int32_t albumId, 223 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 224 static int32_t GetAnalysisPhotoMapPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 225 static int32_t GetFeaturedSinglePortraitAlbumPredicates( 226 const int32_t albumId, DataShare::DataSharePredicates &predicates); 227 static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 228 static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates); 229 static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates, 230 const bool hiddenOnly); 231 static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates); 232 static bool IsSystemApp(); 233 234 static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values); 235 static napi_value GetStringArray( 236 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 237 static napi_value GetNextRowObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet); 238 static napi_value CreateValueByIndex(napi_env env, int32_t index, std::string name, 239 std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset); 240 static void handleTimeInfo(napi_env env, const std::string& name, napi_value result, 241 int32_t index, const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 242 243 template <class AsyncContext> 244 static napi_status ParsePredicates(napi_env env, 245 const napi_value arg, AsyncContext &context, const FetchOptionType &fetchOptType); 246 247 private: 248 static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt); 249 }; 250 251 class SendableNapiScopeHandler { 252 public: 253 SendableNapiScopeHandler(napi_env env); 254 ~SendableNapiScopeHandler(); 255 bool IsValid(); 256 257 private: 258 napi_env env_; 259 napi_handle_scope scope_; 260 bool isValid_ = false; 261 }; 262 } // namespace Media 263 } // namespace OHOS 264 265 #endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_SENDABLE_UTILS_H_ 266