| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        stream.h
 
- // Purpose:     interface of wxStreamBase and its derived classes
 
- // Author:      wxWidgets team
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- /**
 
-     These enumeration values are returned by various functions in the context
 
-     of wxStream classes.
 
- */
 
- enum wxStreamError
 
- {
 
-     wxSTREAM_NO_ERROR = 0,      //!< No error occurred.
 
-     wxSTREAM_EOF,               //!< EOF reached in Read() or similar.
 
-     wxSTREAM_WRITE_ERROR,       //!< generic write error on the last write call.
 
-     wxSTREAM_READ_ERROR         //!< generic read error on the last read call.
 
- };
 
- /**
 
-     @class wxStreamBase
 
-     This class is the base class of most stream related classes in wxWidgets.
 
-     It must not be used directly.
 
-     @library{wxbase}
 
-     @category{streams}
 
-     @see wxStreamBuffer
 
- */
 
- class wxStreamBase
 
- {
 
- public:
 
-     /**
 
-         Creates a dummy stream object. It doesn't do anything.
 
-     */
 
-     wxStreamBase();
 
-     /**
 
-         Destructor.
 
-     */
 
-     virtual ~wxStreamBase();
 
-     /**
 
-         This function returns the last error.
 
-     */
 
-     wxStreamError GetLastError() const;
 
-     /**
 
-         Returns the length of the stream in bytes. If the length cannot be
 
-         determined (this is always the case for socket streams for example),
 
-         returns ::wxInvalidOffset.
 
-         @since 2.5.4
 
-     */
 
-     virtual wxFileOffset GetLength() const;
 
-     /**
 
-         This function returns the size of the stream.
 
-         For example, for a file it is the size of the file.
 
-         @warning
 
-         There are streams which do not have size by definition, such as socket
 
-         streams. In that cases, GetSize() returns 0 so you should always test its
 
-         return value.
 
-     */
 
-     virtual size_t GetSize() const;
 
-     /**
 
-         Returns @true if no error occurred on the stream.
 
-         @see GetLastError()
 
-     */
 
-     virtual bool IsOk() const;
 
-     /**
 
-         Returns @true if the stream supports seeking to arbitrary offsets.
 
-     */
 
-     virtual bool IsSeekable() const;
 
-     /**
 
-         Resets the stream state.
 
-         By default, resets the stream to good state, i.e. clears any errors.
 
-         Since wxWidgets 2.9.3 can be also used to explicitly set the state to
 
-         the specified error (the @a error argument didn't exist in the previous
 
-         versions).
 
-         @see GetLastError()
 
-      */
 
-     void Reset(wxStreamError error = wxSTREAM_NO_ERROR);
 
-     /**
 
-         Returns the opposite of IsOk().
 
-         You can use this function to test the validity of the stream as if
 
-         it was a pointer:
 
-         @code
 
-             bool DoSomething(wxInputStream& stream)
 
-             {
 
-                 wxInt32 data;
 
-                 if (!stream.Read(&data, 4))
 
-                     return false;
 
-                 ...
 
-             }
 
-         @endcode
 
-     */
 
-     bool operator!() const;
 
- protected:
 
-     /**
 
-         Internal function.
 
-         It is called when the stream needs to change the current position.
 
-         @param pos
 
-             Offset to seek to.
 
-         @param mode
 
-             One of the ::wxSeekMode enumeration values.
 
-         @return The new stream position or ::wxInvalidOffset on error.
 
-     */
 
-     virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode);
 
-     /**
 
-         Internal function.
 
-         It is called when the stream needs to know the real position.
 
-         @return The current stream position.
 
-     */
 
-     virtual wxFileOffset OnSysTell() const;
 
- };
 
- /**
 
-     @class wxStreamBuffer
 
-     wxStreamBuffer is a cache manager for wxStreamBase: it manages a stream buffer
 
-     linked to a stream.
 
-     Each stream always has one autoinitialized stream buffer, but you may
 
-     attach more of them to the same stream.
 
-     @library{wxbase}
 
-     @category{streams}
 
-     @see wxStreamBase, @ref overview_stream
 
- */
 
- class wxStreamBuffer
 
