// Copyright 2018 The Chromium 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 BASE_FUCHSIA_FIDL_INTERFACE_REQUEST_H_
#define BASE_FUCHSIA_FIDL_INTERFACE_REQUEST_H_

#include <lib/zx/channel.h>

#include "base/base_export.h"
#include "base/macros.h"
#include "base/strings/string_piece.h"
#include "starboard/types.h"

namespace fidl {

template <typename Interface>
class InterfaceRequest;

template <typename Interface>
class InterfacePtr;

template <typename Interface>
class SynchronousInterfacePtr;

}  // namespace fidl

namespace base {
namespace fuchsia {

// A request for a FIDL interface. FidlInterfaceRequest contains interface name
// and channel handle. Interface consumers create FidlInterfaceRequest when they
// need to connect to a service. FidlInterfaceRequest is resolved when the
// channel is passed to the service implementation, e.g. through
// ComponentContext.
class BASE_EXPORT FidlInterfaceRequest {
 public:
  template <typename Interface>
  explicit FidlInterfaceRequest(fidl::InterfaceRequest<Interface> request)
      : FidlInterfaceRequest(Interface::Name_, request.TakeChannel()) {}

  // Creates a new request for |Interface| and binds the client end to the
  // |stub|. |stub| can be used immediately after the request is created, even
  // before the request is passed to the service that implements the interface.
  template <typename Interface>
  explicit FidlInterfaceRequest(fidl::InterfacePtr<Interface>* stub)
      : FidlInterfaceRequest(stub->NewRequest()) {}

  template <typename Interface>
  explicit FidlInterfaceRequest(fidl::SynchronousInterfacePtr<Interface>* stub)
      : FidlInterfaceRequest(stub->NewRequest()) {}

  FidlInterfaceRequest(FidlInterfaceRequest&&);
  ~FidlInterfaceRequest();

  // Creates an interface request from the specified |channel|. Caller must
  // ensure that the specified |interface_name| is valid for the specified
  // |channel|.
  static FidlInterfaceRequest CreateFromChannelUnsafe(
      const char* interface_name,
      zx::channel channel);

  bool is_valid() const { return interface_name_ && channel_; }

  const char* interface_name() const { return interface_name_; }

  // Extracts the channel handle to be passed to service implementation. The
  // request becomes invalid after this call, i.e. TakeChannel() can be called
  // only once.
  zx::channel TakeChannel();

 private:
  FidlInterfaceRequest(const char* interface_name, zx::channel channel);

  const char* interface_name_;
  zx::channel channel_;

  DISALLOW_COPY_AND_ASSIGN(FidlInterfaceRequest);
};

}  // namespace fuchsia
}  // namespace base

#endif  // BASE_FUCHSIA_FIDL_INTERFACE_REQUEST_H_
