git repos / blockattack-game

blame: source/code/physfs_stream.hpp

normal view · raw

aca2f4b0 sago007 2009-05-10 18:11 1
/*
aca2f4b0 sago007 2009-05-10 18:11 2
physfs_stream.hpp
aca2f4b0 sago007 2009-05-10 18:11 3
    Copyright (C) 2009 Poul Sander
aca2f4b0 sago007 2009-05-10 18:11 4
        Copied from Warzone 2100
aca2f4b0 sago007 2009-05-10 18:11 5
        http://svn.gna.org/viewcvs/warzone/branches/sound/lib/sound/general/physfs_stream.hpp?rev=3623
aca2f4b0 sago007 2009-05-10 18:11 6
	Copyright (C) 2007 Warzone Resurrection Project
aca2f4b0 sago007 2009-05-10 18:11 7
	Copyright (C) 2007 Giel van Schijndel <me@mortis.eu>
aca2f4b0 sago007 2009-05-10 18:11 8
	Originally part of SuperTux:
aca2f4b0 sago007 2009-05-10 18:11 9
	http://svn.berlios.de/svnroot/repos/supertux/trunk/supertux/src/physfs/physfs_stream.cpp revision 4176
aca2f4b0 sago007 2009-05-10 18:11 10
	Copyright (C) 2006 Matthias Braun <matze@braunis.de>
aca2f4b0 sago007 2009-05-10 18:11 11
aca2f4b0 sago007 2009-05-10 18:11 12
    This program is free software; you can redistribute it and/or modify
aca2f4b0 sago007 2009-05-10 18:11 13
    it under the terms of the GNU General Public License as published by
aca2f4b0 sago007 2009-05-10 18:11 14
    the Free Software Foundation; either version 2 of the License, or
aca2f4b0 sago007 2009-05-10 18:11 15
    (at your option) any later version.
aca2f4b0 sago007 2009-05-10 18:11 16
aca2f4b0 sago007 2009-05-10 18:11 17
    This program is distributed in the hope that it will be useful,
aca2f4b0 sago007 2009-05-10 18:11 18
    but WITHOUT ANY WARRANTY; without even the implied warranty of
aca2f4b0 sago007 2009-05-10 18:11 19
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
aca2f4b0 sago007 2009-05-10 18:11 20
    GNU General Public License for more details.
aca2f4b0 sago007 2009-05-10 18:11 21
aca2f4b0 sago007 2009-05-10 18:11 22
    You should have received a copy of the GNU General Public License
aca2f4b0 sago007 2009-05-10 18:11 23
    along with this program; if not, write to the Free Software
aca2f4b0 sago007 2009-05-10 18:11 24
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
aca2f4b0 sago007 2009-05-10 18:11 25
aca2f4b0 sago007 2009-05-10 18:11 26
    Poul Sander
aca2f4b0 sago007 2009-05-10 18:11 27
    blockattack@poulsander.com
aca2f4b0 sago007 2009-05-10 18:11 28
*/
aca2f4b0 sago007 2009-05-10 18:11 29
aca2f4b0 sago007 2009-05-10 18:11 30
#ifndef __INCLUDED_PHYSFS_STREAM_HPP__
aca2f4b0 sago007 2009-05-10 18:11 31
#define __INCLUDED_PHYSFS_STREAM_HPP__
aca2f4b0 sago007 2009-05-10 18:11 32
aca2f4b0 sago007 2009-05-10 18:11 33
#define BUF_SIZE 1024
aca2f4b0 sago007 2009-05-10 18:11 34
aca2f4b0 sago007 2009-05-10 18:11 35
#include <physfs.h>
aca2f4b0 sago007 2009-05-10 18:11 36
#include <streambuf>
aca2f4b0 sago007 2009-05-10 18:11 37
#include <istream>
aca2f4b0 sago007 2009-05-10 18:11 38
#include <ostream>
aca2f4b0 sago007 2009-05-10 18:11 39
/*Compared to Warzone 2100 boost:array has been replaced by vector to limit
aca2f4b0 sago007 2009-05-10 18:11 40
 the compile requirements*/
aca2f4b0 sago007 2009-05-10 18:11 41
#include <vector>
aca2f4b0 sago007 2009-05-10 18:11 42
aca2f4b0 sago007 2009-05-10 18:11 43
/** This an implementation of "File-based streams" as described in the
aca2f4b0 sago007 2009-05-10 18:11 44
 *  ISO/IEC 14882:1998(E) C++ Standard in chapter 27 "Input/output library",
aca2f4b0 sago007 2009-05-10 18:11 45
 *  section 8 "File-based streams". This implementation however uses PhysicsFS
aca2f4b0 sago007 2009-05-10 18:11 46
 *  instead of the C-library's FILE functions. Also this implementation lacks
aca2f4b0 sago007 2009-05-10 18:11 47
 *  an implementation of basic_fstream because PhysicsFS does not support
aca2f4b0 sago007 2009-05-10 18:11 48
 *  opening a file both for reading as well as writing.
aca2f4b0 sago007 2009-05-10 18:11 49
 *
aca2f4b0 sago007 2009-05-10 18:11 50
 *  This header contains similar classes and typedefs as <fstream> does. Both
aca2f4b0 sago007 2009-05-10 18:11 51
 *  similar in names as well as operation, the main difference is that these
aca2f4b0 sago007 2009-05-10 18:11 52
 *  classes do _not_ reside in namespace std.
aca2f4b0 sago007 2009-05-10 18:11 53
 */
