• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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