/* HTTP source element for use in tests
 *
 * Copyright (c) <2015> YouView TV Ltd
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef __GST_TEST_HTTP_SRC_H__
#define __GST_TEST_HTTP_SRC_H__

#include <gst/gst.h>

G_BEGIN_DECLS

#define GST_TYPE_TEST_HTTP_SRC            (gst_test_http_src_get_type ())

/**
 * TEST_HTTP_SRC_REQUEST_HEADERS_NAME:
 * The name of the #GstStructure that will contain all the HTTP request
 * headers
 */
#define TEST_HTTP_SRC_REQUEST_HEADERS_NAME "request-headers"

/**
 * TEST_HTTP_SRC_RESPONSE_HEADERS_NAME:
 * The name of the #GstStructure that will contain all the HTTP response
 * headers
 */
#define TEST_HTTP_SRC_RESPONSE_HEADERS_NAME "response-headers"

/* structure used by src_start function to configure the
 * GstTestHTTPSrc plugin.
 * It specifies information about a given URI.
 */
typedef struct _GstTestHTTPSrcInput
{
  gpointer context; /* opaque pointer that can be used in callbacks */
  guint64 size; /* size of resource, in bytes */
  GstStructure *request_headers;
  GstStructure *response_headers;
  guint status_code; /* HTTP status code */
} GstTestHTTPSrcInput;

/* Opaque structure used by GstTestHTTPSrc */
typedef struct _GstTestHTTPSrc GstTestHTTPSrc;

typedef struct _GstTestHTTPSrcCallbacks {
  /**
   * src_start:
   * @src: The #GstTestHTTPSrc calling this callback
   * @uri: The URI that is being requested
   * @input_data: (out) The implementation of this callback is
   * responsible for filling in this #GstTestHTTPSrcInput
   * with the appropriate information, return returning %TRUE.
   * If returning %FALSE, only GstTestHTTPSrcInput::status_code
   * should be updated.
   * Returns: %TRUE if GstTestHTTPSrc should respond to this URI,
   * using the supplied input_data.
   *
   * src_start is used to "open" the given URI. The callback must return
   * %TRUE to simulate a success, and set appropriate fields in input_data.
   * Returning %FALSE indicates that the request URI is not found.
   * In this situation GstTestHTTPSrc will cause the appropriate
   * 404 error to be posted to the bus 
   */
  gboolean (*src_start)(GstTestHTTPSrc *src,
                        const gchar *uri,
                        GstTestHTTPSrcInput *input_data,
                        gpointer user_data);
  /**
   * src_create:
   * @src: the #GstTestHTTPSrc calling this callback
   * @offset: the offset from the start of the resource
   * @length: requested number of bytes
   * @retbuf: (out) used to return a newly allocated #GstBuffer
   * @context: (allow none) the value of the context field
   * in #GstTestHTTPSrcInput.
   * @user_data: the value of user_data provided to 
   * #gst_test_http_src_install_callbacks
   * Returns: %GST_FLOW_OK to indicate success, or some other value of
   * #GstFlowReturn to indicate EOS or error.
   *
   * The src_create function is used to create a #GstBuffer for
   * simulating the data that is returned when accessing this
   * "open" stream. It can also be used to simulate various error
   * conditions by returning something other than %GST_FLOW_OK
   */
  GstFlowReturn (*src_create)(GstTestHTTPSrc *src,
                              guint64 offset,
                              guint length,
                              GstBuffer ** retbuf,
                              gpointer context,
                              gpointer user_data);
} GstTestHTTPSrcCallbacks;

GType gst_test_http_src_get_type (void);

/**
 * gst_test_http_src_register_plugin:
 * @registry: the #GstRegistry to use for registering this plugin
 * @name: the name to use for this plugin
 * Returns: true if successful
 *
 * Registers this plugin with the GstRegitry using the given name. It will
 * be given a high rank, so that it will be picked in preference to any
 * other element that implements #GstURIHandler.
 */
gboolean gst_test_http_src_register_plugin (GstRegistry * registry, const gchar * name);

/**
 * gst_test_http_src_install_callbacks:
 * @callbacks: the #GstTestHTTPSrcCallbacks callback functions that will
 * be called every time this element is asked to open a URI or provide data
 * for an open URI.
 * @user_data: a pointer that is passed to every callback
 */
void gst_test_http_src_install_callbacks (const GstTestHTTPSrcCallbacks *callbacks, gpointer user_data);

/**
 * gst_test_http_src_set_default_blocksize:
 * @blocksize: the default block size to use (0=use #GstBaseSrc default)
 *
 * Set the default blocksize that will be used by instances of
 * #GstTestHTTPSrc. It specifies the size (in bytes) that will be
 * returned in each #GstBuffer. This default can be overridden
 * by an instance of #GstTestHTTPSrc using the "blocksize" property
 * of #GstBaseSrc
 */
void gst_test_http_src_set_default_blocksize (guint blocksize);

G_END_DECLS

#endif /* __GST_TEST_HTTP_SRC_H__ */