1 /*
2 * Copyright (C) 2023 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 #define MLOG_TAG "UserFileClientEx"
16 #include "userfile_client_ex.h"
17
18 #include <map>
19 #include <string>
20 #include <unordered_map>
21 #include <unistd.h>
22
23 #include "datashare_abs_result_set.h"
24 #include "datashare_predicates.h"
25 #include "directory_ex.h"
26 #include "iservice_registry.h"
27 #include "media_column.h"
28 #include "media_file_uri.h"
29 #include "media_file_utils.h"
30 #include "media_log.h"
31 #include "medialibrary_db_const.h"
32 #include "medialibrary_errno.h"
33 #include "mimetype_utils.h"
34 #include "scanner_utils.h"
35 #include "string_ex.h"
36 #include "system_ability_definition.h"
37 #include "thumbnail_const.h"
38 #include "uri.h"
39 #include "userfile_client.h"
40 #include "userfile_manager_types.h"
41 #include "mediatool_uri.h"
42
43 using namespace OHOS::DataShare;
44 namespace OHOS {
45 namespace Media {
46 namespace MediaTool {
47 const std::string URI_DELIMITER = std::string(1, SLASH_CHAR);
48 const std::string URI_ARG_FIRST_DELIMITER = "?";
49 const std::string URI_API_VERSION_STR = std::to_string(static_cast<uint32_t>(MediaLibraryApi::API_10));
50 const std::string URI_API_VERSION = URI_PARAM_API_VERSION + "=" + URI_API_VERSION_STR;
51 constexpr int32_t ROOT_UID = 0;
52
53 enum class MediaToolOperation {
54 INSERT,
55 QUERY,
56 CLOSE,
57 DELETE,
58 UPDATE,
59 LIST
60 };
61
62 const std::map<MediaToolOperation, std::string> PHOTOOPRN_URI_MAP = {
63 { MediaToolOperation::INSERT, TOOL_CREATE_PHOTO },
64 { MediaToolOperation::QUERY, TOOL_QUERY_PHOTO },
65 { MediaToolOperation::LIST, TOOL_LIST_PHOTO },
66 { MediaToolOperation::CLOSE, TOOL_CLOSE_PHOTO },
67 { MediaToolOperation::DELETE, TOOL_DELETE_PHOTO },
68 { MediaToolOperation::UPDATE, TOOL_UPDATE_PHOTO }
69 };
70
71 const std::map<MediaToolOperation, std::string> AUDIOOPRN_URI_MAP = {
72 { MediaToolOperation::INSERT, TOOL_CREATE_AUDIO },
73 { MediaToolOperation::QUERY, TOOL_QUERY_AUDIO },
74 { MediaToolOperation::LIST, TOOL_LIST_AUDIO },
75 { MediaToolOperation::CLOSE, TOOL_CLOSE_AUDIO },
76 { MediaToolOperation::DELETE, TOOL_DELETE_AUDIO },
77 { MediaToolOperation::UPDATE, TOOL_UPDATE_AUDIO }
78 };
79
80 // delete_tool
81 const std::string DELETE_TOOL_ONLY_DATABASE = "only_db";
82
GetOperation(const std::string & tableName,MediaToolOperation oprn)83 static std::string GetOperation(const std::string &tableName, MediaToolOperation oprn)
84 {
85 if (tableName == PhotoColumn::PHOTOS_TABLE) {
86 auto item = PHOTOOPRN_URI_MAP.find(oprn);
87 if (item != PHOTOOPRN_URI_MAP.end()) {
88 return item->second;
89 }
90 } else if (tableName == AudioColumn::AUDIOS_TABLE) {
91 auto item = AUDIOOPRN_URI_MAP.find(oprn);
92 if (item != AUDIOOPRN_URI_MAP.end()) {
93 return item->second;
94 }
95 }
96 MEDIA_ERR_LOG("get operation failed. tableName:%{public}s", tableName.c_str());
97 return "";
98 }
99
CheckTableName(const std::string & tableName)100 bool UserFileClientEx::CheckTableName(const std::string &tableName)
101 {
102 static const std::set<std::string> VALID_TABLENAME_WHITELIST = {
103 PhotoColumn::PHOTOS_TABLE,
104 AudioColumn::AUDIOS_TABLE
105 };
106 if (tableName.empty()) {
107 return false;
108 }
109 if (VALID_TABLENAME_WHITELIST.find(tableName) == VALID_TABLENAME_WHITELIST.end()) {
110 return false;
111 }
112 return true;
113 }
114
GetUriInfo(const std::string & uri,std::string & uriId)115 static inline bool GetUriInfo(const std::string &uri, std::string &uriId)
116 {
117 MediaFileUri fileUri(uri);
118 if (!fileUri.IsValid()) {
119 MEDIA_ERR_LOG("uri %{public}s is invalid", uri.c_str());
120 return false;
121 }
122 uriId = fileUri.GetFileId();
123 return true;
124 }
125
GetInsertUri(const std::string & tableName)126 static inline std::string GetInsertUri(const std::string &tableName)
127 {
128 std::string uri = GetOperation(tableName, MediaToolOperation::INSERT);
129 if (uri.empty()) {
130 MEDIA_ERR_LOG("get insert uri failed. tableName:%{public}s", tableName.c_str());
131 return uri;
132 }
133 uri.append(URI_ARG_FIRST_DELIMITER + URI_API_VERSION);
134 return uri;
135 }
136
GetQueryUri(const std::string & tableName)137 std::string UserFileClientEx::GetQueryUri(const std::string &tableName)
138 {
139 std::string uri = GetOperation(tableName, MediaToolOperation::QUERY);
140 if (uri.empty()) {
141 MEDIA_ERR_LOG("get query uri failed. tableName:%{public}s", tableName.c_str());
142 return uri;
143 }
144 uri.append(URI_ARG_FIRST_DELIMITER + URI_API_VERSION);
145 return uri;
146 }
147
GetListUri(const std::string & tableName)148 static inline std::string GetListUri(const std::string &tableName)
149 {
150 std::string uri = GetOperation(tableName, MediaToolOperation::LIST);
151 if (uri.empty()) {
152 MEDIA_ERR_LOG("get list uri failed. tableName:%{public}s", tableName.c_str());
153 return uri;
154 }
155 uri.append(URI_ARG_FIRST_DELIMITER + URI_API_VERSION);
156 return uri;
157 }
158
GetCloseUri(const std::string & tableName)159 static inline std::string GetCloseUri(const std::string &tableName)
160 {
161 std::string uri = GetOperation(tableName, MediaToolOperation::CLOSE);
162 if (uri.empty()) {
163 MEDIA_ERR_LOG("get close uri failed. tableName:%{public}s", tableName.c_str());
164 return uri;
165 }
166 uri.append(URI_ARG_FIRST_DELIMITER + URI_API_VERSION);
167 return uri;
168 }
169
GetUpdateUri(const std::string & tableName)170 static inline std::string GetUpdateUri(const std::string &tableName)
171 {
172 std::string uri = GetOperation(tableName, MediaToolOperation::UPDATE);
173 if (uri.empty()) {
174 MEDIA_ERR_LOG("get update uri failed. tableName:%{public}s", tableName.c_str());
175 return uri;
176 }
177 uri.append(URI_ARG_FIRST_DELIMITER + URI_API_VERSION);
178 return uri;
179 }
180
GetDeleteUri(const std::string & tableName)181 static inline std::string GetDeleteUri(const std::string &tableName)
182 {
183 std::string uri = GetOperation(tableName, MediaToolOperation::DELETE);
184 if (uri.empty()) {
185 MEDIA_ERR_LOG("get delete uri failed. tableName:%{public}s", tableName.c_str());
186 return uri;
187 }
188 uri.append(URI_ARG_FIRST_DELIMITER + URI_API_VERSION);
189 return uri;
190 }
191
IsRoot()192 static inline bool IsRoot()
193 {
194 return getuid() == ROOT_UID;
195 }
196
InitToken(const sptr<IRemoteObject> & token)197 static bool InitToken(const sptr<IRemoteObject> &token)
198 {
199 UserFileClient::Init(token);
200 return UserFileClient::IsValid();
201 }
202
Init()203 int32_t UserFileClientEx::Init()
204 {
205 MEDIA_INFO_LOG("Mediatool IPC connect start");
206 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
207 if (saManager == nullptr) {
208 MEDIA_ERR_LOG("get system ability mgr failed.");
209 return Media::E_ERR;
210 }
211 auto remoteObj = saManager->GetSystemAbility(STORAGE_MANAGER_MANAGER_ID);
212 if (remoteObj == nullptr) {
213 MEDIA_ERR_LOG("GetSystemAbility Service failed.");
214 return Media::E_ERR;
215 }
216 if (!InitToken(remoteObj)) {
217 MEDIA_ERR_LOG("set DataShareHelper failed.");
218 return Media::E_ERR;
219 }
220 return Media::E_OK;
221 }
222
Clear()223 void UserFileClientEx::Clear()
224 {
225 UserFileClient::Clear();
226 }
227
InsertExt(const std::string & tableName,const std::string & name,std::string & outString,bool isRestart)228 int32_t UserFileClientEx::InsertExt(const std::string &tableName, const std::string &name,
229 std::string &outString, bool isRestart)
230 {
231 if (isRestart && Init() != Media::E_OK) {
232 MEDIA_ERR_LOG("Init failed");
233 return Media::E_ERR;
234 }
235 std::string insertUriStr = GetInsertUri(tableName);
236 if (insertUriStr.empty()) {
237 MEDIA_ERR_LOG("insert failed. tableName:%{public}s, name:%{public}s", tableName.c_str(),
238 name.c_str());
239 return Media::E_ERR;
240 }
241 Uri insertUri(insertUriStr);
242 DataShare::DataShareValuesBucket values;
243 values.Put(MediaColumn::MEDIA_NAME, name);
244 if (MimeTypeUtils::IsMimeTypeMapEmpty()) {
245 MimeTypeUtils::InitMimeTypeMap();
246 }
247 string mimeType = MimeTypeUtils::GetMimeTypeFromExtension(ScannerUtils::GetFileExtension(name));
248 values.Put(MediaColumn::MEDIA_TYPE, MimeTypeUtils::GetMediaTypeFromMimeType(mimeType));
249 values.Put(MediaColumn::MEDIA_OWNER_PACKAGE, "com.mediatool.album");
250 values.Put(MediaColumn::MEDIA_OWNER_APPID, "mediatool.appid");
251 values.Put(MediaColumn::MEDIA_PACKAGE_NAME, "mediatool");
252 MEDIA_INFO_LOG("insertext. insertUri:%{public}s, name:%{public}s", insertUri.ToString().c_str(), name.c_str());
253 auto ret = UserFileClient::InsertExt(insertUri, values, outString);
254 if (ret <= 0) {
255 MEDIA_ERR_LOG("insertext failed. ret:%{public}d", ret);
256 }
257 return ret;
258 }
259
Query(const std::string & tableName,const std::string & uri,std::shared_ptr<DataShare::DataShareResultSet> & resultSet,bool isList,bool isRestart)260 int32_t UserFileClientEx::Query(const std::string &tableName, const std::string &uri,
261 std::shared_ptr<DataShare::DataShareResultSet> &resultSet, bool isList, bool isRestart)
262 {
263 if (isRestart && Init() != Media::E_OK) {
264 MEDIA_ERR_LOG("Init failed");
265 return Media::E_ERR;
266 }
267 if (!CheckTableName(tableName)) {
268 MEDIA_ERR_LOG("tableName %{public}s is Invalid", tableName.c_str());
269 return Media::E_ERR;
270 }
271 resultSet = nullptr;
272 std::string id;
273 if ((!uri.empty()) && (!GetUriInfo(uri, id))) {
274 MEDIA_ERR_LOG("query failed, uri:%{public}s", uri.c_str());
275 return Media::E_ERR;
276 }
277 std::string queryUriStr = isList ? GetListUri(tableName) : GetQueryUri(tableName);
278 if (queryUriStr.empty()) {
279 MEDIA_ERR_LOG("query failed. queryUriStr:empty, tableName:%{public}s", tableName.c_str());
280 return Media::E_ERR;
281 }
282 Uri queryUri(queryUriStr);
283 DataShare::DataSharePredicates predicates;
284 // Id is empty, meaning get all object from table
285 if (!id.empty()) {
286 predicates.And()->EqualTo(MediaColumn::MEDIA_ID, id);
287 }
288 if (!IsRoot() && (tableName == PhotoColumn::PHOTOS_TABLE)) {
289 predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, 0);
290 }
291 std::vector<std::string> columns;
292 int errCode = 0;
293 MEDIA_INFO_LOG("query. queryUri:%{public}s, tableName:%{public}s, uri:%{public}s, "
294 "id:%{public}s", queryUri.ToString().c_str(), tableName.c_str(), uri.c_str(), id.c_str());
295 resultSet = UserFileClient::Query(queryUri, predicates, columns, errCode);
296 if (resultSet == nullptr) {
297 MEDIA_ERR_LOG("query failed. resultSet:null, errCode:%{public}d.", errCode);
298 return ((errCode == Media::E_OK) ? Media::E_OK : Media::E_ERR);
299 }
300 if (errCode != Media::E_OK) {
301 MEDIA_ERR_LOG("query failed. errCode:%{public}d.", errCode);
302 resultSet->Close();
303 return Media::E_ERR;
304 }
305 return Media::E_OK;
306 }
307
Open(const std::string & uri,const std::string & mode,bool isRestart)308 int UserFileClientEx::Open(const std::string &uri, const std::string &mode, bool isRestart)
309 {
310 if (isRestart && Init() != Media::E_OK) {
311 MEDIA_ERR_LOG("Init failed");
312 return Media::E_ERR;
313 }
314 if (uri.empty()) {
315 return Media::E_FAIL;
316 }
317 std::string uriWithKey {uri};
318 MediaFileUtils::UriAppendKeyValue(uriWithKey, IS_TOOL_OPEN,
319 TOOL_OPEN_TRUE);
320 Uri openUri(uriWithKey);
321 MEDIA_INFO_LOG("open. uri:%{public}s, mode:%{public}s", uriWithKey.c_str(), mode.c_str());
322 return UserFileClient::OpenFile(openUri, mode);
323 }
324
Close(const std::string & uri,const int fileFd,const std::string & mode,bool isCreateThumbSync,bool isRestart)325 int UserFileClientEx::Close(const std::string &uri, const int fileFd, const std::string &mode,
326 bool isCreateThumbSync, bool isRestart)
327 {
328 if (isRestart && Init() != Media::E_OK) {
329 MEDIA_ERR_LOG("Init failed");
330 return Media::E_ERR;
331 }
332 if (!UserFileClient::IsValid()) {
333 MEDIA_ERR_LOG("close failed. helper:null. uri:%{public}s, fileFd:%{public}d, mode:%{public}s",
334 uri.c_str(), fileFd, mode.c_str());
335 return Media::E_FAIL;
336 }
337 if (mode == Media::MEDIA_FILEMODE_READONLY) {
338 if (close(fileFd) != E_SUCCESS) {
339 MEDIA_ERR_LOG("close failed. uri:%{public}s, fileFd:%{public}d, mode:%{public}s",
340 uri.c_str(), fileFd, mode.c_str());
341 return Media::E_FAIL;
342 }
343 return Media::E_OK;
344 }
345 DataShare::DataShareValuesBucket valuesBucket;
346 valuesBucket.Put(MEDIA_DATA_DB_URI, uri);
347 if (isCreateThumbSync) {
348 valuesBucket.Put(CLOSE_CREATE_THUMB_STATUS, CREATE_THUMB_SYNC_STATUS);
349 }
350 std::string closeUriStr = GetCloseUri(GetTableNameByUri(uri));
351 if (closeUriStr.empty()) {
352 MEDIA_ERR_LOG("get close uri failed. uri:%{public}s", uri.c_str());
353 return Media::E_FAIL;
354 }
355 Uri closeUri(closeUriStr);
356 MEDIA_INFO_LOG("close. closeUri:%{public}s, uri:%{public}s", closeUri.ToString().c_str(), uri.c_str());
357 auto ret = UserFileClient::Insert(closeUri, valuesBucket);
358 if (ret != Media::E_OK) {
359 MEDIA_ERR_LOG("close the file failed. ret:%{public}d, closeUri:%{public}s, uri:%{public}s",
360 ret, closeUri.ToString().c_str(), uri.c_str());
361 }
362 if (close(fileFd) != E_SUCCESS) {
363 MEDIA_ERR_LOG("close failed. uri:%{public}s, fileFd:%{public}d, mode:%{public}s",
364 uri.c_str(), fileFd, mode.c_str());
365 return Media::E_FAIL;
366 }
367 return ret;
368 }
369
Trash(const std::string & uri,bool isRestart)370 int32_t UserFileClientEx::Trash(const std::string &uri, bool isRestart)
371 {
372 if (isRestart && Init() != Media::E_OK) {
373 MEDIA_ERR_LOG("Init failed");
374 return Media::E_ERR;
375 }
376 if (!UserFileClient::IsValid()) {
377 MEDIA_ERR_LOG("close failed. helper:null.");
378 return Media::E_FAIL;
379 }
380 MediaFileUri fileUri(uri);
381 if (!fileUri.IsValid()) {
382 MEDIA_ERR_LOG("FileUri %{public}s is not Valid", uri.c_str());
383 return Media::E_FAIL;
384 }
385 string tableName = GetTableNameByUri(uri);
386 std::string trashUriStr = GetUpdateUri(tableName);
387 if (trashUriStr.empty()) {
388 MEDIA_ERR_LOG("get trash uri failed. uri:%{public}s", uri.c_str());
389 return Media::E_FAIL;
390 }
391
392 DataShare::DataShareValuesBucket valuesBucket;
393 valuesBucket.Put(MediaColumn::MEDIA_DATE_TRASHED, MediaFileUtils::UTCTimeMilliSeconds());
394 DataShare::DataSharePredicates predicates;
395 predicates.SetWhereClause(MediaColumn::MEDIA_ID + " = ? ");
396 predicates.SetWhereArgs({ fileUri.GetFileId() });
397 Uri trashUri(trashUriStr);
398 MEDIA_INFO_LOG("trash. trashUri:%{public}s, uri:%{public}s", trashUri.ToString().c_str(), uri.c_str());
399 auto ret = UserFileClient::Update(trashUri, predicates, valuesBucket);
400 if (ret < 0) {
401 MEDIA_ERR_LOG("trash the file failed. ret:%{public}d, trashUri:%{public}s, uri:%{public}s",
402 ret, trashUri.ToString().c_str(), uri.c_str());
403 }
404 return ret;
405 }
406
Delete(const std::string & uri,bool isRestart)407 int32_t UserFileClientEx::Delete(const std::string &uri, bool isRestart)
408 {
409 if (isRestart && Init() != Media::E_OK) {
410 MEDIA_ERR_LOG("Init failed");
411 return Media::E_ERR;
412 }
413 if (!UserFileClient::IsValid()) {
414 MEDIA_ERR_LOG("close failed. helper:null.");
415 return Media::E_FAIL;
416 }
417 MediaFileUri fileUri(uri);
418 if (!fileUri.IsValid()) {
419 MEDIA_ERR_LOG("FileUri %{public}s is not Valid", uri.c_str());
420 return Media::E_FAIL;
421 }
422 string tableName = GetTableNameByUri(uri);
423 std::string deleteUriStr = GetDeleteUri(tableName);
424 if (deleteUriStr.empty()) {
425 MEDIA_ERR_LOG("get delete uri failed. uri:%{public}s", uri.c_str());
426 return Media::E_FAIL;
427 }
428
429 DataShare::DataSharePredicates predicates;
430 predicates.EqualTo(MediaColumn::MEDIA_ID, fileUri.GetFileId());
431 DataShare::DataShareValuesBucket valuesBucket;
432 valuesBucket.Put(PhotoColumn::MEDIA_DATE_TRASHED, 0);
433 Uri deleteUri(deleteUriStr);
434 MEDIA_INFO_LOG("delete. deleteUri:%{public}s, uri:%{public}s", deleteUri.ToString().c_str(), uri.c_str());
435 int ret = 0;
436 if (tableName == PhotoColumn::PHOTOS_TABLE) {
437 ret = UserFileClient::Update(deleteUri, predicates, valuesBucket);
438 } else if (tableName == AudioColumn::AUDIOS_TABLE) {
439 ret = UserFileClient::Delete(deleteUri, predicates);
440 } else {
441 MEDIA_ERR_LOG("invalid table name: %{public}s", tableName.c_str());
442 }
443
444 if (ret < 0) {
445 MEDIA_ERR_LOG("delete the file failed. ret:%{public}d, deleteUri:%{public}s, uri:%{public}s",
446 ret, deleteUri.ToString().c_str(), uri.c_str());
447 }
448 return ret;
449 }
450
Delete(bool isOnlyDeleteDb,bool isRestart)451 int32_t UserFileClientEx::Delete(bool isOnlyDeleteDb, bool isRestart)
452 {
453 if (isRestart && Init() != Media::E_OK) {
454 MEDIA_ERR_LOG("Init failed");
455 return Media::E_ERR;
456 }
457 if (!UserFileClient::IsValid()) {
458 MEDIA_ERR_LOG("close failed. helper:null.");
459 return Media::E_FAIL;
460 }
461 DataShare::DataShareValuesBucket valuesBucket;
462 valuesBucket.Put(DELETE_TOOL_ONLY_DATABASE, isOnlyDeleteDb);
463 std::string uri = URI_DELETE_TOOL;
464 Uri deleteUri(uri);
465 auto ret = UserFileClient::Insert(deleteUri, valuesBucket);
466 if (ret != Media::E_OK) {
467 MEDIA_ERR_LOG("Delete all Files in MediaLibrary failed, ret=%{public}d", ret);
468 }
469 return ret;
470 }
471
GetResultsetByDisplayName(const std::string & tableName,const std::string & displayName)472 std::shared_ptr<DataShare::DataShareResultSet> UserFileClientEx::GetResultsetByDisplayName(
473 const std::string &tableName, const std::string &displayName)
474 {
475 DataShare::DataSharePredicates predicates;
476 predicates.And()->EqualTo(MediaColumn::MEDIA_NAME, displayName);
477 if (!IsRoot() && (tableName == PhotoColumn::PHOTOS_TABLE)) {
478 predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, 0);
479 }
480 std::vector<std::string> columns;
481 int queryErrCode = 0;
482 std::string queryUriStr = GetQueryUri(tableName);
483 if (queryUriStr.empty()) {
484 MEDIA_ERR_LOG("query failed. queryUriStr:empty, tableName:%{public}s", tableName.c_str());
485 }
486 Uri filesQueryUri(queryUriStr);
487 auto resultSet = UserFileClient::Query(filesQueryUri, predicates, columns, queryErrCode);
488 return resultSet;
489 }
490
GetTableNameByMediaType(const MediaType mediaType)491 std::string UserFileClientEx::GetTableNameByMediaType(const MediaType mediaType)
492 {
493 static const std::map<MediaType, std::string> TYPE_TABLE_MAP = {
494 { MediaType::MEDIA_TYPE_AUDIO, AudioColumn::AUDIOS_TABLE },
495 { MediaType::MEDIA_TYPE_IMAGE, PhotoColumn::PHOTOS_TABLE },
496 { MediaType::MEDIA_TYPE_VIDEO, PhotoColumn::PHOTOS_TABLE },
497 { MediaType::MEDIA_TYPE_PHOTO, PhotoColumn::PHOTOS_TABLE }
498 };
499 std::string tableName;
500 auto item = TYPE_TABLE_MAP.find(mediaType);
501 if (item != TYPE_TABLE_MAP.end()) {
502 tableName = item->second;
503 } else {
504 MEDIA_ERR_LOG("get table name failed. mediaType:%{public}d", mediaType);
505 }
506 return tableName;
507 }
508
GetTableNameByUri(const std::string & uri)509 std::string UserFileClientEx::GetTableNameByUri(const std::string &uri)
510 {
511 MediaFileUri fileUri(uri);
512 if (!fileUri.IsValid()) {
513 MEDIA_ERR_LOG("uri %{public}s is invalid", uri.c_str());
514 return "";
515 }
516 return fileUri.GetTableName();
517 }
518
GetSupportTypes()519 const std::vector<MediaType> &UserFileClientEx::GetSupportTypes()
520 {
521 static const std::vector<MediaType> SUPPORT_TYPES = {
522 MediaType::MEDIA_TYPE_AUDIO,
523 MediaType::MEDIA_TYPE_IMAGE,
524 MediaType::MEDIA_TYPE_VIDEO
525 };
526 return SUPPORT_TYPES;
527 }
528
GetSupportTables()529 const std::vector<std::string> &UserFileClientEx::GetSupportTables()
530 {
531 static const std::vector<std::string> SUPPORT_TABLES = {
532 PhotoColumn::PHOTOS_TABLE,
533 AudioColumn::AUDIOS_TABLE
534 };
535 return SUPPORT_TABLES;
536 }
537 } // namespace MediaTool
538 } // namespace Media
539 } // namespace OHOS
540