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

#include <lib/logger/logger.h>
#include <fuchsia/logger/c/fidl.h>
#include <zircon/status.h>
#include <zircon/syscalls.h>

static zx_status_t connect(void* ctx, async_dispatcher_t* dispatcher, const char* service_name,
                           zx_handle_t request) {
  if (!strcmp(service_name, fuchsia_logger_LogSink_Name)) {
    auto logger = new logger::LoggerImpl(zx::channel(request), STDOUT_FILENO);

    zx_status_t status = logger->Begin(dispatcher);
    if (status != ZX_OK) {
      delete logger;
      return status;
    }

    logger->set_error_handler([logger](zx_status_t status) {
      // If we encounter an error, we tear down the logger.
      delete logger;
    });

    return ZX_OK;
  }

  zx_handle_close(request);
  return ZX_ERR_NOT_SUPPORTED;
}

static constexpr const char* logger_services[] = {
    fuchsia_logger_LogSink_Name,
    nullptr,
};

static constexpr zx_service_ops_t logger_ops = {
    .init = nullptr,
    .connect = connect,
    .release = nullptr,
};

static constexpr zx_service_provider_t logger_service_provider = {
    .version = SERVICE_PROVIDER_VERSION,
    .services = logger_services,
    .ops = &logger_ops,
};

const zx_service_provider_t* logger_get_service_provider() { return &logger_service_provider; }
