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