/***************************************************************************

    supportware
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/

#ifndef DDWEBBUFFER_H
#define DDWEBBUFFER_H

#include <ddiobuffer.h>
#include <ddiourl.h>

/// ddwebinbuffer: Hilfsklasse für die IO-Buffer einer ddwebconnection etc.
/**
	WebbuFfer wird sowohl von webconnection für den server-part als auch von
	webblockloader für den client-part verwendet, daher gibt es accept() (_von_ aussen)
	und connect() (_nach_ aussen).
	
	Das ganze ist ein iobuffer ( request lesen ) der zusätzlich zwei iobuffer zur ausgabe hat 
	( response head & body schreiben )
*/

class ddwebbuffer : public ddiobuffer, public ddbasestate
{

public:
	
  ddwebbuffer();
	//ddwebbuffer( size_t bodysize );
	virtual ~ddwebbuffer();
	
	void   set_write_mode( int mode );
	size_t set_path( ddiourl& path );
	int  	 connect( const ddstring& host );
	int  	 accept( int masterfd );
	int  	 receive();
	int  	 send();
	void 	 set_file_size( size_t filesize );
	int  	 restore_buffers();
	void 	 close();


	inline int get_fd()
	{
		return _fd;
	}

	
	inline ddiobuffer& get_body_buffer()
	{
		return _outbody;
	}
	
	
	inline ddiobuffer& get_head_buffer()

	{
		return _outhead;
	}

	
	inline const ddstring& get_host_ip() const
	{
		return _hostip;		
	}
	
protected:
	
	int  send_buffer( ddiobuffer& buffer, int nextstate, int option=0 );
	void cork( bool usecork );
	
	int    			_fd, _filefd, _nextmode;
	off_t  			_offset;
	size_t 			_filesize, _max;
	ddstring		_name;
	bool 				_corked;
	ddiobuffer	_outhead;  
	ddiobuffer	_outbody;  
	ddstring  	_hostip;

};

#endif
