1 /*
2 * Copyright (c) 2021-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 #include "common_event_data.h"
16
17 #include "event_log_wrapper.h"
18 #include "message_parcel.h"
19 #include "string_ex.h"
20
21 namespace OHOS {
22 namespace EventFwk {
CommonEventData()23 CommonEventData::CommonEventData() : code_(0)
24 {
25 }
26
CommonEventData(const Want & want)27 CommonEventData::CommonEventData(const Want &want) : want_(want), code_(0)
28 {
29 }
30
CommonEventData(const Want & want,const int32_t & code,const std::string & data)31 CommonEventData::CommonEventData(const Want &want, const int32_t &code, const std::string &data)
32 : want_(want), code_(code), data_(data)
33 {
34 }
35
~CommonEventData()36 CommonEventData::~CommonEventData()
37 {
38 }
39
SetCode(const int32_t & code)40 void CommonEventData::SetCode(const int32_t &code)
41 {
42 code_ = code;
43 }
44
GetCode() const45 int32_t CommonEventData::GetCode() const
46 {
47 return code_;
48 }
49
SetData(const std::string & data)50 void CommonEventData::SetData(const std::string &data)
51 {
52 data_ = data;
53 }
54
GetData() const55 std::string CommonEventData::GetData() const
56 {
57 return data_;
58 }
59
SetWant(const Want & want)60 void CommonEventData::SetWant(const Want &want)
61 {
62 EVENT_LOGD("set want");
63 want_ = want;
64 }
65
GetWant() const66 const Want &CommonEventData::GetWant() const
67 {
68 return want_;
69 }
70
Marshalling(Parcel & parcel) const71 bool CommonEventData::Marshalling(Parcel &parcel) const
72 {
73 // write data
74 if (GetData().empty()) {
75 if (!parcel.WriteInt32(VALUE_NULL)) {
76 EVENT_LOGE("null data");
77 return false;
78 }
79 } else {
80 if (!parcel.WriteInt32(VALUE_OBJECT)) {
81 return false;
82 }
83 if (!parcel.WriteString16(Str8ToStr16(GetData()))) {
84 EVENT_LOGE("Failed to write data");
85 return false;
86 }
87 }
88
89 if (!parcel.WriteInt32(code_)) {
90 EVENT_LOGE("Failed to write code");
91 return false;
92 }
93
94 if (!parcel.WriteParcelable(&want_)) {
95 EVENT_LOGE("Failed to write want");
96 return false;
97 }
98
99 return true;
100 }
101
ReadFromParcel(Parcel & parcel)102 __attribute__((no_sanitize("cfi"))) bool CommonEventData::ReadFromParcel(Parcel &parcel)
103 {
104 // read data
105 int empty = VALUE_NULL;
106 if (!parcel.ReadInt32(empty)) {
107 return false;
108 }
109 if (empty == VALUE_OBJECT) {
110 SetData(Str16ToStr8(parcel.ReadString16()));
111 }
112
113 // read code
114 code_ = parcel.ReadInt32();
115
116 // read want
117 std::unique_ptr<Want> want(parcel.ReadParcelable<Want>());
118 if (!want) {
119 EVENT_LOGE("Failed to ReadParcelable<Want>");
120 return false;
121 }
122 want_ = *want;
123
124 return true;
125 }
126
Unmarshalling(Parcel & parcel)127 CommonEventData *CommonEventData::Unmarshalling(Parcel &parcel)
128 {
129 CommonEventData *commonEventData = new (std::nothrow) CommonEventData();
130
131 if (commonEventData == nullptr) {
132 EVENT_LOGE("CommonEventData == nullptr");
133 return nullptr;
134 }
135
136 if (!commonEventData->ReadFromParcel(parcel)) {
137 EVENT_LOGE("failed to ReadFromParcel");
138 delete commonEventData;
139 commonEventData = nullptr;
140 }
141
142 return commonEventData;
143 }
144 } // namespace EventFwk
145 } // namespace OHOS