1use super::message_ops::Sealed;
2use super::{Message, MessageKind, MessageOps, OptionKind};
3use crate::bus_listener::BusEvent;
4use crate::ids::{BusListenerCookie, ObjectId, ServiceId};
5use crate::message_deserializer::{MessageDeserializeError, MessageWithoutValueDeserializer};
6use crate::message_serializer::{MessageSerializeError, MessageSerializer};
7use crate::serialized_value::SerializedValueSlice;
8use bytes::BytesMut;
9use num_enum::{IntoPrimitive, TryFromPrimitive};
10
11#[derive(Debug, Copy, Clone, PartialEq, Eq)]
12#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
13pub struct EmitBusEvent {
14 pub cookie: Option<BusListenerCookie>,
15 pub event: BusEvent,
16}
17
18impl MessageOps for EmitBusEvent {
19 fn kind(&self) -> MessageKind {
20 MessageKind::EmitBusEvent
21 }
22
23 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
24 let mut serializer = MessageSerializer::without_value(MessageKind::EmitBusEvent);
25
26 match self.cookie {
27 Some(cookie) => {
28 serializer.put_discriminant_u8(OptionKind::Some);
29 serializer.put_uuid(cookie.0);
30 }
31
32 None => serializer.put_discriminant_u8(OptionKind::None),
33 }
34
35 match self.event {
36 BusEvent::ObjectCreated(object) => {
37 serializer.put_discriminant_u8(BusEventKind::ObjectCreated);
38 serializer.put_uuid(object.uuid.0);
39 serializer.put_uuid(object.cookie.0);
40 }
41
42 BusEvent::ObjectDestroyed(object) => {
43 serializer.put_discriminant_u8(BusEventKind::ObjectDestroyed);
44 serializer.put_uuid(object.uuid.0);
45 serializer.put_uuid(object.cookie.0);
46 }
47
48 BusEvent::ServiceCreated(service) => {
49 serializer.put_discriminant_u8(BusEventKind::ServiceCreated);
50 serializer.put_uuid(service.object_id.uuid.0);
51 serializer.put_uuid(service.object_id.cookie.0);
52 serializer.put_uuid(service.uuid.0);
53 serializer.put_uuid(service.cookie.0);
54 }
55
56 BusEvent::ServiceDestroyed(service) => {
57 serializer.put_discriminant_u8(BusEventKind::ServiceDestroyed);
58 serializer.put_uuid(service.object_id.uuid.0);
59 serializer.put_uuid(service.object_id.cookie.0);
60 serializer.put_uuid(service.uuid.0);
61 serializer.put_uuid(service.cookie.0);
62 }
63 }
64
65 serializer.finish()
66 }
67
68 fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
69 let mut deserializer =
70 MessageWithoutValueDeserializer::new(buf, MessageKind::EmitBusEvent)?;
71
72 let cookie = match deserializer.try_get_discriminant_u8()? {
73 OptionKind::Some => deserializer
74 .try_get_uuid()
75 .map(BusListenerCookie::from)
76 .map(Some)?,
77
78 OptionKind::None => None,
79 };
80
81 let event = match deserializer.try_get_discriminant_u8()? {
82 BusEventKind::ObjectCreated => {
83 let object_uuid = deserializer.try_get_uuid()?.into();
84 let object_cookie = deserializer.try_get_uuid()?.into();
85
86 BusEvent::ObjectCreated(ObjectId::new(object_uuid, object_cookie))
87 }
88
89 BusEventKind::ObjectDestroyed => {
90 let object_uuid = deserializer.try_get_uuid()?.into();
91 let object_cookie = deserializer.try_get_uuid()?.into();
92
93 BusEvent::ObjectDestroyed(ObjectId::new(object_uuid, object_cookie))
94 }
95
96 BusEventKind::ServiceCreated => {
97 let object_uuid = deserializer.try_get_uuid()?.into();
98 let object_cookie = deserializer.try_get_uuid()?.into();
99 let service_uuid = deserializer.try_get_uuid()?.into();
100 let service_cookie = deserializer.try_get_uuid()?.into();
101
102 BusEvent::ServiceCreated(ServiceId::new(
103 ObjectId::new(object_uuid, object_cookie),
104 service_uuid,
105 service_cookie,
106 ))
107 }
108
109 BusEventKind::ServiceDestroyed => {
110 let object_uuid = deserializer.try_get_uuid()?.into();
111 let object_cookie = deserializer.try_get_uuid()?.into();
112 let service_uuid = deserializer.try_get_uuid()?.into();
113 let service_cookie = deserializer.try_get_uuid()?.into();
114
115 BusEvent::ServiceDestroyed(ServiceId::new(
116 ObjectId::new(object_uuid, object_cookie),
117 service_uuid,
118 service_cookie,
119 ))
120 }
121 };
122
123 deserializer.finish()?;
124
125 Ok(Self { cookie, event })
126 }
127
128 fn value(&self) -> Option<&SerializedValueSlice> {
129 None
130 }
131}
132
133impl Sealed for EmitBusEvent {}
134
135impl From<EmitBusEvent> for Message {
136 fn from(msg: EmitBusEvent) -> Self {
137 Self::EmitBusEvent(msg)
138 }
139}
140
141#[cfg(test)]
142mod test {
143 use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
144 use super::super::Message;
145 use super::EmitBusEvent;
146 use crate::bus_listener::BusEvent;
147 use crate::ids::{BusListenerCookie, ObjectId, ServiceId};
148 use uuid::uuid;
149
150 #[test]
151 fn object_created_without_cookie() {
152 let serialized = [
153 39, 0, 0, 0, 44, 0, 0, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc, 0x5e,
154 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49, 0x30,
155 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7,
156 ];
157
158 let msg = EmitBusEvent {
159 cookie: None,
160 event: BusEvent::ObjectCreated(ObjectId::new(
161 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
162 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
163 )),
164 };
165 assert_serialize_eq(&msg, serialized);
166 assert_deserialize_eq(&msg, serialized);
167
168 let msg = Message::EmitBusEvent(msg);
169 assert_serialize_eq(&msg, serialized);
170 assert_deserialize_eq(&msg, serialized);
171 }
172
173 #[test]
174 fn object_destroyed_without_cookie() {
175 let serialized = [
176 39, 0, 0, 0, 44, 0, 1, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc, 0x5e,
177 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49, 0x30,
178 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7,
179 ];
180
181 let msg = EmitBusEvent {
182 cookie: None,
183 event: BusEvent::ObjectDestroyed(ObjectId::new(
184 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
185 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
186 )),
187 };
188 assert_serialize_eq(&msg, serialized);
189 assert_deserialize_eq(&msg, serialized);
190
191 let msg = Message::EmitBusEvent(msg);
192 assert_serialize_eq(&msg, serialized);
193 assert_deserialize_eq(&msg, serialized);
194 }
195
196 #[test]
197 fn service_created_without_cookie() {
198 let serialized = [
199 71, 0, 0, 0, 44, 0, 2, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc, 0x5e,
200 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49, 0x30,
201 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7, 0xaf, 0xfc, 0xb7, 0x9b, 0xe9, 0x9c,
202 0x47, 0x84, 0x95, 0xe0, 0x0d, 0xc9, 0x9f, 0xcb, 0xa8, 0xff, 0x37, 0x22, 0x74, 0x6e,
203 0x76, 0xa8, 0x41, 0x31, 0x98, 0x32, 0x42, 0xc4, 0x78, 0x3f, 0x89, 0x97,
204 ];
205
206 let msg = EmitBusEvent {
207 cookie: None,
208 event: BusEvent::ServiceCreated(ServiceId::new(
209 ObjectId::new(
210 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
211 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
212 ),
213 uuid!("affcb79b-e99c-4784-95e0-0dc99fcba8ff").into(),
214 uuid!("3722746e-76a8-4131-9832-42c4783f8997").into(),
215 )),
216 };
217 assert_serialize_eq(&msg, serialized);
218 assert_deserialize_eq(&msg, serialized);
219
220 let msg = Message::EmitBusEvent(msg);
221 assert_serialize_eq(&msg, serialized);
222 assert_deserialize_eq(&msg, serialized);
223 }
224
225 #[test]
226 fn service_destroyed_without_cookie() {
227 let serialized = [
228 71, 0, 0, 0, 44, 0, 3, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc, 0x5e,
229 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49, 0x30,
230 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7, 0xaf, 0xfc, 0xb7, 0x9b, 0xe9, 0x9c,
231 0x47, 0x84, 0x95, 0xe0, 0x0d, 0xc9, 0x9f, 0xcb, 0xa8, 0xff, 0x37, 0x22, 0x74, 0x6e,
232 0x76, 0xa8, 0x41, 0x31, 0x98, 0x32, 0x42, 0xc4, 0x78, 0x3f, 0x89, 0x97,
233 ];
234
235 let msg = EmitBusEvent {
236 cookie: None,
237 event: BusEvent::ServiceDestroyed(ServiceId::new(
238 ObjectId::new(
239 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
240 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
241 ),
242 uuid!("affcb79b-e99c-4784-95e0-0dc99fcba8ff").into(),
243 uuid!("3722746e-76a8-4131-9832-42c4783f8997").into(),
244 )),
245 };
246 assert_serialize_eq(&msg, serialized);
247 assert_deserialize_eq(&msg, serialized);
248
249 let msg = Message::EmitBusEvent(msg);
250 assert_serialize_eq(&msg, serialized);
251 assert_deserialize_eq(&msg, serialized);
252 }
253
254 #[test]
255 fn object_created_with_cookie() {
256 let serialized = [
257 55, 0, 0, 0, 44, 1, 0xb6, 0x6c, 0x03, 0x07, 0x85, 0xcf, 0x4a, 0x7c, 0x8a, 0xcf, 0x6e,
258 0x99, 0xd0, 0xf4, 0x07, 0xb7, 0, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc,
259 0x5e, 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49,
260 0x30, 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7,
261 ];
262
263 let msg = EmitBusEvent {
264 cookie: Some(BusListenerCookie(uuid!(
265 "b66c0307-85cf-4a7c-8acf-6e99d0f407b7"
266 ))),
267 event: BusEvent::ObjectCreated(ObjectId::new(
268 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
269 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
270 )),
271 };
272 assert_serialize_eq(&msg, serialized);
273 assert_deserialize_eq(&msg, serialized);
274
275 let msg = Message::EmitBusEvent(msg);
276 assert_serialize_eq(&msg, serialized);
277 assert_deserialize_eq(&msg, serialized);
278 }
279
280 #[test]
281 fn object_destroyed_with_cookie() {
282 let serialized = [
283 55, 0, 0, 0, 44, 1, 0xb6, 0x6c, 0x03, 0x07, 0x85, 0xcf, 0x4a, 0x7c, 0x8a, 0xcf, 0x6e,
284 0x99, 0xd0, 0xf4, 0x07, 0xb7, 1, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc,
285 0x5e, 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49,
286 0x30, 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7,
287 ];
288
289 let msg = EmitBusEvent {
290 cookie: Some(BusListenerCookie(uuid!(
291 "b66c0307-85cf-4a7c-8acf-6e99d0f407b7"
292 ))),
293 event: BusEvent::ObjectDestroyed(ObjectId::new(
294 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
295 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
296 )),
297 };
298 assert_serialize_eq(&msg, serialized);
299 assert_deserialize_eq(&msg, serialized);
300
301 let msg = Message::EmitBusEvent(msg);
302 assert_serialize_eq(&msg, serialized);
303 assert_deserialize_eq(&msg, serialized);
304 }
305
306 #[test]
307 fn service_created_with_cookie() {
308 let serialized = [
309 87, 0, 0, 0, 44, 1, 0xb6, 0x6c, 0x03, 0x07, 0x85, 0xcf, 0x4a, 0x7c, 0x8a, 0xcf, 0x6e,
310 0x99, 0xd0, 0xf4, 0x07, 0xb7, 2, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc,
311 0x5e, 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49,
312 0x30, 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7, 0xaf, 0xfc, 0xb7, 0x9b, 0xe9,
313 0x9c, 0x47, 0x84, 0x95, 0xe0, 0x0d, 0xc9, 0x9f, 0xcb, 0xa8, 0xff, 0x37, 0x22, 0x74,
314 0x6e, 0x76, 0xa8, 0x41, 0x31, 0x98, 0x32, 0x42, 0xc4, 0x78, 0x3f, 0x89, 0x97,
315 ];
316
317 let msg = EmitBusEvent {
318 cookie: Some(BusListenerCookie(uuid!(
319 "b66c0307-85cf-4a7c-8acf-6e99d0f407b7"
320 ))),
321 event: BusEvent::ServiceCreated(ServiceId::new(
322 ObjectId::new(
323 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
324 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
325 ),
326 uuid!("affcb79b-e99c-4784-95e0-0dc99fcba8ff").into(),
327 uuid!("3722746e-76a8-4131-9832-42c4783f8997").into(),
328 )),
329 };
330 assert_serialize_eq(&msg, serialized);
331 assert_deserialize_eq(&msg, serialized);
332
333 let msg = Message::EmitBusEvent(msg);
334 assert_serialize_eq(&msg, serialized);
335 assert_deserialize_eq(&msg, serialized);
336 }
337
338 #[test]
339 fn service_destroyed_with_cookie() {
340 let serialized = [
341 87, 0, 0, 0, 44, 1, 0xb6, 0x6c, 0x03, 0x07, 0x85, 0xcf, 0x4a, 0x7c, 0x8a, 0xcf, 0x6e,
342 0x99, 0xd0, 0xf4, 0x07, 0xb7, 3, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc,
343 0x5e, 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49,
344 0x30, 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7, 0xaf, 0xfc, 0xb7, 0x9b, 0xe9,
345 0x9c, 0x47, 0x84, 0x95, 0xe0, 0x0d, 0xc9, 0x9f, 0xcb, 0xa8, 0xff, 0x37, 0x22, 0x74,
346 0x6e, 0x76, 0xa8, 0x41, 0x31, 0x98, 0x32, 0x42, 0xc4, 0x78, 0x3f, 0x89, 0x97,
347 ];
348
349 let msg = EmitBusEvent {
350 cookie: Some(BusListenerCookie(uuid!(
351 "b66c0307-85cf-4a7c-8acf-6e99d0f407b7"
352 ))),
353 event: BusEvent::ServiceDestroyed(ServiceId::new(
354 ObjectId::new(
355 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
356 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
357 ),
358 uuid!("affcb79b-e99c-4784-95e0-0dc99fcba8ff").into(),
359 uuid!("3722746e-76a8-4131-9832-42c4783f8997").into(),
360 )),
361 };
362 assert_serialize_eq(&msg, serialized);
363 assert_deserialize_eq(&msg, serialized);
364
365 let msg = Message::EmitBusEvent(msg);
366 assert_serialize_eq(&msg, serialized);
367 assert_deserialize_eq(&msg, serialized);
368 }
369}
370
371#[derive(Debug, Copy, Clone, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)]
372#[repr(u8)]
373enum BusEventKind {
374 ObjectCreated = 0,
375 ObjectDestroyed = 1,
376 ServiceCreated = 2,
377 ServiceDestroyed = 3,
378}