- {
 
- public:
 
-     /** BufMode flags */
 
-     enum BufMode
 
-     {
 
-         read,
 
-         write,
 
-         read_write
 
-     };
 
-     /**
 
-         Constructor, creates a new stream buffer using @a stream as a parent stream
 
-         and mode as the IO mode.
 
-         @param stream
 
-             The parent stream.
 
-         @param mode
 
-             Can be: wxStreamBuffer::read, wxStreamBuffer::write, wxStreamBuffer::read_write.
 
-         One stream can have many stream buffers but only one is used internally
 
-         to pass IO call (e.g. wxInputStream::Read() -> wxStreamBuffer::Read()),
 
-         but you can call directly wxStreamBuffer::Read without any problems.
 
-         Note that all errors and messages linked to the stream are stored in the
 
-         stream, not the stream buffers:
 
-         @code
 
-         streambuffer.Read(...);
 
-         streambuffer2.Read(...);
 
-             // This call erases previous error messages set by 'streambuffer'
 
-             // assuming that both instances are stream buffers for the same stream
 
-         @endcode
 
-         @see SetBufferIO()
 
-     */
 
-     wxStreamBuffer(wxStreamBase& stream, BufMode mode);
 
-     /**
 
-         Constructor for an input buffer of the specified size.
 
-         Using it is equivalent to using the constructor above with read mode
 
-         and calling SetBufferIO() but is more convenient.
 
-         @since 2.9.0
 
-         @param bufsize
 
-             The size of buffer in bytes.
 
-         @param stream
 
-             The associated input stream, the buffer will be used in read mode.
 
-      */
 
-     wxStreamBuffer(size_t bufsize, wxInputStream& stream);
 
-     /**
 
-         Constructor for an output buffer of the specified size.
 
-         Using it is equivalent to using the constructor above with write mode
 
-         and calling SetBufferIO() but is more convenient.
 
-         @since 2.9.0
 
-         @param bufsize
 
-             The size of buffer in bytes.
 
-         @param stream
 
-             The associated output stream, the buffer will be used in write mode.
 
-      */
 
-     wxStreamBuffer(size_t bufsize, wxOutputStream& stream);
 
-     /**
 
-         Constructor; creates a new empty stream buffer which won't flush any data
 
-         to a stream. mode specifies the type of the buffer (read, write, read_write).
 
-         This stream buffer has the advantage to be stream independent and to work
 
-         only on memory buffers but it is still compatible with the rest of the
 
-         wxStream classes. You can write, read to this special stream and it will
 
-         grow (if it is allowed by the user) its internal buffer.
 
-         Briefly, it has all functionality of a "normal" stream.
 
-         @warning
 
-         The "read_write" mode doesn't currently work for standalone stream buffers.
 
-         @see SetBufferIO()
 
-     */
 
-     wxStreamBuffer(BufMode mode);
 
-     /**
 
-         Copy constructor.
 
-         This method initializes the stream buffer with the data of the specified
 
-         stream buffer. The new stream buffer has the same attributes, size, position
 
-         and they share the same buffer. This will cause problems if the stream to
 
-         which the stream buffer belong is destroyed and the newly cloned stream
 
-         buffer continues to be used, trying to call functions in the (destroyed)
 
-         stream. It is advised to use this feature only in very local area of the
 
-         program.
 
-     */
 
-     wxStreamBuffer(const wxStreamBuffer& buffer);
 
-     /**
 
-         Destructor.
 
-         It finalizes all IO calls and frees all internal buffers if necessary.
 
-     */
 
-     ~wxStreamBuffer();
 
-     /**
 
-         Fill the IO buffer.
 
-     */
 
-     bool FillBuffer();
 
-     /**
 
-         Toggles the fixed flag. Usually this flag is toggled at the same time as
 
-         @e flushable. This flag allows (when it has the @false value) or forbids
 
-         (when it has the @true value) the stream buffer to resize dynamically the
 
-         IO buffer.
 
-         @see SetBufferIO()
 
-     */
 
-     void Fixed(bool fixed);
 
-     /**
 
-         Flushes the IO buffer.
 
-     */
 
-     bool FlushBuffer();
 
-     /**
 
-         Toggles the flushable flag.
 
-         If @a flushable is disabled, no data are sent to the parent stream.
 
-     */
 
-     void Flushable(bool flushable);
 
-     /**
 
-         Returns a pointer on the end of the stream buffer.
 
-     */
 
-     void* GetBufferEnd() const;
 
-     /**
 
-         Returns a pointer on the current position of the stream buffer.
 
-     */
 
-     void* GetBufferPos() const;
 
-     /**
 
-         Returns the size of the buffer.
 
-     */
 
-     size_t GetBufferSize() const;
 
-     /**
 
-         Returns a pointer on the start of the stream buffer.
 
-     */
 
-     void* GetBufferStart() const;
 
-     /**
 
-         Gets a single char from the stream buffer. It acts like the Read() call.
 
-         @warning
 
-         You aren't directly notified if an error occurred during the IO call.
 
-         @see Read()
 
-     */
 
-     virtual char GetChar();
 
-     /**
 
-         Returns the amount of available data in the buffer.
 
-     */
 
-     size_t GetDataLeft();
 
-     /**
 
-         Returns the current position (counted in bytes) in the stream buffer.
 
-     */
 
-     size_t GetIntPosition() const;
 
-     /**
 
-         Returns the amount of bytes read during the last IO call to the parent stream.
 
-     */
 
-     size_t GetLastAccess() const;
 
-     /**
 
-         Puts a single char to the stream buffer.
 
-         @warning
 
-         You aren't directly notified if an error occurred during the IO call.
 
-         @see Read()
 
-     */
 
-     virtual void PutChar(char c);
 
-     /**
 
-         Reads a block of the specified size and stores the data in buffer.
 
-         This function tries to read from the buffer first and if more data has
 
-         been requested, reads more data from the associated stream and updates
 
-         the buffer accordingly until all requested data is read.
 
-         @return It returns the size of the data read. If the returned size is
 
-                 different of the specified size, an error has occurred and
 
-                 should be tested using GetLastError().
 
-     */
 
-     virtual size_t Read(void* buffer, size_t size);
 
-     /**
 
-         Copies data to @a buffer.
 
-         The function returns when @a buffer is full or when there isn't
 
-         any more data in the current buffer.
 
-         @see Write()
 
-     */
 
-     size_t Read(wxStreamBuffer* buffer);
 
-     /**
 
-         Resets to the initial state variables concerning the buffer.
 
-     */
 
-     void ResetBuffer();
 
-     /**
 
-         Changes the current position.
 
-         Parameter @a mode may be one of the following:
 
-         - @b wxFromStart: The position is counted from the start of the stream.
 
-         - @b wxFromCurrent: The position is counted from the current position of the stream.
 
-         - @b wxFromEnd: The position is counted from the end of the stream.
 
-         @return Upon successful completion, it returns the new offset as
 
-                 measured in bytes from the beginning of the stream.
 
-                 Otherwise, it returns ::wxInvalidOffset.
 
-     */
 
-     virtual wxFileOffset Seek(wxFileOffset pos, wxSeekMode mode);
 
-     /**
 
-         Specifies which pointers to use for stream buffering.
 
-         You need to pass a pointer on the start of the buffer end and another
 
-         on the end. The object will use this buffer to cache stream data.
 
-         It may be used also as a source/destination buffer when you create an
 
-         empty stream buffer (See wxStreamBuffer::wxStreamBuffer).
 
-         @remarks
 
-         When you use this function, you will have to destroy the IO buffers
 
-         yourself after the stream buffer is destroyed or don't use it anymore.
 
-         In the case you use it with an empty buffer, the stream buffer will not
 
-         resize it when it is full.
 
-         @see wxStreamBuffer(), Fixed(), Flushable()
 
-     */
 
-     void SetBufferIO(void* start, void* end, bool takeOwnership = false);
 
-     /**
 
-         Destroys or invalidates the previous IO buffer and allocates a new one of the
 
-         specified size.
 
-         @warning
 
-         All previous pointers aren't valid anymore.
 
-         @remarks
 
-         The created IO buffer is growable by the object.
 
-         @see Fixed(), Flushable()
 
-     */
 
-     void SetBufferIO(size_t bufsize);
 
-     /**
 
-         Sets the current position (in bytes) in the stream buffer.
 
-         @warning
 
-         Since it is a very low-level function, there is no check on the position:
 
-         specifying an invalid position can induce unexpected results.
 
-     */
 
-     void SetIntPosition(size_t pos);
 
-     /**
 
-         Returns the parent stream of the stream buffer.
 
-         @deprecated use GetStream() instead
 
-     */
 
-     wxStreamBase* Stream();
 
-     /**
 
-         Gets the current position in the stream. This position is calculated from
 
-         the @e real position in the stream and from the internal buffer position: so
 
-         it gives you the position in the @e real stream counted from the start of
 
-         the stream.
 
-         @return Returns the current position in the stream if possible,
 
-                 ::wxInvalidOffset in the other case.
 
-     */
 
-     virtual wxFileOffset Tell() const;
 
-     /**
 
-         Truncates the buffer to the current position.
 
-         @note Truncate() cannot be used to enlarge the buffer. This is
 
-               usually not needed since the buffer expands automatically.
 
-     */
 
-     void Truncate();
 
-     /**
 
-         Writes a block of the specified size using data of buffer.
 
-         The data are cached in a buffer before being sent in one block to the stream.
 
-     */
 
-     virtual size_t Write(const void* buffer, size_t size);
 
-     /**
 
-         See Read().
 
-     */
 
-     size_t Write(wxStreamBuffer* buffer);
 
- };
 
