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