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