- /**
 
-     @class wxOutputStream
 
-     wxOutputStream is an abstract base class which may not be used directly.
 
-     It is the base class of all streams which provide a Write() function,
 
-     i.e. which can be used to output data (e.g. to a file, to a socket, etc).
 
-     If you want to create your own output stream, you'll need to derive from this
 
-     class and implement the protected OnSysWrite() function only.
 
-     @library{wxbase}
 
-     @category{streams}
 
- */
 
- class wxOutputStream : public wxStreamBase
 
- {
 
- public:
 
-     /**
 
-         Creates a dummy wxOutputStream object.
 
-     */
 
-     wxOutputStream();
 
-     /**
 
-         Destructor.
 
-     */
 
-     virtual ~wxOutputStream();
 
-     /**
 
-         Closes the stream, returning @false if an error occurs.
 
-         The stream is closed implicitly in the destructor if Close() is not
 
-         called explicitly.
 
-         If this stream wraps another stream or some other resource such
 
-         as a file, then the underlying resource is closed too if it is owned
 
-         by this stream, or left open otherwise.
 
-     */
 
-     virtual bool Close();
 
-     /**
 
-         Returns the number of bytes written during the last Write().
 
-         It may return 0 even if there is no error on the stream if it is
 
-         only temporarily impossible to write to it.
 
-     */
 
-     virtual size_t LastWrite() const;
 
-     /**
 
-         Puts the specified character in the output queue and increments the
 
-         stream position.
 
-     */
 
-     void PutC(char c);
 
-     /**
 
-         Changes the stream current position.
 
-         @param pos
 
-             Offset to seek to.
 
-         @param mode
 
-             One of wxFromStart, wxFromEnd, wxFromCurrent.
 
-         @return The new stream position or ::wxInvalidOffset on error.
 
-     */
 
-     virtual wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart);
 
