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 #define MLOG_TAG "FileExtension"
16
17 #include "media_file_ext_ability.h"
18
19 #include "extension_context.h"
20 #include "file_access_ext_stub_impl.h"
21 #include "js_runtime_utils.h"
22 #include "media_file_extention_utils.h"
23 #include "media_log.h"
24 #include "medialibrary_client_errno.h"
25 #include "medialibrary_data_manager.h"
26 #include "medialibrary_errno.h"
27
28 namespace OHOS {
29 namespace Media {
30 using namespace std;
31 using namespace OHOS::AppExecFwk;
32 using namespace OHOS::AbilityRuntime;
33 using namespace OHOS::FileAccessFwk;
34 using namespace OHOS::DataShare;
35
MediaFileExtAbility(JsRuntime & jsRuntime)36 MediaFileExtAbility::MediaFileExtAbility(JsRuntime& jsRuntime) : jsRuntime_(jsRuntime) {}
37
~MediaFileExtAbility()38 MediaFileExtAbility::~MediaFileExtAbility() {}
39
Create(const unique_ptr<Runtime> & runtime)40 MediaFileExtAbility* MediaFileExtAbility::Create(const unique_ptr<Runtime>& runtime)
41 {
42 MEDIA_INFO_LOG("create MediaFileExtAbility");
43 return new MediaFileExtAbility(static_cast<JsRuntime&>(*runtime));
44 }
45
MediaFileExtCreator(const unique_ptr<Runtime> & runtime)46 static MediaFileExtAbility* MediaFileExtCreator(const unique_ptr<Runtime>& runtime)
47 {
48 MEDIA_INFO_LOG("MediaFileExtCreator::%s", __func__);
49 return MediaFileExtAbility::Create(runtime);
50 }
51
RegisterFileExtCreator()52 __attribute__((constructor)) void RegisterFileExtCreator()
53 {
54 MEDIA_INFO_LOG("MediaFileExtCreator::%s", __func__);
55 FileAccessExtAbility::SetCreator(MediaFileExtCreator);
56 }
57
Init(const shared_ptr<AbilityLocalRecord> & record,const shared_ptr<OHOSApplication> & application,shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)58 void MediaFileExtAbility::Init(const shared_ptr<AbilityLocalRecord> &record,
59 const shared_ptr<OHOSApplication> &application, shared_ptr<AbilityHandler> &handler,
60 const sptr<IRemoteObject> &token)
61 {
62 MEDIA_INFO_LOG("Init MediaFileExtAbility");
63 FileAccessExtAbility::Init(record, application, handler, token);
64 auto context = AbilityRuntime::Context::GetApplicationContext();
65 if (context == nullptr) {
66 MEDIA_ERR_LOG("Failed to get context");
67 return;
68 }
69 MediaLibraryDataManager::GetInstance()->InitMediaLibraryMgr(context, nullptr);
70 }
71
OnStart(const AAFwk::Want & want)72 void MediaFileExtAbility::OnStart(const AAFwk::Want &want)
73 {
74 MEDIA_INFO_LOG("Onstart MediaFileExtAbility");
75 Extension::OnStart(want);
76 }
77
OnStop()78 void MediaFileExtAbility::OnStop()
79 {
80 MEDIA_INFO_LOG("%{public}s begin.", __func__);
81 MediaLibraryDataManager::GetInstance()->ClearMediaLibraryMgr();
82 }
83
OnConnect(const AAFwk::Want & want)84 sptr<IRemoteObject> MediaFileExtAbility::OnConnect(const AAFwk::Want &want)
85 {
86 MEDIA_DEBUG_LOG("OnConnect MediaFileExtAbility");
87 Extension::OnConnect(want);
88 sptr<FileAccessExtStubImpl> remoteObject = new (nothrow) FileAccessExtStubImpl(
89 static_pointer_cast<MediaFileExtAbility>(shared_from_this()),
90 reinterpret_cast<napi_env>(&jsRuntime_.GetNativeEngine()));
91 if (remoteObject == nullptr) {
92 MEDIA_ERR_LOG("OnConnect MediaFileExtAbility get obj fail");
93 return nullptr;
94 }
95
96 return remoteObject->AsObject();
97 }
98
ConvertErrno(int32_t innerErr)99 int32_t ConvertErrno(int32_t innerErr)
100 {
101 if (innerErr >= 0) {
102 return E_SUCCESS;
103 }
104 int32_t err = JS_INNER_FAIL;
105 if (ClientErrTable.find(innerErr) != ClientErrTable.end()) {
106 err = ClientErrTable.at(innerErr);
107 }
108 return err;
109 }
110
OpenFile(const Uri & uri,const int flags,int & fd)111 int MediaFileExtAbility::OpenFile(const Uri &uri, const int flags, int &fd)
112 {
113 return ConvertErrno(MediaFileExtentionUtils::OpenFile(uri, flags, fd));
114 }
115
CreateFile(const Uri & parentUri,const string & displayName,Uri & newFileUri)116 int MediaFileExtAbility::CreateFile(const Uri &parentUri, const string &displayName, Uri &newFileUri)
117 {
118 return ConvertErrno(MediaFileExtentionUtils::CreateFile(parentUri, displayName, newFileUri));
119 }
120
Mkdir(const Uri & parentUri,const string & displayName,Uri & newFileUri)121 int MediaFileExtAbility::Mkdir(const Uri &parentUri, const string &displayName, Uri &newFileUri)
122 {
123 return ConvertErrno(MediaFileExtentionUtils::Mkdir(parentUri, displayName, newFileUri));
124 }
125
Delete(const Uri & sourceFileUri)126 int MediaFileExtAbility::Delete(const Uri &sourceFileUri)
127 {
128 return ConvertErrno(MediaFileExtentionUtils::Delete(sourceFileUri));
129 }
130
ListFile(const FileInfo & parentInfo,const int64_t offset,const int64_t maxCount,const DistributedFS::FileFilter & filter,vector<FileInfo> & fileList)131 int MediaFileExtAbility::ListFile(const FileInfo &parentInfo, const int64_t offset, const int64_t maxCount,
132 const DistributedFS::FileFilter &filter, vector<FileInfo> &fileList)
133 {
134 return ConvertErrno(MediaFileExtentionUtils::ListFile(parentInfo, offset, maxCount, filter, fileList));
135 }
136
ScanFile(const FileInfo & parentInfo,const int64_t offset,const int64_t maxCount,const DistributedFS::FileFilter & filter,vector<FileInfo> & fileList)137 int MediaFileExtAbility::ScanFile(const FileInfo &parentInfo, const int64_t offset, const int64_t maxCount,
138 const DistributedFS::FileFilter &filter, vector<FileInfo> &fileList)
139 {
140 return ConvertErrno(MediaFileExtentionUtils::ScanFile(parentInfo, offset, maxCount, filter, fileList));
141 }
142
GetRoots(vector<FileAccessFwk::RootInfo> & rootList)143 int MediaFileExtAbility::GetRoots(vector<FileAccessFwk::RootInfo> &rootList)
144 {
145 return ConvertErrno(MediaFileExtentionUtils::GetRoots(rootList));
146 }
147
Move(const Uri & sourceFileUri,const Uri & targetParentUri,Uri & newFileUri)148 int MediaFileExtAbility::Move(const Uri &sourceFileUri, const Uri &targetParentUri, Uri &newFileUri)
149 {
150 return ConvertErrno(MediaFileExtentionUtils::Move(sourceFileUri, targetParentUri, newFileUri));
151 }
152
Rename(const Uri & sourceFileUri,const string & displayName,Uri & newFileUri)153 int MediaFileExtAbility::Rename(const Uri &sourceFileUri, const string &displayName, Uri &newFileUri)
154 {
155 return ConvertErrno(MediaFileExtentionUtils::Rename(sourceFileUri, displayName, newFileUri));
156 }
157
Access(const Uri & uri,bool & isExist)158 int MediaFileExtAbility::Access(const Uri &uri, bool &isExist)
159 {
160 return ConvertErrno(MediaFileExtentionUtils::Access(uri, isExist));
161 }
162 } // Media
163 } // OHOS
164