// Copyright 2018 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_INTERNAL_STUB_CONTROLLER_H_
#define LIB_FIDL_CPP_INTERNAL_STUB_CONTROLLER_H_

#include <lib/fidl/cpp/internal/message_handler.h>
#include <lib/fidl/cpp/internal/message_reader.h>
#include <lib/fidl/cpp/internal/message_sender.h>
#include <lib/fidl/cpp/internal/stub.h>
#include <lib/fidl/cpp/message.h>
#include <lib/zx/channel.h>

#include <memory>

namespace fidl {
namespace internal {
class WeakStubController;

// Controls the server endpoint of a FIDL channel.
//
// A |StubController| controls the protocol-specific "stub" object. Stub
// objects are used on the server endpoint of a FIDL channel to decode messages
// received over the channel and dispatch them to an implementation of the
// protocol.
class StubController final : public MessageHandler, public MessageSender {
 public:
  StubController();
  ~StubController() override;

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

  // The |MessageReader| that is listening for messages sent by the client.
  MessageReader& reader() { return reader_; }
  const MessageReader& reader() const { return reader_; }

  // The protocol-specific object that decodes messages and dispatches them to
  // an implementation of the protocol.
  //
  // The stub must be set to a non-null value before messages are read from the
  // underlying channel. Typically, the caller will set a non-null stub before
  // binding a channel to the |MessageReader|.
  Stub* stub() const { return stub_; }
  void set_stub(Stub* stub) { stub_ = stub; }

  // Send a message over the channel.
  //
  // Returns an error if the message fails to encode properly or if the message
  // cannot be written to the channel.
  zx_status_t Send(const fidl_type_t* type, HLCPPOutgoingMessage message) final;

 private:
  // Called by the |MessageReader| when a message arrives on the channel from
  // the client.
  //
  // The message will be dispatched using the |stub()|. If the message expects a
  // response, the |stub()| will also be given a |PendingResponse| object that
  // can be used to send a reply to the message.
  zx_status_t OnMessage(HLCPPIncomingMessage message) final;

  // Causes the |StubController| to invalidate all outstanding weak pointers,
  // preventing outstanding |PendingResponse| objects from sending messages on
  // the channel that has gone away.
  void OnChannelGone() final;

  // Invalidate all outstanding weak pointers, preventing outstanding
  // |PendingResponse| objects from sending messages.
  void InvalidateWeakIfNeeded();

  WeakStubController* weak_;
  MessageReader reader_;
  Stub* stub_;
};

}  // namespace internal
}  // namespace fidl

#endif  // LIB_FIDL_CPP_INTERNAL_STUB_CONTROLLER_H_
