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

#pragma once

#include <lib/async/dispatcher.h>
#include <zircon/compiler.h>
#include <zircon/types.h>

__BEGIN_CDECLS

// echo -n "zx_service_provider_v0.1" | sha256sum | cut -c1-16
#define SERVICE_PROVIDER_VERSION 0xc102b17652bc1e20

// Function table for services hosted by an svchost.
typedef struct zx_service_ops {
  // Opportunity to do on-load work.
  //
  // Called ony once, before any other ops are called. The service may
  // optionally return a context pointer to be passed to the other service ops.
  zx_status_t (*init)(void** out_ctx);

  // Connect to the service with the given name.
  //
  // |ctx| is the pointer returned by |init|, if any.
  //
  // |async| is the async dispatch on which the service provider should
  // schedule its work. This dispatcher might be shared with other service
  // providers.
  //
  // |service_name| is the name of the service to which the client wishes to
  // connect. If the service provider doesn't implement a service with this
  // name, this function should return |ZX_ERR_NOT_SUPPORTED|.
  //
  // This function takes ownership of |request| and should close |request| on
  // error.
  zx_status_t (*connect)(void* ctx, async_dispatcher_t* dispatcher, const char* service_name,
                         zx_handle_t request);

  // Called before the service is unloaded.
  //
  // |ctx| is the pointer returned by |init|, if any.
  void (*release)(void* ctx);
} zx_service_ops_t;

// Metadata and operations for a service provider.
typedef struct zx_service_provider {
  // A magic number that identifies the ABI.
  uint64_t version;  // SERVICE_PROVIDER_VERSION

  // The services that this service provider implements.
  //
  // Represented as a null-terminated array of null-terminated strings.
  const char* const* services;

  // The function table of operations implemented by this service provider.
  const zx_service_ops_t* ops;
} zx_service_provider_t;

__END_CDECLS
