1 /*
2 * Copyright (c) 2021 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 "data_ability_operation.h"
17 #include "app_log_wrapper.h"
18 #include "hilog_wrapper.h"
19 #include "data_ability_predicates.h"
20 #include "values_bucket.h"
21
22 namespace OHOS {
23 namespace AppExecFwk {
DataAbilityOperation(const std::shared_ptr<DataAbilityOperation> & dataAbilityOperation,const std::shared_ptr<Uri> & withUri)24 DataAbilityOperation::DataAbilityOperation(
25 const std::shared_ptr<DataAbilityOperation> &dataAbilityOperation, const std::shared_ptr<Uri> &withUri)
26 {
27 uri_ = withUri;
28 if (dataAbilityOperation != nullptr) {
29 type_ = dataAbilityOperation->type_;
30 valuesBucket_ = dataAbilityOperation->valuesBucket_;
31 expectedCount_ = dataAbilityOperation->expectedCount_;
32 dataAbilityPredicates_ = dataAbilityOperation->dataAbilityPredicates_;
33 valuesBucketReferences_ = dataAbilityOperation->valuesBucketReferences_;
34 dataAbilityPredicatesBackReferences_ = dataAbilityOperation->dataAbilityPredicatesBackReferences_;
35 interrupted_ = dataAbilityOperation->interrupted_;
36 } else {
37 type_ = 0;
38 expectedCount_ = 0;
39 valuesBucket_ = std::make_shared<NativeRdb::ValuesBucket>();
40 dataAbilityPredicates_ = std::make_shared<NativeRdb::DataAbilityPredicates>();
41 valuesBucketReferences_ = std::make_shared<NativeRdb::ValuesBucket>();
42 dataAbilityPredicatesBackReferences_.clear();
43 interrupted_ = false;
44 }
45 }
DataAbilityOperation(Parcel & in)46 DataAbilityOperation::DataAbilityOperation(Parcel &in)
47 {
48 ReadFromParcel(in);
49 }
DataAbilityOperation(const std::shared_ptr<DataAbilityOperationBuilder> & builder)50 DataAbilityOperation::DataAbilityOperation(const std::shared_ptr<DataAbilityOperationBuilder> &builder)
51 {
52 if (builder != nullptr) {
53 type_ = builder->type_;
54 uri_ = builder->uri_;
55 valuesBucket_ = builder->valuesBucket_;
56 expectedCount_ = builder->expectedCount_;
57 dataAbilityPredicates_ = builder->dataAbilityPredicates_;
58 valuesBucketReferences_ = builder->valuesBucketReferences_;
59 dataAbilityPredicatesBackReferences_ = builder->dataAbilityPredicatesBackReferences_;
60 interrupted_ = builder->interrupted_;
61 }
62 }
63
DataAbilityOperation()64 DataAbilityOperation::DataAbilityOperation()
65 {
66 type_ = 0;
67 uri_ = nullptr;
68 expectedCount_ = 0;
69 valuesBucket_ = std::make_shared<NativeRdb::ValuesBucket>();
70 dataAbilityPredicates_ = std::make_shared<NativeRdb::DataAbilityPredicates>();
71 valuesBucketReferences_ = std::make_shared<NativeRdb::ValuesBucket>();
72 dataAbilityPredicatesBackReferences_.clear();
73 interrupted_ = false;
74 }
75
~DataAbilityOperation()76 DataAbilityOperation::~DataAbilityOperation()
77 {
78 dataAbilityPredicatesBackReferences_.clear();
79 }
80
operator ==(const DataAbilityOperation & other) const81 bool DataAbilityOperation::operator==(const DataAbilityOperation &other) const
82 {
83 if (type_ != other.type_) {
84 return false;
85 }
86 if ((uri_ != nullptr) && (other.uri_ != nullptr) && (uri_->ToString() != other.uri_->ToString())) {
87 return false;
88 }
89 if (expectedCount_ != other.expectedCount_) {
90 return false;
91 }
92 if (valuesBucket_ != other.valuesBucket_) {
93 return false;
94 }
95 if (dataAbilityPredicates_ != other.dataAbilityPredicates_) {
96 return false;
97 }
98 if (valuesBucketReferences_ != other.valuesBucketReferences_) {
99 return false;
100 }
101 int backReferencesCount = dataAbilityPredicatesBackReferences_.size();
102 int otherBackReferencesCount = other.dataAbilityPredicatesBackReferences_.size();
103 if (backReferencesCount != otherBackReferencesCount) {
104 return false;
105 }
106
107 std::map<int, int>::const_iterator it = dataAbilityPredicatesBackReferences_.begin();
108 while (it != dataAbilityPredicatesBackReferences_.end()) {
109 std::map<int, int>::const_iterator otherIt = other.dataAbilityPredicatesBackReferences_.find(it->first);
110 if (otherIt != other.dataAbilityPredicatesBackReferences_.end()) {
111 if (otherIt->second != it->second) {
112 return false;
113 }
114 } else {
115 return false;
116 }
117 it++;
118 }
119
120 if (interrupted_ != other.interrupted_) {
121 return false;
122 }
123 return true;
124 }
125
operator =(const DataAbilityOperation & other)126 DataAbilityOperation &DataAbilityOperation::operator=(const DataAbilityOperation &other)
127 {
128 if (this != &other) {
129 type_ = other.type_;
130 uri_ = other.uri_;
131 expectedCount_ = other.expectedCount_;
132 valuesBucket_ = other.valuesBucket_;
133 dataAbilityPredicates_ = other.dataAbilityPredicates_;
134 valuesBucketReferences_ = other.valuesBucketReferences_;
135 dataAbilityPredicatesBackReferences_ = other.dataAbilityPredicatesBackReferences_;
136 interrupted_ = other.interrupted_;
137 }
138 return *this;
139 }
140
NewInsertBuilder(const std::shared_ptr<Uri> & uri)141 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperation::NewInsertBuilder(const std::shared_ptr<Uri> &uri)
142 {
143 APP_LOGD("DataAbilityOperation::NewInsertBuilder start");
144 if (uri == nullptr) {
145 APP_LOGE("DataAbilityOperation::NewInsertBuilder uri is nullptr");
146 return nullptr;
147 }
148 std::shared_ptr<DataAbilityOperationBuilder> builder =
149 std::make_shared<DataAbilityOperationBuilder>(TYPE_INSERT, uri);
150 APP_LOGD("DataAbilityOperation::NewInsertBuilder end");
151 return builder;
152 }
153
NewUpdateBuilder(const std::shared_ptr<Uri> & uri)154 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperation::NewUpdateBuilder(const std::shared_ptr<Uri> &uri)
155 {
156 APP_LOGD("DataAbilityOperation::NewUpdateBuilder start");
157 if (uri == nullptr) {
158 APP_LOGE("DataAbilityOperation::NewUpdateBuilder uri is nullptr");
159 return nullptr;
160 }
161 std::shared_ptr<DataAbilityOperationBuilder> builder =
162 std::make_shared<DataAbilityOperationBuilder>(TYPE_UPDATE, uri);
163 APP_LOGD("DataAbilityOperation::NewUpdateBuilder end");
164 return builder;
165 }
166
NewDeleteBuilder(const std::shared_ptr<Uri> & uri)167 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperation::NewDeleteBuilder(const std::shared_ptr<Uri> &uri)
168 {
169 APP_LOGD("DataAbilityOperation::NewDeleteBuilder start");
170 if (uri == nullptr) {
171 APP_LOGE("DataAbilityOperation::NewDeleteBuilder uri is nullptr");
172 return nullptr;
173 }
174 std::shared_ptr<DataAbilityOperationBuilder> builder =
175 std::make_shared<DataAbilityOperationBuilder>(TYPE_DELETE, uri);
176 APP_LOGD("DataAbilityOperation::NewDeleteBuilder end");
177 return builder;
178 }
179
NewAssertBuilder(const std::shared_ptr<Uri> & uri)180 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperation::NewAssertBuilder(const std::shared_ptr<Uri> &uri)
181 {
182 APP_LOGD("DataAbilityOperation::NewAssertBuilder start");
183 if (uri == nullptr) {
184 APP_LOGE("DataAbilityOperation::NewAssertBuilder uri is nullptr");
185 return nullptr;
186 }
187 std::shared_ptr<DataAbilityOperationBuilder> builder =
188 std::make_shared<DataAbilityOperationBuilder>(TYPE_ASSERT, uri);
189 APP_LOGD("DataAbilityOperation::NewAssertBuilder end");
190 return builder;
191 }
192
GetType() const193 int DataAbilityOperation::GetType() const
194 {
195 APP_LOGD("DataAbilityOperation::GetType");
196 return type_;
197 }
198
GetUri() const199 std::shared_ptr<Uri> DataAbilityOperation::GetUri() const
200 {
201 APP_LOGD("DataAbilityOperation::GetUri");
202 return uri_;
203 }
204
GetValuesBucket() const205 std::shared_ptr<NativeRdb::ValuesBucket> DataAbilityOperation::GetValuesBucket() const
206 {
207 APP_LOGD("DataAbilityOperation::GetValuesBucket");
208 return valuesBucket_;
209 }
210
GetExpectedCount() const211 int DataAbilityOperation::GetExpectedCount() const
212 {
213 APP_LOGD("DataAbilityOperation::GetExpectedCount");
214 return expectedCount_;
215 }
216
GetDataAbilityPredicates() const217 std::shared_ptr<NativeRdb::DataAbilityPredicates> DataAbilityOperation::GetDataAbilityPredicates() const
218 {
219 APP_LOGD("DataAbilityOperation::GetDataAbilityPredicates");
220 return dataAbilityPredicates_;
221 }
222
GetValuesBucketReferences() const223 std::shared_ptr<NativeRdb::ValuesBucket> DataAbilityOperation::GetValuesBucketReferences() const
224 {
225 APP_LOGD("DataAbilityOperation::GetValuesBucketReferences");
226 return valuesBucketReferences_;
227 }
GetDataAbilityPredicatesBackReferences() const228 std::map<int, int> DataAbilityOperation::GetDataAbilityPredicatesBackReferences() const
229 {
230 APP_LOGD("DataAbilityOperation::GetDataAbilityPredicatesBackReferences");
231 return dataAbilityPredicatesBackReferences_;
232 }
IsInsertOperation() const233 bool DataAbilityOperation::IsInsertOperation() const
234 {
235 APP_LOGD("DataAbilityOperation::IsInsertOperation:%d", type_ == TYPE_INSERT);
236 return type_ == TYPE_INSERT;
237 }
IsUpdateOperation() const238 bool DataAbilityOperation::IsUpdateOperation() const
239 {
240 APP_LOGD("DataAbilityOperation::IsUpdateOperation:%d", type_ == TYPE_UPDATE);
241 return type_ == TYPE_UPDATE;
242 }
IsDeleteOperation() const243 bool DataAbilityOperation::IsDeleteOperation() const
244 {
245 APP_LOGD("DataAbilityOperation::IsDeleteOperation:%d", type_ == TYPE_DELETE);
246 return type_ == TYPE_DELETE;
247 }
IsAssertOperation() const248 bool DataAbilityOperation::IsAssertOperation() const
249 {
250 APP_LOGD("DataAbilityOperation::IsAssertOperation:%d", type_ == TYPE_ASSERT);
251 return type_ == TYPE_ASSERT;
252 }
IsInterruptionAllowed() const253 bool DataAbilityOperation::IsInterruptionAllowed() const
254 {
255 APP_LOGD("DataAbilityOperation::IsInterruptionAllowed:%d", interrupted_);
256 return interrupted_;
257 }
Marshalling(Parcel & out) const258 bool DataAbilityOperation::Marshalling(Parcel &out) const
259 {
260 APP_LOGD("DataAbilityOperation::Marshalling start");
261 if (!out.WriteInt32(type_)) {
262 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(type_) error");
263 return false;
264 }
265 if (!out.WriteInt32(expectedCount_)) {
266 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
267 return false;
268 }
269
270 if (!out.WriteBool(interrupted_)) {
271 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
272 return false;
273 }
274
275 if (uri_ != nullptr) {
276 if (!out.WriteInt32(VALUE_OBJECT)) {
277 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
278 return false;
279 }
280
281 if (!out.WriteParcelable(uri_.get())) {
282 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
283 return false;
284 }
285 } else {
286 if (!out.WriteInt32(VALUE_NULL)) {
287 return false;
288 }
289 }
290
291 if (valuesBucket_ != nullptr) {
292 if (!out.WriteInt32(VALUE_OBJECT)) {
293 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
294 return false;
295 }
296
297 if (!out.WriteParcelable(valuesBucket_.get())) {
298 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
299 return false;
300 }
301 } else {
302 if (!out.WriteInt32(VALUE_NULL)) {
303 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
304 return false;
305 }
306 }
307
308 if (dataAbilityPredicates_ != nullptr) {
309 if (!out.WriteInt32(VALUE_OBJECT)) {
310 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
311 return false;
312 }
313 if (!out.WriteParcelable(dataAbilityPredicates_.get())) {
314 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
315 return false;
316 }
317 } else {
318 if (!out.WriteInt32(VALUE_NULL)) {
319 return false;
320 }
321 }
322
323 if (valuesBucketReferences_ != nullptr) {
324 if (!out.WriteInt32(VALUE_OBJECT)) {
325 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
326 return false;
327 }
328 if (!out.WriteParcelable(valuesBucketReferences_.get())) {
329 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
330 return false;
331 }
332 } else {
333 if (!out.WriteInt32(VALUE_NULL)) {
334 return false;
335 }
336 }
337
338 int referenceSize = 0;
339 if (!dataAbilityPredicatesBackReferences_.empty()) {
340 referenceSize = dataAbilityPredicatesBackReferences_.size();
341 if (!out.WriteInt32(referenceSize)) {
342 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
343 return false;
344 }
345 if (referenceSize >= REFERENCE_THRESHOLD) {
346 APP_LOGI("DataAbilityOperation::Marshalling referenceSize >= REFERENCE_THRESHOLD");
347 return true;
348 }
349 for (auto it = dataAbilityPredicatesBackReferences_.begin(); it != dataAbilityPredicatesBackReferences_.end();
350 it++) {
351
352 if (!out.WriteInt32(it->first)) {
353 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
354 return false;
355 }
356 if (!out.WriteInt32(it->second)) {
357 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
358 return false;
359 }
360 }
361 } else {
362 APP_LOGD("DataAbilityOperation::Marshalling dataAbilityPredicatesBackReferences_ is empty");
363 if (!out.WriteInt32(referenceSize)) {
364 APP_LOGE("DataAbilityOperation::Marshalling WriteInt32(VALUE_OBJECT) error");
365 return false;
366 }
367 }
368
369 APP_LOGD("DataAbilityOperation::Marshalling end");
370 return true;
371 }
Unmarshalling(Parcel & in)372 DataAbilityOperation *DataAbilityOperation::Unmarshalling(Parcel &in)
373 {
374 APP_LOGD("DataAbilityOperation::Unmarshalling start");
375 DataAbilityOperation *dataAbilityOperation = new (std::nothrow) DataAbilityOperation();
376 if (dataAbilityOperation != nullptr && !dataAbilityOperation->ReadFromParcel(in)) {
377 APP_LOGE("DataAbilityOperation::Unmarshalling dataAbilityOperation(%p) error", dataAbilityOperation);
378 delete dataAbilityOperation;
379 dataAbilityOperation = nullptr;
380 }
381 APP_LOGD("DataAbilityOperation::Unmarshalling end");
382 return dataAbilityOperation;
383 }
ReadFromParcel(Parcel & in)384 bool DataAbilityOperation::ReadFromParcel(Parcel &in)
385 {
386 APP_LOGD("DataAbilityOperation::ReadFromParcel start");
387 if (!in.ReadInt32(type_)) {
388 APP_LOGE("DataAbilityOperation::ReadFromParcel ReadInt32(type_) error");
389 return false;
390 }
391 if (!in.ReadInt32(expectedCount_)) {
392 APP_LOGE("DataAbilityOperation::ReadFromParcel ReadInt32(empty) error");
393 return false;
394 }
395 interrupted_ = in.ReadBool();
396
397 int empty = VALUE_NULL;
398 if (!in.ReadInt32(empty)) {
399 APP_LOGE("DataAbilityOperation::ReadFromParcel ReadInt32(empty) error");
400 return false;
401 }
402 if (empty == VALUE_OBJECT) {
403 uri_.reset(in.ReadParcelable<Uri>());
404 } else {
405 uri_.reset();
406 }
407
408 empty = VALUE_NULL;
409 if (!in.ReadInt32(empty)) {
410 APP_LOGE("DataAbilityOperation::ReadFromParcel ReadInt32(empty) error");
411 return false;
412 }
413 APP_LOGD("DataAbilityOperation::ReadFromParcel empty is %{public}s", empty == VALUE_OBJECT ? "VALUE_OBJECT" : "VALUE_NULL");
414 if (empty == VALUE_OBJECT) {
415 valuesBucket_.reset(in.ReadParcelable<NativeRdb::ValuesBucket>());
416 } else {
417 valuesBucket_.reset();
418 }
419
420 empty = VALUE_NULL;
421 if (!in.ReadInt32(empty)) {
422 APP_LOGE("DataAbilityOperation::ReadFromParcel ReadInt32(empty) error");
423 return false;
424 }
425 APP_LOGD("DataAbilityOperation::ReadFromParcel empty is %{public}s", empty == VALUE_OBJECT ? "VALUE_OBJECT" : "VALUE_NULL");
426 if (empty == VALUE_OBJECT) {
427 dataAbilityPredicates_.reset(in.ReadParcelable<NativeRdb::DataAbilityPredicates>());
428 } else {
429 dataAbilityPredicates_.reset();
430 }
431
432 empty = VALUE_NULL;
433 if (!in.ReadInt32(empty)) {
434 APP_LOGE("DataAbilityOperation::ReadFromParcel ReadInt32(empty) error");
435 return false;
436 }
437 APP_LOGD("DataAbilityOperation::ReadFromParcel empty is %{public}s", empty == VALUE_OBJECT ? "VALUE_OBJECT" : "VALUE_NULL");
438 if (empty == VALUE_OBJECT) {
439 valuesBucketReferences_.reset(in.ReadParcelable<NativeRdb::ValuesBucket>());
440 } else {
441 valuesBucketReferences_.reset();
442 }
443
444 int referenceSize = 0;
445 if (!in.ReadInt32(referenceSize)) {
446 APP_LOGE("DataAbilityOperation::ReadFromParcel end");
447 return false;
448 }
449 if (referenceSize >= REFERENCE_THRESHOLD) {
450 APP_LOGI("DataAbilityOperation::ReadFromParcel referenceSize:%{public}d >= REFERENCE_THRESHOLD:%{public}d", referenceSize, REFERENCE_THRESHOLD);
451 return true;
452 }
453
454 for (int i = 0; i < REFERENCE_THRESHOLD && i < referenceSize; ++i) {
455 int first = 0;
456 int second = 0;
457 if (!in.ReadInt32(first)) {
458 APP_LOGE("DataAbilityOperation::ReadFromParcel end");
459 return false;
460 }
461 if (!in.ReadInt32(second)) {
462 APP_LOGE("DataAbilityOperation::ReadFromParcel end");
463 return false;
464 }
465 dataAbilityPredicatesBackReferences_.insert(std::make_pair(first, second));
466 }
467
468 APP_LOGD("DataAbilityOperation::ReadFromParcel end");
469 return true;
470 }
CreateFromParcel(Parcel & in)471 std::shared_ptr<DataAbilityOperation> DataAbilityOperation::CreateFromParcel(Parcel &in)
472 {
473 APP_LOGD("DataAbilityOperation::CreateFromParcel start");
474 std::shared_ptr<DataAbilityOperation> operation = std::make_shared<DataAbilityOperation>(in);
475 APP_LOGD("DataAbilityOperation::CreateFromParcel end");
476 return operation;
477 }
PutMap(Parcel & in)478 void DataAbilityOperation::PutMap(Parcel &in)
479 {
480 APP_LOGD("DataAbilityOperation::PutMap start");
481 int count = in.ReadInt32();
482 if (count > 0 && count < REFERENCE_THRESHOLD) {
483 for (int i = 0; i < count; ++i) {
484 dataAbilityPredicatesBackReferences_.insert(std::make_pair(in.ReadInt32(), in.ReadInt32()));
485 }
486 }
487 APP_LOGD("DataAbilityOperation::PutMap end");
488 }
489 } // namespace AppExecFwk
490 } // namespace OHOS