• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "userfile_client.h"
17 
18 #include "ability_runtime/cj_ability_context.h"
19 #include "ffi_remote_data.h"
20 #include "media_asset_rdbstore.h"
21 #include "media_file_utils.h"
22 #include "medialibrary_errno.h"
23 #include "medialibrary_helper_container.h"
24 #include "medialibrary_operation.h"
25 #include "userfilemgr_uri.h"
26 #include "medialibrary_napi_utils.h"
27 
28 using namespace std;
29 using namespace OHOS::DataShare;
30 using namespace OHOS::AppExecFwk;
31 
32 namespace OHOS {
33 namespace Media {
34 
35 int32_t UserFileClient::userId_ = -1;
36 int32_t UserFileClient::lastUserId_ = -1;
37 std::string MULTI_USER_URI_FLAG = "user=";
38 std::string USER_STR = "user";
39 
GetMediaLibraryDataUri()40 static std::string GetMediaLibraryDataUri()
41 {
42     std::string mediaLibraryDataUri = MEDIALIBRARY_DATA_URI;
43     if (UserFileClient::GetUserId() != -1) {
44         mediaLibraryDataUri = mediaLibraryDataUri + "?" + MULTI_USER_URI_FLAG + to_string(UserFileClient::GetUserId());
45     }
46     return mediaLibraryDataUri;
47 }
48 
MultiUserUriRecognition(Uri & uri)49 static Uri MultiUserUriRecognition(Uri &uri)
50 {
51     if (UserFileClient::GetUserId() == -1) {
52         return uri;
53     }
54     std::string uriString = uri.ToString();
55     MediaLibraryNapiUtils::UriAppendKeyValue(uriString, USER_STR, to_string(UserFileClient::GetUserId()));
56     return Uri(uriString);
57 }
58 
IsValid()59 bool UserFileClient::IsValid()
60 {
61     return sDataShareHelper_ != nullptr;
62 }
63 
Init(const sptr<IRemoteObject> & token)64 void UserFileClient::Init(const sptr<IRemoteObject> &token)
65 {
66     sDataShareHelper_ = DataShare::DataShareHelper::Creator(token, GetMediaLibraryDataUri());
67     if (sDataShareHelper_ == nullptr) {
68         sDataShareHelper_ = DataShare::DataShareHelper::Creator(token, GetMediaLibraryDataUri());
69     }
70     MediaLibraryHelperContainer::GetInstance()->SetDataShareHelper(sDataShareHelper_);
71 }
72 
Init(int64_t contextId)73 void UserFileClient::Init(int64_t contextId)
74 {
75     auto context = FFI::FFIData::GetData<AbilityRuntime::CJAbilityContext>(contextId);
76     if (context == nullptr) {
77         LOGE("Failed to get native stage context instance");
78         return;
79     }
80     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
81         DataShare::DataShareHelper::Creator(context->GetToken(), GetMediaLibraryDataUri());
82     MediaLibraryHelperContainer::GetInstance()->SetDataShareHelper(dataShareHelper);
83     sDataShareHelper_ = dataShareHelper;
84 }
85 
Query(Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns,int & errCode)86 shared_ptr<DataShareResultSet> UserFileClient::Query(Uri &uri, const DataSharePredicates &predicates,
87     std::vector<std::string> &columns, int &errCode)
88 {
89     if (!IsValid()) {
90         LOGE("Query fail, helper null");
91         return nullptr;
92     }
93     uri = MultiUserUriRecognition(uri);
94 
95     shared_ptr<DataShareResultSet> resultSet = nullptr;
96     OperationObject object = OperationObject::UNKNOWN_OBJECT;
97     if (MediaAssetRdbStore::GetInstance()->IsQueryAccessibleViaSandBox(uri, object, predicates) &&
98         !uri.ToString().find(MULTI_USER_URI_FLAG)) {
99         resultSet = MediaAssetRdbStore::GetInstance()->Query(predicates, columns, object, errCode);
100     } else {
101         DatashareBusinessError businessError;
102         resultSet = sDataShareHelper_->Query(uri, predicates, columns, &businessError);
103         errCode = businessError.GetCode();
104     }
105     return resultSet;
106 }
107 
Insert(Uri & uri,const DataShareValuesBucket & value)108 int UserFileClient::Insert(Uri &uri, const DataShareValuesBucket &value)
109 {
110     if (!IsValid()) {
111         LOGE("insert fail, helper null");
112         return E_FAIL;
113     }
114     uri = MultiUserUriRecognition(uri);
115     int index = sDataShareHelper_->Insert(uri, value);
116     return index;
117 }
118 
RegisterObserverExt(const Uri & uri,shared_ptr<DataShare::DataShareObserver> dataObserver,bool isDescendants)119 void UserFileClient::RegisterObserverExt(const Uri &uri,
120     shared_ptr<DataShare::DataShareObserver> dataObserver, bool isDescendants)
121 {
122     if (!IsValid()) {
123         LOGE("register observer fail, helper null");
124         return;
125     }
126     sDataShareHelper_->RegisterObserverExt(uri, std::move(dataObserver), isDescendants);
127 }
128 
UnregisterObserverExt(const Uri & uri,std::shared_ptr<DataShare::DataShareObserver> dataObserver)129 void UserFileClient::UnregisterObserverExt(const Uri &uri, std::shared_ptr<DataShare::DataShareObserver> dataObserver)
130 {
131     if (!IsValid()) {
132         LOGE("unregister observer fail, helper null");
133         return;
134     }
135     sDataShareHelper_->UnregisterObserverExt(uri, std::move(dataObserver));
136 }
137 
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)138 void UserFileClient::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
139 {
140     if (!IsValid()) {
141         LOGE("register observer fail, helper null");
142         return;
143     }
144     sDataShareHelper_->RegisterObserver(uri, dataObserver);
145 }
146 
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)147 void UserFileClient::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
148 {
149     if (dataObserver == nullptr) {
150         LOGE("Failed to obtain data observer");
151         return;
152     }
153     if (!IsValid()) {
154         LOGE("unregister observer fail, helper null");
155         return;
156     }
157     sDataShareHelper_->UnregisterObserver(uri, dataObserver);
158 }
159 
Update(Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)160 int UserFileClient::Update(Uri &uri, const DataSharePredicates &predicates,
161     const DataShareValuesBucket &value)
162 {
163     if (!IsValid()) {
164         LOGE("update fail, helper null");
165         return E_FAIL;
166     }
167     uri = MultiUserUriRecognition(uri);
168     return sDataShareHelper_->Update(uri, predicates, value);
169 }
170 
NotifyChange(const Uri & uri)171 void UserFileClient::NotifyChange(const Uri &uri)
172 {
173     if (!IsValid()) {
174         LOGE("notify change fail, helper null");
175         return;
176     }
177     sDataShareHelper_->NotifyChange(uri);
178 }
179 
OpenFile(Uri & uri,const std::string & mode)180 int UserFileClient::OpenFile(Uri &uri, const std::string &mode)
181 {
182     if (!IsValid()) {
183         LOGE("Open file fail, helper null");
184         return E_FAIL;
185     }
186     uri = MultiUserUriRecognition(uri);
187     return sDataShareHelper_->OpenFile(uri, mode);
188 }
189 
Delete(Uri & uri,const DataSharePredicates & predicates)190 int UserFileClient::Delete(Uri &uri, const DataSharePredicates &predicates)
191 {
192     if (!IsValid()) {
193         LOGE("delete fail, helper null");
194         return E_FAIL;
195     }
196     uri = MultiUserUriRecognition(uri);
197     return sDataShareHelper_->Delete(uri, predicates);
198 }
199 
InsertExt(Uri & uri,const DataShareValuesBucket & value,string & result)200 int UserFileClient::InsertExt(Uri &uri, const DataShareValuesBucket &value, string &result)
201 {
202     if (!IsValid()) {
203         LOGE("insert fail, helper null");
204         return E_FAIL;
205     }
206     uri = MultiUserUriRecognition(uri);
207     int index = sDataShareHelper_->InsertExt(uri, value, result);
208     return index;
209 }
210 
BatchInsert(Uri & uri,const std::vector<DataShare::DataShareValuesBucket> & values)211 int UserFileClient::BatchInsert(Uri& uri, const std::vector<DataShare::DataShareValuesBucket>& values)
212 {
213     if (!IsValid()) {
214         LOGE("Batch insert fail, helper null");
215         return E_FAIL;
216     }
217     uri = MultiUserUriRecognition(uri);
218     return sDataShareHelper_->BatchInsert(uri, values);
219 }
220 
SetUserId(const int32_t userId)221 void UserFileClient::SetUserId(const int32_t userId)
222 {
223     userId_ = userId;
224 }
225 
GetUserId()226 int32_t UserFileClient::GetUserId()
227 {
228     return userId_;
229 }
230 
SetLastUserId(const int32_t userId)231 void UserFileClient::SetLastUserId(const int32_t userId)
232 {
233     lastUserId_ = userId;
234 }
235 
GetLastUserId()236 int32_t UserFileClient::GetLastUserId()
237 {
238     return lastUserId_;
239 }
240 }
241 }