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
16 #include "datashare_stub_impl.h"
17 #include <string>
18
19 #include "accesstoken_kit.h"
20 #include "bundle_constants.h"
21 #include "bundle_mgr_helper.h"
22 #include "dataobs_mgr_client.h"
23 #include "data_share_config.h"
24 #include "datashare_errno.h"
25 #include "datashare_log.h"
26 #include "datashare_string_utils.h"
27 #include "hiview_datashare.h"
28 #include "ipc_skeleton.h"
29
30 namespace OHOS {
31 namespace DataShare {
32 using OHOS::Security::AccessToken::AccessTokenKit;
33
34 constexpr int DEFAULT_NUMBER = -1;
35 constexpr int PERMISSION_ERROR_NUMBER = -2;
GetOwner()36 std::shared_ptr<JsDataShareExtAbility> DataShareStubImpl::GetOwner()
37 {
38 if (extension_ == nullptr) {
39 LOG_ERROR("extension_ is nullptr.");
40 }
41 return extension_;
42 }
43
CheckTrusts(uint32_t consumerToken,uint32_t providerToken)44 int CheckTrusts(uint32_t consumerToken, uint32_t providerToken)
45 {
46 auto obsMgrClient = AAFwk::DataObsMgrClient::GetInstance();
47 if (obsMgrClient == nullptr) {
48 LOG_ERROR("obsMgrClient is nullptr");
49 return E_DATA_OBS_NOT_READY;
50 }
51 ErrCode ret = obsMgrClient->CheckTrusts(consumerToken, providerToken);
52 if (ret != E_OK) {
53 LOG_ERROR("CheckTrusts error return %{public}d", ret);
54 return ret;
55 }
56 return E_OK;
57 }
58
CheckCallingPermission(const std::string & permission)59 bool DataShareStubImpl::CheckCallingPermission(const std::string &permission)
60 {
61 uint32_t token = IPCSkeleton::GetCallingTokenID();
62 if (permission.empty() || AccessTokenKit::VerifyAccessToken(token, permission)
63 == AppExecFwk::Constants::PERMISSION_GRANTED) {
64 return true;
65 }
66 LOG_WARN("permission not granted. permission %{public}s, token %{public}d", permission.c_str(), token);
67 return false;
68 }
69
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)70 std::vector<std::string> DataShareStubImpl::GetFileTypes(const Uri &uri, const std::string &mimeTypeFilter)
71 {
72 CallingInfo info;
73 GetCallingInfo(info);
74 std::vector<std::string> ret;
75 auto client = sptr<DataShareStubImpl>(this);
76 auto extension = client->GetOwner();
77 if (extension == nullptr) {
78 return ret;
79 }
80 auto result = std::make_shared<JsResult>();
81 std::function<void()> syncTaskFunc = [extension, info, uri, mimeTypeFilter, result]() {
82 extension->SetCallingInfo(info);
83 extension->InitResult(result);
84 extension->GetFileTypes(uri, mimeTypeFilter);
85 };
86 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
87 if (result == nullptr) {
88 return false;
89 }
90 bool isRecvReply = result->GetRecvReply();
91 result->GetResult(ret);
92 return isRecvReply;
93 };
94 std::lock_guard<std::mutex> lock(mutex_);
95 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
96 return ret;
97 }
98
OpenFile(const Uri & uri,const std::string & mode)99 int DataShareStubImpl::OpenFile(const Uri &uri, const std::string &mode)
100 {
101 CallingInfo info;
102 GetCallingInfo(info);
103 auto client = sptr<DataShareStubImpl>(this);
104 auto extension = client->GetOwner();
105 if (extension == nullptr) {
106 return DEFAULT_NUMBER;
107 }
108 auto result = std::make_shared<JsResult>();
109 int ret = -1;
110 std::function<void()> syncTaskFunc = [extension, info, uri, mode, result]() {
111 extension->SetCallingInfo(info);
112 extension->InitResult(result);
113 extension->OpenFile(uri, mode);
114 };
115 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
116 if (result == nullptr) {
117 return false;
118 }
119 bool isRecvReply = result->GetRecvReply();
120 result->GetResult(ret);
121 return isRecvReply;
122 };
123 std::lock_guard<std::mutex> lock(mutex_);
124 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
125 return ret;
126 }
127
OpenRawFile(const Uri & uri,const std::string & mode)128 int DataShareStubImpl::OpenRawFile(const Uri &uri, const std::string &mode)
129 {
130 CallingInfo info;
131 GetCallingInfo(info);
132 auto client = sptr<DataShareStubImpl>(this);
133 auto extension = client->GetOwner();
134 if (extension == nullptr) {
135 return DEFAULT_NUMBER;
136 }
137
138 std::shared_ptr<int> ret = std::make_shared<int>(-1);
139 std::function<void()> syncTaskFunc = [extension, ret, info, uri, mode]() {
140 extension->SetCallingInfo(info);
141 *ret = extension->OpenRawFile(uri, mode);
142 };
143 std::lock_guard<std::mutex> lock(mutex_);
144 uvQueue_->SyncCall(syncTaskFunc);
145 return *ret;
146 }
147
Insert(const Uri & uri,const DataShareValuesBucket & value)148 int DataShareStubImpl::Insert(const Uri &uri, const DataShareValuesBucket &value)
149 {
150 CallingInfo info;
151 GetCallingInfo(info);
152
153 auto client = sptr<DataShareStubImpl>(this);
154 auto extension = client->GetOwner();
155 if (extension == nullptr) {
156 return DEFAULT_NUMBER;
157 }
158
159 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
160 LOG_ERROR("Check calling permission failed.");
161 return PERMISSION_ERROR_NUMBER;
162 }
163
164 auto result = std::make_shared<JsResult>();
165 int ret = 0;
166 std::function<void()> syncTaskFunc = [extension, info, uri, value, result]() {
167 extension->SetCallingInfo(info);
168 extension->InitResult(result);
169 extension->Insert(uri, value);
170 };
171 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
172 if (result == nullptr) {
173 return false;
174 }
175 bool isRecvReply = result->GetRecvReply();
176 result->GetResult(ret);
177 return isRecvReply;
178 };
179 std::lock_guard<std::mutex> lock(mutex_);
180 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
181 return ret;
182 }
183
Update(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)184 int DataShareStubImpl::Update(const Uri &uri, const DataSharePredicates &predicates,
185 const DataShareValuesBucket &value)
186 {
187 CallingInfo info;
188 GetCallingInfo(info);
189
190 auto client = sptr<DataShareStubImpl>(this);
191 auto extension = client->GetOwner();
192 if (extension == nullptr) {
193 return DEFAULT_NUMBER;
194 }
195
196 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
197 LOG_ERROR("Check calling permission failed.");
198 return PERMISSION_ERROR_NUMBER;
199 }
200
201 auto result = std::make_shared<JsResult>();
202 int ret = 0;
203 std::function<void()> syncTaskFunc = [extension, info, uri, predicates, value, result]() {
204 extension->SetCallingInfo(info);
205 extension->InitResult(result);
206 extension->Update(uri, predicates, value);
207 };
208 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
209 if (result == nullptr) {
210 return false;
211 }
212 bool isRecvReply = result->GetRecvReply();
213 result->GetResult(ret);
214 return isRecvReply;
215 };
216 std::lock_guard<std::mutex> lock(mutex_);
217 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
218 return ret;
219 }
220
BatchUpdate(const UpdateOperations & operations,std::vector<BatchUpdateResult> & results)221 int DataShareStubImpl::BatchUpdate(const UpdateOperations &operations, std::vector<BatchUpdateResult> &results)
222 {
223 CallingInfo info;
224 GetCallingInfo(info);
225 auto client = sptr<DataShareStubImpl>(this);
226 auto extension = client->GetOwner();
227 if (extension == nullptr) {
228 return DEFAULT_NUMBER;
229 }
230 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
231 LOG_ERROR("Check calling permission failed.");
232 return PERMISSION_ERROR_NUMBER;
233 }
234 auto result = std::make_shared<JsResult>();
235 int ret = 0;
236 std::function<void()> syncTaskFunc = [extension, operations, info, result]() {
237 extension->SetCallingInfo(info);
238 extension->InitResult(result);
239 std::vector<BatchUpdateResult> tmp;
240 extension->BatchUpdate(operations, tmp);
241 };
242 std::function<bool()> getRetFunc = [&results, result, &ret]() -> bool {
243 if (result == nullptr) {
244 return false;
245 }
246 bool isRecvReply = result->GetRecvReply();
247 result->GetResult(results);
248 result->GetResult(ret);
249 return isRecvReply;
250 };
251 std::lock_guard<std::mutex> lock(mutex_);
252 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
253 return ret;
254 }
255
Delete(const Uri & uri,const DataSharePredicates & predicates)256 int DataShareStubImpl::Delete(const Uri &uri, const DataSharePredicates &predicates)
257 {
258 CallingInfo info;
259 GetCallingInfo(info);
260
261 auto client = sptr<DataShareStubImpl>(this);
262 auto extension = client->GetOwner();
263 if (extension == nullptr) {
264 return DEFAULT_NUMBER;
265 }
266
267 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
268 LOG_ERROR("Check calling permission failed.");
269 return PERMISSION_ERROR_NUMBER;
270 }
271
272 auto result = std::make_shared<JsResult>();
273 int ret = 0;
274 std::function<void()> syncTaskFunc = [extension, info, uri, predicates, result]() {
275 extension->SetCallingInfo(info);
276 extension->InitResult(result);
277 extension->Delete(uri, predicates);
278 };
279 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
280 if (result == nullptr) {
281 return false;
282 }
283 bool isRecvReply = result->GetRecvReply();
284 result->GetResult(ret);
285 return isRecvReply;
286 };
287 std::lock_guard<std::mutex> lock(mutex_);
288 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
289 return ret;
290 }
291
InsertEx(const Uri & uri,const DataShareValuesBucket & value)292 std::pair<int32_t, int32_t> DataShareStubImpl::InsertEx(const Uri &uri, const DataShareValuesBucket &value)
293 {
294 CallingInfo info;
295 GetCallingInfo(info);
296
297 auto client = sptr<DataShareStubImpl>(this);
298 auto extension = client->GetOwner();
299 if (extension == nullptr) {
300 return std::make_pair(DATA_SHARE_ERROR, 0);
301 }
302
303 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
304 LOG_ERROR("Check calling permission failed.");
305 return std::make_pair(PERMISSION_ERROR_NUMBER, 0);
306 }
307
308 auto result = std::make_shared<JsResult>();
309 int ret = 0;
310 std::function<void()> syncTaskFunc = [extension, info, uri, value, result]() {
311 extension->SetCallingInfo(info);
312 extension->InitResult(result);
313 extension->Insert(uri, value);
314 };
315 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
316 if (result == nullptr) {
317 return false;
318 }
319 bool isRecvReply = result->GetRecvReply();
320 result->GetResult(ret);
321 return isRecvReply;
322 };
323 std::lock_guard<std::mutex> lock(mutex_);
324 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
325 return std::make_pair(E_OK, ret);
326 }
327
UpdateEx(const Uri & uri,const DataSharePredicates & predicates,const DataShareValuesBucket & value)328 std::pair<int32_t, int32_t> DataShareStubImpl::UpdateEx(const Uri &uri, const DataSharePredicates &predicates,
329 const DataShareValuesBucket &value)
330 {
331 CallingInfo info;
332 GetCallingInfo(info);
333
334 auto client = sptr<DataShareStubImpl>(this);
335 auto extension = client->GetOwner();
336 if (extension == nullptr) {
337 return std::make_pair(DATA_SHARE_ERROR, 0);
338 }
339
340 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
341 LOG_ERROR("Check calling permission failed.");
342 return std::make_pair(PERMISSION_ERROR_NUMBER, 0);
343 }
344
345 auto result = std::make_shared<JsResult>();
346 int ret = 0;
347 std::function<void()> syncTaskFunc = [extension, info, uri, predicates, value, result]() {
348 extension->SetCallingInfo(info);
349 extension->InitResult(result);
350 extension->Update(uri, predicates, value);
351 };
352 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
353 if (result == nullptr) {
354 return false;
355 }
356 bool isRecvReply = result->GetRecvReply();
357 result->GetResult(ret);
358 return isRecvReply;
359 };
360 std::lock_guard<std::mutex> lock(mutex_);
361 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
362 return std::make_pair(E_OK, ret);
363 }
364
DeleteEx(const Uri & uri,const DataSharePredicates & predicates)365 std::pair<int32_t, int32_t> DataShareStubImpl::DeleteEx(const Uri &uri, const DataSharePredicates &predicates)
366 {
367 CallingInfo info;
368 GetCallingInfo(info);
369
370 auto client = sptr<DataShareStubImpl>(this);
371 auto extension = client->GetOwner();
372 if (extension == nullptr) {
373 return std::make_pair(DATA_SHARE_ERROR, 0);
374 }
375
376 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
377 LOG_ERROR("Check calling permission failed.");
378 return std::make_pair(PERMISSION_ERROR_NUMBER, 0);
379 }
380
381 int ret = 0;
382 auto result = std::make_shared<JsResult>();
383 std::function<void()> syncTaskFunc = [extension, info, uri, predicates, result]() {
384 extension->SetCallingInfo(info);
385 extension->InitResult(result);
386 extension->Delete(uri, predicates);
387 };
388 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
389 if (result == nullptr) {
390 return false;
391 }
392 bool isRecvReply = result->GetRecvReply();
393 result->GetResult(ret);
394 return isRecvReply;
395 };
396 std::lock_guard<std::mutex> lock(mutex_);
397 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
398 return std::make_pair(E_OK, ret);
399 }
400
Query(const Uri & uri,const DataSharePredicates & predicates,std::vector<std::string> & columns,DatashareBusinessError & businessError)401 std::shared_ptr<DataShareResultSet> DataShareStubImpl::Query(const Uri &uri,
402 const DataSharePredicates &predicates, std::vector<std::string> &columns, DatashareBusinessError &businessError)
403 {
404 CallingInfo info;
405 GetCallingInfo(info);
406 std::shared_ptr<DataShareResultSet> resultSet = nullptr;
407 auto client = sptr<DataShareStubImpl>(this);
408 auto extension = client->GetOwner();
409 if (extension == nullptr) {
410 return resultSet;
411 }
412
413 if (!CheckCallingPermission(extension->abilityInfo_->readPermission)) {
414 LOG_ERROR("Check calling permission failed.");
415 businessError.SetCode(PERMISSION_ERROR_NUMBER);
416 return resultSet;
417 }
418 auto result = std::make_shared<JsResult>();
419 std::function<void()> syncTaskFunc = [extension, info, uri, predicates, columns, result]() mutable {
420 extension->SetCallingInfo(info);
421 extension->InitResult(result);
422 DatashareBusinessError businessErr;
423 extension->Query(uri, predicates, columns, businessErr);
424 };
425 std::function<bool()> getRetFunc = [result, &resultSet, &businessError]() -> bool {
426 if (result == nullptr) {
427 return false;
428 }
429 auto isRecvReply = result->GetRecvReply();
430 result->GetResultSet(resultSet);
431 result->GetBusinessError(businessError);
432 return isRecvReply;
433 };
434 std::lock_guard<std::mutex> lock(mutex_);
435 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
436 return resultSet;
437 }
438
GetType(const Uri & uri)439 std::string DataShareStubImpl::GetType(const Uri &uri)
440 {
441 CallingInfo info;
442 GetCallingInfo(info);
443 std::string ret = "";
444 auto client = sptr<DataShareStubImpl>(this);
445 auto extension = client->GetOwner();
446 if (extension == nullptr) {
447 return ret;
448 }
449 auto result = std::make_shared<JsResult>();
450 std::function<void()> syncTaskFunc = [extension, info, uri, result]() {
451 if (extension == nullptr) {
452 return;
453 }
454 extension->SetCallingInfo(info);
455 extension->InitResult(result);
456 extension->GetType(uri);
457 };
458 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
459 if (result == nullptr) {
460 return false;
461 }
462 bool isRecvReply = result->GetRecvReply();
463 result->GetResult(ret);
464 return isRecvReply;
465 };
466 std::lock_guard<std::mutex> lock(mutex_);
467 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
468 return ret;
469 }
470
BatchInsert(const Uri & uri,const std::vector<DataShareValuesBucket> & values)471 int DataShareStubImpl::BatchInsert(const Uri &uri, const std::vector<DataShareValuesBucket> &values)
472 {
473 CallingInfo info;
474 GetCallingInfo(info);
475 auto client = sptr<DataShareStubImpl>(this);
476 auto extension = client->GetOwner();
477 if (extension == nullptr) {
478 return DEFAULT_NUMBER;
479 }
480
481 if (!CheckCallingPermission(extension->abilityInfo_->writePermission)) {
482 LOG_ERROR("Check calling permission failed.");
483 return PERMISSION_ERROR_NUMBER;
484 }
485
486 auto result = std::make_shared<JsResult>();
487 int ret = 0;
488 std::function<void()> syncTaskFunc = [extension, info, uri, values, result]() {
489 extension->SetCallingInfo(info);
490 extension->InitResult(result);
491 extension->BatchInsert(uri, values);
492 };
493 std::function<bool()> getRetFunc = [result, &ret]() -> bool {
494 if (result == nullptr) {
495 return false;
496 }
497 bool isRecvReply = result->GetRecvReply();
498 result->GetResult(ret);
499 return isRecvReply;
500 };
501 std::lock_guard<std::mutex> lock(mutex_);
502 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
503 return ret;
504 }
505
GetCallingUserId()506 int32_t DataShareStubImpl::GetCallingUserId()
507 {
508 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
509 auto type = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
510 if (type == Security::AccessToken::TOKEN_NATIVE || type == Security::AccessToken::TOKEN_SHELL) {
511 return 0;
512 } else {
513 int32_t callingUid = IPCSkeleton::GetCallingUid();
514 int32_t userId = callingUid / Constants::BASE_USER_RANGE;
515 return userId;
516 }
517 }
518
RegisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)519 bool DataShareStubImpl::RegisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
520 {
521 auto extension = GetOwner();
522 if (extension == nullptr) {
523 return false;
524 }
525 int32_t callingToken = IPCSkeleton::GetCallingTokenID();
526 bool isSuccess = CheckCallingPermission(extension->abilityInfo_->readPermission);
527 if (!isSuccess) {
528 int selfToken = IPCSkeleton::GetSelfTokenID();
529 if (CheckTrusts(callingToken, selfToken) != E_OK) {
530 LOG_ERROR("Register observer check permission failed. uri: %{public}s, token:%{public}d",
531 DataShareStringUtils::Anonymous(uri.ToString()).c_str(), callingToken);
532 // just log
533 }
534 }
535 return extension->RegisterObserver(uri, dataObserver);
536 }
537
UnregisterObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)538 bool DataShareStubImpl::UnregisterObserver(const Uri &uri, const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
539 {
540 auto extension = GetOwner();
541 if (extension == nullptr) {
542 return false;
543 }
544 int32_t callingToken = IPCSkeleton::GetCallingTokenID();
545 bool isSuccess = CheckCallingPermission(extension->abilityInfo_->readPermission);
546 if (!isSuccess) {
547 int selfToken = IPCSkeleton::GetSelfTokenID();
548 if (CheckTrusts(callingToken, selfToken) != E_OK) {
549 LOG_ERROR("UnRegister observer check permission failed. uri: %{public}s, token:%{public}d",
550 DataShareStringUtils::Anonymous(uri.ToString()).c_str(), callingToken);
551 // just log
552 }
553 }
554
555 return extension->UnregisterObserver(uri, dataObserver);
556 }
557
NotifyChange(const Uri & uri)558 bool DataShareStubImpl::NotifyChange(const Uri &uri)
559 {
560 std::shared_ptr<bool> ret = std::make_shared<bool>(false);
561 auto client = sptr<DataShareStubImpl>(this);
562 auto extension = client->GetOwner();
563 if (extension == nullptr) {
564 return *ret;
565 }
566 int32_t callingToken = IPCSkeleton::GetCallingTokenID();
567 bool isSuccess = CheckCallingPermission(extension->abilityInfo_->writePermission);
568 if (!isSuccess) {
569 int selfToken = IPCSkeleton::GetSelfTokenID();
570 if (CheckTrusts(callingToken, selfToken) != E_OK) {
571 LOG_ERROR("extension NotifyChange check permission failed. uri: %{public}s token %{public}d",
572 uri.ToString().c_str(), IPCSkeleton::GetCallingTokenID());
573 // just log
574 }
575 }
576
577 int32_t callingUserId = GetCallingUserId();
578 std::function<void()> syncTaskFunc = [extension, ret, uri, callingUserId]() {
579 *ret = extension->NotifyChangeWithUser(uri, callingUserId);
580 };
581 std::lock_guard<std::mutex> lock(mutex_);
582 uvQueue_->SyncCall(syncTaskFunc);
583 return *ret;
584 }
585
NormalizeUri(const Uri & uri)586 Uri DataShareStubImpl::NormalizeUri(const Uri &uri)
587 {
588 CallingInfo info;
589 GetCallingInfo(info);
590 Uri normalizeUri("");
591 auto client = sptr<DataShareStubImpl>(this);
592 auto extension = client->GetOwner();
593 if (extension == nullptr) {
594 return normalizeUri;
595 }
596
597 auto result = std::make_shared<JsResult>();
598 std::function<void()> syncTaskFunc = [extension, info, uri, result]() {
599 extension->SetCallingInfo(info);
600 extension->InitResult(result);
601 extension->NormalizeUri(uri);
602 };
603 std::function<bool()> getRetFunc = [result, &normalizeUri]() -> bool {
604 if (result == nullptr) {
605 return false;
606 }
607 bool isRecvReply = result->GetRecvReply();
608 std::string ret;
609 result->GetResult(ret);
610 Uri tmp(ret);
611 normalizeUri = tmp;
612 return isRecvReply;
613 };
614 std::lock_guard<std::mutex> lock(mutex_);
615 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
616 return normalizeUri;
617 }
618
DenormalizeUri(const Uri & uri)619 Uri DataShareStubImpl::DenormalizeUri(const Uri &uri)
620 {
621 CallingInfo info;
622 GetCallingInfo(info);
623 Uri denormalizedUri("");
624 auto client = sptr<DataShareStubImpl>(this);
625 auto extension = client->GetOwner();
626 if (extension == nullptr) {
627 return denormalizedUri;
628 }
629 auto result = std::make_shared<JsResult>();
630 std::function<void()> syncTaskFunc = [extension, info, uri, result]() {
631 extension->SetCallingInfo(info);
632 extension->InitResult(result);
633 extension->DenormalizeUri(uri);
634 };
635 std::function<bool()> getRetFunc = [result, &denormalizedUri]() -> bool {
636 if (result == nullptr) {
637 return false;
638 }
639 bool isRecvReply = result->GetRecvReply();
640 std::string ret;
641 result->GetResult(ret);
642 Uri tmp(ret);
643 denormalizedUri = tmp;
644 return isRecvReply;
645 };
646 std::lock_guard<std::mutex> lock(mutex_);
647 uvQueue_->SyncCall(syncTaskFunc, getRetFunc);
648 return denormalizedUri;
649 }
650
GetCallingInfo(CallingInfo & callingInfo)651 void DataShareStubImpl::GetCallingInfo(CallingInfo& callingInfo)
652 {
653 callingInfo.callingTokenId = GetCallingTokenID();
654 callingInfo.callingPid = GetCallingPid();
655 callingInfo.callingUid = GetCallingUid();
656 }
657 } // namespace DataShare
658 } // namespace OHOS