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