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