/*
    ParaGUI - crossplatform widgetset
    Copyright (C) 2000,2001,2002  Alexander Pipelka
 
    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
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
    Alexander Pipelka
    pipelka@teleweb.at
 
    Last Update:      $Author: braindead $
    Update Date:      $Date: 2003/01/04 21:13:37 $
    Source File:      $Source: /cvsroot/paragui/paragui/include/pgfile.h,v $
    CVS/RCS Revision: $Revision: 1.3.6.4 $
    Status:           $State: Exp $
*/

/** \file pgfile.h
	Header file of the PG_File class.
*/

#ifndef PG_FILE_H
#define PG_FILE_H

#ifdef SWIG
%include "swigcommon.h"
%module pgfile
%{
#include "pgfile.h"
%}
#endif

#include "paragui.h"

// strange hack needed for GCC 2.91 - Alex
#ifdef getc
#undef getc
#endif

/**
 * @author Alexander Pipelka
 *
 * @short file abstraction for the PhsicsFS (used in conjunction with PG_FileArchive)
*/

class DECLSPEC PG_File {
protected:
	/**
	The constructor can only be called from PG_FileArchive or any subclass.
	PG_File object are create by PG_FileArchive::OpenFile(...)
	@param f pointer to PhysicsFS file
	*/
	PG_File(void* f);

public:
	~PG_File();

	// lowlevel physfs functions

	/**
	read bytes from the stream
	@param buffer	buffer to fill
	@param bytestoread number of bytes to read from the stream
	@return number of bytes read
	*/
	int read(void *buffer, unsigned int bytestoread);

	/**
	write bytes to the stream
	@param buffer	buffer to write
	@param bytestowrite number of bytes to write to the stream
	@return number of bytes written
	*/
	int write(void *buffer, unsigned int bytestowrite);

#ifndef SWIG
	//! write bytes to the stream
	/*! 
	\param buffer buffer to write
	\return number of bytes written
	*/
	int write(string &buffer);
#endif

#ifndef SWIG
	//! write bytes to the stream
	/*! 
	\param buffer buffer to write
	\return number of bytes written
	*/
	int write(const char *buffer);
#endif

#ifndef SWIG
	/**
	read records from the stream
	@param buffer	buffer to fill
	@param objSize size (in bytes) of a record
	@param objCount number of records to read
	@return number of records read
	*/
	int read(void *buffer, unsigned int objSize, unsigned int objCount);
#endif

#ifndef SWIG
	/**
	write records to the stream
	@param buffer	buffer to write
	@param objSize size (in bytes) of a record
	@param objCount number of records to write
	@return number of records written
	*/
	int write(void *buffer, unsigned int objSize, unsigned int objCount);
#endif

	/**
	check for the end of the file.
	@return true if we touched the end of the file.
	*/
	bool eof();
	
	/**
	get the current position in the file stream
	@return current file stream position
	*/
	int tell();
	
	/**
	set the file pointer to a given position
	@param pos position to set
	@return true on success
	*/
	bool seek(int pos);
	
	/**
	return the length of the file (in bytes)
	@return length of the file
	*/
	int fileLength();

	/**
	get a single character from the file
	*/
	char getc();
	
	/**
	read a line from the file.
	
	This function reads a CR/LF terminated line of text from the file.
	Any trailing carriage return and linefeed characters will be skipped.
	*/
	string getline();

	/**
	write a line to the file
	@param line text to write
	This functions writes a line of text to a file. Carriage return (and linefeed)
	characters will be added.
	*/
	void putline(const string& line);
	
private:
	void* file;

#ifndef SWIG
	friend class PG_FileArchive;
#endif
};

#endif
