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

    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 DDBUFFERHANDLER_H
#define DDBUFFERHANDLER_H



#include <ddbaseobject.h>
#include <map>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

using namespace std;

/// ddiobufferhandler : Liest von und schreibt in einem memoryblock
/**
	ddiobufferhandler ist die Basis für operationen auf Puffern und enthält nur 
	die Methoden zum ein- und auslesen. Der Inhalt des Puffers (mmap etc.) wird
	in den unterklassen bestimmt.
*/


class ddiobufferhandler  : public ddbaseobject
{

public:

  ddiobufferhandler()
  :	_data(0),  _size(0), _input_offset(0), _output_offset(0)
  {
  }
 
  virtual ~ddiobufferhandler()
  {
  }
	
	ddiobufferhandler( const ddiobufferhandler& src )
	{
		this->operator=( src );
	}
	
  ddiobufferhandler& operator=( const ddiobufferhandler& src )
  {
	  if( this == &src )
	  	return *this;
	  _data 					= src._data;
  	_size 					= src._size;
  	_input_offset 	= src._input_offset;
  	_output_offset 	= src._output_offset;
		return *this;
	}
	
	int move_input( int bytes );
  int move_output( int bytes );

  ddstring to_string() const;

  /**
   	Alle pointer zurücksetzen.
  */

  inline void reset()
  {
    _input_offset = _output_offset = 0;
  }


  /**
  	Gibt den basepointer zurück.
  */

  inline const char* data()  const
  {
  	return (const char*) _data;
  }


  /**
  	Gibt den fürs reinschreiben zustï¿½ndigen pointer zurück.
  */

  inline char* input()
  {
    return (char*) (_data + _input_offset);
  }


  /**
  	Gibt den fürs reinschreiben zustï¿½ndigen pointer zurück, const version.
  */

  inline const char* input() const
  {
    return (const char*) (_data + _input_offset);
  }
	
  /**
  	Gibt den fürs auslesen zustï¿½ndigen pointer zurück.
  */

  inline char* output()
  {
		return (char*) (_data + _output_offset);
  }

  
  /**
  	Gibt den fürs auslesen zustï¿½ndigen pointer zurück, const version.
  */

  inline const char* output() const
  {
		return (const char*) (_data + _output_offset);
  }

  /**
  	Gibt die Gesamtgrösse zurück.
  */

  inline size_t size() const
  {
  	return _size;
  }


  /**
  	Gibt die maximale Anzahl an Bytes zurück, die noch in den Buffer geschrieben werden
  	können.
  */

  inline int max_input() const
  {
     return _size - _input_offset;
  }


  /**
  	Gibt die maximale Anzahl an Bytes zurück, die noch ausgelesen werden
  	können.
  */

  inline int max_output() const
  {
      return _input_offset - _output_offset;
  }

protected:
	
  char* _data;
  int		_size;
  int		_input_offset;
  int   _output_offset;

};


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

    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.

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




/// ddiobufferreader : Ein bufferhandler, der auf 'fremden' daten arbeitet: mmap etc.
/**
	ddiobufferreader : Ein bufferhandler, der auf 'fremden' daten arbeitet: mmap etc
*/

class ddioinfo;

class ddiobufferreader  : public ddiobufferhandler
{

public:

  ddiobufferreader()
  {
  }
  
  virtual ~ddiobufferreader()
  {
  
  }
	
	void set_data( char* src, int size )
	{
		_data = src;
		_size = size;
	}
  
};


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

    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.

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


/// ddiobufferreader : Ein bufferhandler, der auf 'eigenen' daten arbeitet.
/**
	ddiobufferreader : Ein bufferhandler, der auf 'eigenen' daten arbeitet. Der memoryblock
	wird von malloc, realloc und free verwaltet.
	#warning FIX! lieber operator new verwenden ?
	#warning FIX! crashbehandlung fehlt!
*/

class ddioinfo;

class ddiobuffer  : public ddiobufferhandler
{

public:

  ddiobuffer();
 
  virtual ~ddiobuffer();
	
	int  grow_buffer( int bytes );
  void shrink_buffer();
  
  void init_buffer( int size );
  
  /**
  	Daten in den Buffer schreiben
  */

  inline void append( const ddstring& src )
  {  	
		append( src.data(), src.size() );
  }

	void append ( const char* src, int bytes );

protected:
	
  int		_origsize;
 
private:	 
	
	ddiobuffer( const ddiobuffer& src )
	{
	}
	
  ddiobuffer& operator=( const ddiobuffer& src )
  {
  	return *this;
  }

};



	
#endif
