//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 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 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; } } }