// 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 allocator2_request_param) {
    zx::channel allocator2_request(allocator2_request_param);
    sysmem_connector_t* connector = static_cast<sysmem_connector_t*>(ctx);
    if (!strcmp(service_name, fuchsia_sysmem_Allocator2_Name)) {
        sysmem_connector_queue_connection_request(connector, allocator2_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_Allocator2_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;
}