-     /**
 
-         Returns the current stream position.
 
-     */
 
-     virtual wxFileOffset TellO() const;
 
-     /**
 
-         Writes up to the specified amount of bytes using the data of buffer.
 
-         Note that not all data can always be written so you must check the number
 
-         of bytes really written to the stream using LastWrite() when this function
 
-         returns.
 
-         In some cases (for example a write end of a pipe which is currently full)
 
-         it is even possible that there is no errors and zero bytes have been written.
 
-         This function returns a reference on the current object, so the user can
 
-         test any states of the stream right away.
 
-     */
 
-     virtual wxOutputStream& Write(const void* buffer, size_t size);
 
-     /**
 
-         Reads data from the specified input stream and stores them
 
-         in the current stream. The data is read until an error is raised
 
-         by one of the two streams.
 
-     */
 
-     wxOutputStream& Write(wxInputStream& stream_in);
 
-     /**
 
-         Writes exactly the specified number of bytes from the buffer.
 
-         Returns @true if exactly @a size bytes were written. Otherwise, returns
 
-         @false and LastWrite() should be used to retrieve the exact amount of
 
-         the data written if necessary.
 
-         This method uses repeated calls to Write() (which may return writing
 
-         only part of the data) if necessary.
 
-         @since 2.9.5
 
-     */
 
-     bool WriteAll(const void* buffer, size_t size);
 
- protected:
 
-     /**
 
-         Internal function. It is called when the stream wants to write data of the
 
-         specified size @a bufsize into the given @a buffer.
 
-         It should return the size that was actually wrote (which maybe zero if
 
-         @a bufsize is zero or if an error occurred; in this last case the internal
 
-         variable @c m_lasterror should be appropriately set).
 
-     */
 
-     size_t OnSysWrite(const void* buffer, size_t bufsize);
 
- };
 
- /**
 
-     @class wxInputStream
 
-     wxInputStream is an abstract base class which may not be used directly.
 
-     It is the base class of all streams which provide a Read() function,
 
-     i.e. which can be used to read data from a source (e.g. a file, a socket, etc).
 
-     If you want to create your own input stream, you'll need to derive from this
 
-     class and implement the protected OnSysRead() function only.
 
-     @library{wxbase}
 
-     @category{streams}
 
- */
 
- class wxInputStream : public wxStreamBase
 
