qzdoom-gpl/src/files.h
Christoph Oelckers 96b72f2e33 - Changed the internal Timidity player so that it uses timidity_mastervolume
because it has the same sound volume issues as the external one.
- Replaced use of stdio in Timidity with FileReader and added the option to read
  from the lump directory. If the main config file is inside the lump directory
  it will assume that everything else is as well. If it is a real file it will be
  assumed that the rest is real files as well.
- Fixed: None of the error returns in Timidity::read_config_file closed the file being read.


SVN r906 (trunk)
2008-04-12 21:36:10 +00:00

161 lines
2.8 KiB
C++

#ifndef FILES_H
#define FILES_H
#include <stdio.h>
#include <zlib.h>
#include "doomtype.h"
#include "m_swap.h"
class FileReader
{
public:
FileReader ();
FileReader (const char *filename);
FileReader (FILE *file);
FileReader (FILE *file, long length);
bool Open (const char *filename);
virtual ~FileReader ();
virtual long Tell () const;
virtual long Seek (long offset, int origin);
virtual long Read (void *buffer, long len);
virtual char *Gets(char *strbuf, int len);
long GetLength () const { return Length; }
// If you use the underlying FILE without going through this class,
// you must call ResetFilePtr() before using this class again.
void ResetFilePtr ();
FILE *GetFile () const { return File; }
FileReader &operator>> (BYTE &v)
{
Read (&v, 1);
return *this;
}
FileReader &operator>> (SBYTE &v)
{
Read (&v, 1);
return *this;
}
FileReader &operator>> (WORD &v)
{
Read (&v, 2);
v = LittleShort(v);
return *this;
}
FileReader &operator>> (SWORD &v)
{
Read (&v, 2);
v = LittleShort(v);
return *this;
}
FileReader &operator>> (DWORD &v)
{
Read (&v, 4);
v = LittleLong(v);
return *this;
}
protected:
FileReader (const FileReader &other, long length);
char *GetsFromBuffer(const char * bufptr, char *strbuf, int len);
FILE *File;
long Length;
long StartPos;
long FilePos;
private:
long CalcFileLen () const;
protected:
bool CloseOnDestruct;
};
// Wraps around a FileReader to decompress a zlib stream
class FileReaderZ
{
public:
FileReaderZ (FileReader &file, bool zip=false);
~FileReaderZ ();
long Read (void *buffer, long len);
FileReaderZ &operator>> (BYTE &v)
{
Read (&v, 1);
return *this;
}
FileReaderZ &operator>> (SBYTE &v)
{
Read (&v, 1);
return *this;
}
FileReaderZ &operator>> (WORD &v)
{
Read (&v, 2);
v = LittleShort(v);
return *this;
}
FileReaderZ &operator>> (SWORD &v)
{
Read (&v, 2);
v = LittleShort(v);
return *this;
}
FileReaderZ &operator>> (DWORD &v)
{
Read (&v, 4);
v = LittleLong(v);
return *this;
}
FileReaderZ &operator>> (fixed_t &v)
{
Read (&v, 4);
v = LittleLong(v);
return *this;
}
private:
enum { BUFF_SIZE = 4096 };
FileReader &File;
bool SawEOF;
z_stream Stream;
BYTE InBuff[BUFF_SIZE];
void FillBuffer ();
FileReaderZ &operator= (const FileReaderZ &) { return *this; }
};
class MemoryReader : public FileReader
{
public:
MemoryReader (const char *buffer, long length);
~MemoryReader ();
virtual long Tell () const;
virtual long Seek (long offset, int origin);
virtual long Read (void *buffer, long len);
virtual char *Gets(char *strbuf, int len);
protected:
const char * bufptr;
};
#endif