// 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.

#ifndef LIB_FIDL_CPP_EVENT_SENDER_H_
#define LIB_FIDL_CPP_EVENT_SENDER_H_

#include <lib/fidl/cpp/interface_request.h>
#include <lib/fidl/cpp/internal/message_sender.h>
#include <lib/zx/channel.h>

#include <utility>

namespace fidl {

// Sends events for |Interface| on a given channel.
//
// An |EventSender| lets its client send events on a given channel. This class
// differs from |Binding| in that |EventSender| does not listen for incoming
// messages on the channel, which allows |EventSender| to send messages from
// multiple threads safely.
//
// See also:
//
//  * |Binding|, which can receive messages as well as send events.
template <typename Interface>
class EventSender final : public fidl::internal::MessageSender {
 public:
  // Constructs an event sender that sends events through |channel|.
  explicit EventSender(zx::channel channel) : channel_(std::move(channel)), stub_(nullptr) {
    stub_.set_sender(this);
  }

  // Constructs an event sender that sends events through the underlying channel
  // in |request|.
  explicit EventSender(InterfaceRequest<Interface> request) : EventSender(request.TakeChannel()) {}

  EventSender(const EventSender&) = delete;
  EventSender& operator=(const EventSender&) = delete;

  // The interface for sending events back to the client.
  typename Interface::EventSender_& events() { return stub_; }

  // The underlying channel.
  const zx::channel& channel() const { return channel_; }

  // Transfers ownership of the underlying channel to the caller.
  zx::channel TakeChannel() { return std::move(channel_); }

 private:
  zx_status_t Send(const fidl_type_t* type, Message message) final {
    return fidl::internal::SendMessage(channel_, type, std::move(message));
  }

  zx::channel channel_;
  typename Interface::Stub_ stub_;
};

}  // namespace fidl

#endif  // LIB_FIDL_CPP_EVENT_SENDER_H_
