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