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