| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use crate::MAX_EVENTS_SENT_WITHOUT_ACK; |
| use fidl_fuchsia_media_sessions::{ActiveSession, RegistryControlHandle, SessionsChange}; |
| |
| pub trait SubscriberEvent: Sized { |
| fn send(self, handle: &RegistryControlHandle) -> bool; |
| } |
| |
| impl SubscriberEvent for SessionsChange { |
| fn send(mut self, handle: &RegistryControlHandle) -> bool { |
| handle.send_on_sessions_changed(&mut self).is_ok() |
| } |
| } |
| |
| impl SubscriberEvent for ActiveSession { |
| fn send(self, handle: &RegistryControlHandle) -> bool { |
| handle.send_on_active_session_changed(self).is_ok() |
| } |
| } |
| |
| /// A subscriber is a client of `fuchsia.mediasession.Registry`. |
| pub struct Subscriber { |
| control_handle: RegistryControlHandle, |
| events_sent_without_ack: usize, |
| } |
| |
| impl Subscriber { |
| pub fn new(control_handle: RegistryControlHandle) -> Self { |
| Self { control_handle, events_sent_without_ack: 0 } |
| } |
| |
| pub fn ack(&mut self) { |
| self.events_sent_without_ack = 0; |
| } |
| |
| pub fn should_wait_to_send_more(&self) -> bool { |
| self.events_sent_without_ack >= MAX_EVENTS_SENT_WITHOUT_ACK |
| } |
| |
| /// Sends an event to a subscriber without increasing their |
| /// events-without-ack count and returns whether sending to that subscriber |
| /// succeeded. |
| pub fn send_no_ack_count(&self, event: impl SubscriberEvent) -> bool { |
| event.send(&self.control_handle) |
| } |
| |
| /// Sends an event to a subscriber and returns whether sending to that |
| /// subscriber succeeded. |
| pub fn send(&mut self, event: impl SubscriberEvent) -> bool { |
| self.events_sent_without_ack += 1; |
| event.send(&self.control_handle) |
| } |
| } |