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 "common_event_publish_info.h"
17 #include "event_log_wrapper.h"
18 #include "string_ex.h"
19 #include <cstdint>
20 
21 namespace OHOS {
22 namespace EventFwk {
23 namespace {
24 const int32_t SUBSCRIBER_UIDS_MAX_NUM = 3;
25 }
26 
CommonEventPublishInfo()27 CommonEventPublishInfo::CommonEventPublishInfo() : sticky_(false), ordered_(false),
28     subscriberType_(static_cast<int32_t>(SubscriberType::ALL_SUBSCRIBER_TYPE))
29 {
30 }
31 
CommonEventPublishInfo(const CommonEventPublishInfo & commonEventPublishInfo)32 CommonEventPublishInfo::CommonEventPublishInfo(const CommonEventPublishInfo &commonEventPublishInfo)
33 {
34     sticky_ = commonEventPublishInfo.sticky_;
35     ordered_ = commonEventPublishInfo.ordered_;
36     bundleName_ = commonEventPublishInfo.bundleName_;
37     subscriberPermissions_ = commonEventPublishInfo.subscriberPermissions_;
38     subscriberUids_ = commonEventPublishInfo.subscriberUids_;
39     subscriberType_ = commonEventPublishInfo.subscriberType_;
40 }
41 
~CommonEventPublishInfo()42 CommonEventPublishInfo::~CommonEventPublishInfo()
43 {
44 }
45 
SetSticky(bool sticky)46 void CommonEventPublishInfo::SetSticky(bool sticky)
47 {
48     sticky_ = sticky;
49 }
50 
IsSticky() const51 bool CommonEventPublishInfo::IsSticky() const
52 {
53     return sticky_;
54 }
55 
SetSubscriberPermissions(const std::vector<std::string> & subscriberPermissions)56 void CommonEventPublishInfo::SetSubscriberPermissions(const std::vector<std::string> &subscriberPermissions)
57 {
58     subscriberPermissions_ = subscriberPermissions;
59 }
60 
GetSubscriberPermissions() const61 const std::vector<std::string> &CommonEventPublishInfo::GetSubscriberPermissions() const
62 {
63     return subscriberPermissions_;
64 }
65 
SetOrdered(bool ordered)66 void CommonEventPublishInfo::SetOrdered(bool ordered)
67 {
68     ordered_ = ordered;
69 }
70 
IsOrdered() const71 bool CommonEventPublishInfo::IsOrdered() const
72 {
73     return ordered_;
74 }
75 
SetBundleName(const std::string & bundleName)76 void CommonEventPublishInfo::SetBundleName(const std::string &bundleName)
77 {
78     bundleName_ = bundleName;
79 }
80 
GetBundleName() const81 std::string CommonEventPublishInfo::GetBundleName() const
82 {
83     return bundleName_;
84 }
85 
SetSubscriberUid(const std::vector<int32_t> & subscriberUids)86 void CommonEventPublishInfo::SetSubscriberUid(const std::vector<int32_t> &subscriberUids)
87 {
88     if (subscriberUids.size() > SUBSCRIBER_UIDS_MAX_NUM) {
89         subscriberUids_ =
90             std::vector<int32_t>(subscriberUids.begin(), subscriberUids.begin() + SUBSCRIBER_UIDS_MAX_NUM);
91         return;
92     }
93     subscriberUids_ = subscriberUids;
94 }
95 
GetSubscriberUid() const96 std::vector<int32_t> CommonEventPublishInfo::GetSubscriberUid() const
97 {
98     return subscriberUids_;
99 }
100 
SetSubscriberType(const int32_t & subscriberType)101 void CommonEventPublishInfo::SetSubscriberType(const int32_t &subscriberType)
102 {
103     if (!isSubscriberType(subscriberType)) {
104         EVENT_LOGW("subscriberType in common event Publish Info is out of range, and has already"
105             "converted to default value ALL_SUBSCRIBER_TYPE = 0");
106         subscriberType_ = static_cast<int32_t>(SubscriberType::ALL_SUBSCRIBER_TYPE);
107         return;
108     }
109     subscriberType_ = subscriberType;
110 }
111 
GetSubscriberType() const112 int32_t CommonEventPublishInfo::GetSubscriberType() const
113 {
114     return subscriberType_;
115 }
116 
Marshalling(Parcel & parcel) const117 bool CommonEventPublishInfo::Marshalling(Parcel &parcel) const
118 {
119     EVENT_LOGD("enter");
120 
121     // write subscriber permissions
122     std::vector<std::u16string> permissionVec_;
123     for (std::vector<std::string>::size_type i = 0; i < subscriberPermissions_.size(); ++i) {
124         permissionVec_.emplace_back(Str8ToStr16(subscriberPermissions_[i]));
125     }
126     if (!parcel.WriteString16Vector(permissionVec_)) {
127         EVENT_LOGE("common event Publish Info write permission failed");
128         return false;
129     }
130 
131     // write ordered
132     if (!parcel.WriteBool(ordered_)) {
133         EVENT_LOGE("common event Publish Info write ordered failed");
134         return false;
135     }
136 
137     // write sticky
138     if (!parcel.WriteBool(sticky_)) {
139         EVENT_LOGE("common event Publish Info write sticky failed");
140         return false;
141     }
142     // write bundleName
143     if (!parcel.WriteString16(Str8ToStr16(bundleName_))) {
144         EVENT_LOGE("common event Publish Info  write bundleName failed");
145         return false;
146     }
147     // write subscriberUids
148     if (!parcel.WriteInt32Vector(subscriberUids_)) {
149         EVENT_LOGE("common event Publish Info write subscriberUids failed");
150         return false;
151     }
152 
153     // write subscriberType
154     if (!parcel.WriteInt32(subscriberType_)) {
155         EVENT_LOGE("common event Publish Info write subscriberType failed");
156         return false;
157     }
158     return true;
159 }
160 
isSubscriberType(int32_t subscriberType)161 bool CommonEventPublishInfo::isSubscriberType(int32_t subscriberType)
162 {
163     switch (subscriberType) {
164         case static_cast<int32_t>(SubscriberType::ALL_SUBSCRIBER_TYPE):
165             return true;
166         case static_cast<int32_t>(SubscriberType::SYSTEM_SUBSCRIBER_TYPE):
167             return true;
168         default:
169             return false;
170     }
171 }
172 
ReadFromParcel(Parcel & parcel)173 bool CommonEventPublishInfo::ReadFromParcel(Parcel &parcel)
174 {
175     EVENT_LOGD("enter");
176 
177     // read subscriber permissions
178     std::vector<std::u16string> permissionVec_;
179     if (!parcel.ReadString16Vector(&permissionVec_)) {
180         EVENT_LOGE("ReadFromParcel read permission error");
181         return false;
182     }
183     subscriberPermissions_.clear();
184     for (std::vector<std::u16string>::size_type i = 0; i < permissionVec_.size(); i++) {
185         subscriberPermissions_.emplace_back(Str16ToStr8(permissionVec_[i]));
186     }
187     // read ordered
188     ordered_ = parcel.ReadBool();
189     // read sticky
190     sticky_ = parcel.ReadBool();
191     // read bundleName
192     bundleName_ = Str16ToStr8(parcel.ReadString16());
193     // read subscriberUids
194     if (!parcel.ReadInt32Vector(&subscriberUids_)) {
195         EVENT_LOGE("ReadFromParcel read subscriberUids error");
196         return false;
197     }
198     // read subscriberType
199     subscriberType_ = parcel.ReadInt32();
200     return true;
201 }
202 
Unmarshalling(Parcel & parcel)203 CommonEventPublishInfo *CommonEventPublishInfo::Unmarshalling(Parcel &parcel)
204 {
205     CommonEventPublishInfo *commonEventPublishInfo = new (std::nothrow) CommonEventPublishInfo();
206 
207     if (commonEventPublishInfo == nullptr) {
208         EVENT_LOGE("commonEventPublishInfo == nullptr");
209         return nullptr;
210     }
211 
212     if (!commonEventPublishInfo->ReadFromParcel(parcel)) {
213         EVENT_LOGE("failed to ReadFromParcel");
214         delete commonEventPublishInfo;
215         commonEventPublishInfo = nullptr;
216     }
217 
218     return commonEventPublishInfo;
219 }
220 }  // namespace EventFwk
221 }  // namespace OHOS