• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 "FileOperation"
16 
17 #include "medialibrary_file_operations.h"
18 
19 #include "datashare_predicates.h"
20 #include "datashare_values_bucket.h"
21 #include "file_asset.h"
22 #include "hitrace_meter.h"
23 #include "media_file_utils.h"
24 #include "media_log.h"
25 #include "medialibrary_data_manager_utils.h"
26 #include "medialibrary_db_const.h"
27 #include "medialibrary_dir_operations.h"
28 #include "medialibrary_errno.h"
29 #include "medialibrary_object_utils.h"
30 #include "medialibrary_smartalbum_map_db.h"
31 #include "medialibrary_tracer.h"
32 #include "medialibrary_unistore_manager.h"
33 #include "native_album_asset.h"
34 #include "rdb_utils.h"
35 
36 using namespace std;
37 using namespace OHOS::NativeRdb;
38 using namespace OHOS::DataShare;
39 using namespace OHOS::RdbDataShareAdapter;
40 
41 namespace OHOS {
42 namespace Media {
HandleFileOperation(MediaLibraryCommand & cmd)43 int32_t MediaLibraryFileOperations::HandleFileOperation(MediaLibraryCommand &cmd)
44 {
45     int32_t errCode = E_FAIL;
46     auto values = cmd.GetValueBucket();
47     string actualUri;
48 
49     ValueObject valueObject;
50     if (values.GetObject(MEDIA_DATA_DB_URI, valueObject)) {
51         valueObject.GetString(actualUri);
52     }
53 
54     // only support CloseAsset when networkId is not empty
55     string networkId = MediaLibraryDataManagerUtils::GetNetworkIdFromUri(actualUri);
56     if (!networkId.empty() && cmd.GetOprnType() != OperationType::CLOSE) {
57         return E_PERMISSION_DENIED;
58     }
59 
60     switch (cmd.GetOprnType()) {
61         case OperationType::CREATE:
62             errCode = CreateFileOperation(cmd);
63             break;
64         case OperationType::CLOSE:
65             errCode = CloseFileOperation(cmd);
66             break;
67         case OperationType::ISDICTIONARY:
68             errCode = IsDirectoryOperation(cmd);
69             break;
70         case OperationType::GETCAPACITY:
71             errCode = GetAlbumCapacityOperation(cmd);
72             break;
73         default:
74             MEDIA_ERR_LOG("unknown operation type %{public}d", cmd.GetOprnType());
75             break;
76     }
77     return errCode;
78 }
79 
CreateFileOperation(MediaLibraryCommand & cmd)80 int32_t MediaLibraryFileOperations::CreateFileOperation(MediaLibraryCommand &cmd)
81 {
82     MEDIA_DEBUG_LOG("enter");
83     return MediaLibraryObjectUtils::CreateFileObj(cmd);
84 }
85 
CloseFileOperation(MediaLibraryCommand & cmd)86 int32_t MediaLibraryFileOperations::CloseFileOperation(MediaLibraryCommand &cmd)
87 {
88     MEDIA_DEBUG_LOG("enter");
89     return MediaLibraryObjectUtils::CloseFile(cmd);
90 }
91 
QueryFavFiles(MediaLibraryCommand & cmd)92 shared_ptr<AbsSharedResultSet> MediaLibraryFileOperations::QueryFavFiles(MediaLibraryCommand &cmd)
93 {
94     MEDIA_DEBUG_LOG("enter");
95     cmd.GetAbsRdbPredicates()->EqualTo(MEDIA_DATA_DB_IS_FAV, "1");
96     cmd.GetAbsRdbPredicates()->And()->NotEqualTo(MEDIA_DATA_DB_MEDIA_TYPE, "8");
97 
98     return MediaLibraryObjectUtils::QueryWithCondition(cmd, {});
99 }
100 
QueryTrashFiles(MediaLibraryCommand & cmd)101 shared_ptr<AbsSharedResultSet> MediaLibraryFileOperations::QueryTrashFiles(MediaLibraryCommand &cmd)
102 {
103     MEDIA_DEBUG_LOG("enter");
104     cmd.GetAbsRdbPredicates()
105         ->GreaterThan(MEDIA_DATA_DB_DATE_TRASHED, "0")
106         ->And()
107         ->NotEqualTo(MEDIA_DATA_DB_MEDIA_TYPE, "8");
108 
109     return MediaLibraryObjectUtils::QueryWithCondition(cmd, {});
110 }
111 
GetAlbumCapacityOperation(MediaLibraryCommand & cmd)112 int32_t MediaLibraryFileOperations::GetAlbumCapacityOperation(MediaLibraryCommand &cmd)
113 {
114     MEDIA_DEBUG_LOG("enter");
115     int32_t errorCode = E_FAIL;
116     shared_ptr<AbsSharedResultSet> resultSet = nullptr;
117 
118     auto values = cmd.GetValueBucket();
119     ValueObject valueObject;
120     bool isFavourite = false;
121     bool isTrash = false;
122     if (values.GetObject(MEDIA_DATA_DB_IS_FAV, valueObject)) {
123         valueObject.GetBool(isFavourite);
124     }
125     if (values.GetObject(MEDIA_DATA_DB_IS_TRASH, valueObject)) {
126         valueObject.GetBool(isTrash);
127     }
128 
129     if (isFavourite) {
130         resultSet = QueryFavFiles(cmd);
131     } else if (isTrash) {
132         resultSet = QueryTrashFiles(cmd);
133     }
134 
135     if (resultSet != nullptr) {
136         resultSet->GetRowCount(errorCode);
137         MEDIA_INFO_LOG("GetRowCount %{private}d", errorCode);
138     }
139 
140     return errorCode;
141 }
142 
ModifyFileOperation(MediaLibraryCommand & cmd)143 int32_t MediaLibraryFileOperations::ModifyFileOperation(MediaLibraryCommand &cmd)
144 {
145     MEDIA_DEBUG_LOG("enter");
146 
147     string strFileId = cmd.GetOprnFileId();
148     if (strFileId.empty()) {
149         MEDIA_ERR_LOG("MediaLibraryFileOperations::ModifyFileOperation Get id from uri or valuesBucket failed!");
150         return E_INVALID_FILEID;
151     }
152 
153     string srcPath = MediaLibraryObjectUtils::GetPathByIdFromDb(strFileId);
154     if (srcPath.empty()) {
155         MEDIA_ERR_LOG("MediaLibraryFileOperations::ModifyFileOperation Get path of id %{private}s from database file!",
156             strFileId.c_str());
157         return E_INVALID_FILEID;
158     }
159 
160     string dstFileName;
161     string dstReFilePath;
162     auto values = cmd.GetValueBucket();
163     ValueObject valueObject;
164     if (values.GetObject(MEDIA_DATA_DB_NAME, valueObject)) {
165         valueObject.GetString(dstFileName);
166     }
167     if (values.GetObject(MEDIA_DATA_DB_RELATIVE_PATH, valueObject)) {
168         valueObject.GetString(dstReFilePath);
169     }
170     string dstFilePath = ROOT_MEDIA_DIR + dstReFilePath + dstFileName;
171 
172     if (srcPath.compare(dstFilePath) == 0) {
173         return E_SAME_PATH;
174     }
175 
176     return MediaLibraryObjectUtils::RenameFileObj(cmd, srcPath, dstFilePath);
177 }
178 
DeleteFileOperation(MediaLibraryCommand & cmd,const unordered_map<string,DirAsset> & dirQuerySetMap)179 int32_t MediaLibraryFileOperations::DeleteFileOperation(MediaLibraryCommand &cmd,
180     const unordered_map<string, DirAsset> &dirQuerySetMap)
181 {
182     string strFileId = cmd.GetOprnFileId();
183     if (strFileId.empty()) {
184         MEDIA_ERR_LOG("MediaLibraryFileOperations::DeleteFileOperation Get id from uri or valuesBucket failed!");
185         return E_INVALID_FILEID;
186     }
187 
188     string srcPath = MediaLibraryObjectUtils::GetPathByIdFromDb(strFileId);
189     if (srcPath.empty()) {
190         MEDIA_ERR_LOG("MediaLibraryFileOperations::DeleteFileOperation Get path of id %{private}s from database file!",
191             strFileId.c_str());
192         return E_INVALID_FILEID;
193     }
194 
195     int32_t errCode = MediaLibraryObjectUtils::DeleteFileObj(cmd, srcPath);
196     if (errCode > 0) {
197         MediaLibraryDirOperations dirOprn;
198         MediaLibrarySmartAlbumMapDb smartAlbumMapDbOprn;
199         auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStoreRaw()->GetRaw();
200         dirOprn.HandleDirOperations(MEDIA_DIROPRN_DELETEDIR, cmd.GetValueBucket(), rdbStore, dirQuerySetMap);
201         smartAlbumMapDbOprn.DeleteAllAssetsMapInfo(std::stoi(strFileId), rdbStore);
202     }
203     return errCode;
204 }
205 
IsDirectoryOperation(MediaLibraryCommand & cmd)206 int32_t MediaLibraryFileOperations::IsDirectoryOperation(MediaLibraryCommand &cmd)
207 {
208     MEDIA_DEBUG_LOG("enter");
209     auto uniStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
210     if (uniStore == nullptr) {
211         MEDIA_ERR_LOG("uniStore is nullptr");
212         return E_HAS_DB_ERROR;
213     }
214 
215     string fileId = cmd.GetOprnFileId();
216     if (fileId.empty()) {
217         MEDIA_ERR_LOG("not dictionary id, can't do the judgement!");
218         return E_INVALID_FILEID;
219     }
220     string path = MediaLibraryObjectUtils::GetPathByIdFromDb(fileId);
221     if (MediaFileUtils::IsDirectory(path)) {
222         MEDIA_INFO_LOG("%{private}s is a dictionary!", path.c_str());
223         return E_SUCCESS;
224     }
225     MEDIA_INFO_LOG("%{private}s is NOT a dictionary!", path.c_str());
226     return E_CHECK_DIR_FAIL;
227 }
228 
QueryFileOperation(MediaLibraryCommand & cmd,vector<string> columns)229 shared_ptr<AbsSharedResultSet> MediaLibraryFileOperations::QueryFileOperation(
230     MediaLibraryCommand &cmd, vector<string> columns)
231 {
232     auto uniStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
233     if (uniStore == nullptr) {
234         MEDIA_ERR_LOG("uniStore is nullptr");
235         return nullptr;
236     }
237 
238     shared_ptr<AbsSharedResultSet> queryResultSet;
239     string fileId = cmd.GetOprnFileId();
240     if (cmd.GetAbsRdbPredicates()->GetWhereClause().empty() && !fileId.empty()) {
241         cmd.GetAbsRdbPredicates()->EqualTo(MEDIA_DATA_DB_ID, fileId);
242     }
243     string networkId = cmd.GetOprnDevice();
244     if (!networkId.empty()) {
245         std::vector<string> devices;
246         devices.push_back(networkId);
247         cmd.GetAbsRdbPredicates()->InDevices(devices);
248     }
249     MediaLibraryTracer tracer;
250     tracer.Start("QueryFile RdbStore->Query");
251     queryResultSet = uniStore->Query(cmd, columns);
252     tracer.Finish();
253     return queryResultSet;
254 }
255 } // namespace Media
256 } // namespace OHOS
257