121 lines
2.5 KiB
C++
121 lines
2.5 KiB
C++
//This file is part of Photon (http://photon.sourceforge.net)
|
|
//Copyright (C) 2004-2005 James Turk
|
|
//
|
|
// Author:
|
|
// James Turk (jpt2433@rit.edu)
|
|
//
|
|
// Version:
|
|
// $Id: FileBuffer.cpp,v 1.5 2005/06/10 07:06:06 cozman Exp $
|
|
|
|
#include "util/FileBuffer.hpp"
|
|
|
|
#include "exceptions.hpp"
|
|
|
|
namespace photon
|
|
{
|
|
namespace util
|
|
{
|
|
|
|
FileBuffer::FileBuffer() :
|
|
file_(0)
|
|
{}
|
|
|
|
|
|
FileBuffer::FileBuffer(const std::string& filename) :
|
|
file_( PHYSFS_openRead(filename.c_str()) )
|
|
{}
|
|
|
|
FileBuffer::~FileBuffer()
|
|
{}
|
|
|
|
void FileBuffer::open(const std::string& filename)
|
|
{
|
|
file_ = PHYSFS_openRead(filename.c_str());
|
|
}
|
|
|
|
void FileBuffer::close()
|
|
{
|
|
if(file_ == 0)
|
|
{
|
|
throw PreconditionException("No file open in FileBuffer::close");
|
|
}
|
|
|
|
PHYSFS_close(file_);
|
|
}
|
|
|
|
std::vector<ubyte> FileBuffer::getData(int amount)
|
|
{
|
|
if(file_ == 0)
|
|
{
|
|
throw PreconditionException("No file open in FileBuffer::getData");
|
|
}
|
|
|
|
// if amount is 0, read entire buffer
|
|
if(amount == 0)
|
|
{
|
|
amount = getSize();
|
|
}
|
|
|
|
std::vector<ubyte> buffer(amount); //create buffer
|
|
|
|
// try to read 'amount' bytes into buffer
|
|
PHYSFS_sint64 bytesRead = PHYSFS_read(file_, &buffer[0], 1, amount);
|
|
|
|
// if -1 is returned (an error) or fewer bytes were read than asked but
|
|
// eof hasn't been reached, PhysFS encountered an error
|
|
if( bytesRead == -1 || (bytesRead < amount && PHYSFS_eof(file_) == 0) )
|
|
{
|
|
throw APIError(std::string("PhysFS failure in FileBuffer::getData (") +
|
|
PHYSFS_getLastError() + ")");
|
|
}
|
|
|
|
buffer.resize(bytesRead); //shrink to size()==bytesRead
|
|
|
|
return buffer;
|
|
}
|
|
|
|
uint FileBuffer::getPosition() const
|
|
{
|
|
if(file_ == 0)
|
|
{
|
|
throw PreconditionException("No file open in FileBuffer::getPosition");
|
|
}
|
|
|
|
PHYSFS_sint64 pos = PHYSFS_tell(file_);
|
|
|
|
if(pos == -1)
|
|
{
|
|
throw APIError(
|
|
std::string("PhysFS failure in FileBuffer::getPosition (") +
|
|
PHYSFS_getLastError() + ")");
|
|
}
|
|
|
|
return pos;
|
|
}
|
|
|
|
uint FileBuffer::getSize() const
|
|
{
|
|
if(file_ == 0)
|
|
{
|
|
throw PreconditionException("No file open in FileBuffer::getSize");
|
|
}
|
|
|
|
PHYSFS_sint64 size = PHYSFS_fileLength(file_);
|
|
|
|
if(size == -1)
|
|
{
|
|
throw APIError(std::string("PhysFS failure in FileBuffer::getSize (") +
|
|
PHYSFS_getLastError() + ")");
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
bool FileBuffer::isOpen() const
|
|
{
|
|
return file_ != 0;
|
|
}
|
|
|
|
}
|
|
}
|