- {
 
- public:
 
-     /**
 
-         Creates a dummy input stream.
 
-     */
 
-     wxInputStream();
 
-     /**
 
-         Destructor.
 
-     */
 
-     virtual ~wxInputStream();
 
-     /**
 
-         Returns @true if some data is available in the stream right now, so that
 
-         calling Read() wouldn't block.
 
-     */
 
-     virtual bool CanRead() const;
 
-     /**
 
-         Returns @true after an attempt has been made to read past the end of the
 
-         stream.
 
-     */
 
-     virtual bool Eof() const;
 
-     /**
 
-         Returns the first character in the input queue and removes it,
 
-         blocking until it appears if necessary.
 
-         On success returns a value between 0 - 255; on end of file returns @c wxEOF.
 
-     */
 
-     int GetC();
 
-     /**
 
-         Returns the last number of bytes read.
 
-     */
 
-     virtual size_t LastRead() const;
 
-     /**
 
-         Returns the first character in the input queue without removing it.
 
-     */
 
-     virtual char Peek();
 
-     /**
 
-         Reads the specified amount of bytes and stores the data in buffer.
 
-         To check if the call was successful you must use LastRead() to check
 
-         if this call did actually read @a size bytes (if it didn't, GetLastError()
 
-         should return a meaningful value).
 
-         @warning
 
-         The buffer absolutely needs to have at least the specified size.
 
-         @return This function returns a reference on the current object, so the
 
-                 user can test any states of the stream right away.
 
-     */
 
-     virtual wxInputStream& Read(void* buffer, size_t size);
 
-     /**
 
-         Reads data from the input queue and stores it in the specified output stream.
 
-         The data is read until an error is raised by one of the two streams.
 
-         @return This function returns a reference on the current object, so the
 
-                 user can test any states of the stream right away.
 
-     */
 
-     wxInputStream& Read(wxOutputStream& stream_out);
 
-     /**
 
-         Reads exactly the specified number of bytes into the buffer.
 
-         Returns @true only if the entire amount of data was read, otherwise
 
-         @false is returned and the number of bytes really read can be retrieved
 
-         using LastRead(), as with Read().
 
-         This method uses repeated calls to Read() (which may return after
 
-         reading less than the requested number of bytes) if necessary.
 
-         @warning
 
-         The buffer absolutely needs to have at least the specified size.
 
-         @since 2.9.5
 
-     */
 
-     bool ReadAll(void* buffer, size_t size);
 
-     /**
 
-         Changes the stream current position.
 
-         This operation in general is possible only for seekable streams 
 
-         (see wxStreamBase::IsSeekable()); non-seekable streams support only
 
-         seeking positive amounts in mode @c wxFromCurrent (this is implemented
 
-         by reading data and simply discarding it).
 
-         @param pos
 
-             Offset to seek to.
 
-         @param mode
 
-             One of wxFromStart, wxFromEnd, wxFromCurrent.
 
-         @return The new stream position or ::wxInvalidOffset on error.
 
-     */
 
-     virtual wxFileOffset SeekI(wxFileOffset pos, wxSeekMode mode = wxFromStart);
 
-     /**
 
-         Returns the current stream position or ::wxInvalidOffset if it's not
 
-         available (e.g. socket streams do not have a size nor a current stream
 
-         position).
 
-     */
 
-     virtual wxFileOffset TellI() const;
 
-     /**
 
-         This function is only useful in read mode.
 
-         It is the manager of the "Write-Back" buffer. This buffer acts like a
 
-         temporary buffer where data which has to be read during the next read IO
 
-         call are put. This is useful when you get a big block of data which you
 
-         didn't want to read: you can replace them at the top of the input queue
 
-         by this way.
 
-         Be very careful about this call in connection with calling SeekI() on
 
-         the same stream. Any call to SeekI() will invalidate any previous call
 
-         to this method (otherwise you could SeekI() to one position, "unread" a
 
-         few bytes there, SeekI() to another position and data would be either
 
-         lost or corrupted).
 
-         @return Returns the amount of bytes saved in the Write-Back buffer.
 
-     */
 
-     size_t Ungetch(const void* buffer, size_t size);
 
-     /**
 
-         This function acts like the previous one except that it takes only one
 
-         character: it is sometimes shorter to use than the generic function.
 
-     */
 
-     bool Ungetch(char c);
 
- protected:
 
-     /**
 
-         Internal function. It is called when the stream wants to read data of the
 
-         specified size @a bufsize and wants it to be placed inside @a buffer.
 
-         It should return the size that was actually read or zero if EOF has been
 
-         reached or an error occurred (in this last case the internal @c m_lasterror
 
-         variable should be set accordingly as well).
 
-     */
 
-     size_t OnSysRead(void* buffer, size_t bufsize) = 0;
 
- };
 
- /**
 
-     @class wxCountingOutputStream
 
-     wxCountingOutputStream is a specialized output stream which does not write any
 
-     data anywhere, instead it counts how many bytes would get written if this were a
 
-     normal stream. This can sometimes be useful or required if some data gets
 
-     serialized to a stream or compressed by using stream compression and thus the
 
-     final size of the stream cannot be known other than pretending to write the stream.
 
-     One case where the resulting size would have to be known is if the data has
 
-     to be written to a piece of memory and the memory has to be allocated before
 
-     writing to it (which is probably always the case when writing to a memory stream).
 
-     @library{wxbase}
 
-     @category{streams}
 
- */
 
