From: Matthias Braun Date: Tue, 7 Jun 2005 16:27:06 +0000 (+0000) Subject: forgot to add some files X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=36266bca23c8ef1a4b036572b7c5fa07df7a1afd;p=supertux.git forgot to add some files SVN-Revision: 2576 --- diff --git a/src/physfs/physfs_sdl.cpp b/src/physfs/physfs_sdl.cpp new file mode 100644 index 000000000..4cff76d9e --- /dev/null +++ b/src/physfs/physfs_sdl.cpp @@ -0,0 +1,93 @@ +/* +Copyright (C) 2005 Matthias Braun + +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. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +#include + +#include "physfs_sdl.h" + +#include + +#include +#include +#include + +#include + +static int funcSeek(struct SDL_RWops* context, int offset, int whence) +{ + PHYSFS_file* file = (PHYSFS_file*) context->hidden.unknown.data1; + int res; + switch(whence) { + case SEEK_SET: + res = PHYSFS_seek(file, offset); + break; + case SEEK_CUR: + res = PHYSFS_seek(file, PHYSFS_tell(file) + offset); + break; + case SEEK_END: + res = PHYSFS_seek(file, PHYSFS_fileLength(file) + offset); + break; + default: + res = 0; + assert(false); + break; + } + if(res == 0) { + std::cerr << "Error seeking in file: " << PHYSFS_getLastError() << "\n"; + return -1; + } + + return (int) PHYSFS_tell(file); +} + +static int funcRead(struct SDL_RWops* context, void* ptr, int size, int maxnum) +{ + PHYSFS_file* file = (PHYSFS_file*) context->hidden.unknown.data1; + + int res = PHYSFS_read(file, ptr, size, maxnum); + return res; +} + +static int funcClose(struct SDL_RWops* context) +{ + PHYSFS_file* file = (PHYSFS_file*) context->hidden.unknown.data1; + + PHYSFS_close(file); + delete context; + + return 0; +} + +SDL_RWops* get_physfs_SDLRWops(const std::string& filename) +{ + PHYSFS_file* file = (PHYSFS_file*) PHYSFS_openRead(filename.c_str()); + if(!file) { + std::stringstream msg; + msg << "Couldn't open '" << filename << "': " + << PHYSFS_getLastError(); + throw std::runtime_error(msg.str()); + } + + SDL_RWops* ops = new SDL_RWops(); + ops->type = 0; + ops->hidden.unknown.data1 = file; + ops->seek = funcSeek; + ops->read = funcRead; + ops->write = 0; + ops->close = funcClose; + return ops; +} diff --git a/src/physfs/physfs_sdl.h b/src/physfs/physfs_sdl.h new file mode 100644 index 000000000..d78d21030 --- /dev/null +++ b/src/physfs/physfs_sdl.h @@ -0,0 +1,27 @@ +/* +Copyright (C) 2005 Matthias Braun + +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. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +#ifndef __PHYSFSSDL_HPP__ +#define __PHYSFSSDL_HPP__ + +#include +#include + +SDL_RWops* get_physfs_SDLRWops(const std::string& filename); + +#endif + diff --git a/src/physfs/physfs_stream.cpp b/src/physfs/physfs_stream.cpp new file mode 100644 index 000000000..0a41a545c --- /dev/null +++ b/src/physfs/physfs_stream.cpp @@ -0,0 +1,127 @@ +/* +Copyright (C) 2005 Matthias Braun + +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. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +#include + +#include "physfs_stream.h" + +#include +#include +#include + +IFileStreambuf::IFileStreambuf(const std::string& filename) +{ + file = PHYSFS_openRead(filename.c_str()); + if(file == 0) { + std::stringstream msg; + msg << "Couldn't open file '" << filename << "': " + << PHYSFS_getLastError(); + throw std::runtime_error(msg.str()); + } +} + +IFileStreambuf::~IFileStreambuf() +{ + PHYSFS_close(file); +} + +int +IFileStreambuf::underflow() +{ + if(PHYSFS_eof(file)) + return traits_type::eof(); + + size_t bytesread = (size_t) PHYSFS_read(file, buf, 1, sizeof(buf)); + if(bytesread == 0) + return traits_type::eof(); + setg(buf, buf, buf + bytesread); + + return buf[0]; +} + +//--------------------------------------------------------------------------- + +OFileStreambuf::OFileStreambuf(const std::string& filename) +{ + file = PHYSFS_openWrite(filename.c_str()); + if(file == 0) { + std::stringstream msg; + msg << "Couldn't open file '" << filename << "': " + << PHYSFS_getLastError(); + throw std::runtime_error(msg.str()); + } + + setp(buf, buf+sizeof(buf)); +} + +OFileStreambuf::~OFileStreambuf() +{ + sync(); + PHYSFS_close(file); +} + +int +OFileStreambuf::overflow(int c) +{ + if(pbase() == pptr()) + return 0; + + size_t size = pptr() - pbase(); + PHYSFS_sint64 res = PHYSFS_write(file, pbase(), 1, size); + if(res <= 0) + return traits_type::eof(); + + if(c != traits_type::eof()) { + PHYSFS_sint64 res = PHYSFS_write(file, &c, 1, 1); + if(res <= 0) + return traits_type::eof(); + } + + setp(buf, buf + res); + return 0; +} + +int +OFileStreambuf::sync() +{ + return overflow(traits_type::eof()); +} + +//--------------------------------------------------------------------------- + +IFileStream::IFileStream(const std::string& filename) + : std::istream(new IFileStreambuf(filename)) +{ +} + +IFileStream::~IFileStream() +{ + delete rdbuf(); +} + +//--------------------------------------------------------------------------- + +OFileStream::OFileStream(const std::string& filename) + : std::ostream(new OFileStreambuf(filename)) +{ +} + +OFileStream::~OFileStream() +{ + delete rdbuf(); +} + diff --git a/src/physfs/physfs_stream.h b/src/physfs/physfs_stream.h new file mode 100644 index 000000000..5267483af --- /dev/null +++ b/src/physfs/physfs_stream.h @@ -0,0 +1,73 @@ +/* +Copyright (C) 2004 by Matthias Braun + +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. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +#ifndef __PHYSFSSTREAM_HPP__ +#define __PHYSFSSTREAM_HPP__ + +#include +#include +#include +#include + +/** This class implements a C++ streambuf object for physfs files. + * So that you can use normal istream operations on them + */ +class IFileStreambuf : public std::streambuf +{ +public: + IFileStreambuf(const std::string& filename); + ~IFileStreambuf(); + +protected: + virtual int underflow(); + +private: + PHYSFS_file* file; + char buf[1024]; +}; + +class OFileStreambuf : public std::streambuf +{ +public: + OFileStreambuf(const std::string& filename); + ~OFileStreambuf(); + +protected: + virtual int overflow(int c); + virtual int sync(); + +private: + PHYSFS_file* file; + char buf[1024]; +}; + +class IFileStream : public std::istream +{ +public: + IFileStream(const std::string& filename); + ~IFileStream(); +}; + +class OFileStream : public std::ostream +{ +public: + OFileStream(const std::string& filename); + ~OFileStream(); +}; + +#endif +