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