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> &copyResult,
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