// WARNING: This file is machine generated by fidlgen.

#include <fidl/test/handles/llcpp/fidl.h>

#include <memory>

namespace llcpp {

namespace fidl {
namespace test {
namespace handles {

#ifdef __Fuchsia__
void Handles::_CloseHandles() {
  plain_handle.reset();
  bti_handle.reset();
  channel_handle.reset();
  clock_handle.reset();
  debuglog_handle.reset();
  event_handle.reset();
  eventpair_handle.reset();
  exception_handle.reset();
  fifo_handle.reset();
  guest_handle.reset();
  interrupt_handle.reset();
  iommu_handle.reset();
  job_handle.reset();
  pager_handle.reset();
  pcidevice_handle.reset();
  pmt_handle.reset();
  port_handle.reset();
  process_handle.reset();
  profile_handle.reset();
  resource_handle.reset();
  socket_handle.reset();
  suspendtoken_handle.reset();
  thread_handle.reset();
  timer_handle.reset();
  vcpu_handle.reset();
  vmar_handle.reset();
  vmo_handle.reset();
  rights_handle.reset();
  aliased_plain_handle_field.reset();
  aliased_subtype_handle_field.reset();
  aliased_rights_handle_field.reset();
  some_protocol.reset();
  request_some_protocol.reset();
}
#endif  // __Fuchsia__

namespace {}  // namespace

std::optional<::fidl::UnbindInfo> SomeProtocol::ClientImpl::DispatchEvent(
    fidl_incoming_msg_t* msg) {
  fidl_message_header_t* hdr =
      reinterpret_cast<fidl_message_header_t*>(msg->bytes);
  switch (hdr->ordinal) {
    default:
      FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
      return ::fidl::UnbindInfo{::fidl::UnbindInfo::kUnexpectedMessage,
                                ZX_ERR_NOT_SUPPORTED};
  }
  return {};
}

namespace methods {}  // namespace methods

namespace entries {

::fidl::internal::MethodEntry SomeProtocol[] = {};

}  // namespace entries

::fidl::DispatchResult SomeProtocol::TryDispatch(Interface* impl,
                                                 fidl_incoming_msg_t* msg,
                                                 ::fidl::Transaction* txn) {
  return ::fidl::DispatchResult::kNotFound;
}

::fidl::DispatchResult SomeProtocol::Dispatch(Interface* impl,
                                              fidl_incoming_msg_t* msg,
                                              ::fidl::Transaction* txn) {
  FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
  txn->InternalError(
      {::fidl::UnbindInfo::kUnexpectedMessage, ZX_ERR_NOT_SUPPORTED});
  return ::fidl::DispatchResult::kNotFound;
}

::fidl::DispatchResult SomeProtocol::Interface::dispatch_message(
    fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  return SomeProtocol::Dispatch(this, msg, txn);
}

}  // namespace handles
}  // namespace test
}  // namespace fidl
}  // namespace llcpp
