• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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