• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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_helper.h"
17 
18 #include <nlohmann/json.hpp>
19 #include "bundle_constants.h"
20 #include "bundle_mgr_proxy.h"
21 #include "file_access_framework_errno.h"
22 #include "file_access_extension_info.h"
23 #include "file_access_service_proxy.h"
24 #include "hilog_wrapper.h"
25 #include "hitrace_meter.h"
26 #include "user_access_tracer.h"
27 #include "if_system_ability_manager.h"
28 #include "ifile_access_ext_base.h"
29 #include "ipc_skeleton.h"
30 #include "iservice_registry.h"
31 #include "image_source.h"
32 #include "system_ability_definition.h"
33 #include "tokenid_kit.h"
34 #include "n_error.h"
35 
36 namespace OHOS {
37 namespace FileAccessFwk {
38 using namespace Media;
39 using json = nlohmann::json;
40 namespace {
41     constexpr int COPY_EXCEPTION = -1;
42     constexpr int COPY_NOEXCEPTION = -2;
43 }
44 std::vector<AAFwk::Want> FileAccessHelper::wants_;
45 sptr<IFileAccessExtBase> g_sourceExtProxy;
46 sptr<IFileAccessExtBase> g_destExtProxy;
47 
GetUserId()48 static int GetUserId()
49 {
50     int uid = IPCSkeleton::GetCallingUid();
51     int userId = uid / AppExecFwk::Constants::BASE_USER_RANGE;
52     return userId;
53 }
54 
GetBundleNameFromPath(const std::string & path,std::string & bundleName)55 static bool GetBundleNameFromPath(const std::string &path, std::string &bundleName)
56 {
57     if (path.size() == 0) {
58         HILOG_ERROR("Uri path error.");
59         return false;
60     }
61 
62     if (path.front() != '/') {
63         HILOG_ERROR("Uri path format error.");
64         return false;
65     }
66 
67     auto tmpPath = path.substr(1);
68     auto index = tmpPath.find_first_of("/");
69     bundleName = tmpPath.substr(0, index);
70     if (bundleName.compare(MEDIA_BNUDLE_NAME_ALIAS) == 0) {
71         bundleName = MEDIA_BNUDLE_NAME;
72         return true;
73     }
74     if (bundleName.compare(EXTERNAL_BNUDLE_NAME_ALIAS) == 0) {
75         bundleName = EXTERNAL_BNUDLE_NAME;
76         return true;
77     }
78     HILOG_ERROR("Uri-authority error.");
79     return false;
80 }
81 
CheckUri(Uri & uri)82 static bool CheckUri(Uri &uri)
83 {
84     HILOG_DEBUG("Uri : %{private}s.", uri.ToString().c_str());
85     std::string schemeStr = std::string(uri.GetScheme());
86     if (schemeStr.compare(FILE_SCHEME_NAME) != 0) {
87         HILOG_ERROR("Uri scheme error.");
88         return false;
89     }
90     return true;
91 }
92 
GetBundleMgrProxy()93 sptr<AppExecFwk::IBundleMgr> FileAccessHelper::GetBundleMgrProxy()
94 {
95     sptr<ISystemAbilityManager> systemAbilityManager =
96         SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
97     if (!systemAbilityManager) {
98         return nullptr;
99     }
100 
101     sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
102     if (!remoteObject) {
103         return nullptr;
104     }
105 
106     return iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
107 }
108 
FileAccessHelper(const std::shared_ptr<OHOS::AbilityRuntime::Context> & context,const std::unordered_map<std::string,std::shared_ptr<ConnectInfo>> & cMap)109 FileAccessHelper::FileAccessHelper(const std::shared_ptr<OHOS::AbilityRuntime::Context> &context,
110     const std::unordered_map<std::string, std::shared_ptr<ConnectInfo>> &cMap)
111 {
112     token_ = context->GetToken();
113     cMap_ = cMap;
114 }
115 
FileAccessHelper(const sptr<IRemoteObject> & token,const std::unordered_map<std::string,std::shared_ptr<ConnectInfo>> & cMap)116 FileAccessHelper::FileAccessHelper(const sptr<IRemoteObject> &token,
117     const std::unordered_map<std::string, std::shared_ptr<ConnectInfo>> &cMap)
118 {
119     token_ = token;
120     cMap_ = cMap;
121 }
122 
AddFileAccessDeathRecipient(const sptr<IRemoteObject> & token)123 void FileAccessHelper::AddFileAccessDeathRecipient(const sptr<IRemoteObject> &token)
124 {
125     if (token != nullptr && callerDeathRecipient_ != nullptr) {
126         token->RemoveDeathRecipient(callerDeathRecipient_);
127     }
128     if (callerDeathRecipient_ == nullptr) {
129         callerDeathRecipient_ =
130             new FileAccessDeathRecipient(std::bind(&FileAccessHelper::OnSchedulerDied, this, std::placeholders::_1));
131     }
132     if (token != nullptr) {
133         token->AddDeathRecipient(callerDeathRecipient_);
134     }
135 }
136 
OnSchedulerDied(const wptr<IRemoteObject> & remote)137 void FileAccessHelper::OnSchedulerDied(const wptr<IRemoteObject> &remote)
138 {
139     auto object = remote.promote();
140     object = nullptr;
141 }
142 
GetConnectInfo(const std::string & bundleName)143 std::shared_ptr<ConnectInfo> FileAccessHelper::GetConnectInfo(const std::string &bundleName)
144 {
145     auto iterator = cMap_.find(bundleName);
146     if (iterator != cMap_.end()) {
147         return iterator->second;
148     }
149     HILOG_ERROR("GetConnectInfo called with bundleName return nullptr");
150     return nullptr;
151 }
152 
GetKeyOfWants(const AAFwk::Want & want)153 std::string FileAccessHelper::GetKeyOfWants(const AAFwk::Want &want)
154 {
155     auto elementTmp = want.GetElement();
156     for (auto iter = FileAccessHelper::wants_.begin(); iter != FileAccessHelper::wants_.end(); ++iter) {
157         auto element = iter->GetElement();
158         if (element.GetBundleName() == elementTmp.GetBundleName() &&
159             element.GetAbilityName() == elementTmp.GetAbilityName()) {
160             return element.GetBundleName();
161         }
162     }
163     HILOG_ERROR("GetKeyOfWants did not find a want message to match");
164     return "";
165 }
166 
IsSystemApp()167 static bool IsSystemApp()
168 {
169     uint64_t accessTokenIDEx = OHOS::IPCSkeleton::GetCallingFullTokenID();
170     return OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(accessTokenIDEx);
171 }
172 
Creator(const std::shared_ptr<OHOS::AbilityRuntime::Context> & context)173 std::pair<std::shared_ptr<FileAccessHelper>, int> FileAccessHelper::Creator(
174     const std::shared_ptr<OHOS::AbilityRuntime::Context> &context)
175 {
176     UserAccessTracer trace;
177     trace.Start("Creator");
178     if (context == nullptr) {
179         HILOG_ERROR("FileAccessHelper::Creator failed, context == nullptr");
180         return {nullptr, EINVAL};
181     }
182 
183     if (!IsSystemApp()) {
184         HILOG_ERROR("FileAccessHelper::Creator check IsSystemAppByFullTokenID failed");
185         return {nullptr, E_PERMISSION_SYS};
186     }
187 
188     sptr<AppExecFwk::IBundleMgr> bm = FileAccessHelper::GetBundleMgrProxy();
189     FileAccessHelper::wants_.clear();
190     std::unordered_map<std::string, std::shared_ptr<ConnectInfo>> cMap;
191     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
192     bool ret = bm->QueryExtensionAbilityInfos(
193         AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION, GetUserId(), extensionInfos);
194     if (!ret) {
195         HILOG_ERROR("FileAccessHelper::Creator QueryExtensionAbilityInfos failed");
196         return {nullptr, E_GETINFO};
197     }
198 
199     for (size_t i = 0; i < extensionInfos.size(); i++) {
200         AAFwk::Want wantTem;
201         wantTem.SetElementName(extensionInfos[i].bundleName, extensionInfos[i].name);
202         sptr<FileAccessExtConnection> fileAccessExtConnection(new(std::nothrow) FileAccessExtConnection());
203         if (fileAccessExtConnection == nullptr) {
204             HILOG_ERROR("new fileAccessExtConnection fail");
205             return {nullptr, E_GETRESULT};
206         }
207 
208         if (!fileAccessExtConnection->IsExtAbilityConnected()) {
209             fileAccessExtConnection->ConnectFileExtAbility(wantTem, context->GetToken());
210         }
211 
212         sptr<IFileAccessExtBase> fileExtProxy = fileAccessExtConnection->GetFileExtProxy();
213         if (fileExtProxy == nullptr) {
214             HILOG_ERROR("Creator get invalid fileExtProxy");
215             return {nullptr, E_CONNECT};
216         }
217 
218         std::shared_ptr<ConnectInfo> connectInfo = std::make_shared<ConnectInfo>();
219         if (!connectInfo) {
220             HILOG_ERROR("Creator, connectInfo == nullptr");
221             return {nullptr, E_GETRESULT};
222         }
223         FileAccessHelper::wants_.push_back(wantTem);
224 
225         connectInfo->want = wantTem;
226         connectInfo->fileAccessExtConnection = fileAccessExtConnection;
227         cMap.emplace(extensionInfos[i].bundleName, connectInfo);
228     }
229     FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(context, cMap);
230     if (ptrFileAccessHelper == nullptr) {
231         HILOG_ERROR("FileAccessHelper::Creator failed, create FileAccessHelper failed");
232         return {nullptr, E_GETRESULT};
233     }
234 
235     return {std::shared_ptr<FileAccessHelper>(ptrFileAccessHelper), ERR_OK};
236 }
237 
Creator(const std::shared_ptr<OHOS::AbilityRuntime::Context> & context,const std::vector<AAFwk::Want> & wants)238 std::pair<std::shared_ptr<FileAccessHelper>, int> FileAccessHelper::Creator(
239     const std::shared_ptr<OHOS::AbilityRuntime::Context> &context, const std::vector<AAFwk::Want> &wants)
240 {
241     UserAccessTracer trace;
242     trace.Start("Creator");
243     if (context == nullptr) {
244         HILOG_ERROR("FileAccessHelper::Creator failed, context == nullptr");
245         return {nullptr, EINVAL};
246     }
247 
248     if (wants.size() == 0) {
249         HILOG_ERROR("FileAccessHelper::Creator failed, wants is empty");
250         return {nullptr, EINVAL};
251     }
252 
253     if (!IsSystemApp()) {
254         HILOG_ERROR("FileAccessHelper::Creator check IsSystemAppByFullTokenID failed");
255         return {nullptr, E_PERMISSION_SYS};
256     }
257 
258     if (GetRegisteredFileAccessExtAbilityInfo(FileAccessHelper::wants_) != ERR_OK) {
259         HILOG_ERROR("GetRegisteredFileAccessExtAbilityInfo failed");
260         return {nullptr, E_GETINFO};
261     }
262 
263     std::unordered_map<std::string, std::shared_ptr<ConnectInfo>> cMap;
264     for (size_t i = 0; i < wants.size(); i++) {
265         sptr<FileAccessExtConnection> fileAccessExtConnection(new(std::nothrow) FileAccessExtConnection());
266         if (fileAccessExtConnection == nullptr) {
267             HILOG_ERROR("new fileAccessExtConnection fail");
268             return {nullptr, E_GETRESULT};
269         }
270 
271         if (!fileAccessExtConnection->IsExtAbilityConnected()) {
272             fileAccessExtConnection->ConnectFileExtAbility(wants[i], context->GetToken());
273         }
274 
275         sptr<IFileAccessExtBase> fileExtProxy = fileAccessExtConnection->GetFileExtProxy();
276         if (fileExtProxy == nullptr) {
277             HILOG_ERROR("Creator get invalid fileExtProxy");
278             return {nullptr, E_CONNECT};
279         }
280 
281         std::shared_ptr<ConnectInfo> connectInfo = std::make_shared<ConnectInfo>();
282         if (connectInfo == nullptr) {
283             HILOG_ERROR("Creator, connectInfo == nullptr");
284             return {nullptr, E_GETRESULT};
285         }
286 
287         connectInfo->want = wants[i];
288         connectInfo->fileAccessExtConnection = fileAccessExtConnection;
289         string bundleName = FileAccessHelper::GetKeyOfWants(wants[i]);
290         if (bundleName.length() == 0) {
291             HILOG_ERROR("Creator GetKeyOfWants bundleName not found");
292             return {nullptr, E_GETRESULT};
293         }
294         cMap.insert(std::pair<std::string, std::shared_ptr<ConnectInfo>>(bundleName, connectInfo));
295     }
296     FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(context, cMap);
297     if (ptrFileAccessHelper == nullptr) {
298         HILOG_ERROR("Creator failed, create FileAccessHelper failed");
299         return {nullptr, E_GETRESULT};
300     }
301 
302     return {std::shared_ptr<FileAccessHelper>(ptrFileAccessHelper), ERR_OK};
303 }
304 
Creator(const sptr<IRemoteObject> & token,const std::vector<AAFwk::Want> & wants)305 std::shared_ptr<FileAccessHelper> FileAccessHelper::Creator(const sptr<IRemoteObject> &token,
306     const std::vector<AAFwk::Want> &wants)
307 {
308     UserAccessTracer trace;
309     trace.Start("Creator");
310     if (token == nullptr) {
311         HILOG_ERROR("FileAccessHelper::Creator failed, token == nullptr");
312         return nullptr;
313     }
314 
315     if (wants.size() == 0) {
316         HILOG_ERROR("FileAccessHelper::Creator failed, wants is empty");
317         return nullptr;
318     }
319 
320     if (!IsSystemApp()) {
321         HILOG_ERROR("FileAccessHelper::Creator check IsSystemAppByFullTokenID failed");
322         return nullptr;
323     }
324 
325     if (GetRegisteredFileAccessExtAbilityInfo(FileAccessHelper::wants_) != ERR_OK) {
326         HILOG_ERROR("GetRegisteredFileAccessExtAbilityInfo failed");
327         return nullptr;
328     }
329 
330     std::unordered_map<std::string, std::shared_ptr<ConnectInfo>> cMap;
331     for (size_t i = 0; i < wants.size(); i++) {
332         sptr<FileAccessExtConnection> fileAccessExtConnection(new(std::nothrow) FileAccessExtConnection());
333         if (fileAccessExtConnection == nullptr) {
334             HILOG_ERROR("new fileAccessExtConnection fail");
335             return nullptr;
336         }
337 
338         if (!fileAccessExtConnection->IsExtAbilityConnected()) {
339             fileAccessExtConnection->ConnectFileExtAbility(wants[i], token);
340         }
341 
342         sptr<IFileAccessExtBase> fileExtProxy = fileAccessExtConnection->GetFileExtProxy();
343         if (fileExtProxy == nullptr) {
344             HILOG_ERROR("Creator get invalid fileExtProxy");
345             return nullptr;
346         }
347 
348         std::shared_ptr<ConnectInfo> connectInfo = std::make_shared<ConnectInfo>();
349         if (!connectInfo) {
350             HILOG_ERROR("Creator, connectInfo == nullptr");
351             return nullptr;
352         }
353 
354         connectInfo->want = wants[i];
355         connectInfo->fileAccessExtConnection = fileAccessExtConnection;
356         string bundleName = FileAccessHelper::GetKeyOfWants(wants[i]);
357         if (bundleName.length() == 0) {
358             HILOG_ERROR("Creator GetKeyOfWants bundleName not found");
359             return nullptr;
360         }
361         cMap.insert(std::pair<std::string, std::shared_ptr<ConnectInfo>>(bundleName, connectInfo));
362     }
363     FileAccessHelper *ptrFileAccessHelper = new (std::nothrow) FileAccessHelper(token, cMap);
364     if (ptrFileAccessHelper == nullptr) {
365         HILOG_ERROR("Creator failed, create FileAccessHelper failed");
366         return nullptr;
367     }
368 
369     return std::shared_ptr<FileAccessHelper>(ptrFileAccessHelper);
370 }
371 
Release()372 bool FileAccessHelper::Release()
373 {
374     for (auto iter = cMap_.begin(); iter != cMap_.end(); iter++) {
375         if (iter->second->fileAccessExtConnection->IsExtAbilityConnected()) {
376             iter->second->fileAccessExtConnection->DisconnectFileExtAbility();
377         }
378     }
379     cMap_.clear();
380     token_ = nullptr;
381     FileAccessHelper::wants_.clear();
382     return true;
383 }
384 
GetProxyByUri(Uri & uri)385 sptr<IFileAccessExtBase> FileAccessHelper::GetProxyByUri(Uri &uri)
386 {
387     std::string scheme = uri.GetScheme();
388     std::string bundleName;
389     if (scheme == FILE_SCHEME_NAME) {
390         std::string path = "/" + uri.GetAuthority() + uri.GetPath();
391         if (!GetBundleNameFromPath(path, bundleName)) {
392             HILOG_ERROR("Get BundleName failed.");
393             return nullptr;
394         }
395     }
396 
397     auto fileAccessExtProxy = GetProxyByBundleName(bundleName);
398     return fileAccessExtProxy;
399 }
400 
GetProxyByBundleName(const std::string & bundleName)401 sptr<IFileAccessExtBase> FileAccessHelper::GetProxyByBundleName(const std::string &bundleName)
402 {
403     auto connectInfo = GetConnectInfo(bundleName);
404     if (connectInfo == nullptr) {
405         HILOG_ERROR("GetProxyByUri failed with invalid connectInfo");
406         return nullptr;
407     }
408 
409     if (!connectInfo->fileAccessExtConnection->IsExtAbilityConnected()) {
410         connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want, token_);
411     }
412 
413     auto fileAccessExtProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy();
414     if (fileAccessExtProxy) {
415         AddFileAccessDeathRecipient(fileAccessExtProxy->AsObject());
416     }
417 
418     if (fileAccessExtProxy == nullptr) {
419         HILOG_ERROR("GetProxyByUri failed with invalid fileAccessExtProxy");
420         return nullptr;
421     }
422 
423     return fileAccessExtProxy;
424 }
425 
GetProxy()426 bool FileAccessHelper::GetProxy()
427 {
428     for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) {
429         auto connectInfo = iter->second;
430         if (!connectInfo->fileAccessExtConnection->IsExtAbilityConnected()) {
431             connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want, token_);
432         }
433 
434         auto fileAccessExtProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy();
435         if (fileAccessExtProxy) {
436             AddFileAccessDeathRecipient(fileAccessExtProxy->AsObject());
437         }
438 
439         if (fileAccessExtProxy == nullptr) {
440             HILOG_ERROR("GetProxy failed with invalid fileAccessExtProxy");
441             return false;
442         }
443     }
444     return true;
445 }
446 
OpenFile(Uri & uri,int flags,int & fd)447 int FileAccessHelper::OpenFile(Uri &uri, int flags, int &fd)
448 {
449     UserAccessTracer trace;
450     trace.Start("OpenFile");
451     if (!IsSystemApp()) {
452         HILOG_ERROR("FileAccessHelper::OpenFile check IsSystemAppByFullTokenID failed");
453         return E_PERMISSION_SYS;
454     }
455 
456     if (!CheckUri(uri)) {
457         HILOG_ERROR("Uri format check error.");
458         return E_URIS;
459     }
460 
461     if (flags != READ && flags != WRITE && flags != WRITE_READ) {
462         HILOG_ERROR("flags type error.");
463         return EINVAL;
464     }
465 
466     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
467     if (fileExtProxy == nullptr) {
468         HILOG_ERROR("failed with invalid fileAccessExtProxy");
469         return E_IPCS;
470     }
471 
472     int ret = fileExtProxy->OpenFile(uri, flags, fd);
473     if (ret != ERR_OK) {
474         HILOG_ERROR("OpenFile get result error, code:%{public}d", ret);
475         return ret;
476     }
477 
478     return ERR_OK;
479 }
480 
CreateFile(Uri & parent,const std::string & displayName,Uri & newFile)481 int FileAccessHelper::CreateFile(Uri &parent, const std::string &displayName, Uri &newFile)
482 {
483     UserAccessTracer trace;
484     trace.Start("CreateFile");
485     if (!IsSystemApp()) {
486         HILOG_ERROR("FileAccessHelper::CreateFile check IsSystemAppByFullTokenID failed");
487         return E_PERMISSION_SYS;
488     }
489 
490     if (!CheckUri(parent)) {
491         HILOG_ERROR("Uri format check error.");
492         return E_URIS;
493     }
494 
495     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(parent);
496     if (fileExtProxy == nullptr) {
497         HILOG_ERROR("failed with invalid fileAccessExtProxy");
498         return E_IPCS;
499     }
500 
501     int ret = fileExtProxy->CreateFile(parent, displayName, newFile);
502     if (ret != ERR_OK) {
503         HILOG_ERROR("CreateFile get result error, code:%{public}d", ret);
504         return ret;
505     }
506 
507     return ERR_OK;
508 }
509 
Mkdir(Uri & parent,const std::string & displayName,Uri & newDir)510 int FileAccessHelper::Mkdir(Uri &parent, const std::string &displayName, Uri &newDir)
511 {
512     UserAccessTracer trace;
513     trace.Start("Mkdir");
514     if (!IsSystemApp()) {
515         HILOG_ERROR("FileAccessHelper::Mkdir check IsSystemAppByFullTokenID failed");
516         return E_PERMISSION_SYS;
517     }
518 
519     if (!CheckUri(parent)) {
520         HILOG_ERROR("Uri format check error.");
521         return E_URIS;
522     }
523 
524     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(parent);
525     if (fileExtProxy == nullptr) {
526         HILOG_ERROR("failed with invalid fileAccessExtProxy");
527         return E_IPCS;
528     }
529 
530     int ret = fileExtProxy->Mkdir(parent, displayName, newDir);
531     if (ret != ERR_OK) {
532         HILOG_ERROR("Mkdir get result error, code:%{public}d", ret);
533         return ret;
534     }
535 
536     return ERR_OK;
537 }
538 
Delete(Uri & selectFile)539 int FileAccessHelper::Delete(Uri &selectFile)
540 {
541     UserAccessTracer trace;
542     trace.Start("Delete");
543     if (!IsSystemApp()) {
544         HILOG_ERROR("FileAccessHelper::Delete check IsSystemAppByFullTokenID failed");
545         return E_PERMISSION_SYS;
546     }
547 
548     if (!CheckUri(selectFile)) {
549         HILOG_ERROR("Uri format check error.");
550         return E_URIS;
551     }
552 
553     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(selectFile);
554     if (fileExtProxy == nullptr) {
555         HILOG_ERROR("failed with invalid fileAccessExtProxy");
556         return E_IPCS;
557     }
558 
559     int ret = fileExtProxy->Delete(selectFile);
560     if (ret != ERR_OK) {
561         HILOG_ERROR("Delete get result error, code:%{public}d", ret);
562         return ret;
563     }
564 
565     return ERR_OK;
566 }
567 
Move(Uri & sourceFile,Uri & targetParent,Uri & newFile)568 int FileAccessHelper::Move(Uri &sourceFile, Uri &targetParent, Uri &newFile)
569 {
570     UserAccessTracer trace;
571     trace.Start("Move");
572     if (!IsSystemApp()) {
573         HILOG_ERROR("FileAccessHelper::Move check IsSystemAppByFullTokenID failed");
574         return E_PERMISSION_SYS;
575     }
576 
577     Uri sourceFileUri(sourceFile.ToString());
578     Uri targetParentUri(targetParent.ToString());
579     if (!CheckUri(sourceFile) || !CheckUri(targetParent)) {
580         HILOG_ERROR("uri format check error.");
581         return E_URIS;
582     }
583 
584     if (sourceFileUri.GetAuthority() != targetParentUri.GetAuthority()) {
585         HILOG_WARN("Operation failed, move not supported");
586         return EPERM;
587     }
588 
589     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
590     if (fileExtProxy == nullptr) {
591         HILOG_ERROR("failed with invalid fileAccessExtProxy");
592         return E_IPCS;
593     }
594 
595     int ret = fileExtProxy->Move(sourceFile, targetParent, newFile);
596     if (ret != ERR_OK) {
597         HILOG_ERROR("Move get result error, code:%{public}d", ret);
598         return ret;
599     }
600 
601     return ERR_OK;
602 }
603 
IsDirectory(Uri & uri,bool & isDir)604 int FileAccessHelper::IsDirectory(Uri &uri, bool &isDir)
605 {
606     sptr<IFileAccessExtBase> proxy = FileAccessHelper::GetProxyByUri(uri);
607     if (proxy == nullptr) {
608         HILOG_ERROR("failed with invalid fileAccessExtProxy");
609         return E_IPCS;
610     }
611 
612     FileInfo fileInfo;
613     int ret = proxy->GetFileInfoFromUri(uri, fileInfo);
614     if (ret != ERR_OK) {
615         HILOG_ERROR("get FileInfo from uri error, code:%{public}d", ret);
616         return ret;
617     }
618     isDir = (fileInfo.mode & DOCUMENT_FLAG_REPRESENTS_DIR) != 0;
619     return ret;
620 }
621 
TranslateCopyResult(int errCode,CopyResult & result)622 static int TranslateCopyResult(int errCode, CopyResult &result)
623 {
624     if (errCode == COPY_EXCEPTION || errCode == ERR_OK) {
625         return errCode;
626     }
627 
628     int ret = ERR_OK;
629     switch (errCode) {
630         case E_IPCS:
631         case E_URIS:
632         case ERR_NOMEM:
633         case E_PERMISSION_SYS:
634         case ERR_PERM: {
635             HILOG_ERROR("Copy exception, terminate copy");
636             ret = COPY_EXCEPTION;
637             break;
638         }
639         default: {
640             HILOG_ERROR("Copy exception, continue copy");
641             ret = COPY_NOEXCEPTION;
642             break;
643         }
644     }
645     if (OHOS::FileManagement::LibN::errCodeTable.find(errCode) !=
646         OHOS::FileManagement::LibN::errCodeTable.end()) {
647         result.errCode = OHOS::FileManagement::LibN::errCodeTable.at(errCode).first;
648         result.errMsg = OHOS::FileManagement::LibN::errCodeTable.at(errCode).second;
649     }
650     return ret;
651 }
652 
GetCopyResult(const std::string & sourceUri,const std::string & destUri,int errCode,const std::string & errMsg,std::vector<CopyResult> & copyResult)653 static int GetCopyResult(const std::string &sourceUri, const std::string &destUri, int errCode,
654     const std::string &errMsg, std::vector<CopyResult> &copyResult)
655 {
656     CopyResult result { sourceUri, destUri, errCode, errMsg };
657     int ret = TranslateCopyResult(errCode, result);
658     copyResult.clear();
659     copyResult.push_back(result);
660     return ret;
661 }
662 
CopyOperation(Uri & sourceUri,Uri & destUri,std::vector<CopyResult> & copyResult,bool force)663 int FileAccessHelper::CopyOperation(Uri &sourceUri, Uri &destUri, std::vector<CopyResult> &copyResult, bool force)
664 {
665     UserAccessTracer trace;
666     trace.Start("CopyOperation");
667     int ret = COPY_EXCEPTION;
668     sptr<IFileAccessExtBase> proxy = GetProxyByUri(sourceUri);
669     if (proxy == nullptr) {
670         HILOG_ERROR("Failed with invalid fileAccessExtProxy");
671         CopyResult result;
672         ret = TranslateCopyResult(E_IPCS, result);
673         copyResult.push_back(result);
674         return ret;
675     }
676 
677     ret = proxy->Copy(sourceUri, destUri, copyResult, force);
678     if (ret != ERR_OK) {
679         if ((ret == COPY_EXCEPTION) || (ret == COPY_NOEXCEPTION)) {
680             HILOG_ERROR("Copy exception, code:%{public}d", ret);
681             FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
682             return ret;
683         }
684         HILOG_ERROR("Copy error, code:%{public}d", ret);
685         CopyResult result { "", "", ret, "" };
686         ret = TranslateCopyResult(ret, result);
687         copyResult.push_back(result);
688         return ret;
689     }
690     return ret;
691 }
692 
Copy(Uri & sourceUri,Uri & destUri,std::vector<CopyResult> & copyResult,bool force)693 int FileAccessHelper::Copy(Uri &sourceUri, Uri &destUri, std::vector<CopyResult> &copyResult, bool force)
694 {
695     UserAccessTracer trace;
696     trace.Start("Copy");
697     if (!IsSystemApp()) {
698         HILOG_ERROR("Copy check IsSystemAppByFullTokenID failed");
699         return GetCopyResult("", "", E_PERMISSION_SYS, "", copyResult);
700     }
701 
702     if (!CheckUri(sourceUri) || !CheckUri(destUri)) {
703         HILOG_ERROR("Uri format check error");
704         return GetCopyResult("", "", E_URIS, "", copyResult);
705     }
706 
707     bool isDir = false;
708     int ret = IsDirectory(destUri, isDir);
709     if (ret != ERR_OK) {
710         HILOG_ERROR("Get uri type error");
711         GetCopyResult("", "", ret, "", copyResult);
712         return COPY_EXCEPTION;
713     }
714     if (!isDir) {
715         HILOG_ERROR("Destination uri is not directory");
716         return GetCopyResult("", "", E_URIS, "", copyResult);
717     }
718 
719     ret = CopyOperation(sourceUri, destUri, copyResult, force);
720     return ret;
721 }
722 
Rename(Uri & sourceFile,const std::string & displayName,Uri & newFile)723 int FileAccessHelper::Rename(Uri &sourceFile, const std::string &displayName, Uri &newFile)
724 {
725     UserAccessTracer trace;
726     trace.Start("Rename");
727     if (!IsSystemApp()) {
728         HILOG_ERROR("FileAccessHelper::Rename check IsSystemAppByFullTokenID failed");
729         return E_PERMISSION_SYS;
730     }
731 
732     if (!CheckUri(sourceFile)) {
733         HILOG_ERROR("sourceFile format check error.");
734         return E_URIS;
735     }
736 
737     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
738     if (fileExtProxy == nullptr) {
739         HILOG_ERROR("failed with invalid fileAccessExtProxy");
740         return E_IPCS;
741     }
742 
743     int ret = fileExtProxy->Rename(sourceFile, displayName, newFile);
744     if (ret != ERR_OK) {
745         HILOG_ERROR("Rename get result error, code:%{public}d", ret);
746         return ret;
747     }
748 
749     return ERR_OK;
750 }
751 
ListFile(const FileInfo & fileInfo,const int64_t offset,const int64_t maxCount,const FileFilter & filter,std::vector<FileInfo> & fileInfoVec)752 int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,
753     const FileFilter &filter, std::vector<FileInfo> &fileInfoVec)
754 {
755     UserAccessTracer trace;
756     trace.Start("ListFile");
757     if (!IsSystemApp()) {
758         HILOG_ERROR("FileAccessHelper::ListFile check IsSystemAppByFullTokenID failed");
759         return E_PERMISSION_SYS;
760     }
761 
762     Uri sourceFile(fileInfo.uri);
763     if (!CheckUri(sourceFile)) {
764         HILOG_ERROR("sourceFile format check error.");
765         return E_URIS;
766     }
767 
768     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
769     if (fileExtProxy == nullptr) {
770         HILOG_ERROR("failed with invalid fileAccessExtProxy");
771         return E_IPCS;
772     }
773 
774     int ret = fileExtProxy->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec);
775     if (ret != ERR_OK) {
776         HILOG_ERROR("ListFile get result error, code:%{public}d", ret);
777         return ret;
778     }
779 
780     return ERR_OK;
781 }
782 
ScanFile(const FileInfo & fileInfo,const int64_t offset,const int64_t maxCount,const FileFilter & filter,std::vector<FileInfo> & fileInfoVec)783 int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount,
784     const FileFilter &filter, std::vector<FileInfo> &fileInfoVec)
785 {
786     UserAccessTracer trace;
787     trace.Start("ScanFile");
788     if (!IsSystemApp()) {
789         HILOG_ERROR("FileAccessHelper::ScanFile check IsSystemAppByFullTokenID failed");
790         return E_PERMISSION_SYS;
791     }
792 
793     Uri sourceFile(fileInfo.uri);
794     if (!CheckUri(sourceFile)) {
795         HILOG_ERROR("sourceFile format check error.");
796         return E_URIS;
797     }
798 
799     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(sourceFile);
800     if (fileExtProxy == nullptr) {
801         HILOG_ERROR("failed with invalid fileAccessExtProxy");
802         return E_IPCS;
803     }
804 
805     int ret = fileExtProxy->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec);
806     if (ret != ERR_OK) {
807         HILOG_ERROR("ScanFile get result error, code:%{public}d", ret);
808         return ret;
809     }
810 
811     return ERR_OK;
812 }
813 
GetQueryColumns(std::string & uri,std::string & metaJson,std::vector<std::string> & columns)814 static int GetQueryColumns(std::string &uri, std::string &metaJson, std::vector<std::string> &columns)
815 {
816     if (!json::accept(metaJson)) {
817         HILOG_ERROR("metaJson format check error.");
818         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
819         return EINVAL;
820     }
821 
822     auto jsonObject = json::parse(metaJson);
823     for (json::iterator it = jsonObject.begin(); it != jsonObject.end(); ++it) {
824         auto iterator = FILE_RESULT_TYPE.find(it.key());
825         if (iterator == FILE_RESULT_TYPE.end()) {
826             HILOG_ERROR("columns format check error.");
827             FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
828             return EINVAL;
829         }
830         columns.push_back(it.key());
831     }
832 
833     if (columns.empty()) {
834         HILOG_ERROR("columns is empty.");
835         FinishTrace(HITRACE_TAG_FILEMANAGEMENT);
836         return EINVAL;
837     }
838     return ERR_OK;
839 }
840 
GetQueryResult(std::string & uri,std::vector<std::string> & columns,std::vector<std::string> & results,std::string & metaJson)841 static int GetQueryResult(std::string &uri, std::vector<std::string> &columns, std::vector<std::string> &results,
842     std::string &metaJson)
843 {
844     json jsonObject;
845     for (size_t i = 0; i < columns.size(); i++) {
846         auto memberType = FILE_RESULT_TYPE.at(columns.at(i));
847         // Assign a default value based on the type, When fileIo obtains an invalid value.
848         switch (memberType) {
849             case STRING_TYPE:
850                 if (results[i].empty()) {
851                     results[i] = " ";
852                 }
853                 jsonObject[columns[i]] = results[i];
854                 break;
855             case INT32_TYPE:
856                 if (results[i].empty()) {
857                     results[i] = "0";
858                 }
859                 jsonObject[columns[i]] = std::stoi(results[i]);
860                 break;
861             case INT64_TYPE:
862                 if (results[i].empty()) {
863                     results[i] = "0";
864                 }
865                 jsonObject[columns[i]] = std::stol(results[i]);
866                 break;
867             default:
868                 jsonObject[columns[i]] = " ";
869                 HILOG_ERROR("not match  memberType %{public}d", memberType);
870                 break;
871         }
872     }
873     metaJson = jsonObject.dump();
874     return ERR_OK;
875 }
876 
Query(Uri & uri,std::string & metaJson)877 int FileAccessHelper::Query(Uri &uri, std::string &metaJson)
878 {
879     UserAccessTracer trace;
880     trace.Start("Query");
881     if (!IsSystemApp()) {
882         HILOG_ERROR("FileAccessHelper::Query check IsSystemAppByFullTokenID failed");
883         return E_PERMISSION_SYS;
884     }
885 
886     if (!CheckUri(uri)) {
887         HILOG_ERROR("Uri format check error.");
888         return E_URIS;
889     }
890 
891     std::string uriString(uri.ToString());
892     std::vector<std::string> columns;
893     std::vector<std::string> results;
894     int ret = GetQueryColumns(uriString, metaJson, columns);
895     if (ret != ERR_OK) {
896         HILOG_ERROR("Query get columns error, code:%{public}d", ret);
897         return ret;
898     }
899 
900     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
901     if (fileExtProxy == nullptr) {
902         HILOG_ERROR("failed with invalid fileAccessExtProxy");
903         return E_IPCS;
904     }
905 
906     ret = fileExtProxy->Query(uri, columns, results);
907     if (ret != ERR_OK) {
908         HILOG_ERROR("Query get result error, code:%{public}d", ret);
909         return ret;
910     }
911 
912     ret = GetQueryResult(uriString, columns, results, metaJson);
913     if (ret != ERR_OK) {
914         HILOG_ERROR("Query get result error, code:%{public}d", ret);
915         return ret;
916     }
917 
918     return ERR_OK;
919 }
920 
GetRoots(std::vector<RootInfo> & rootInfoVec)921 int FileAccessHelper::GetRoots(std::vector<RootInfo> &rootInfoVec)
922 {
923     UserAccessTracer trace;
924     trace.Start("GetRoots");
925     if (!IsSystemApp()) {
926         HILOG_ERROR("FileAccessHelper::GetRoots check IsSystemAppByFullTokenID failed");
927         return E_PERMISSION_SYS;
928     }
929 
930     if (!GetProxy()) {
931         HILOG_ERROR("failed with invalid fileAccessExtProxy");
932         return E_IPCS;
933     }
934 
935     int ret = ERR_OK;
936     for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) {
937         auto connectInfo = iter->second;
938         auto fileAccessExtProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy();
939         std::vector<RootInfo> results;
940         if (fileAccessExtProxy) {
941             AddFileAccessDeathRecipient(fileAccessExtProxy->AsObject());
942         } else {
943             HILOG_ERROR("GetFileExtProxy return nullptr, bundle name is %{public}s", iter->first.c_str());
944             continue;
945         }
946 
947         ret = fileAccessExtProxy->GetRoots(results);
948         if (ret != ERR_OK) {
949             HILOG_ERROR("getRoots get fail ret:%{public}d", ret);
950             return ret;
951         }
952 
953         rootInfoVec.insert(rootInfoVec.end(), results.begin(), results.end());
954     }
955 
956     return ERR_OK;
957 }
958 
GetRegisteredFileAccessExtAbilityInfo(std::vector<AAFwk::Want> & wantVec)959 int FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(std::vector<AAFwk::Want> &wantVec)
960 {
961     UserAccessTracer trace;
962     trace.Start("GetRegisteredFileAccessExtAbilityInfo");
963     if (!IsSystemApp()) {
964         HILOG_ERROR("FileAccessHelper::GetRoots check IsSystemAppByFullTokenID failed");
965         return E_PERMISSION_SYS;
966     }
967 
968     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
969     sptr<AppExecFwk::IBundleMgr> bm = FileAccessHelper::GetBundleMgrProxy();
970     if (bm == nullptr) {
971         HILOG_ERROR("GetBundleMgrProxy nullptr.");
972         return E_GETINFO;
973     }
974     bool ret = bm->QueryExtensionAbilityInfos(
975         AppExecFwk::ExtensionAbilityType::FILEACCESS_EXTENSION, GetUserId(), extensionInfos);
976     if (!ret) {
977         HILOG_ERROR("FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo QueryExtensionAbilityInfos error");
978         return E_GETINFO;
979     }
980 
981     wantVec.clear();
982     for (size_t i = 0; i < extensionInfos.size(); i++) {
983         AAFwk::Want want;
984         want.SetElementName(extensionInfos[i].bundleName, extensionInfos[i].name);
985         wantVec.push_back(want);
986     }
987 
988     return ERR_OK;
989 }
990 
Access(Uri & uri,bool & isExist)991 int FileAccessHelper::Access(Uri &uri, bool &isExist)
992 {
993     UserAccessTracer trace;
994     trace.Start("Access");
995     if (!IsSystemApp()) {
996         HILOG_ERROR("FileAccessHelper::Access check IsSystemAppByFullTokenID failed");
997         return E_PERMISSION_SYS;
998     }
999 
1000     if (!CheckUri(uri)) {
1001         HILOG_ERROR("uri format check error.");
1002         return E_URIS;
1003     }
1004 
1005     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
1006     if (fileExtProxy == nullptr) {
1007         HILOG_ERROR("failed with invalid fileAccessExtProxy");
1008         return E_IPCS;
1009     }
1010 
1011     int ret = fileExtProxy->Access(uri, isExist);
1012     if (ret != ERR_OK) {
1013         HILOG_ERROR("Access get result error, code:%{public}d", ret);
1014         return ret;
1015     }
1016 
1017     return ERR_OK;
1018 }
1019 
GetThumbnail(Uri & uri,ThumbnailSize & thumbnailSize,std::shared_ptr<PixelMap> & pixelMap)1020 int FileAccessHelper::GetThumbnail(Uri &uri, ThumbnailSize &thumbnailSize, std::shared_ptr<PixelMap> &pixelMap)
1021 {
1022     UserAccessTracer trace;
1023     trace.Start("GetThumbnail");
1024     if (!IsSystemApp()) {
1025         HILOG_ERROR("FileAccessHelper::GetThumbnail check IsSystemAppByFullTokenID failed");
1026         return E_PERMISSION_SYS;
1027     }
1028 
1029     if (!CheckUri(uri)) {
1030         HILOG_ERROR("Uri format check error.");
1031         return E_URIS;
1032     }
1033 
1034     string uriStr = uri.ToString();
1035     if (thumbnailSize.width <= 0 || thumbnailSize.height <= 0) {
1036         HILOG_ERROR("Size format check error.");
1037         return E_GETRESULT;
1038     }
1039 
1040     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
1041     if (fileExtProxy == nullptr) {
1042         HILOG_ERROR("failed with invalid fileAccessExtProxy");
1043         return E_IPCS;
1044     }
1045 
1046     int ret = fileExtProxy->GetThumbnail(uri, thumbnailSize, pixelMap);
1047     if (ret != ERR_OK) {
1048         HILOG_ERROR("GetThumbnail get result error, code:%{public}d", ret);
1049         return ret;
1050     }
1051 
1052     return ERR_OK;
1053 }
1054 
GetFileInfoFromUri(Uri & selectFile,FileInfo & fileInfo)1055 int FileAccessHelper::GetFileInfoFromUri(Uri &selectFile, FileInfo &fileInfo)
1056 {
1057     UserAccessTracer trace;
1058     trace.Start("GetFileInfoFromUri");
1059     if (!IsSystemApp()) {
1060         HILOG_ERROR("FileAccessHelper::GetFileInfoFromUri check IsSystemAppByFullTokenID failed");
1061         return E_PERMISSION_SYS;
1062     }
1063 
1064     if (!CheckUri(selectFile)) {
1065         HILOG_ERROR("selectFile uri format check error.");
1066         return E_URIS;
1067     }
1068 
1069     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(selectFile);
1070     if (fileExtProxy == nullptr) {
1071         HILOG_ERROR("failed with invalid fileAccessExtProxy");
1072         return E_IPCS;
1073     }
1074 
1075     int ret = fileExtProxy->GetFileInfoFromUri(selectFile, fileInfo);
1076     if (ret != ERR_OK) {
1077         HILOG_ERROR("GetFileInfoFromUri get result error, code:%{public}d", ret);
1078         return ret;
1079     }
1080 
1081     return ERR_OK;
1082 }
1083 
GetFileInfoFromRelativePath(std::string & selectFile,FileInfo & fileInfo)1084 int FileAccessHelper::GetFileInfoFromRelativePath(std::string &selectFile, FileInfo &fileInfo)
1085 {
1086     UserAccessTracer trace;
1087     trace.Start("GetFileInfoFromRelativePath");
1088     if (!IsSystemApp()) {
1089         HILOG_ERROR("FileAccessHelper::GetFileInfoFromRelativePath check IsSystemAppByFullTokenID failed");
1090         return E_PERMISSION_SYS;
1091     }
1092 
1093     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByBundleName(EXTERNAL_BNUDLE_NAME);
1094     if (fileExtProxy == nullptr) {
1095         HILOG_ERROR("failed with invalid fileAccessExtProxy");
1096         return E_IPCS;
1097     }
1098 
1099     int ret = fileExtProxy->GetFileInfoFromRelativePath(selectFile, fileInfo);
1100     if (ret != ERR_OK) {
1101         HILOG_ERROR("GetFileInfoFromRelativePath get result error, code:%{public}d", ret);
1102         return ret;
1103     }
1104 
1105     return ERR_OK;
1106 }
1107 
StartWatcher(Uri & uri)1108 int FileAccessHelper::StartWatcher(Uri &uri)
1109 {
1110     UserAccessTracer trace;
1111     trace.Start("StartWatcher");
1112     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
1113     if (fileExtProxy == nullptr) {
1114         HILOG_ERROR("failed with invalid fileAccessExtProxy");
1115         return E_IPCS;
1116     }
1117 
1118     int ret = fileExtProxy->StartWatcher(uri);
1119     if (ret != ERR_OK) {
1120         HILOG_ERROR("Delete get result error, code:%{public}d", ret);
1121         return ret;
1122     }
1123 
1124     return ERR_OK;
1125 }
1126 
StopWatcher(Uri & uri,bool isUnregisterAll)1127 int FileAccessHelper::StopWatcher(Uri &uri, bool isUnregisterAll)
1128 {
1129     UserAccessTracer trace;
1130     trace.Start("StopWatcher");
1131     sptr<IFileAccessExtBase> fileExtProxy = GetProxyByUri(uri);
1132     if (fileExtProxy == nullptr) {
1133         HILOG_ERROR("failed with invalid fileAccessExtProxy");
1134         return E_IPCS;
1135     }
1136 
1137     int ret = fileExtProxy->StopWatcher(uri, isUnregisterAll);
1138     if (ret != ERR_OK) {
1139         HILOG_ERROR("StopWatcher get result error, code:%{public}d", ret);
1140         return ret;
1141     }
1142 
1143     return ERR_OK;
1144 }
1145 
RegisterNotify(Uri uri,bool notifyForDescendants,sptr<IFileAccessObserver> & observer)1146 int FileAccessHelper::RegisterNotify(Uri uri, bool notifyForDescendants, sptr<IFileAccessObserver> &observer)
1147 {
1148     UserAccessTracer trace;
1149     trace.Start("RegisterNotify");
1150     if (!IsSystemApp()) {
1151         HILOG_ERROR("FileAccessHelper::RegisterNotify check IsSystemAppByFullTokenID failed");
1152         return E_PERMISSION_SYS;
1153     }
1154 
1155     if (!CheckUri(uri) || observer == nullptr) {
1156         HILOG_ERROR("parameter check error.");
1157         return EINVAL;
1158     }
1159 
1160     auto proxy = FileAccessServiceProxy::GetInstance();
1161     if (proxy == nullptr) {
1162         HILOG_ERROR("RegisterNotify get SA failed");
1163         return E_LOAD_SA;
1164     }
1165 
1166     int ret = proxy->RegisterNotify(uri, notifyForDescendants, observer);
1167     if (ret != ERR_OK) {
1168         HILOG_ERROR("RegisterNotify error ret = %{public}d", ret);
1169         return ret;
1170     }
1171 
1172     ret = StartWatcher(uri);
1173     if (ret != ERR_OK) {
1174         HILOG_ERROR("StartWatcher error ret = %{public}d", ret);
1175     }
1176     return ret;
1177 }
1178 
UnregisterNotify(Uri uri,sptr<IFileAccessObserver> & observer)1179 int FileAccessHelper::UnregisterNotify(Uri uri, sptr<IFileAccessObserver> &observer)
1180 {
1181     UserAccessTracer trace;
1182     trace.Start("UnregisterNotify");
1183     if (!IsSystemApp()) {
1184         HILOG_ERROR("FileAccessHelper::UnregisterNotify check IsSystemAppByFullTokenID failed");
1185         return E_PERMISSION_SYS;
1186     }
1187 
1188     if (!CheckUri(uri) || observer == nullptr) {
1189         HILOG_ERROR("parameter check error.");
1190         return EINVAL;
1191     }
1192 
1193     auto proxy = FileAccessServiceProxy::GetInstance();
1194     if (proxy == nullptr) {
1195         HILOG_ERROR("UnregisterNotify get SA failed");
1196         return E_LOAD_SA;
1197     }
1198 
1199     int ret = proxy->UnregisterNotify(uri, observer);
1200     if (ret != ERR_OK) {
1201         HILOG_ERROR("UnregisterNotify error ret = %{public}d", ret);
1202         return ret;
1203     }
1204 
1205     bool isUnregisterAll = false;
1206     ret = StopWatcher(uri, isUnregisterAll);
1207     if (ret != ERR_OK) {
1208         HILOG_ERROR("StopWatcher error ret = %{public}d", ret);
1209     }
1210     return ret;
1211 }
1212 
UnregisterNotify(Uri uri)1213 int FileAccessHelper::UnregisterNotify(Uri uri)
1214 {
1215     UserAccessTracer trace;
1216     trace.Start("UnregisterNotify");
1217     if (!IsSystemApp()) {
1218         HILOG_ERROR("FileAccessHelper::UnregisterNotify check IsSystemAppByFullTokenID failed");
1219         return E_PERMISSION_SYS;
1220     }
1221 
1222     if (!CheckUri(uri)) {
1223         HILOG_ERROR("parameter check error.");
1224         return EINVAL;
1225     }
1226     auto proxy = FileAccessServiceProxy::GetInstance();
1227     if (proxy == nullptr) {
1228         HILOG_ERROR("UnregisterNotify get SA failed");
1229         return E_LOAD_SA;
1230     }
1231 
1232     sptr<IFileAccessObserver> observer = nullptr;
1233     int ret = proxy->UnregisterNotify(uri, observer);
1234     if (ret != ERR_OK) {
1235         HILOG_ERROR("UnregisterNotify error ret = %{public}d", ret);
1236         return ret;
1237     }
1238 
1239     bool isUnregisterAll = true;
1240     ret = StopWatcher(uri, isUnregisterAll);
1241     if (ret != ERR_OK) {
1242         HILOG_ERROR("StopWatcher error ret = %{public}d", ret);
1243     }
1244     return ret;
1245 }
1246 
OnRemoteDied(const wptr<IRemoteObject> & remote)1247 void FileAccessDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
1248 {
1249     if (handler_) {
1250         handler_(remote);
1251     }
1252 }
1253 
FileAccessDeathRecipient(RemoteDiedHandler handler)1254 FileAccessDeathRecipient::FileAccessDeathRecipient(RemoteDiedHandler handler) : handler_(handler)
1255 {
1256 }
1257 
~FileAccessDeathRecipient()1258 FileAccessDeathRecipient::~FileAccessDeathRecipient()
1259 {
1260 }
1261 } // namespace FileAccessFwk
1262 } // namespace OHOS
1263