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

#include "lib/fidl/cpp/internal/synchronous_proxy.h"

#include <memory>
#include <utility>

#include "lib/fidl/cpp/internal/logging.h"
#include "lib/fidl/trace.h"

namespace fidl {
namespace internal {

SynchronousProxy::SynchronousProxy(zx::channel channel) : channel_(std::move(channel)) {}

SynchronousProxy::~SynchronousProxy() = default;

zx::channel SynchronousProxy::TakeChannel() { return std::move(channel_); }

zx_status_t SynchronousProxy::Send(const fidl_type_t* type, Message message) {
  return fidl::internal::SendMessage(channel_, type, std::move(message));
}

zx_status_t SynchronousProxy::Call(const fidl_type_t* request_type,
                                   const fidl_type_t* response_type, Message request,
                                   Message* response) {
  const char* error_msg = nullptr;
  zx_status_t status = request.Validate(request_type, &error_msg);
  if (status != ZX_OK) {
    FIDL_REPORT_ENCODING_ERROR(request, request_type, error_msg);
    return status;
  }
  fidl_trace(WillHLCPPChannelCall, request_type, request.bytes().data(), request.bytes().actual(),
             request.handles().actual());
  status = request.Call(channel_.get(), 0, ZX_TIME_INFINITE, response);
  fidl_trace(DidHLCPPChannelCall, response_type, response->bytes().data(),
             response->bytes().actual(), response->handles().actual());
  if (status != ZX_OK)
    return status;
  status = response->Decode(response_type, &error_msg);
  if (status != ZX_OK) {
    FIDL_REPORT_DECODING_ERROR(*response, response_type, error_msg);
    return status;
  }
  return ZX_OK;
}

}  // namespace internal
}  // namespace fidl
