# OgreDataStream.h

Go to the documentation of this file.

    00001 /*
    00002 -----------------------------------------------------------------------------
    00003 This source file is part of OGRE
    00004 (Object-oriented Graphics Rendering Engine)
    00005 For the latest info, see http://www.ogre3d.org/
    00006
    00007 Copyright (c) 2000-2009 Torus Knot Software Ltd
    00008
    00009 Permission is hereby granted, free of charge, to any person obtaining a copy
    00010 of this software and associated documentation files (the "Software"), to deal
    00011 in the Software without restriction, including without limitation the rights
    00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    00013 copies of the Software, and to permit persons to whom the Software is
    00014 furnished to do so, subject to the following conditions:
    00015
    00016 The above copyright notice and this permission notice shall be included in
    00017 all copies or substantial portions of the Software.
    00018
    00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    00025 THE SOFTWARE.
    00026 -----------------------------------------------------------------------------
    00027 */
    00028 #ifndef __DataStream_H__
    00029 #define __DataStream_H__
    00030
    00031 #include "OgrePrerequisites.h"
    00032 #include "OgreString.h"
    00033 #include "OgreSharedPtr.h"
    00034 #include <istream>
    00035
    00036 namespace Ogre {
    00063     class _OgreExport DataStream : public StreamAlloc
    00064     {
    00065     public:
    00066         enum AccessMode
    00067         {
    00068             READ = 1,
    00069             WRITE = 2
    00070         };
    00071     protected:
    00073         String mName;
    00075         size_t mSize;
    00077         uint16 mAccess;
    00078
    00079         #define OGRE_STREAM_TEMP_SIZE 128
    00080     public:
    00082         DataStream(uint16 accessMode = READ) : mSize(0), mAccess(accessMode) {}
    00084         DataStream(const String& name, uint16 accessMode = READ)
    00085             : mName(name), mSize(0), mAccess(accessMode) {}
    00087         const String& getName(void) { return mName; }
    00089         uint16 getAccessMode() const { return mAccess; }
    00091         virtual bool isReadable() const { return (mAccess & READ) != 0; }
    00093         virtual bool isWriteable() const { return (mAccess & WRITE) != 0; }
    00094         virtual ~DataStream() {}
    00095         // Streaming operators
    00096         template<typename T> DataStream& operator>>(T& val);
    00103         virtual size_t read(void* buf, size_t count) = 0;
    00110         virtual size_t write(const void* buf, size_t count)
    00111         {
    00112                         (void)buf;
    00113                         (void)count;
    00114             // default to not supported
    00115             return 0;
    00116         }
    00117
    00132         virtual size_t readLine(char* buf, size_t maxCount, const String& delim = "\n");
    00133
    00148         virtual String getLine( bool trimAfter = true );
    00149
    00155         virtual String getAsString(void);
    00156
    00164         virtual size_t skipLine(const String& delim = "\n");
    00165
    00168         virtual void skip(long count) = 0;
    00169
    00172         virtual void seek( size_t pos ) = 0;
    00173
    00175         virtual size_t tell(void) const = 0;
    00176
    00179         virtual bool eof(void) const = 0;
    00180
    00184         size_t size(void) const { return mSize; }
    00185
    00187         virtual void close(void) = 0;
    00188
    00189
    00190     };
    00191
    00195     typedef SharedPtr<DataStream> DataStreamPtr;
    00196
    00198     typedef list<DataStreamPtr>::type DataStreamList;
    00200     typedef SharedPtr<DataStreamList> DataStreamListPtr;
    00201
    00204     class _OgreExport MemoryDataStream : public DataStream
    00205     {
    00206     protected:
    00208         uchar* mData;
    00210         uchar* mPos;
    00212         uchar* mEnd;
    00214         bool mFreeOnClose;
    00215     public:
    00216
    00227         MemoryDataStream(void* pMem, size_t size, bool freeOnClose = false, bool readOnly = false);
    00228
    00240         MemoryDataStream(const String& name, void* pMem, size_t size,
    00241                 bool freeOnClose = false, bool readOnly = false);
    00242
    00254         MemoryDataStream(DataStream& sourceStream,
    00255                 bool freeOnClose = true, bool readOnly = false);
    00256
    00268         MemoryDataStream(DataStreamPtr& sourceStream,
    00269                 bool freeOnClose = true, bool readOnly = false);
    00270
    00284         MemoryDataStream(const String& name, DataStream& sourceStream,
    00285                 bool freeOnClose = true, bool readOnly = false);
    00286
    00300         MemoryDataStream(const String& name, const DataStreamPtr& sourceStream,
    00301             bool freeOnClose = true, bool readOnly = false);
    00302
    00309         MemoryDataStream(size_t size, bool freeOnClose = true, bool readOnly = false);
    00317         MemoryDataStream(const String& name, size_t size,
    00318                 bool freeOnClose = true, bool readOnly = false);
    00319
    00320         ~MemoryDataStream();
    00321
    00323         uchar* getPtr(void) { return mData; }
    00324
    00326         uchar* getCurrentPtr(void) { return mPos; }
    00327
    00330         size_t read(void* buf, size_t count);
    00331
    00334         size_t write(const void* buf, size_t count);
    00335
    00338         size_t readLine(char* buf, size_t maxCount, const String& delim = "\n");
    00339
    00342         size_t skipLine(const String& delim = "\n");
    00343
    00346         void skip(long count);
    00347
    00350         void seek( size_t pos );
    00351
    00354         size_t tell(void) const;
    00355
    00358         bool eof(void) const;
    00359
    00362         void close(void);
    00363
    00365         void setFreeOnClose(bool free) { mFreeOnClose = free; }
    00366     };
    00367
    00371     typedef SharedPtr<MemoryDataStream> MemoryDataStreamPtr;
    00372
    00376     class _OgreExport FileStreamDataStream : public DataStream
    00377     {
    00378     protected:
    00380         std::istream* mpInStream;
    00382         std::ifstream* mpFStreamRO;
    00384         std::fstream* mpFStream;
    00385         bool mFreeOnClose;
    00386
    00387         void determineAccess();
    00388     public:
    00394         FileStreamDataStream(std::ifstream* s,
    00395             bool freeOnClose = true);
    00401         FileStreamDataStream(std::fstream* s,
    00402             bool freeOnClose = true);
    00403
    00410         FileStreamDataStream(const String& name,
    00411             std::ifstream* s,
    00412             bool freeOnClose = true);
    00413
    00420         FileStreamDataStream(const String& name,
    00421             std::fstream* s,
    00422             bool freeOnClose = true);
    00423
    00438         FileStreamDataStream(const String& name,
    00439             std::ifstream* s,
    00440             size_t size,
    00441             bool freeOnClose = true);
    00442
    00457         FileStreamDataStream(const String& name,
    00458             std::fstream* s,
    00459             size_t size,
    00460             bool freeOnClose = true);
    00461
    00462         ~FileStreamDataStream();
    00463
    00466         size_t read(void* buf, size_t count);
    00467
    00470         size_t write(const void* buf, size_t count);
    00471
    00474         size_t readLine(char* buf, size_t maxCount, const String& delim = "\n");
    00475
    00478         void skip(long count);
    00479
    00482         void seek( size_t pos );
    00483
    00486         size_t tell(void) const;
    00487
    00490         bool eof(void) const;
    00491
    00494         void close(void);
    00495
    00496
    00497     };
    00498
    00508     class _OgreExport FileHandleDataStream : public DataStream
    00509     {
    00510     protected:
    00511         FILE* mFileHandle;
    00512     public:
    00514         FileHandleDataStream(FILE* handle, uint16 accessMode = READ);
    00516         FileHandleDataStream(const String& name, FILE* handle, uint16 accessMode = READ);
    00517         ~FileHandleDataStream();
    00518
    00521         size_t read(void* buf, size_t count);
    00522
    00525         size_t write(const void* buf, size_t count);
    00526
    00529         void skip(long count);
    00530
    00533         void seek( size_t pos );
    00534
    00537         size_t tell(void) const;
    00538
    00541         bool eof(void) const;
    00542
    00545         void close(void);
    00546
    00547     };
    00550 }
    00551 #endif
    00552

Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Wed Nov 3 2010 19:24:51