- class wxCountingOutputStream : public wxOutputStream
 
- {
 
- public:
 
-     /**
 
-         Creates a wxCountingOutputStream object.
 
-     */
 
-     wxCountingOutputStream();
 
-     /**
 
-         Destructor.
 
-     */
 
-     virtual ~wxCountingOutputStream();
 
-     /**
 
-         Returns the current length of the stream.
 
-         This is the amount of data written to the stream so far, in bytes.
 
-     */
 
-     virtual wxFileOffset GetLength() const;
 
- };
 
- /**
 
-     @class wxBufferedInputStream
 
-     This stream acts as a cache. It caches the bytes read from the specified
 
-     input stream (see wxFilterInputStream).
 
-     It uses wxStreamBuffer and sets the default in-buffer size to 1024 bytes.
 
-     This class may not be used without some other stream to read the data
 
-     from (such as a file stream or a memory stream).
 
-     @library{wxbase}
 
-     @category{streams}
 
-     @see wxStreamBuffer, wxInputStream, wxBufferedOutputStream
 
- */
 
- class wxBufferedInputStream : public wxFilterInputStream
 
- {
 
- public:
 
-     /**
 
-         Constructor using the provided buffer or default.
 
-         @param stream
 
-             The associated low-level stream.
 
-         @param buffer
 
-             The buffer to use if non-@NULL. Notice that the ownership of this
 
-             buffer is taken by the stream, i.e. it will delete it. If this
 
-             parameter is @NULL a default 1KB buffer is used.
 
-     */
 
-     wxBufferedInputStream(wxInputStream& stream,
 
-                           wxStreamBuffer *buffer = NULL);
 
-     /**
 
-         Constructor allowing to specify the size of the buffer.
 
-         This is just a more convenient alternative to creating a wxStreamBuffer
 
-         of the given size and using the other overloaded constructor of this
 
-         class.
 
-         @param stream
 
-             The associated low-level stream.
 
-         @param bufsize
 
-             The size of the buffer, in bytes.
 
-         @since 2.9.0
 
-      */
 
-     wxBufferedInputStream(wxInputStream& stream, size_t bufsize);
 
-     /**
 
-         Destructor.
 
-     */
 
-     virtual ~wxBufferedInputStream();
 
- };
 
- /**
 
-     Enumeration values used by wxFilterClassFactory.
 
- */
 
- enum wxStreamProtocolType
 
- {
 
-     wxSTREAM_PROTOCOL,  //!< wxFileSystem protocol (should be only one).
 
-     wxSTREAM_MIMETYPE,  //!< MIME types the stream handles.
 
-     wxSTREAM_ENCODING,  //!< The HTTP Content-Encodings the stream handles.
 
-     wxSTREAM_FILEEXT    //!< File extensions the stream handles.
 
- };
 
- /**
 
-     @class wxFilterClassFactory
 
-     Allows the creation of filter streams to handle compression formats such
 
-     as gzip and bzip2.
 
-     For example, given a filename you can search for a factory that will
 
-     handle it and create a stream to decompress it:
 
-     @code
 
-         factory = wxFilterClassFactory::Find(filename, wxSTREAM_FILEEXT);
 
-         if (factory)
 
-             stream = factory->NewStream(new wxFFileInputStream(filename));
 
-     @endcode
 
-     wxFilterClassFactory::Find can also search for a factory by MIME type,
 
-     HTTP encoding or by wxFileSystem protocol.
 
-     The available factories can be enumerated using wxFilterClassFactory::GetFirst()
 
-     and wxFilterClassFactory::GetNext().
 
-     @library{wxbase}
 
-     @category{streams}
 
-     @see wxFilterInputStream, wxFilterOutputStream, wxArchiveClassFactory,
 
-         @ref overview_archive
 
- */
 
- class wxFilterClassFactory : public wxObject
 
