// Copyright 2016 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 "garnet/bin/netconnector/service_agent.h"

#include "garnet/bin/netconnector/netconnector_impl.h"
#include "src/lib/fxl/logging.h"

namespace netconnector {

// static
std::unique_ptr<ServiceAgent> ServiceAgent::Create(fxl::UniqueFD socket_fd,
                                                   NetConnectorImpl* owner) {
  return std::unique_ptr<ServiceAgent>(
      new ServiceAgent(std::move(socket_fd), owner));
}

ServiceAgent::ServiceAgent(fxl::UniqueFD socket_fd, NetConnectorImpl* owner)
    : MessageTransceiver(std::move(socket_fd)), owner_(owner) {
  FXL_DCHECK(owner != nullptr);
}

ServiceAgent::~ServiceAgent() {}

void ServiceAgent::OnVersionReceived(uint32_t version) {}

void ServiceAgent::OnServiceNameReceived(const std::string& service_name) {
  zx::channel local;
  zx::channel remote;
  zx_status_t status = zx::channel::create(0u, &local, &remote);

  if (status != ZX_OK) {
    FXL_LOG(ERROR) << "Failed to create channel, status " << status;
    CloseConnection();
    return;
  }

  owner_->responding_services()->ConnectToService(service_name,
                                                  std::move(remote));

  SetChannel(std::move(local));
}

void ServiceAgent::OnConnectionClosed() {
  FXL_DCHECK(owner_ != nullptr);
  owner_->ReleaseServiceAgent(this);
}

}  // namespace netconnector