aca2f4b0 sago007 2009-05-10 18:11 54
namespace PhysFS
aca2f4b0 sago007 2009-05-10 18:11 55
{
aca2f4b0 sago007 2009-05-10 18:11 56
    /** Typedefinitions mandated by the C++ standard in section 27.8.1
aca2f4b0 sago007 2009-05-10 18:11 57
     */
aca2f4b0 sago007 2009-05-10 18:11 58
    template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
aca2f4b0 sago007 2009-05-10 18:11 59
        class physfs_filebuf;
aca2f4b0 sago007 2009-05-10 18:11 60
    typedef physfs_filebuf<char>        filebuf;
aca2f4b0 sago007 2009-05-10 18:11 61
    typedef physfs_filebuf<wchar_t>     wfilebuf;
aca2f4b0 sago007 2009-05-10 18:11 62
aca2f4b0 sago007 2009-05-10 18:11 63
    template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
aca2f4b0 sago007 2009-05-10 18:11 64
        class physfs_ifstream;
aca2f4b0 sago007 2009-05-10 18:11 65
    typedef physfs_ifstream<char>       ifstream;
aca2f4b0 sago007 2009-05-10 18:11 66
    typedef physfs_ifstream<wchar_t>    wifstream;
aca2f4b0 sago007 2009-05-10 18:11 67
aca2f4b0 sago007 2009-05-10 18:11 68
    template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
aca2f4b0 sago007 2009-05-10 18:11 69
        class physfs_ofstream;
aca2f4b0 sago007 2009-05-10 18:11 70
    typedef physfs_ofstream<char>       ofstream;
aca2f4b0 sago007 2009-05-10 18:11 71
    typedef physfs_ofstream<wchar_t>    wofstream;
aca2f4b0 sago007 2009-05-10 18:11 72
aca2f4b0 sago007 2009-05-10 18:11 73
    /** This class implements a C++ streambuf object for physfs files.
aca2f4b0 sago007 2009-05-10 18:11 74
     *  So that you can use normal istream and ostream operations on them.
aca2f4b0 sago007 2009-05-10 18:11 75
     *  This class is similar to std::basic_filebuf as defined in
aca2f4b0 sago007 2009-05-10 18:11 76
     *  section 27.8.1.1, except in name.
aca2f4b0 sago007 2009-05-10 18:11 77
     */
aca2f4b0 sago007 2009-05-10 18:11 78
    template<typename _CharT, typename _Traits>
aca2f4b0 sago007 2009-05-10 18:11 79
    class physfs_filebuf : public std::basic_streambuf<_CharT, _Traits>
aca2f4b0 sago007 2009-05-10 18:11 80
    {
aca2f4b0 sago007 2009-05-10 18:11 81
        public:
aca2f4b0 sago007 2009-05-10 18:11 82
            // Types:
aca2f4b0 sago007 2009-05-10 18:11 83
            typedef _CharT                                  char_type;
aca2f4b0 sago007 2009-05-10 18:11 84
            typedef _Traits                                 traits_type;
aca2f4b0 sago007 2009-05-10 18:11 85
            typedef typename traits_type::int_type          int_type;
aca2f4b0 sago007 2009-05-10 18:11 86
            typedef typename traits_type::pos_type          pos_type;
aca2f4b0 sago007 2009-05-10 18:11 87
            typedef typename traits_type::off_type          off_type;
aca2f4b0 sago007 2009-05-10 18:11 88
aca2f4b0 sago007 2009-05-10 18:11 89
            typedef std::basic_streambuf<_CharT, _Traits>   __streambuf_type;
aca2f4b0 sago007 2009-05-10 18:11 90
            typedef physfs_filebuf<_CharT, _Traits>         __filebuf_type;
aca2f4b0 sago007 2009-05-10 18:11 91
aca2f4b0 sago007 2009-05-10 18:11 92
            physfs_filebuf() :
aca2f4b0 sago007 2009-05-10 18:11 93
                _file(0)
aca2f4b0 sago007 2009-05-10 18:11 94
            {
aca2f4b0 sago007 2009-05-10 18:11 95
                _buf.resize(BUF_SIZE);
aca2f4b0 sago007 2009-05-10 18:11 96
            }
aca2f4b0 sago007 2009-05-10 18:11 97
aca2f4b0 sago007 2009-05-10 18:11 98
            virtual ~physfs_filebuf()
aca2f4b0 sago007 2009-05-10 18:11 99
            {
aca2f4b0 sago007 2009-05-10 18:11 100
                close();
aca2f4b0 sago007 2009-05-10 18:11 101
            }
aca2f4b0 sago007 2009-05-10 18:11 102
aca2f4b0 sago007 2009-05-10 18:11 103
            bool is_open() const throw()
aca2f4b0 sago007 2009-05-10 18:11 104
            {
aca2f4b0 sago007 2009-05-10 18:11 105
                return (_file != 0);
aca2f4b0 sago007 2009-05-10 18:11 106
            }
aca2f4b0 sago007 2009-05-10 18:11 107
aca2f4b0 sago007 2009-05-10 18:11 108
            __filebuf_type* open(const char* fileName, std::ios_base::openmode mode)
aca2f4b0 sago007 2009-05-10 18:11 109
            {
aca2f4b0 sago007 2009-05-10 18:11 110
                // Return failure if this file buf is open already
aca2f4b0 sago007 2009-05-10 18:11 111
                if (is_open() != false)
aca2f4b0 sago007 2009-05-10 18:11 112
                    return 0;
aca2f4b0 sago007 2009-05-10 18:11 113
aca2f4b0 sago007 2009-05-10 18:11 114
                // Return failure if we are requested to open a file in an unsupported mode
aca2f4b0 sago007 2009-05-10 18:11 115
                if (!(mode & std::ios_base::binary) ||
aca2f4b0 sago007 2009-05-10 18:11 116
                    (mode & std::ios_base::in &&
aca2f4b0 sago007 2009-05-10 18:11 117
                     mode & std::ios_base::out))
aca2f4b0 sago007 2009-05-10 18:11 118
                    return 0;
aca2f4b0 sago007 2009-05-10 18:11 119
aca2f4b0 sago007 2009-05-10 18:11 120
                // Open the file
aca2f4b0 sago007 2009-05-10 18:11 121
                if (mode & std::ios_base::out &&
aca2f4b0 sago007 2009-05-10 18:11 122
                    mode & std::ios_base::app)
aca2f4b0 sago007 2009-05-10 18:11 123
                {
aca2f4b0 sago007 2009-05-10 18:11 124
                    _file = PHYSFS_openAppend(fileName);
aca2f4b0 sago007 2009-05-10 18:11 125
                    _writeStream = true;
aca2f4b0 sago007 2009-05-10 18:11 126
                }
aca2f4b0 sago007 2009-05-10 18:11 127
                else if (mode & std::ios_base::out)
aca2f4b0 sago007 2009-05-10 18:11 128
                {
aca2f4b0 sago007 2009-05-10 18:11 129
                    _file = PHYSFS_openWrite(fileName);
aca2f4b0 sago007 2009-05-10 18:11 130
                    _writeStream = true;
aca2f4b0 sago007 2009-05-10 18:11 131
                }
aca2f4b0 sago007 2009-05-10 18:11 132
                else if (mode & std::ios_base::in)
aca2f4b0 sago007 2009-05-10 18:11 133
                {
aca2f4b0 sago007 2009-05-10 18:11 134
                    _file = PHYSFS_openRead(fileName);
aca2f4b0 sago007 2009-05-10 18:11 135
                    _writeStream = false;
aca2f4b0 sago007 2009-05-10 18:11 136
                }
aca2f4b0 sago007 2009-05-10 18:11 137
                else
aca2f4b0 sago007 2009-05-10 18:11 138
                {
aca2f4b0 sago007 2009-05-10 18:11 139
                    return 0;
aca2f4b0 sago007 2009-05-10 18:11 140
                }
aca2f4b0 sago007 2009-05-10 18:11 141
aca2f4b0 sago007 2009-05-10 18:11 142
                if (!_file)
aca2f4b0 sago007 2009-05-10 18:11 143
                    return 0;
aca2f4b0 sago007 2009-05-10 18:11 144
aca2f4b0 sago007 2009-05-10 18:11 145
                if (mode & std::ios_base::ate &&
aca2f4b0 sago007 2009-05-10 18:11 146
                    mode & std::ios_base::in)
aca2f4b0 sago007 2009-05-10 18:11 147
                {
aca2f4b0 sago007 2009-05-10 18:11 148
                    if (!PHYSFS_seek(_file, PHYSFS_fileLength(_file)))
aca2f4b0 sago007 2009-05-10 18:11 149
                    {
aca2f4b0 sago007 2009-05-10 18:11 150
                        close();
aca2f4b0 sago007 2009-05-10 18:11 151
                        return 0;
aca2f4b0 sago007 2009-05-10 18:11 152
                    }
aca2f4b0 sago007 2009-05-10 18:11 153
                }
aca2f4b0 sago007 2009-05-10 18:11 154
aca2f4b0 sago007 2009-05-10 18:11 155
                return this;
aca2f4b0 sago007 2009-05-10 18:11 156
            }
aca2f4b0 sago007 2009-05-10 18:11 157
aca2f4b0 sago007 2009-05-10 18:11 158
            __filebuf_type* close()
aca2f4b0 sago007 2009-05-10 18:11 159
            {
aca2f4b0 sago007 2009-05-10 18:11 160
                // Return failure if this file buf is closed already
aca2f4b0 sago007 2009-05-10 18:11 161
                if (is_open() == false)
aca2f4b0 sago007 2009-05-10 18:11 162
                    return 0;
aca2f4b0 sago007 2009-05-10 18:11 163
aca2f4b0 sago007 2009-05-10 18:11 164
                sync();
aca2f4b0 sago007 2009-05-10 18:11 165
aca2f4b0 sago007 2009-05-10 18:11 166
                if (!PHYSFS_close(_file))
aca2f4b0 sago007 2009-05-10 18:11 167
                {
aca2f4b0 sago007 2009-05-10 18:11 168
                    return 0;
aca2f4b0 sago007 2009-05-10 18:11 169
                }
aca2f4b0 sago007 2009-05-10 18:11 170
aca2f4b0 sago007 2009-05-10 18:11 171
                _file = 0;
aca2f4b0 sago007 2009-05-10 18:11 172
aca2f4b0 sago007 2009-05-10 18:11 173
                return this;
aca2f4b0 sago007 2009-05-10 18:11 174
            }
aca2f4b0 sago007 2009-05-10 18:11 175
aca2f4b0 sago007 2009-05-10 18:11 176
        protected:
aca2f4b0 sago007 2009-05-10 18:11 177
            // Read stuff:
aca2f4b0 sago007 2009-05-10 18:11 178
            virtual int_type underflow()
aca2f4b0 sago007 2009-05-10 18:11 179
            {
aca2f4b0 sago007 2009-05-10 18:11 180
                if (!is_open() || _writeStream)
aca2f4b0 sago007 2009-05-10 18:11 181
                    return traits_type::eof();
aca2f4b0 sago007 2009-05-10 18:11 182
aca2f4b0 sago007 2009-05-10 18:11 183
                if(PHYSFS_eof(_file))
aca2f4b0 sago007 2009-05-10 18:11 184
                {
aca2f4b0 sago007 2009-05-10 18:11 185
                    return traits_type::eof();
aca2f4b0 sago007 2009-05-10 18:11 186
                }
aca2f4b0 sago007 2009-05-10 18:11 187
aca2f4b0 sago007 2009-05-10 18:11 188
                PHYSFS_sint64 objectsRead = PHYSFS_read(_file, &*_buf.begin(), sizeof(char_type), BUF_SIZE);
aca2f4b0 sago007 2009-05-10 18:11 189
aca2f4b0 sago007 2009-05-10 18:11 190
                if(objectsRead <= 0)
aca2f4b0 sago007 2009-05-10 18:11 191
                {
aca2f4b0 sago007 2009-05-10 18:11 192
                    return traits_type::eof();
aca2f4b0 sago007 2009-05-10 18:11 193
                }
aca2f4b0 sago007 2009-05-10 18:11 194
aca2f4b0 sago007 2009-05-10 18:11 195
                char_type* xend = (static_cast<size_t> (objectsRead) == BUF_SIZE) ? &*_buf.end() : &_buf[objectsRead];
aca2f4b0 sago007 2009-05-10 18:11 196
                setg(&*_buf.begin(), &*_buf.begin(), xend);
aca2f4b0 sago007 2009-05-10 18:11 197
aca2f4b0 sago007 2009-05-10 18:11 198
                return traits_type::to_int_type(_buf.front());
aca2f4b0 sago007 2009-05-10 18:11 199
            }
aca2f4b0 sago007 2009-05-10 18:11 200
aca2f4b0 sago007 2009-05-10 18:11 201
            virtual pos_type seekpos(pos_type pos, std::ios_base::openmode)
aca2f4b0 sago007 2009-05-10 18:11 202
            {
aca2f4b0 sago007 2009-05-10 18:11 203
                if (!is_open() || _writeStream)
aca2f4b0 sago007 2009-05-10 18:11 204
                    return pos_type(off_type(-1));
aca2f4b0 sago007 2009-05-10 18:11 205
aca2f4b0 sago007 2009-05-10 18:11 206
                if(PHYSFS_seek(_file, static_cast<PHYSFS_uint64> (pos)) == 0)
aca2f4b0 sago007 2009-05-10 18:11 207
                {
aca2f4b0 sago007 2009-05-10 18:11 208
                    return pos_type(off_type(-1));
aca2f4b0 sago007 2009-05-10 18:11 209
                }
aca2f4b0 sago007 2009-05-10 18:11 210
aca2f4b0 sago007 2009-05-10 18:11 211
                // the seek invalidated the buffer
aca2f4b0 sago007 2009-05-10 18:11 212
                setg(&*_buf.begin(), &*_buf.begin(), &*_buf.begin());
aca2f4b0 sago007 2009-05-10 18:11 213
                return pos;
aca2f4b0 sago007 2009-05-10 18:11 214
            }
aca2f4b0 sago007 2009-05-10 18:11 215
aca2f4b0 sago007 2009-05-10 18:11 216
            virtual pos_type seekoff(off_type off, std::ios_base::seekdir dir, std::ios_base::openmode mode)
aca2f4b0 sago007 2009-05-10 18:11 217
            {
aca2f4b0 sago007 2009-05-10 18:11 218
                if (!is_open() || _writeStream)
aca2f4b0 sago007 2009-05-10 18:11 219
                    return pos_type(off_type(-1));
aca2f4b0 sago007 2009-05-10 18:11 220
aca2f4b0 sago007 2009-05-10 18:11 221
                off_type pos = off;
aca2f4b0 sago007 2009-05-10 18:11 222
aca2f4b0 sago007 2009-05-10 18:11 223
                switch (dir)
aca2f4b0 sago007 2009-05-10 18:11 224
                {
aca2f4b0 sago007 2009-05-10 18:11 225
                    case std::ios_base::beg:
aca2f4b0 sago007 2009-05-10 18:11 226
                        break;
aca2f4b0 sago007 2009-05-10 18:11 227
aca2f4b0 sago007 2009-05-10 18:11 228
                    case std::ios_base::cur:
aca2f4b0 sago007 2009-05-10 18:11 229
                    {
aca2f4b0 sago007 2009-05-10 18:11 230
                        PHYSFS_sint64 ptell = PHYSFS_tell(_file);
aca2f4b0 sago007 2009-05-10 18:11 231
                        pos_type buf_tell = static_cast<pos_type> (ptell) - static_cast<pos_type> (__streambuf_type::egptr() - __streambuf_type::gptr());
aca2f4b0 sago007 2009-05-10 18:11 232
                        if(off == 0)
aca2f4b0 sago007 2009-05-10 18:11 233
                        {
aca2f4b0 sago007 2009-05-10 18:11 234
                            return buf_tell;
aca2f4b0 sago007 2009-05-10 18:11 235
                        }
aca2f4b0 sago007 2009-05-10 18:11 236
aca2f4b0 sago007 2009-05-10 18:11 237
                        pos += static_cast<off_type> (buf_tell);
aca2f4b0 sago007 2009-05-10 18:11 238
                        break;
aca2f4b0 sago007 2009-05-10 18:11 239
                    }
aca2f4b0 sago007 2009-05-10 18:11 240
aca2f4b0 sago007 2009-05-10 18:11 241
                    case std::ios_base::end:
aca2f4b0 sago007 2009-05-10 18:11 242
                        pos = static_cast<off_type> (PHYSFS_fileLength(_file)) - pos;
aca2f4b0 sago007 2009-05-10 18:11 243
                        break;
aca2f4b0 sago007 2009-05-10 18:11 244
aca2f4b0 sago007 2009-05-10 18:11 245
                    default:
aca2f4b0 sago007 2009-05-10 18:11 246
                        //assert(!"invalid seekdirection");
aca2f4b0 sago007 2009-05-10 18:11 247
                        return pos_type(off_type(-1));
aca2f4b0 sago007 2009-05-10 18:11 248
                }
aca2f4b0 sago007 2009-05-10 18:11 249
aca2f4b0 sago007 2009-05-10 18:11 250
                return seekpos(static_cast<pos_type> (pos), mode);
aca2f4b0 sago007 2009-05-10 18:11 251
            }
aca2f4b0 sago007 2009-05-10 18:11 252
aca2f4b0 sago007 2009-05-10 18:11 253
            // Write stuff:
aca2f4b0 sago007 2009-05-10 18:11 254
            virtual int_type overflow(int_type c = traits_type::eof())
aca2f4b0 sago007 2009-05-10 18:11 255
            {
aca2f4b0 sago007 2009-05-10 18:11 256
                if (!is_open() || !_writeStream)
aca2f4b0 sago007 2009-05-10 18:11 257
                    return traits_type::eof();
aca2f4b0 sago007 2009-05-10 18:11 258
aca2f4b0 sago007 2009-05-10 18:11 259
                size_t size = __streambuf_type::pptr() - __streambuf_type::pbase();
aca2f4b0 sago007 2009-05-10 18:11 260
                if(size == 0)
aca2f4b0 sago007 2009-05-10 18:11 261
                    return 0;
aca2f4b0 sago007 2009-05-10 18:11 262
aca2f4b0 sago007 2009-05-10 18:11 263
                PHYSFS_sint64 res = PHYSFS_write(_file, __streambuf_type::pbase(), sizeof(char_type), size);
aca2f4b0 sago007 2009-05-10 18:11 264
aca2f4b0 sago007 2009-05-10 18:11 265
                if(res <= 0)
aca2f4b0 sago007 2009-05-10 18:11 266
                    return traits_type::eof();
aca2f4b0 sago007 2009-05-10 18:11 267
aca2f4b0 sago007 2009-05-10 18:11 268
                if(!traits_type::eq_int_type(c, traits_type::eof()))
aca2f4b0 sago007 2009-05-10 18:11 269
                {
aca2f4b0 sago007 2009-05-10 18:11 270
                    PHYSFS_sint64 res = PHYSFS_write(_file, &c, sizeof(char_type), 1);
aca2f4b0 sago007 2009-05-10 18:11 271
aca2f4b0 sago007 2009-05-10 18:11 272
                    if(res <= 0)
aca2f4b0 sago007 2009-05-10 18:11 273
                        return traits_type::eof();
aca2f4b0 sago007 2009-05-10 18:11 274
                }
aca2f4b0 sago007 2009-05-10 18:11 275
aca2f4b0 sago007 2009-05-10 18:11 276
                char_type* xend = (static_cast<size_t> (res) == BUF_SIZE) ? &*_buf.end() : &_buf[res];
aca2f4b0 sago007 2009-05-10 18:11 277
                setp(&*_buf.begin(), xend);
aca2f4b0 sago007 2009-05-10 18:11 278
                return 0;
aca2f4b0 sago007 2009-05-10 18:11 279
            }
aca2f4b0 sago007 2009-05-10 18:11 280
aca2f4b0 sago007 2009-05-10 18:11 281
            virtual int sync()
aca2f4b0 sago007 2009-05-10 18:11 282
            {
aca2f4b0 sago007 2009-05-10 18:11 283
                if (!is_open() || !_writeStream)
aca2f4b0 sago007 2009-05-10 18:11 284
                    return -1;
aca2f4b0 sago007 2009-05-10 18:11 285
aca2f4b0 sago007 2009-05-10 18:11 286
                return overflow(traits_type::eof());
aca2f4b0 sago007 2009-05-10 18:11 287
            }
aca2f4b0 sago007 2009-05-10 18:11 288
aca2f4b0 sago007 2009-05-10 18:11 289
            virtual std::streamsize showmanyc()
aca2f4b0 sago007 2009-05-10 18:11 290
            {
aca2f4b0 sago007 2009-05-10 18:11 291
                if (!is_open() || _writeStream)
aca2f4b0 sago007 2009-05-10 18:11 292
                    return -1;
aca2f4b0 sago007 2009-05-10 18:11 293
aca2f4b0 sago007 2009-05-10 18:11 294
                PHYSFS_sint64 fileSize = PHYSFS_fileLength(_file);
aca2f4b0 sago007 2009-05-10 18:11 295
aca2f4b0 sago007 2009-05-10 18:11 296
                return static_cast<int> (fileSize);
aca2f4b0 sago007 2009-05-10 18:11 297
            }
aca2f4b0 sago007 2009-05-10 18:11 298
aca2f4b0 sago007 2009-05-10 18:11 299
        private:
aca2f4b0 sago007 2009-05-10 18:11 300
            PHYSFS_file* _file;
aca2f4b0 sago007 2009-05-10 18:11 301
            bool _writeStream;
aca2f4b0 sago007 2009-05-10 18:11 302
            vector<char_type> _buf;
aca2f4b0 sago007 2009-05-10 18:11 303
    };
aca2f4b0 sago007 2009-05-10 18:11 304
aca2f4b0 sago007 2009-05-10 18:11 305
    /** This class implements a C++ istream object for physfs files.
aca2f4b0 sago007 2009-05-10 18:11 306
     *  This class is similar to std::basic_ifstream as defined in
aca2f4b0 sago007 2009-05-10 18:11 307
     *  section 27.8.1.5, except in name.
aca2f4b0 sago007 2009-05-10 18:11 308
     */
aca2f4b0 sago007 2009-05-10 18:11 309
    template<typename _CharT, typename _Traits>
aca2f4b0 sago007 2009-05-10 18:11 310
    class physfs_ifstream : public std::basic_istream<_CharT, _Traits>
aca2f4b0 sago007 2009-05-10 18:11 311
    {
aca2f4b0 sago007 2009-05-10 18:11 312
        public:
aca2f4b0 sago007 2009-05-10 18:11 313
            // Types:
aca2f4b0 sago007 2009-05-10 18:11 314
            typedef _CharT                                  char_type;
aca2f4b0 sago007 2009-05-10 18:11 315
            typedef _Traits                                 traits_type;
aca2f4b0 sago007 2009-05-10 18:11 316
            typedef typename traits_type::int_type          int_type;
aca2f4b0 sago007 2009-05-10 18:11 317
            typedef typename traits_type::pos_type          pos_type;
aca2f4b0 sago007 2009-05-10 18:11 318
            typedef typename traits_type::off_type          off_type;
aca2f4b0 sago007 2009-05-10 18:11 319
aca2f4b0 sago007 2009-05-10 18:11 320
            typedef physfs_filebuf<_CharT, _Traits>         __filebuf_type;
aca2f4b0 sago007 2009-05-10 18:11 321
            typedef std::basic_istream<_CharT, _Traits>     __istream_type;
aca2f4b0 sago007 2009-05-10 18:11 322
aca2f4b0 sago007 2009-05-10 18:11 323
            physfs_ifstream() throw() :
aca2f4b0 sago007 2009-05-10 18:11 324
                __istream_type(&_sb)
aca2f4b0 sago007 2009-05-10 18:11 325
            {
aca2f4b0 sago007 2009-05-10 18:11 326
            }
aca2f4b0 sago007 2009-05-10 18:11 327
aca2f4b0 sago007 2009-05-10 18:11 328
            explicit physfs_ifstream(const char* fileName, std::ios_base::openmode mode = std::ios_base::binary) :
aca2f4b0 sago007 2009-05-10 18:11 329
                __istream_type(&_sb)
aca2f4b0 sago007 2009-05-10 18:11 330
            {
aca2f4b0 sago007 2009-05-10 18:11 331
                open(fileName, mode);
aca2f4b0 sago007 2009-05-10 18:11 332
            }
aca2f4b0 sago007 2009-05-10 18:11 333
aca2f4b0 sago007 2009-05-10 18:11 334
            const __filebuf_type* rdbuf() const throw()
aca2f4b0 sago007 2009-05-10 18:11 335
            {
aca2f4b0 sago007 2009-05-10 18:11 336
                return &_sb;
aca2f4b0 sago007 2009-05-10 18:11 337
            }
aca2f4b0 sago007 2009-05-10 18:11 338
aca2f4b0 sago007 2009-05-10 18:11 339
            __filebuf_type* rdbuf() throw()
aca2f4b0 sago007 2009-05-10 18:11 340
            {
aca2f4b0 sago007 2009-05-10 18:11 341
                return &_sb;
aca2f4b0 sago007 2009-05-10 18:11 342
            }
aca2f4b0 sago007 2009-05-10 18:11 343
aca2f4b0 sago007 2009-05-10 18:11 344
            bool is_open() const throw()
aca2f4b0 sago007 2009-05-10 18:11 345
            {
aca2f4b0 sago007 2009-05-10 18:11 346
                return rdbuf()->is_open();
aca2f4b0 sago007 2009-05-10 18:11 347
            }
aca2f4b0 sago007 2009-05-10 18:11 348
aca2f4b0 sago007 2009-05-10 18:11 349
            void open(const char* fileName, std::ios_base::openmode mode = std::ios_base::binary)
aca2f4b0 sago007 2009-05-10 18:11 350
            {
aca2f4b0 sago007 2009-05-10 18:11 351
                if (!rdbuf()->open(fileName, mode | std::ios_base::in))
aca2f4b0 sago007 2009-05-10 18:11 352
                {
aca2f4b0 sago007 2009-05-10 18:11 353
                    __istream_type::setstate(std::ios_base::failbit);
aca2f4b0 sago007 2009-05-10 18:11 354
                }
aca2f4b0 sago007 2009-05-10 18:11 355
            }
aca2f4b0 sago007 2009-05-10 18:11 356
aca2f4b0 sago007 2009-05-10 18:11 357
            void close()
aca2f4b0 sago007 2009-05-10 18:11 358
            {
aca2f4b0 sago007 2009-05-10 18:11 359
                if (!rdbuf()->close())
aca2f4b0 sago007 2009-05-10 18:11 360
                {
aca2f4b0 sago007 2009-05-10 18:11 361
                    __istream_type::setstate(std::ios_base::failbit);
aca2f4b0 sago007 2009-05-10 18:11 362
                }
aca2f4b0 sago007 2009-05-10 18:11 363
            }
aca2f4b0 sago007 2009-05-10 18:11 364
aca2f4b0 sago007 2009-05-10 18:11 365
        private:
aca2f4b0 sago007 2009-05-10 18:11 366
            __filebuf_type _sb;
aca2f4b0 sago007 2009-05-10 18:11 367
    };
aca2f4b0 sago007 2009-05-10 18:11 368
aca2f4b0 sago007 2009-05-10 18:11 369
    /** This class implements a C++ ostream object for physfs files.
aca2f4b0 sago007 2009-05-10 18:11 370
     *  This class is similar to std::basic_ofstream as defined in
aca2f4b0 sago007 2009-05-10 18:11 371
     *  section 27.8.1.8, except in name.
aca2f4b0 sago007 2009-05-10 18:11 372
     */
aca2f4b0 sago007 2009-05-10 18:11 373
    template<typename _CharT, typename _Traits>
aca2f4b0 sago007 2009-05-10 18:11 374
    class physfs_ofstream : public std::basic_ostream<_CharT, _Traits>
aca2f4b0 sago007 2009-05-10 18:11 375
    {
aca2f4b0 sago007 2009-05-10 18:11 376
        public:
aca2f4b0 sago007 2009-05-10 18:11 377
            // Types:
aca2f4b0 sago007 2009-05-10 18:11 378
            typedef _CharT                                  char_type;
aca2f4b0 sago007 2009-05-10 18:11 379
            typedef _Traits                                 traits_type;
aca2f4b0 sago007 2009-05-10 18:11 380
            typedef typename traits_type::int_type          int_type;
aca2f4b0 sago007 2009-05-10 18:11 381
            typedef typename traits_type::pos_type          pos_type;
aca2f4b0 sago007 2009-05-10 18:11 382
            typedef typename traits_type::off_type          off_type;
aca2f4b0 sago007 2009-05-10 18:11 383
aca2f4b0 sago007 2009-05-10 18:11 384
            typedef physfs_filebuf<_CharT, _Traits>         __filebuf_type;
aca2f4b0 sago007 2009-05-10 18:11 385
            typedef std::basic_ostream<_CharT, _Traits>     __ostream_type;
aca2f4b0 sago007 2009-05-10 18:11 386
aca2f4b0 sago007 2009-05-10 18:11 387
            physfs_ofstream() throw() :
aca2f4b0 sago007 2009-05-10 18:11 388
                __ostream_type(&_sb)
aca2f4b0 sago007 2009-05-10 18:11 389
            {
aca2f4b0 sago007 2009-05-10 18:11 390
            }
aca2f4b0 sago007 2009-05-10 18:11 391
aca2f4b0 sago007 2009-05-10 18:11 392
            explicit physfs_ofstream(const char* fileName, std::ios_base::openmode mode = std::ios_base::binary) :
aca2f4b0 sago007 2009-05-10 18:11 393
                __ostream_type(&_sb)
aca2f4b0 sago007 2009-05-10 18:11 394
            {
aca2f4b0 sago007 2009-05-10 18:11 395
                open(fileName, mode);
aca2f4b0 sago007 2009-05-10 18:11 396
            }
aca2f4b0 sago007 2009-05-10 18:11 397
aca2f4b0 sago007 2009-05-10 18:11 398
            const __filebuf_type* rdbuf() const throw()
aca2f4b0 sago007 2009-05-10 18:11 399
            {
aca2f4b0 sago007 2009-05-10 18:11 400
                return &_sb;
aca2f4b0 sago007 2009-05-10 18:11 401
            }
aca2f4b0 sago007 2009-05-10 18:11 402
aca2f4b0 sago007 2009-05-10 18:11 403
            __filebuf_type* rdbuf() throw()
aca2f4b0 sago007 2009-05-10 18:11 404
            {
aca2f4b0 sago007 2009-05-10 18:11 405
                return &_sb;
aca2f4b0 sago007 2009-05-10 18:11 406
            }
aca2f4b0 sago007 2009-05-10 18:11 407
aca2f4b0 sago007 2009-05-10 18:11 408
            bool is_open() const throw()
aca2f4b0 sago007 2009-05-10 18:11 409
            {
aca2f4b0 sago007 2009-05-10 18:11 410
                return rdbuf()->is_open();
aca2f4b0 sago007 2009-05-10 18:11 411
            }
aca2f4b0 sago007 2009-05-10 18:11 412
aca2f4b0 sago007 2009-05-10 18:11 413
            void open(const char* fileName, std::ios_base::openmode mode = std::ios_base::binary)
aca2f4b0 sago007 2009-05-10 18:11 414
            {
aca2f4b0 sago007 2009-05-10 18:11 415
                if (!rdbuf()->open(fileName, mode | std::ios_base::out))
aca2f4b0 sago007 2009-05-10 18:11 416
                {
aca2f4b0 sago007 2009-05-10 18:11 417
                    __ostream_type::setstate(std::ios_base::failbit);
aca2f4b0 sago007 2009-05-10 18:11 418
                }
aca2f4b0 sago007 2009-05-10 18:11 419
            }
aca2f4b0 sago007 2009-05-10 18:11 420
aca2f4b0 sago007 2009-05-10 18:11 421
            void close()
aca2f4b0 sago007 2009-05-10 18:11 422
            {
aca2f4b0 sago007 2009-05-10 18:11 423
                if (!rdbuf()->close())
aca2f4b0 sago007 2009-05-10 18:11 424
                {
aca2f4b0 sago007 2009-05-10 18:11 425
                    __ostream_type::setstate(std::ios_base::failbit);
aca2f4b0 sago007 2009-05-10 18:11 426
                }
aca2f4b0 sago007 2009-05-10 18:11 427
            }
aca2f4b0 sago007 2009-05-10 18:11 428
aca2f4b0 sago007 2009-05-10 18:11 429
        private:
aca2f4b0 sago007 2009-05-10 18:11 430
            __filebuf_type _sb;
aca2f4b0 sago007 2009-05-10 18:11 431
    };
aca2f4b0 sago007 2009-05-10 18:11 432
}
aca2f4b0 sago007 2009-05-10 18:11 433
aca2f4b0 sago007 2009-05-10 18:11 434
#endif // __INCLUDED_PHYSFS_STREAM_HPP__
1970-01-01 00:00 435