// 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 "sysmem.h"

#include <fuchsia/sysmem/c/fidl.h>
#include <lib/sysmem-connector/sysmem-connector.h>
#include <lib/zx/channel.h>

#include <cstring>

const char* kSysmemSvchostPath = "/sysmem";

// We don't really need a service context, only a sysmem-connector context, so
// we just directly use the sysmem-connector context as the only context.
static zx_status_t sysmem2_init(void** out_ctx) {
  return sysmem_connector_init(kSysmemSvchostPath, reinterpret_cast<sysmem_connector_t**>(out_ctx));
}

static zx_status_t sysmem2_connect(void* ctx, async_dispatcher_t* dispatcher,
                                   const char* service_name, zx_handle_t allocator_request_param) {
  zx::channel allocator_request(allocator_request_param);
  sysmem_connector_t* connector = static_cast<sysmem_connector_t*>(ctx);
  if (!strcmp(service_name, fuchsia_sysmem_Allocator_Name)) {
    sysmem_connector_queue_connection_request(connector, allocator_request.release());
  }
  return ZX_ERR_NOT_SUPPORTED;
}
static void sysmem2_release(void* ctx) {
  sysmem_connector_release(static_cast<sysmem_connector_t*>(ctx));
}

static constexpr const char* sysmem2_services[] = {
    fuchsia_sysmem_Allocator_Name,
    nullptr,
};

static constexpr zx_service_ops_t sysmem2_ops = {
    .init = sysmem2_init,
    .connect = sysmem2_connect,
    .release = sysmem2_release,
};

static constexpr zx_service_provider_t sysmem2_service_provider = {
    .version = SERVICE_PROVIDER_VERSION,
    .services = sysmem2_services,
    .ops = &sysmem2_ops,
};

const zx_service_provider_t* sysmem2_get_service_provider() { return &sysmem2_service_provider; }
