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

#include "connection_destroyer.h"

#include <inttypes.h>

#include "device_controller_connection.h"
#include "proxy_iostate.h"
#include "src/devices/lib/log/log.h"
#include "zx_device.h"

zx_status_t ConnectionDestroyer::QueueProxyConnection(async_dispatcher_t* dispatcher,
                                                      ProxyIostate* conn) {
  zx_packet_user_t pkt = {};
  pkt.u64[0] = static_cast<uint64_t>(Type::Proxy);
  pkt.u64[1] = reinterpret_cast<uintptr_t>(conn);
  return receiver_.QueuePacket(dispatcher, &pkt);
}

zx_status_t ConnectionDestroyer::QueueDeviceControllerConnection(async_dispatcher_t* dispatcher,
                                                                 DeviceControllerConnection* conn) {
  zx_packet_user_t pkt = {};
  pkt.u64[0] = static_cast<uint64_t>(Type::DeviceController);
  pkt.u64[1] = reinterpret_cast<uintptr_t>(conn);
  return receiver_.QueuePacket(dispatcher, &pkt);
}

void ConnectionDestroyer::Handler(async_dispatcher_t* dispatcher, async::Receiver* receiver,
                                  zx_status_t status, const zx_packet_user_t* data) {
  Type type = static_cast<Type>(data->u64[0]);
  uintptr_t ptr = data->u64[1];

  switch (type) {
    case Type::DeviceController: {
      auto conn = reinterpret_cast<DeviceControllerConnection*>(ptr);
      VLOGF(1, "Destroying driver_manager connection %p", conn);
      delete conn;
      break;
    }
    case Type::Proxy: {
      auto conn = reinterpret_cast<ProxyIostate*>(ptr);
      VLOGF(1, "Destroying proxy connection %p", conn);
      delete conn;
      break;
    }
    default:
      ZX_ASSERT_MSG(false, "Unknown IosDestructionType %" PRIu64 "\n", data->u64[0]);
  }
}