- {
 
- public:
 
-     /**
 
-         Returns @true if this factory can handle the given protocol, MIME type, HTTP
 
-         encoding or file extension.
 
-         When using @c wxSTREAM_FILEEXT for the second parameter, the first parameter
 
-         can be a complete filename rather than just an extension.
 
-     */
 
-     bool CanHandle(const wxString& protocol,
 
-                    wxStreamProtocolType type = wxSTREAM_PROTOCOL) const;
 
-     /**
 
-         A static member that finds a factory that can handle a given protocol, MIME
 
-         type, HTTP encoding or file extension. Returns a pointer to the class
 
-         factory if found, or @NULL otherwise.
 
-         It does not give away ownership of the factory.
 
-         When using @c wxSTREAM_FILEEXT for the second parameter, the first parameter
 
-         can be a complete filename rather than just an extension.
 
-     */
 
-     static const wxFilterClassFactory* Find(const wxString& protocol,
 
-                                             wxStreamProtocolType type = wxSTREAM_PROTOCOL);
 
-     //@{
 
-     /**
 
-         GetFirst and GetNext can be used to enumerate the available factories.
 
-         For example, to list them:
 
-         @code
 
-         wxString list;
 
-         const wxFilterClassFactory *factory = wxFilterClassFactory::GetFirst();
 
-         while (factory) {
 
-             list << factory->GetProtocol() << wxT("\n");
 
-             factory = factory->GetNext();
 
-         }
 
-         @endcode
 
-         GetFirst()/GetNext() return a pointer to a factory or @NULL if no more
 
-         are available. They do not give away ownership of the factory.
 
-     */
 
-     static const wxFilterClassFactory* GetFirst();
 
-     const wxFilterClassFactory* GetNext() const;
 
-     //@}
 
-     /**
 
-         Returns the wxFileSystem protocol supported by this factory.
 
-         Equivalent to @code wxString(*GetProtocols()) @endcode.
 
-     */
 
-     wxString GetProtocol() const;
 
-     /**
 
-         Returns the protocols, MIME types, HTTP encodings or file extensions
 
-         supported by this factory, as an array of null terminated strings.
 
-         It does not give away ownership of the array or strings.
 
-         For example, to list the file extensions a factory supports:
 
-         @code
 
-         wxString list;
 
-         const wxChar *const *p;
 
-         for (p = factory->GetProtocols(wxSTREAM_FILEEXT); *p; p++)
 
-             list << *p << wxT("\n");
 
-         @endcode
 
-     */
 
-     virtual const wxChar * const* GetProtocols(wxStreamProtocolType type = wxSTREAM_PROTOCOL) const = 0;
 
-     //@{
 
-     /**
 
-         Create a new input or output stream to decompress or compress a given stream.
 
-         If the parent stream is passed as a pointer then the new filter stream
 
-         takes ownership of it. If it is passed by reference then it does not.
 
-     */
 
-     virtual wxFilterInputStream*  NewStream(wxInputStream& stream) const = 0;
 
-     virtual wxFilterOutputStream* NewStream(wxOutputStream& stream) const = 0;
 
-     virtual wxFilterInputStream*  NewStream(wxInputStream* stream) const = 0;
 
-     virtual wxFilterOutputStream* NewStream(wxOutputStream* stream) const = 0;
 
-     //@}
 
-     /**
 
-         Remove the file extension of @a location if it is one of the file
 
-         extensions handled by this factory.
 
-     */
 
-     wxString PopExtension(const wxString& location) const;
 
-     /**
 
-         Adds this class factory to the list returned  by GetFirst()/GetNext().
 
-         It is not necessary to do this to use the filter streams. It is usually
 
-         used when implementing streams, typically the implementation will
 
-         add a static instance of its factory class.
 
-         It can also be used to change the order of a factory already in the list,
 
-         bringing it to the front. This isn't a thread safe operation so can't be
 
-         done when other threads are running that will be using the list.
 
-         The list does not take ownership of the factory.
 
-     */
 
-     void PushFront();
 
-     /**
 
-         Removes this class factory from the list returned by GetFirst()/GetNext().
 
-         Removing from the list isn't a thread safe operation so can't be done
 
-         when other threads are running that will be using the list.
 
-         The list does not own the factories, so removing a factory does not delete it.
 
-     */
 
-     void Remove();
 
- };
 
- /**
 
-     @class wxFilterOutputStream
 
-     A filter stream has the capability of a normal stream but it can be placed
 
-     on top of another stream. So, for example, it can compress, encrypt the data
 
-     which are passed to it and write them to another stream.
 
-     @note
 
-     The use of this class is exactly the same as of wxOutputStream.
 
-     Only a constructor differs and it is documented below.
 
-     @library{wxbase}
 
-     @category{streams}
 
-     @see wxFilterClassFactory, wxFilterInputStream
 
- */
 
- class wxFilterOutputStream : public wxOutputStream
 
- {
 
- public:
 
-     //@{
 
-     /**
 
-         Initializes a "filter" stream.
 
-         If the parent stream is passed as a pointer then the new filter stream
 
-         takes ownership of it. If it is passed by reference then it does not.
 
-     */
 
-     wxFilterOutputStream(wxOutputStream& stream);
 
-     wxFilterOutputStream(wxOutputStream* stream);
 
-     //@}
 
- };
 
