/**************************************************************************
 *
 * Copyright (c) 2000-2003 Intel Corporation
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * - Neither name of Intel Corporation nor the names of its contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 **************************************************************************/

#ifndef GENLIB_NET_HTTP_WEBSERVER_H
#define GENLIB_NET_HTTP_WEBSERVER_H

#include "UpnpGlobal.h"
#include "httpparser.h"
#include "sock.h"
#include <time.h>

#ifdef __cplusplus
extern "C" {
#endif

struct SendInstruction
{
	int IsVirtualFile;
	int IsChunkActive;
	int IsRangeActive;
	int IsTrailers;
	char RangeHeader[200];
	char AcceptLanguageHeader[200];
	off_t RangeOffset;
	/*! Read from local source and send on the network. */
	off_t ReadSendSize;
	/*! Recv from the network and write into local file. */
	long RecvWriteSize;
	/*! CorsHeader. */
	const void *CorsHeader;
	/*! Cookie associated with the virtualDir. */
	const void *Cookie;
	/*! Cookie associated with the request. */
	const void *RequestCookie;
	/* Later few more member could be added depending
	 * on the requirement.*/
};

/*!
 * \brief Initilialize the different documents. Initialize the memory
 * for root directory for web server. Call to initialize global XML
 * document. Sets bWebServerState to WEB_SERVER_ENABLED.
 *
 * \note alias_content is not freed here
 *
 * \return
 * \li \c 0 - OK
 * \li \c UPNP_E_OUTOF_MEMORY
 */
int web_server_init(void);

/*!
 * \brief Release memory allocated for the global web server root
 * directory and the global XML document. Resets the flag bWebServerState
 * to WEB_SERVER_DISABLED.
 */
void web_server_destroy(void);

/*!
 * \brief Replaces current alias with the given alias. To remove the current
 * alias, set alias_name to NULL.
 *
 * \note alias_content is not freed here
 *
 * \return
 * \li \c 0 - OK
 * \li \c UPNP_E_OUTOF_MEMORY
 */
int web_server_set_alias(
	/*! [in] Webserver name of alias; created by caller and freed by caller
	 * (doesn't even have to be malloc()d. */
	const char *alias_name,
	/*! [in] The xml doc; this is allocated by the caller; and freed by
	 * the web server. */
	const char *alias_content,
	/*! [in] Length of alias body in bytes. */
	size_t alias_content_length,
	/*! [in] Time when the contents of alias were last changed (local time).
	 */
	time_t last_modified);

/*!
 * \brief Assign the path specfied by the input const char* root_dir parameter
 * to the global Document root directory. Also check for path names ending
 * in '/'.
 *
 * \return Integer.
 */
int web_server_set_root_dir(
	/*! [in] String having the root directory for the document. */
	const char *root_dir);

/*!
 * \brief Assign the Access-Control-Allow-Origin specfied by the input
 * const char* cors_string parameterto the global CORS string
 *
 * \return Integer.
 */
int web_server_set_cors(
	/*! [in] String having the Access-Control-Allow-Origin string. */
	const char *cors_string);

/*!
 * \brief Main entry point into web server; Handles HTTP GET and HEAD
 * requests.
 */
void web_server_callback(
	/*! [in] . */
	http_parser_t *parser,
	/*! [in] . */
	http_message_t *req,
	/*! [in,out] . */
	SOCKINFO *info);

/* regression: issue #153 — unit-test hooks to simulate concurrent alias access
 */
UPNP_EXPORT_SPEC void web_server_ut_grab_alias(void);
UPNP_EXPORT_SPEC void web_server_ut_release_alias(void);
UPNP_EXPORT_SPEC int web_server_ut_set_alias(
	const char *name, const char *content, size_t len);

#ifdef __cplusplus
} /* extern C */
#endif

#endif /* GENLIB_NET_HTTP_WEBSERVER_H */
