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