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 }