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 std::vector<DataShare::OperationItem> operations = {}); 118 template <class AsyncContext> 119 static napi_status ParseAlbumFetchOptCallback(napi_env env, napi_callback_info info, AsyncContext &context); 120 template <class AsyncContext> 121 static bool HandleSpecialPredicate(AsyncContext &context, 122 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate, const FetchOptionType &fetchOptType, 123 std::vector<DataShare::OperationItem> operations = {}); 124 template <class AsyncContext> 125 static void UpdateMediaTypeSelections(AsyncContext *context); 126 127 template <class AsyncContext> 128 static napi_status AsyncContextSetObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 129 const size_t minArgs, const size_t maxArgs); 130 131 template <class AsyncContext> 132 static napi_status AsyncContextGetArgs(napi_env env, napi_callback_info info, AsyncContext &asyncContext, 133 const size_t minArgs, const size_t maxArgs); 134 135 template <class AsyncContext> 136 static napi_status GetFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 137 AsyncContext &context, std::vector<DataShare::OperationItem> operations = {}); 138 139 template <class AsyncContext> 140 static napi_status GetAlbumFetchOption(napi_env env, napi_value arg, const FetchOptionType &fetchOptType, 141 AsyncContext &context); 142 143 template <class AsyncContext> 144 static napi_status GetParamCallback(napi_env env, AsyncContext &context); 145 146 template <class AsyncContext> 147 static napi_status ParseAssetFetchOptCallback(napi_env env, napi_callback_info info, 148 AsyncContext &context); 149 150 template <class AsyncContext> 151 static napi_status ParseArgsBoolCallBack(napi_env env, napi_callback_info info, AsyncContext &context, bool ¶m); 152 153 template <class AsyncContext> 154 static napi_status ParseArgsStringCallback(napi_env env, napi_callback_info info, AsyncContext &context, 155 std::string ¶m); 156 template <class AsyncContext> 157 static napi_status ParseArgsStringArrayCallback(napi_env env, napi_callback_info info, 158 AsyncContext &context, std::vector<std::string> &array); 159 160 template <class AsyncContext> 161 static napi_status ParseArgsNumberCallback(napi_env env, napi_callback_info info, AsyncContext &context, 162 int32_t &value); 163 164 template <class AsyncContext> 165 static napi_status ParseArgsOnlyCallBack(napi_env env, napi_callback_info info, AsyncContext &context); 166 167 static AssetType GetAssetType(MediaType type); 168 169 static void AppendFetchOptionSelection(std::string &selection, const std::string &newCondition); 170 171 template <class AsyncContext> 172 static bool GetLocationPredicate(AsyncContext &context, 173 std::shared_ptr<DataShare::DataShareAbsPredicates> &predicate); 174 175 static int TransErrorCode(const std::string &Name, std::shared_ptr<DataShare::DataShareResultSet> resultSet); 176 177 static int TransErrorCode(const std::string &Name, int error); 178 179 static void HandleError(napi_env env, int error, napi_value &errorObj, const std::string &Name); 180 181 static void CreateNapiErrorObject(napi_env env, napi_value &errorObj, const int32_t errCode, 182 const std::string errMsg); 183 184 static void InvokeJSAsyncMethod(napi_env env, napi_deferred deferred, napi_ref callbackRef, napi_async_work work, 185 const SendableJSAsyncContextOutput &asyncContext); 186 187 template <class AsyncContext> 188 static napi_value NapiCreateAsyncWork(napi_env env, std::unique_ptr<AsyncContext> &asyncContext, 189 const std::string &resourceName, void (*execute)(napi_env, void *), 190 void (*complete)(napi_env, napi_status, void *)); 191 192 static std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(napi_env env, napi_value value); 193 194 static bool IsExistsByPropertyName(napi_env env, napi_value jsObject, const char *propertyName); 195 196 static napi_value GetPropertyValueByName(napi_env env, napi_value jsObject, const char *propertyName); 197 198 static bool CheckJSArgsTypeAsFunc(napi_env env, napi_value arg); 199 200 static bool IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize); 201 202 static napi_status HasCallback(napi_env env, const size_t argc, const napi_value argv[], 203 bool &isCallback); 204 205 static napi_value GetInt32Arg(napi_env env, napi_value arg, int32_t &value); 206 207 static void UriAppendKeyValue(std::string &uri, const std::string &key, const std::string &value); 208 209 static napi_value AddDefaultAssetColumns(napi_env env, std::vector<std::string> &fetchColumn, 210 std::function<bool(const std::string &columnName)> isValidColumn, NapiAssetType assetType, 211 const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC); 212 static napi_value AddAssetColumns(napi_env env, std::vector<std::string> &fetchColumn, 213 std::function<bool(const std::string &columnName)> isValidColumn, std::set<std::string>& validFetchColumns, 214 const PhotoAlbumSubType subType = PhotoAlbumSubType::USER_GENERIC); 215 static int32_t GetSystemAlbumPredicates(const PhotoAlbumSubType subType, 216 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 217 static int32_t GetUserAlbumPredicates(const int32_t albumId, 218 DataShare::DataSharePredicates &predicates, const bool hiddenOnly); 219 static int32_t GetAnalysisAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 220 static int32_t GetFeaturedSinglePortraitAlbumPredicates( 221 const int32_t albumId, DataShare::DataSharePredicates &predicates); 222 static int32_t GetPortraitAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); 223 static int32_t GetAllLocationPredicates(DataShare::DataSharePredicates &predicates); 224 static int32_t GetSourceAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates, 225 const bool hiddenOnly); 226 static bool IsFeaturedSinglePortraitAlbum(std::string albumName, DataShare::DataSharePredicates &predicates); 227 static bool IsSystemApp(); 228 229 static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector<napi_value> &values); 230 static napi_value GetStringArray( 231 napi_env env, std::vector<napi_value> &napiValues, std::vector<std::string> &values); 232 static napi_value GetNextRowObject(napi_env env, std::shared_ptr<NativeRdb::ResultSet> &resultSet); 233 static napi_value CreateValueByIndex(napi_env env, int32_t index, std::string name, 234 std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::shared_ptr<FileAsset> &asset); 235 static void handleTimeInfo(napi_env env, const std::string& name, napi_value result, 236 int32_t index, const std::shared_ptr<NativeRdb::ResultSet>& resultSet); 237 238 template <class AsyncContext> 239 static napi_status ParsePredicates(napi_env env, 240 const napi_value arg, AsyncContext &context, const FetchOptionType &fetchOptType); 241 242 private: 243 static napi_status hasFetchOpt(napi_env env, const napi_value arg, bool &hasFetchOpt); 244 }; 245 246 class SendableNapiScopeHandler { 247 public: 248 SendableNapiScopeHandler(napi_env env); 249 ~SendableNapiScopeHandler(); 250 bool IsValid(); 251 252 private: 253 napi_env env_; 254 napi_handle_scope scope_; 255 bool isValid_ = false; 256 }; 257 } // namespace Media 258 } // namespace OHOS 259 260 #endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIALIBRARY_NAPI_SENDABLE_UTILS_H_ 261