#ifndef MEDIA_CAST_LOGGING_LOG_EVENT_DISPATCHER_H_
#define MEDIA_CAST_LOGGING_LOG_EVENT_DISPATCHER_H_
#include <memory>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/task/single_thread_task_runner.h"
#include "media/cast/logging/logging_defines.h"
#include "media/cast/logging/raw_event_subscriber.h"
namespace media::cast {
class LogEventDispatcher {
public:
explicit LogEventDispatcher(
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
base::OnceClosure deletion_cb);
LogEventDispatcher(const LogEventDispatcher&) = delete;
LogEventDispatcher(LogEventDispatcher&&) = delete;
LogEventDispatcher& operator=(const LogEventDispatcher&) = delete;
LogEventDispatcher& operator=(LogEventDispatcher&&) = delete;
~LogEventDispatcher();
void DispatchFrameEvent(std::unique_ptr<FrameEvent> event) const;
void DispatchPacketEvent(std::unique_ptr<PacketEvent> event) const;
void DispatchBatchOfEvents(
std::unique_ptr<std::vector<FrameEvent>> frame_events,
std::unique_ptr<std::vector<PacketEvent>> packet_events) const;
void Subscribe(RawEventSubscriber* subscriber);
void Unsubscribe(RawEventSubscriber* subscriber);
private:
class Impl {
public:
explicit Impl(base::OnceClosure deletion_cb);
Impl(const Impl&) = delete;
Impl(Impl&&) = delete;
Impl& operator=(const Impl&) = delete;
Impl& operator=(Impl&&) = delete;
~Impl();
void DispatchFrameEvent(std::unique_ptr<FrameEvent> event) const;
void DispatchPacketEvent(std::unique_ptr<PacketEvent> event) const;
void DispatchBatchOfEvents(
std::unique_ptr<std::vector<FrameEvent>> frame_events,
std::unique_ptr<std::vector<PacketEvent>> packet_events) const;
void Subscribe(RawEventSubscriber* subscriber);
void Unsubscribe(RawEventSubscriber* subscriber);
private:
base::OnceClosure deletion_cb_;
std::vector<raw_ptr<RawEventSubscriber, VectorExperimental>> subscribers_;
};
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
std::unique_ptr<Impl> impl_;
};
}
#endif