• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #define MLOG_TAG "Extension"
16 
17 #include "media_datashare_stub_impl.h"
18 
19 #include "media_log.h"
20 #include "medialibrary_errno.h"
21 #include "i_observer_manager_interface.h"
22 #include "media_observer_manager.h"
23 #include "notify_register_permission.h"
24 #include "observer_callback_recipient.h"
25 #include "observer_info.h"
26 
27 namespace OHOS {
28 namespace DataShare {
29 using namespace OHOS::Media;
30 std::unordered_map<std::string, Notification::NotifyUriType> NOTIFY_URI_MAP = {
31     {"photoChange", Notification::NotifyUriType::PHOTO_URI},
32     {"hiddenPhotoChange", Notification::NotifyUriType::HIDDEN_PHOTO_URI},
33     {"trashedPhotoChange", Notification::NotifyUriType::TRASH_PHOTO_URI},
34     {"photoAlbumChange", Notification::NotifyUriType::PHOTO_ALBUM_URI},
35     {"hiddenAlbumChange", Notification::NotifyUriType::HIDDEN_ALBUM_URI},
36     {"trashedAlbumChange", Notification::NotifyUriType::TRASH_ALBUM_URI}
37 };
38 
GetOwner()39 std::shared_ptr<MediaDataShareExtAbility> MediaDataShareStubImpl::GetOwner()
40 {
41     return extension_;
42 }
43 
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)44 std::vector<std::string> MediaDataShareStubImpl::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
45 {
46     MEDIA_DEBUG_LOG("begin.");
47     std::vector<std::string> ret;
48     auto client = sptr<MediaDataShareStubImpl>(this);
49     auto extension = client->GetOwner();
50     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
51     ret = extension->GetFileTypes(uri, mimeTypeFilter);
52     MEDIA_DEBUG_LOG("end successfully.");
53     return ret;
54 }
55 
OpenFile(const Uri & uri,const std::string & mode)56 int MediaDataShareStubImpl::OpenFile(const Uri &uri, const std::string &mode)
57 {
58     int ret = -1;
59     auto client = sptr<MediaDataShareStubImpl>(this);
60     auto extension = client->GetOwner();
61     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
62     ret = extension->OpenFile(uri, mode);
63     return ret;
64 }
65 
OpenRawFile(const Uri & uri,const std::string & mode)66 int MediaDataShareStubImpl::OpenRawFile(const Uri &uri, const std::string &mode)
67 {
68     MEDIA_DEBUG_LOG("begin.");
69     int ret = -1;
70     auto client = sptr<MediaDataShareStubImpl>(this);
71     auto extension = client->GetOwner();
72     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
73     ret = extension->OpenRawFile(uri, mode);
74     MEDIA_DEBUG_LOG("end successfully. ret: %{public}d", ret);
75     return ret;
76 }
77 
Insert(const Uri & uri,const DataShareValuesBucket & value)78 int MediaDataShareStubImpl::Insert(const Uri &uri, const DataShareValuesBucket &value)
79 {
80     int ret = 0;
81     auto client = sptr<MediaDataShareStubImpl>(this);
82     auto extension = client->GetOwner();
83     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
84     ret = extension->Insert(uri, value);
85     return ret;
86 }
87 
InsertExt(const Uri & uri,const DataShareValuesBucket & value,std::string & result)88 int MediaDataShareStubImpl::InsertExt(const Uri &uri, const DataShareValuesBucket &value, std::string &result)
89 {
90     int ret = 0;
91     auto client = sptr<MediaDataShareStubImpl>(this);
92     auto extension = client->GetOwner();
93     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
94     ret = extension->InsertExt(uri, value, result);
95     return ret;
96 }
97 
Update(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)98 int MediaDataShareStubImpl::Update(const Uri &uri, const DataSharePredicates &predicates,
99     const DataShareValuesBucket &value)
100 {
101     int ret = 0;
102     auto client = sptr<MediaDataShareStubImpl>(this);
103     auto extension = client->GetOwner();
104     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
105     ret = extension->Update(uri, predicates, value);
106     return ret;
107 }
108 
Delete(const Uri & uri,const DataSharePredicates & predicates)109 int MediaDataShareStubImpl::Delete(const Uri &uri, const DataSharePredicates &predicates)
110 {
111     int ret = 0;
112     auto client = sptr<MediaDataShareStubImpl>(this);
113     auto extension = client->GetOwner();
114     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
115     ret = extension->Delete(uri, predicates);
116     return ret;
117 }
118 
Query(const Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns,DatashareBusinessError & businessError)119 std::shared_ptr<DataShareResultSet> MediaDataShareStubImpl::Query(const Uri &uri,
120     const DataSharePredicates &predicates, std::vector<std::string> &columns, DatashareBusinessError &businessError)
121 {
122     auto client = sptr<MediaDataShareStubImpl>(this);
123     auto extension = client->GetOwner();
124     CHECK_AND_RETURN_RET_LOG(extension != nullptr, nullptr, "%{public}s end failed.", __func__);
125     return extension->Query(uri, predicates, columns, businessError);
126 }
127 
GetType(const Uri & uri)128 std::string MediaDataShareStubImpl::GetType(const Uri &uri)
129 {
130     MEDIA_DEBUG_LOG("begin.");
131     std::string ret = "";
132     auto client = sptr<MediaDataShareStubImpl>(this);
133     auto extension = client->GetOwner();
134     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
135     ret = extension->GetType(uri);
136     MEDIA_DEBUG_LOG("end successfully.");
137     return ret;
138 }
139 
BatchInsert(const Uri & uri,const std::vector<DataShareValuesBucket> & values)140 int MediaDataShareStubImpl::BatchInsert(const Uri &uri, const std::vector<DataShareValuesBucket> &values)
141 {
142     MEDIA_DEBUG_LOG("begin.");
143     int ret = 0;
144     auto client = sptr<MediaDataShareStubImpl>(this);
145     auto extension = client->GetOwner();
146     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
147     ret = extension->BatchInsert(uri, values);
148     MEDIA_DEBUG_LOG("end successfully.");
149     return ret;
150 }
151 
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)152 bool MediaDataShareStubImpl::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
153 {
154     MEDIA_DEBUG_LOG("begin.");
155     bool ret = false;
156     auto client = sptr<MediaDataShareStubImpl>(this);
157     auto extension = client->GetOwner();
158     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
159     ret = extension->RegisterObserver(uri, dataObserver);
160     MEDIA_DEBUG_LOG("end successfully. ret: %{public}d", ret);
161     return ret;
162 }
163 
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)164 bool MediaDataShareStubImpl::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
165 {
166     MEDIA_DEBUG_LOG("begin.");
167     bool ret = false;
168     auto client = sptr<MediaDataShareStubImpl>(this);
169     auto extension = client->GetOwner();
170     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
171     ret = extension->UnregisterObserver(uri, dataObserver);
172     MEDIA_DEBUG_LOG("end successfully. ret: %{public}d", ret);
173     return ret;
174 }
175 
RegisterObserverExtProvider(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver,bool isDescendants,RegisterOption option)176 int MediaDataShareStubImpl::RegisterObserverExtProvider(const Uri &uri,
177     const sptr<AAFwk::IDataAbilityObserver> &dataObserver, bool isDescendants, RegisterOption option)
178 {
179     MEDIA_INFO_LOG("enter MediaDataShareStubImpl::RegisterObserver, uri:%{public}s", uri.ToString().c_str());
180     std::string uriType = uri.ToString();
181     if (NOTIFY_URI_MAP.find(uriType) == NOTIFY_URI_MAP.end()) {
182         MEDIA_ERR_LOG("registerType is invalid");
183         return E_URI_IS_INVALID;
184     }
185     Notification::NotifyUriType registerUriType = NOTIFY_URI_MAP.at(uriType);
186     auto observerManager = Media::Notification::MediaObserverManager::GetObserverManager();
187     CHECK_AND_RETURN_RET_LOG(observerManager != nullptr, E_OBSERVER_MANAGER_IS_NULL, "observerManager is nullptr");
188     int32_t ret = observerManager->AddObserver(registerUriType, dataObserver, option.isReconnect);
189     CHECK_AND_RETURN_RET_LOG(ret == E_OK, ret, "failed to add observer, error is %{public}d", ret);
190     return E_SUCCESS;
191 }
192 
UnregisterObserverExtProvider(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)193 int MediaDataShareStubImpl::UnregisterObserverExtProvider(const Uri &uri,
194     const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
195 {
196     MEDIA_INFO_LOG("enter MediaDataShareStubImpl::UnregisterObserver, uri:%{public}s", uri.ToString().c_str());
197     std::string uriType = uri.ToString();
198     if (NOTIFY_URI_MAP.find(uriType) == NOTIFY_URI_MAP.end()) {
199         MEDIA_ERR_LOG("registerType is invalid");
200         return E_URI_IS_INVALID;
201     }
202     Notification::NotifyUriType registerUriType = NOTIFY_URI_MAP.at(uriType);
203     auto observerManager = Media::Notification::MediaObserverManager::GetObserverManager();
204     CHECK_AND_RETURN_RET_LOG(observerManager != nullptr, E_OBSERVER_MANAGER_IS_NULL, "observerManager is nullptr");
205     int32_t ret = observerManager->RemoveObserverWithUri(registerUriType, dataObserver);
206     CHECK_AND_RETURN_RET_LOG(ret == E_OK, ret, "failed to remove observer, error is %{public}d", ret);
207     return E_SUCCESS;
208 }
209 
NotifyChange(const Uri & uri)210 bool MediaDataShareStubImpl::NotifyChange(const Uri &uri)
211 {
212     MEDIA_DEBUG_LOG("begin.");
213     bool ret = false;
214     auto client = sptr<MediaDataShareStubImpl>(this);
215     auto extension = client->GetOwner();
216     CHECK_AND_RETURN_RET_LOG(extension != nullptr, ret, "%{public}s end failed.", __func__);
217     ret = extension->NotifyChange(uri);
218     MEDIA_DEBUG_LOG("end successfully. ret: %{public}d", ret);
219     return ret;
220 }
221 
NormalizeUri(const Uri & uri)222 Uri MediaDataShareStubImpl::NormalizeUri(const Uri &uri)
223 {
224     MEDIA_DEBUG_LOG("begin.");
225     Uri urivalue("");
226     auto client = sptr<MediaDataShareStubImpl>(this);
227     auto extension = client->GetOwner();
228     CHECK_AND_RETURN_RET_LOG(extension != nullptr, urivalue, "%{public}s end failed.", __func__);
229     urivalue = extension->NormalizeUri(uri);
230     MEDIA_DEBUG_LOG("end successfully.");
231     return urivalue;
232 }
233 
DenormalizeUri(const Uri & uri)234 Uri MediaDataShareStubImpl::DenormalizeUri(const Uri &uri)
235 {
236     MEDIA_DEBUG_LOG("begin.");
237     Uri urivalue("");
238     auto client = sptr<MediaDataShareStubImpl>(this);
239     auto extension = client->GetOwner();
240     CHECK_AND_RETURN_RET_LOG(extension != nullptr, urivalue, "%{public}s end failed.", __func__);
241     urivalue = extension->DenormalizeUri(uri);
242     MEDIA_DEBUG_LOG("end successfully.");
243     return urivalue;
244 }
245 
UserDefineFunc(MessageParcel & data,MessageParcel & reply,MessageOption & option)246 int32_t MediaDataShareStubImpl::UserDefineFunc(MessageParcel &data, MessageParcel &reply, MessageOption &option)
247 {
248     auto client = sptr<MediaDataShareStubImpl>(this);
249     auto extension = client->GetOwner();
250     bool errConn = extension == nullptr;
251     CHECK_AND_RETURN_RET_LOG(!errConn, E_ERR, "%{public}s end failed.", __func__);
252     auto ret = extension->UserDefineFunc(data, reply, option);
253     return ret;
254 }
255 } // namespace DataShare
256 } // namespace OHOS
257