- /**
 
-     @class wxFilterInputStream
 
-     A filter stream has the capability of a normal stream but it can be placed on
 
-     top of another stream. So, for example, it can uncompress or decrypt the data which
 
-     are read from another stream and pass it to the requester.
 
-     @note
 
-     The interface of this class is the same as that of wxInputStream.
 
-     Only a constructor differs and it is documented below.
 
-     @library{wxbase}
 
-     @category{streams}
 
-     @see wxFilterClassFactory, wxFilterOutputStream
 
- */
 
- class wxFilterInputStream : public wxInputStream
 
- {
 
- public:
 
-     //@{
 
-     /**
 
-         Initializes a "filter" stream.
 
-         If the parent stream is passed as a pointer then the new filter stream
 
-         takes ownership of it. If it is passed by reference then it does not.
 
-     */
 
-     wxFilterInputStream(wxInputStream& stream);
 
-     wxFilterInputStream(wxInputStream* stream);
 
-     //@}
 
- };
 
- /**
 
-     @class wxBufferedOutputStream
 
-     This stream acts as a cache. It caches the bytes to be written to the specified
 
-     output stream (See wxFilterOutputStream). The data is only written when the
 
-     cache is full, when the buffered stream is destroyed or when calling SeekO().
 
-     This class may not be used without some other stream to write the data
 
-     to (such as a file stream or a memory stream).
 
-     @library{wxbase}
 
-     @category{streams}
 
-     @see wxStreamBuffer, wxOutputStream
 
- */
 
- class wxBufferedOutputStream : public wxFilterOutputStream
 
- {
 
- public:
 
-     /**
 
-         Constructor using the provided buffer or default.
 
-         @param stream
 
-             The associated low-level stream.
 
-         @param buffer
 
-             The buffer to use if non-@NULL. Notice that the ownership of this
 
-             buffer is taken by the stream, i.e. it will delete it. If this
 
-             parameter is @NULL a default 1KB buffer is used.
 
-     */
 
-     wxBufferedOutputStream(wxOutputStream& stream,
 
-                            wxStreamBuffer *buffer = NULL);
 
-     /**
 
-         Constructor allowing to specify the size of the buffer.
 
-         This is just a more convenient alternative to creating a wxStreamBuffer
 
-         of the given size and using the other overloaded constructor of this
 
-         class.
 
-         @param stream
 
-             The associated low-level stream.
 
-         @param bufsize
 
-             The size of the buffer, in bytes.
 
-         @since 2.9.0
 
-      */
 
-     wxBufferedOutputStream(wxOutputStream& stream, size_t bufsize);
 
-     /**
 
-         Destructor. Calls Sync() and destroys the internal buffer.
 
-     */
 
-     virtual ~wxBufferedOutputStream();
 
-     /**
 
-         Calls Sync() and changes the stream position.
 
-     */
 
-     virtual wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart);
 
-     /**
 
-         Flushes the buffer and calls Sync() on the parent stream.
 
-     */
 
-     virtual void Sync();
 
- };
 
- /**
 
-     @class wxWrapperInputStream
 
-     A wrapper input stream is a kind of filter stream which forwards all the
 
-     operations to its base stream. This is useful to build utility classes such
 
-     as wxFSInputStream.
 
-     @note
 
-     The interface of this class is the same as that of wxInputStream.
 
-     Only a constructor differs and it is documented below.
 
-     @library{wxbase}
 
-     @category{streams}
 
-     @see wxFSInputStream, wxFilterInputStream
 
-     @since 2.9.4
 
- */
 
- class wxWrapperInputStream : public wxFilterInputStream
 
- {
 
- public:
 
-     //@{
 
-     /**
 
-         Initializes a wrapper stream.
 
-         If the parent stream is passed as a pointer then the new wrapper stream
 
-         takes ownership of it. If it is passed by reference then it does not.
 
-     */
 
-     wxWrapperInputStream(wxInputStream& stream);
 
-     wxWrapperInputStream(wxInputStream* stream);
 
-     //@}
 
- protected:
 
-     /**
 
-         Default constructor, use InitParentStream() to finish initialization.
 
-         This constructor can be used by the derived classes from their own
 
-         constructors when the parent stream can't be specified immediately.
 
-         The derived class must call InitParentStream() later to do it.
 
-      */
 
-     wxWrapperInputStream();
 
-     //@{
 
-     /**
 
-         Set up the wrapped stream for an object initialized using the default
 
-         constructor.
 
-         The ownership logic is the same as for the non-default constructor,
 
-         i.e. this object takes ownership of the stream if it's passed by
 
-         pointer but not if it's passed by reference.
 
-      */
 
-     void InitParentStream(wxInputStream& stream);
 
-     void InitParentStream(wxInputStream* stream);
 
-     //@}
 
- };
 
 
  |