1 /*
2 * Copyright (c) 2022-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 #include "file_access_ext_stub_impl.h"
17
18 #include <cinttypes>
19 #include "user_access_tracer.h"
20 #include "file_access_framework_errno.h"
21 #include "hilog_wrapper.h"
22 #include "hitrace_meter.h"
23
24 namespace OHOS {
25 namespace FileAccessFwk {
26 const uint64_t FILEFILTER_DEFAULT_COUNTS = 2000;
27 const uint64_t FILEFILTER_MAX_COUNTS = 20000;
GetOwner()28 std::shared_ptr<FileAccessExtAbility> FileAccessExtStubImpl::GetOwner()
29 {
30 return extension_;
31 }
32
OpenFile(const Uri & uri,const int flags,int & fd)33 int FileAccessExtStubImpl::OpenFile(const Uri &uri, const int flags, int &fd)
34 {
35 UserAccessTracer trace;
36 trace.Start("OpenFile");
37 if (extension_ == nullptr) {
38 HILOG_ERROR("OpenFile get extension failed.");
39 return E_IPCS;
40 }
41
42 int ret = extension_->OpenFile(uri, flags, fd);
43 return ret;
44 }
45
CreateFile(const Uri & parent,const std::string & displayName,Uri & newFile)46 int FileAccessExtStubImpl::CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile)
47 {
48 UserAccessTracer trace;
49 trace.Start("CreateFile");
50 if (extension_ == nullptr) {
51 HILOG_ERROR("CreateFile get extension failed.");
52 return E_IPCS;
53 }
54
55 int ret = extension_->CreateFile(parent, displayName, newFile);
56 return ret;
57 }
58
Mkdir(const Uri & parent,const std::string & displayName,Uri & newFile)59 int FileAccessExtStubImpl::Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile)
60 {
61 UserAccessTracer trace;
62 trace.Start("Mkdir");
63 if (extension_ == nullptr) {
64 HILOG_ERROR("Mkdir get extension failed.");
65 return E_IPCS;
66 }
67
68 int ret = extension_->Mkdir(parent, displayName, newFile);
69 return ret;
70 }
71
Delete(const Uri & sourceFile)72 int FileAccessExtStubImpl::Delete(const Uri &sourceFile)
73 {
74 UserAccessTracer trace;
75 trace.Start("Delete");
76 if (extension_ == nullptr) {
77 HILOG_ERROR("Delete get extension failed.");
78 return E_IPCS;
79 }
80
81 int ret = extension_->Delete(sourceFile);
82 return ret;
83 }
84
Move(const Uri & sourceFile,const Uri & targetParent,Uri & newFile)85 int FileAccessExtStubImpl::Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile)
86 {
87 UserAccessTracer trace;
88 trace.Start("Move");
89 if (extension_ == nullptr) {
90 HILOG_ERROR("Move get extension failed.");
91 return E_IPCS;
92 }
93
94 int ret = extension_->Move(sourceFile, targetParent, newFile);
95 return ret;
96 }
97
Copy(const Uri & sourceUri,const Uri & destUri,std::vector<Result> & copyResult,bool force)98 int FileAccessExtStubImpl::Copy(const Uri &sourceUri, const Uri &destUri, std::vector<Result> ©Result,
99 bool force)
100 {
101 UserAccessTracer trace;
102 trace.Start("Copy");
103 if (extension_ == nullptr) {
104 HILOG_ERROR("Copy get extension failed.");
105 return E_IPCS;
106 }
107 int ret = extension_->Copy(sourceUri, destUri, copyResult, force);
108 return ret;
109 }
110
CopyFile(const Uri & sourceUri,const Uri & destUri,const std::string & fileName,Uri & newFileUri)111 int FileAccessExtStubImpl::CopyFile(const Uri &sourceUri, const Uri &destUri, const std::string &fileName,
112 Uri &newFileUri)
113 {
114 UserAccessTracer trace;
115 trace.Start("CopyFile");
116 if (extension_ == nullptr) {
117 HILOG_ERROR("Copy file get extension failed.");
118 return E_IPCS;
119 }
120 int ret = extension_->CopyFile(sourceUri, destUri, fileName, newFileUri);
121 return ret;
122 }
123
Rename(const Uri & sourceFile,const std::string & displayName,Uri & newFile)124 int FileAccessExtStubImpl::Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile)
125 {
126 UserAccessTracer trace;
127 trace.Start("Rename");
128 if (extension_ == nullptr) {
129 HILOG_ERROR("Rename get extension failed.");
130 return E_IPCS;
131 }
132
133 int ret = extension_->Rename(sourceFile, displayName, newFile);
134 return ret;
135 }
136
ListFile(const FileInfo & fileInfo,const int64_t offset,const FileFilter & filter,SharedMemoryInfo & memInfo)137 int FileAccessExtStubImpl::ListFile(const FileInfo &fileInfo, const int64_t offset,
138 const FileFilter &filter, SharedMemoryInfo &memInfo)
139 {
140 UserAccessTracer trace;
141 trace.Start("ListFile");
142 if (extension_ == nullptr) {
143 HILOG_ERROR("ListFile get extension failed.");
144 return E_IPCS;
145 }
146
147 std::vector<FileInfo> fileInfoVec;
148 int ret = ERR_OK;
149 memInfo.isOver = false;
150 int64_t currentOffset = offset;
151 while (true) {
152 uint64_t maxCounts =
153 memInfo.memSize > DEFAULT_CAPACITY_200KB ? FILEFILTER_MAX_COUNTS : FILEFILTER_DEFAULT_COUNTS;
154 fileInfoVec.clear();
155 ret = extension_->ListFile(fileInfo, currentOffset, maxCounts, filter, fileInfoVec);
156 if (ret != ERR_OK) {
157 HILOG_ERROR("Extension ability ListFile error, code:%{public}d", ret);
158 break;
159 }
160
161 uint32_t currentWriteCounts = SharedMemoryOperation::WriteFileInfos(fileInfoVec, memInfo);
162 if (currentWriteCounts < fileInfoVec.size()) {
163 if (memInfo.memSize == DEFAULT_CAPACITY_200KB) {
164 uint32_t counts = 0;
165 extension_->GetFileInfoNum(fileInfo.uri, filter, false, counts);
166 memInfo.leftDataCounts = counts - memInfo.dataCounts;
167 }
168 break;
169 }
170 if (fileInfoVec.empty() ||(maxCounts > static_cast<uint64_t>(fileInfoVec.size())
171 && currentWriteCounts == fileInfoVec.size())) {
172 memInfo.isOver = true;
173 break;
174 }
175 currentOffset += currentWriteCounts;
176 }
177
178 return ret;
179 }
180
ScanFile(const FileInfo & fileInfo,const int64_t offset,const int64_t maxCount,const FileFilter & filter,std::vector<FileInfo> & fileInfoVec)181 int FileAccessExtStubImpl::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,
182 const FileFilter &filter, std::vector<FileInfo> &fileInfoVec)
183 {
184 UserAccessTracer trace;
185 trace.Start("ScanFile");
186 if (extension_ == nullptr) {
187 HILOG_ERROR("ScanFile get extension failed.");
188 return E_IPCS;
189 }
190
191 int ret = extension_->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec);
192 return ret;
193 }
194
Query(const Uri & uri,std::vector<std::string> & columns,std::vector<std::string> & results)195 int FileAccessExtStubImpl::Query(const Uri &uri, std::vector<std::string> &columns, std::vector<std::string> &results)
196 {
197 UserAccessTracer trace;
198 trace.Start("Query");
199 if (extension_ == nullptr) {
200 HILOG_ERROR("Query get extension failed.");
201 return E_IPCS;
202 }
203
204 int ret = extension_->Query(uri, columns, results);
205 return ret;
206 }
207
GetRoots(std::vector<RootInfo> & rootInfoVec)208 int FileAccessExtStubImpl::GetRoots(std::vector<RootInfo> &rootInfoVec)
209 {
210 UserAccessTracer trace;
211 trace.Start("GetRoots");
212 if (extension_ == nullptr) {
213 HILOG_ERROR("GetRoots get extension failed.");
214 return E_IPCS;
215 }
216
217 int ret = extension_->GetRoots(rootInfoVec);
218 return ret;
219 }
220
GetFileInfoFromUri(const Uri & selectFile,FileInfo & fileInfo)221 int FileAccessExtStubImpl::GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo)
222 {
223 UserAccessTracer trace;
224 trace.Start("GetFileInfoFromUri");
225 if (extension_ == nullptr) {
226 HILOG_ERROR("GetFileInfoFromUri get extension failed.");
227 return E_IPCS;
228 }
229
230 int ret = extension_->GetFileInfoFromUri(selectFile, fileInfo);
231 return ret;
232 }
233
GetFileInfoFromRelativePath(const std::string & selectFile,FileInfo & fileInfo)234 int FileAccessExtStubImpl::GetFileInfoFromRelativePath(const std::string &selectFile, FileInfo &fileInfo)
235 {
236 UserAccessTracer trace;
237 trace.Start("GetFileInfoFromRelativePath");
238 if (extension_ == nullptr) {
239 HILOG_ERROR("GetFileInfoFromRelativePath get extension failed.");
240 return E_IPCS;
241 }
242
243 int ret = extension_->GetFileInfoFromRelativePath(selectFile, fileInfo);
244 return ret;
245 }
246
Access(const Uri & uri,bool & isExist)247 int FileAccessExtStubImpl::Access(const Uri &uri, bool &isExist)
248 {
249 UserAccessTracer trace;
250 trace.Start("Access");
251 if (extension_ == nullptr) {
252 HILOG_ERROR("Access get extension failed.");
253 return E_IPCS;
254 }
255
256 int ret = extension_->Access(uri, isExist);
257 return ret;
258 }
259
StartWatcher(const Uri & uri)260 int FileAccessExtStubImpl::StartWatcher(const Uri &uri)
261 {
262 UserAccessTracer trace;
263 trace.Start("StartWatcher");
264 if (extension_ == nullptr) {
265 HILOG_ERROR("StartWatcher get extension failed.");
266 return E_IPCS;
267 }
268
269 int ret = extension_->StartWatcher(uri);
270 return ret;
271 }
272
StopWatcher(const Uri & uri)273 int FileAccessExtStubImpl::StopWatcher(const Uri &uri)
274 {
275 UserAccessTracer trace;
276 trace.Start("StopWatcher");
277 if (extension_ == nullptr) {
278 HILOG_ERROR("StopWatcher get extension failed.");
279 return E_IPCS;
280 }
281
282 int ret = extension_->StopWatcher(uri);
283 return ret;
284 }
285
MoveItem(const Uri & sourceFile,const Uri & targetParent,std::vector<Result> & moveResult,bool force)286 int FileAccessExtStubImpl::MoveItem(const Uri &sourceFile, const Uri &targetParent, std::vector<Result> &moveResult,
287 bool force)
288 {
289 UserAccessTracer trace;
290 trace.Start("MoveItem");
291 if (extension_ == nullptr) {
292 HILOG_ERROR("Move get extension failed.");
293 return E_IPCS;
294 }
295
296 return extension_->MoveItem(sourceFile, targetParent, moveResult, force);
297 }
298
MoveFile(const Uri & sourceFile,const Uri & targetParent,std::string & fileName,Uri & newFile)299 int FileAccessExtStubImpl::MoveFile(const Uri &sourceFile, const Uri &targetParent, std::string &fileName, Uri &newFile)
300 {
301 UserAccessTracer trace;
302 trace.Start("MoveFile");
303 if (extension_ == nullptr) {
304 HILOG_ERROR("Move get extension failed.");
305 return E_IPCS;
306 }
307
308 return extension_->MoveFile(sourceFile, targetParent, fileName, newFile);
309 }
310 } // namespace FileAccessFwk
311 } // namespace OHOS
312