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 "userfile_client.h"
17
18 #include "ability.h"
19
20 #include "media_asset_rdbstore.h"
21 #include "medialibrary_errno.h"
22 #include "medialibrary_napi_log.h"
23 #include "medialibrary_helper_container.h"
24 #include "media_file_utils.h"
25
26 using namespace std;
27 using namespace OHOS::DataShare;
28 using namespace OHOS::AppExecFwk;
29 namespace OHOS {
30 namespace Media {
DataShareCreator(const sptr<IRemoteObject> & token,shared_ptr<DataShare::DataShareHelper> & dataShareHelper)31 static void DataShareCreator(const sptr<IRemoteObject> &token, shared_ptr<DataShare::DataShareHelper> &dataShareHelper)
32 {
33 dataShareHelper = DataShare::DataShareHelper::Creator(token, MEDIALIBRARY_DATA_URI);
34 if (dataShareHelper == nullptr) {
35 NAPI_ERR_LOG("dataShareHelper Creator failed");
36 dataShareHelper = DataShare::DataShareHelper::Creator(token, MEDIALIBRARY_DATA_URI);
37 }
38 }
39
GetDataShareHelper(napi_env env,napi_callback_info info)40 shared_ptr<DataShare::DataShareHelper> UserFileClient::GetDataShareHelper(napi_env env, napi_callback_info info)
41 {
42 size_t argc = ARGS_ONE;
43 napi_value argv[ARGS_ONE] = {0};
44 napi_value thisVar = nullptr;
45 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
46
47 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = nullptr;
48 bool isStageMode = false;
49 napi_status status = OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
50 if (status != napi_ok || !isStageMode) {
51 auto ability = OHOS::AbilityRuntime::GetCurrentAbility(env);
52 if (ability == nullptr) {
53 NAPI_ERR_LOG("Failed to get native ability instance");
54 return nullptr;
55 }
56 auto context = ability->GetContext();
57 if (context == nullptr) {
58 NAPI_ERR_LOG("Failed to get native context instance");
59 return nullptr;
60 }
61 DataShareCreator(context->GetToken(), dataShareHelper);
62 } else {
63 auto context = OHOS::AbilityRuntime::GetStageModeContext(env, argv[0]);
64 if (context == nullptr) {
65 NAPI_ERR_LOG("Failed to get native stage context instance");
66 return nullptr;
67 }
68 DataShareCreator(context->GetToken(), dataShareHelper);
69 }
70 MediaLibraryHelperContainer::GetInstance()->SetDataShareHelper(dataShareHelper);
71 return dataShareHelper;
72 }
73
CheckIsStage(napi_env env,napi_callback_info info,bool & result)74 napi_status UserFileClient::CheckIsStage(napi_env env, napi_callback_info info, bool &result)
75 {
76 size_t argc = ARGS_ONE;
77 napi_value argv[ARGS_ONE] = {0};
78 napi_value thisVar = nullptr;
79 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
80 if (status != napi_ok) {
81 NAPI_ERR_LOG("Failed to get cb info, status=%{public}d", (int) status);
82 return status;
83 }
84
85 result = false;
86 status = OHOS::AbilityRuntime::IsStageContext(env, argv[0], result);
87 if (status != napi_ok) {
88 NAPI_ERR_LOG("Failed to get stage mode, status=%{public}d", (int) status);
89 return status;
90 }
91 return napi_ok;
92 }
93
ParseTokenInStageMode(napi_env env,napi_callback_info info)94 sptr<IRemoteObject> UserFileClient::ParseTokenInStageMode(napi_env env, napi_callback_info info)
95 {
96 size_t argc = ARGS_ONE;
97 napi_value argv[ARGS_ONE] = {0};
98 napi_value thisVar = nullptr;
99 if (napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr) != napi_ok) {
100 NAPI_ERR_LOG("Failed to get cb info");
101 return nullptr;
102 }
103
104 auto context = OHOS::AbilityRuntime::GetStageModeContext(env, argv[0]);
105 if (context == nullptr) {
106 NAPI_ERR_LOG("Failed to get native stage context instance");
107 return nullptr;
108 }
109 return context->GetToken();
110 }
111
ParseTokenInAbility(napi_env env,napi_callback_info info)112 sptr<IRemoteObject> UserFileClient::ParseTokenInAbility(napi_env env, napi_callback_info info)
113 {
114 size_t argc = ARGS_ONE;
115 napi_value argv[ARGS_ONE] = {0};
116 napi_value thisVar = nullptr;
117 if (napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr) != napi_ok) {
118 NAPI_ERR_LOG("Failed to get cb info");
119 return nullptr;
120 }
121
122 auto ability = OHOS::AbilityRuntime::GetCurrentAbility(env);
123 if (ability == nullptr) {
124 NAPI_ERR_LOG("Failed to get native ability instance");
125 return nullptr;
126 }
127 auto context = ability->GetContext();
128 if (context == nullptr) {
129 NAPI_ERR_LOG("Failed to get native context instance");
130 return nullptr;
131 }
132 return context->GetToken();
133 }
134
IsValid()135 bool UserFileClient::IsValid()
136 {
137 return sDataShareHelper_ != nullptr;
138 }
139
Init(const sptr<IRemoteObject> & token,bool isSetHelper)140 void UserFileClient::Init(const sptr<IRemoteObject> &token, bool isSetHelper)
141 {
142 sDataShareHelper_ = DataShare::DataShareHelper::Creator(token, MEDIALIBRARY_DATA_URI);
143 if (isSetHelper) {
144 MediaLibraryHelperContainer::GetInstance()->SetDataShareHelper(sDataShareHelper_);
145 }
146 }
147
Init(napi_env env,napi_callback_info info)148 void UserFileClient::Init(napi_env env, napi_callback_info info)
149 {
150 sDataShareHelper_ = GetDataShareHelper(env, info);
151 }
152
Query(Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns,int & errCode)153 shared_ptr<DataShareResultSet> UserFileClient::Query(Uri &uri, const DataSharePredicates &predicates,
154 std::vector<std::string> &columns, int &errCode)
155 {
156 if (!IsValid()) {
157 NAPI_ERR_LOG("Query fail, helper null");
158 return nullptr;
159 }
160
161 shared_ptr<DataShareResultSet> resultSet = nullptr;
162 OperationObject object = OperationObject::UNKNOWN_OBJECT;
163 if (MediaAssetRdbStore::GetInstance()->IsQueryAccessibleViaSandBox(uri, object, predicates)) {
164 resultSet = MediaAssetRdbStore::GetInstance()->Query(predicates, columns, object, errCode);
165 } else {
166 DatashareBusinessError businessError;
167 resultSet = sDataShareHelper_->Query(uri, predicates, columns, &businessError);
168 errCode = businessError.GetCode();
169 }
170 return resultSet;
171 }
172
QueryRdb(Uri & uri,const DataShare::DataSharePredicates & predicates,std::vector<std::string> & columns)173 std::shared_ptr<NativeRdb::ResultSet> UserFileClient::QueryRdb(Uri &uri,
174 const DataShare::DataSharePredicates &predicates, std::vector<std::string> &columns)
175 {
176 shared_ptr<NativeRdb::ResultSet> resultSet = nullptr;
177 OperationObject object = OperationObject::UNKNOWN_OBJECT;
178 if (MediaAssetRdbStore::GetInstance()->IsSupportSharedAssetQuery(uri, object)) {
179 resultSet = MediaAssetRdbStore::GetInstance()->QueryRdb(predicates, columns, object);
180 }
181 return resultSet;
182 }
183
Insert(Uri & uri,const DataShareValuesBucket & value)184 int UserFileClient::Insert(Uri &uri, const DataShareValuesBucket &value)
185 {
186 if (!IsValid()) {
187 NAPI_ERR_LOG("insert fail, helper null");
188 return E_FAIL;
189 }
190 int index = sDataShareHelper_->Insert(uri, value);
191 return index;
192 }
193
InsertExt(Uri & uri,const DataShareValuesBucket & value,string & result)194 int UserFileClient::InsertExt(Uri &uri, const DataShareValuesBucket &value, string &result)
195 {
196 if (!IsValid()) {
197 NAPI_ERR_LOG("insert fail, helper null");
198 return E_FAIL;
199 }
200 int index = sDataShareHelper_->InsertExt(uri, value, result);
201 return index;
202 }
203
BatchInsert(Uri & uri,const std::vector<DataShare::DataShareValuesBucket> & values)204 int UserFileClient::BatchInsert(Uri &uri, const std::vector<DataShare::DataShareValuesBucket> &values)
205 {
206 if (!IsValid()) {
207 NAPI_ERR_LOG("Batch insert fail, helper null");
208 return E_FAIL;
209 }
210 return sDataShareHelper_->BatchInsert(uri, values);
211 }
212
Delete(Uri & uri,const DataSharePredicates & predicates)213 int UserFileClient::Delete(Uri &uri, const DataSharePredicates &predicates)
214 {
215 if (!IsValid()) {
216 NAPI_ERR_LOG("delete fail, helper null");
217 return E_FAIL;
218 }
219 return sDataShareHelper_->Delete(uri, predicates);
220 }
221
NotifyChange(const Uri & uri)222 void UserFileClient::NotifyChange(const Uri &uri)
223 {
224 if (!IsValid()) {
225 NAPI_ERR_LOG("notify change fail, helper null");
226 return;
227 }
228 sDataShareHelper_->NotifyChange(uri);
229 }
230
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)231 void UserFileClient::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
232 {
233 if (!IsValid()) {
234 NAPI_ERR_LOG("register observer fail, helper null");
235 return;
236 }
237 sDataShareHelper_->RegisterObserver(uri, dataObserver);
238 }
239
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)240 void UserFileClient::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
241 {
242 if (!IsValid()) {
243 NAPI_ERR_LOG("unregister observer fail, helper null");
244 return;
245 }
246 sDataShareHelper_->UnregisterObserver(uri, dataObserver);
247 }
248
OpenFile(Uri & uri,const std::string & mode)249 int UserFileClient::OpenFile(Uri &uri, const std::string &mode)
250 {
251 if (!IsValid()) {
252 NAPI_ERR_LOG("Open file fail, helper null");
253 return E_FAIL;
254 }
255 return sDataShareHelper_->OpenFile(uri, mode);
256 }
257
Update(Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)258 int UserFileClient::Update(Uri &uri, const DataSharePredicates &predicates,
259 const DataShareValuesBucket &value)
260 {
261 if (!IsValid()) {
262 NAPI_ERR_LOG("update fail, helper null");
263 return E_FAIL;
264 }
265 return sDataShareHelper_->Update(uri, predicates, value);
266 }
267
RegisterObserverExt(const Uri & uri,shared_ptr<DataShare::DataShareObserver> dataObserver,bool isDescendants)268 void UserFileClient::RegisterObserverExt(const Uri &uri,
269 shared_ptr<DataShare::DataShareObserver> dataObserver, bool isDescendants)
270 {
271 if (!IsValid()) {
272 NAPI_ERR_LOG("register observer fail, helper null");
273 return;
274 }
275 sDataShareHelper_->RegisterObserverExt(uri, std::move(dataObserver), isDescendants);
276 }
277
UnregisterObserverExt(const Uri & uri,std::shared_ptr<DataShare::DataShareObserver> dataObserver)278 void UserFileClient::UnregisterObserverExt(const Uri &uri, std::shared_ptr<DataShare::DataShareObserver> dataObserver)
279 {
280 if (!IsValid()) {
281 NAPI_ERR_LOG("unregister observer fail, helper null");
282 return;
283 }
284 sDataShareHelper_->UnregisterObserverExt(uri, std::move(dataObserver));
285 }
286
GetType(Uri & uri)287 std::string UserFileClient::GetType(Uri &uri)
288 {
289 if (!IsValid()) {
290 NAPI_ERR_LOG("get type fail, helper null");
291 return "";
292 }
293 return sDataShareHelper_->GetType(uri);
294 }
295
Clear()296 void UserFileClient::Clear()
297 {
298 sDataShareHelper_ = nullptr;
299 }
300 }
301 }
302