// 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 <lib/paver/provider.h>

#include <fuchsia/paver/llcpp/fidl.h>
#include <lib/fidl-async/cpp/bind.h>
#include <zircon/status.h>
#include <zircon/syscalls.h>

#include "paver.h"

namespace {

zx_status_t Connect(void* ctx, async_dispatcher_t* dispatcher, const char* service_name,
                    zx_handle_t request) {
  if (!strcmp(service_name, ::llcpp::fuchsia::paver::Paver::Name)) {
    return fidl::Bind(dispatcher, zx::channel(request), reinterpret_cast<paver::Paver*>(ctx));
  }

  zx_handle_close(request);
  return ZX_ERR_NOT_SUPPORTED;
}

zx_status_t Init(void** out_ctx) {
  *out_ctx = new paver::Paver;
  return ZX_OK;
}

void Release(void* ctx) { delete static_cast<paver::Paver*>(ctx); }

constexpr const char* kPaverServices[] = {
    ::llcpp::fuchsia::paver::Paver::Name,
    nullptr,
};

constexpr zx_service_ops_t kPaverOps = {
    .init = Init,
    .connect = Connect,
    .release = Release,
};

constexpr zx_service_provider_t paver_service_provider = {
    .version = SERVICE_PROVIDER_VERSION,
    .services = kPaverServices,
    .ops = &kPaverOps,
};

}  // namespace

const zx_service_provider_t* paver_get_service_provider() { return &paver_service_provider; }
