// Copyright (c) 1999-2000 David Muse
// See the COPYING file for more information

#ifndef CGI_H
#define CGI_H

#include <inputoutput.h>
#include <http.h>
#include <private/cookieentry.h>
#include <private/formentry.h>
#include <private/fileentry.h>

// The cgi class provides functions to access cgi environment variables,
// form variables, cookies and multipart form submissions as well as
// the sending of a standard text/html header.

// CGI 1.1
class	cgi : virtual public inputoutput {
	public:
			cgi();
		virtual	~cgi();

		void	initCgi(char *tempdir);
				// During initialization, all 
				// form entries, cookies and uploaded files 
				// are put into lists and copies of the 
				// uploaded files are saved into "tempdir".

		// convenience functions
		void	sendHeader();
				// sends Content type: text/html
		
		// form entry handling functions
		char	*formEntry(char *name);
				// returns the value of form entry: name
		void	writeFormEntry(char *name);
				// writes form entry: name to the browser
		void	formEntriesGetString(strstream *container, ...);
				// Returns all form entries formatted as an
				// escaped get string into "container" with the 
				// exception of a NULL terminated list of 
				// exceptions.
				// If "container" is NULL, the list is written
				// to the browser.
				// "container" is not NULL terminated.
		void	formEntriesHiddenVariables(strstream *container, ...);
				// Returns all form entries formatted as a
				// list of hidden variables into "container"
				// with the exception of a NULL terminated 
				// list of exceptions passed in after
				// "container".
				// If "container" is NULL, the list is written
				// to the browser.
				// "container" is not NULL terminated.
		char	**formEntryVariables();
				// Returns a null terminated list of form 
				// entry variables.  The order of the list is
				// the order the variables were received in.
		char	**formEntryValues();
				// Returns a null terminated list of form 
				// entry values corresponding to the variables
				// returned from formEntryVariables().
		char	*fileEntryFilename(char *name);
				// returns the filename passed in from 
				// file form entry "name"
		char	*fileEntryTempFilename(char *name);
				// returns the filename of the local file
				// created when file form entry "name" was
				// passed in
		void	dumpVariables();
				// dumps all environment variable, form entries,
				// file entries, and cookies to the browser
		void	newFormEntry(char *name, char *value);
				// create a new form entry with
				// name: "name" and value: "value"
		int	changeFormEntry(char *name, char *value);
				// change existing form entry: "name" to have
				// value: "value"
				// if the form entry exists, 1 is returned
				// otherwise 0 is returned
		void	newFileEntry(char *name, char *filename, 
						char *tempfilename);
				// create a new file form entry with
				// name: "name", filename: "filename", and 
				// temporary filename: "tempfilename"
				// if the form entry doesn't already exist,
				// no action is taken
		void	newCookieEntry(char *name, char *value);
				// create a new cookie entry with
				// name: "name" and value: "value"
		char	*cookieEntry(char *name);
				// returns the value of cookie entry: "name"
		void	writeCookieEntry(char *name);
				// writes cookie entry: "name" to the browser

		int	formEntryCount();
				// returns the number of form entries
		int	fileCount();
				// returns the number of posted files
		int	cookieCount();
				// returns the number of cookies collected

	private:
		#include <private/cgi.h>
};


#endif