From a90ea340d2a8a11cf9dc18936499a19b3ba1d391 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 16 Jul 2013 06:15:18 -0700 Subject: [PATCH] Add return values to OutputStream methods --- .../files/beast_FileOutputStream.cpp | 11 ++- .../beast_core/files/beast_FileOutputStream.h | 13 ++- .../streams/beast_MemoryOutputStream.cpp | 6 +- .../streams/beast_MemoryOutputStream.h | 16 ++-- .../beast_core/streams/beast_OutputStream.cpp | 85 +++++++++++-------- .../beast_core/streams/beast_OutputStream.h | 60 ++++++++----- .../zip/beast_GZIPCompressorOutputStream.h | 6 +- 7 files changed, 111 insertions(+), 86 deletions(-) diff --git a/modules/beast_core/files/beast_FileOutputStream.cpp b/modules/beast_core/files/beast_FileOutputStream.cpp index 368eb9c43..a3a0e5e3c 100644 --- a/modules/beast_core/files/beast_FileOutputStream.cpp +++ b/modules/beast_core/files/beast_FileOutputStream.cpp @@ -114,7 +114,7 @@ bool FileOutputStream::write (const void* const src, const size_t numBytes) return true; } -void FileOutputStream::writeRepeatedByte (uint8 byte, size_t numBytes) +bool FileOutputStream::writeRepeatedByte (uint8 byte, size_t numBytes) { bassert (((ssize_t) numBytes) >= 0); @@ -123,9 +123,8 @@ void FileOutputStream::writeRepeatedByte (uint8 byte, size_t numBytes) memset (buffer + bytesInBuffer, byte, numBytes); bytesInBuffer += numBytes; currentPosition += numBytes; + return true; } - else - { - OutputStream::writeRepeatedByte (byte, numBytes); - } -} + + return OutputStream::writeRepeatedByte (byte, numBytes); +} \ No newline at end of file diff --git a/modules/beast_core/files/beast_FileOutputStream.h b/modules/beast_core/files/beast_FileOutputStream.h index 5f358ecd6..e4110492c 100644 --- a/modules/beast_core/files/beast_FileOutputStream.h +++ b/modules/beast_core/files/beast_FileOutputStream.h @@ -27,7 +27,6 @@ #include "beast_File.h" #include "../streams/beast_OutputStream.h" - //============================================================================== /** An output stream that writes into a local file. @@ -87,11 +86,11 @@ public: Result truncate(); //============================================================================== - void flush(); - int64 getPosition(); - bool setPosition (int64 pos); - bool write (const void* data, size_t numBytes); - void writeRepeatedByte (uint8 byte, size_t numTimesToRepeat); + void flush() override; + int64 getPosition() override; + bool setPosition (int64) override; + bool write (const void*, size_t) override; + bool writeRepeatedByte (uint8 byte, size_t numTimesToRepeat) override; private: @@ -111,4 +110,4 @@ private: ssize_t writeInternal (const void*, size_t); }; -#endif // BEAST_FILEOUTPUTSTREAM_BEASTHEADER +#endif \ No newline at end of file diff --git a/modules/beast_core/streams/beast_MemoryOutputStream.cpp b/modules/beast_core/streams/beast_MemoryOutputStream.cpp index 050592061..2e2e2f15a 100644 --- a/modules/beast_core/streams/beast_MemoryOutputStream.cpp +++ b/modules/beast_core/streams/beast_MemoryOutputStream.cpp @@ -90,10 +90,12 @@ bool MemoryOutputStream::write (const void* const buffer, size_t howMany) return true; } -void MemoryOutputStream::writeRepeatedByte (uint8 byte, size_t howMany) +bool MemoryOutputStream::writeRepeatedByte (uint8 byte, size_t howMany) { if (howMany > 0) memset (prepareToWrite (howMany), byte, howMany); + + return true; } void MemoryOutputStream::appendUTF8Char (beast_wchar c) @@ -162,4 +164,4 @@ OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const MemoryOutpu stream.write (streamToRead.getData(), dataSize); return stream; -} +} \ No newline at end of file diff --git a/modules/beast_core/streams/beast_MemoryOutputStream.h b/modules/beast_core/streams/beast_MemoryOutputStream.h index 1413dcbf3..c93f1ba0f 100644 --- a/modules/beast_core/streams/beast_MemoryOutputStream.h +++ b/modules/beast_core/streams/beast_MemoryOutputStream.h @@ -28,7 +28,6 @@ #include "../memory/beast_MemoryBlock.h" #include "../memory/beast_ScopedPointer.h" - //============================================================================== /** Writes data to an internal memory buffer, which grows as required. @@ -36,9 +35,10 @@ The data that was written into the stream can then be accessed later as a contiguous block of memory. */ -class BEAST_API MemoryOutputStream +class BEAST_API MemoryOutputStream : public OutputStream , LeakChecked + , Uncopyable { public: //============================================================================== @@ -108,11 +108,11 @@ public: */ void flush(); - bool write (const void* buffer, size_t howMany); - int64 getPosition() { return position; } - bool setPosition (int64 newPosition); - int writeFromInputStream (InputStream& source, int64 maxNumBytesToWrite); - void writeRepeatedByte (uint8 byte, size_t numTimesToRepeat); + bool write (const void*, size_t) override; + int64 getPosition() override { return position; } + bool setPosition (int64) override; + int writeFromInputStream (InputStream&, int64 maxNumBytesToWrite) override; + bool writeRepeatedByte (uint8 byte, size_t numTimesToRepeat) override; private: //============================================================================== @@ -128,4 +128,4 @@ private: OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const MemoryOutputStream& streamToRead); -#endif // BEAST_MEMORYOUTPUTSTREAM_BEASTHEADER +#endif \ No newline at end of file diff --git a/modules/beast_core/streams/beast_OutputStream.cpp b/modules/beast_core/streams/beast_OutputStream.cpp index 508915377..c1ac44c04 100644 --- a/modules/beast_core/streams/beast_OutputStream.cpp +++ b/modules/beast_core/streams/beast_OutputStream.cpp @@ -61,48 +61,51 @@ OutputStream::~OutputStream() } //============================================================================== -void OutputStream::writeBool (const bool b) +bool OutputStream::writeBool (const bool b) { - writeByte (b ? (char) 1 - : (char) 0); + return writeByte (b ? (char) 1 + : (char) 0); } -void OutputStream::writeByte (char byte) +bool OutputStream::writeByte (char byte) { - write (&byte, 1); + return write (&byte, 1); } -void OutputStream::writeRepeatedByte (uint8 byte, size_t numTimesToRepeat) +bool OutputStream::writeRepeatedByte (uint8 byte, size_t numTimesToRepeat) { for (size_t i = 0; i < numTimesToRepeat; ++i) - writeByte ((char) byte); + if (! writeByte ((char) byte)) + return false; + + return true; } -void OutputStream::writeShort (short value) +bool OutputStream::writeShort (short value) { const unsigned short v = ByteOrder::swapIfBigEndian ((unsigned short) value); - write (&v, 2); + return write (&v, 2); } -void OutputStream::writeShortBigEndian (short value) +bool OutputStream::writeShortBigEndian (short value) { const unsigned short v = ByteOrder::swapIfLittleEndian ((unsigned short) value); - write (&v, 2); + return write (&v, 2); } -void OutputStream::writeInt (int value) +bool OutputStream::writeInt (int value) { const unsigned int v = ByteOrder::swapIfBigEndian ((unsigned int) value); - write (&v, 4); + return write (&v, 4); } -void OutputStream::writeIntBigEndian (int value) +bool OutputStream::writeIntBigEndian (int value) { const unsigned int v = ByteOrder::swapIfLittleEndian ((unsigned int) value); - write (&v, 4); + return write (&v, 4); } -void OutputStream::writeCompressedInt (int value) +bool OutputStream::writeCompressedInt (int value) { unsigned int un = (value < 0) ? (unsigned int) -value : (unsigned int) value; @@ -121,60 +124,60 @@ void OutputStream::writeCompressedInt (int value) if (value < 0) data[0] |= 0x80; - write (data, num + 1); + return write (data, num + 1); } -void OutputStream::writeInt64 (int64 value) +bool OutputStream::writeInt64 (int64 value) { const uint64 v = ByteOrder::swapIfBigEndian ((uint64) value); - write (&v, 8); + return write (&v, 8); } -void OutputStream::writeInt64BigEndian (int64 value) +bool OutputStream::writeInt64BigEndian (int64 value) { const uint64 v = ByteOrder::swapIfLittleEndian ((uint64) value); - write (&v, 8); + return write (&v, 8); } -void OutputStream::writeFloat (float value) +bool OutputStream::writeFloat (float value) { union { int asInt; float asFloat; } n; n.asFloat = value; - writeInt (n.asInt); + return writeInt (n.asInt); } -void OutputStream::writeFloatBigEndian (float value) +bool OutputStream::writeFloatBigEndian (float value) { union { int asInt; float asFloat; } n; n.asFloat = value; - writeIntBigEndian (n.asInt); + return writeIntBigEndian (n.asInt); } -void OutputStream::writeDouble (double value) +bool OutputStream::writeDouble (double value) { union { int64 asInt; double asDouble; } n; n.asDouble = value; - writeInt64 (n.asInt); + return writeInt64 (n.asInt); } -void OutputStream::writeDoubleBigEndian (double value) +bool OutputStream::writeDoubleBigEndian (double value) { union { int64 asInt; double asDouble; } n; n.asDouble = value; - writeInt64BigEndian (n.asInt); + return writeInt64BigEndian (n.asInt); } -void OutputStream::writeString (const String& text) +bool OutputStream::writeString (const String& text) { // (This avoids using toUTF8() to prevent the memory bloat that it would leave behind // if lots of large, persistent strings were to be written to streams). const size_t numBytes = text.getNumBytesAsUTF8() + 1; HeapBlock temp (numBytes); text.copyToUTF8 (temp, numBytes); - write (temp, numBytes); + return write (temp, numBytes); } -void OutputStream::writeText (const String& text, const bool asUTF16, +bool OutputStream::writeText (const String& text, const bool asUTF16, const bool writeUTF16ByteOrderMark) { if (asUTF16) @@ -196,7 +199,9 @@ void OutputStream::writeText (const String& text, const bool asUTF16, writeShort ((short) '\r'); lastCharWasReturn = (c == L'\r'); - writeShort ((short) c); + + if (! writeShort ((short) c)) + return false; } } else @@ -209,9 +214,12 @@ void OutputStream::writeText (const String& text, const bool asUTF16, if (*t == '\n') { if (t > src) - write (src, (int) (t - src)); + if (! write (src, (int) (t - src))) + return false; + + if (! write ("\r\n", 2)) + return false; - write ("\r\n", 2); src = t + 1; } else if (*t == '\r') @@ -222,7 +230,8 @@ void OutputStream::writeText (const String& text, const bool asUTF16, else if (*t == 0) { if (t > src) - write (src, (int) (t - src)); + if (! write (src, (int) (t - src))) + return false; break; } @@ -230,6 +239,8 @@ void OutputStream::writeText (const String& text, const bool asUTF16, ++t; } } + + return true; } int OutputStream::writeFromInputStream (InputStream& source, int64 numBytesToWrite) @@ -317,4 +328,4 @@ BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, InputSt BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const NewLine&) { return stream << stream.getNewLineString(); -} +} \ No newline at end of file diff --git a/modules/beast_core/streams/beast_OutputStream.h b/modules/beast_core/streams/beast_OutputStream.h index 9365041ba..33b744a7d 100644 --- a/modules/beast_core/streams/beast_OutputStream.h +++ b/modules/beast_core/streams/beast_OutputStream.h @@ -40,9 +40,7 @@ class File; @see InputStream, MemoryOutputStream, FileOutputStream */ -class BEAST_API OutputStream - : public Uncopyable - , LeakChecked +class BEAST_API OutputStream { protected: //============================================================================== @@ -92,75 +90,88 @@ public: //============================================================================== /** Writes a single byte to the stream. - + @returns false if the write operation fails for some reason @see InputStream::readByte */ - virtual void writeByte (char byte); + virtual bool writeByte (char byte); /** Writes a boolean to the stream as a single byte. This is encoded as a binary byte (not as text) with a value of 1 or 0. + @returns false if the write operation fails for some reason @see InputStream::readBool */ - virtual void writeBool (bool boolValue); + virtual bool writeBool (bool boolValue); /** Writes a 16-bit integer to the stream in a little-endian byte order. This will write two bytes to the stream: (value & 0xff), then (value >> 8). + @returns false if the write operation fails for some reason @see InputStream::readShort */ - virtual void writeShort (short value); + virtual bool writeShort (short value); /** Writes a 16-bit integer to the stream in a big-endian byte order. This will write two bytes to the stream: (value >> 8), then (value & 0xff). + @returns false if the write operation fails for some reason @see InputStream::readShortBigEndian */ - virtual void writeShortBigEndian (short value); + virtual bool writeShortBigEndian (short value); /** Writes a 32-bit integer to the stream in a little-endian byte order. + @returns false if the write operation fails for some reason @see InputStream::readInt */ - virtual void writeInt (int value); + virtual bool writeInt (int value); /** Writes a 32-bit integer to the stream in a big-endian byte order. + @returns false if the write operation fails for some reason @see InputStream::readIntBigEndian */ - virtual void writeIntBigEndian (int value); + virtual bool writeIntBigEndian (int value); /** Writes a 64-bit integer to the stream in a little-endian byte order. + @returns false if the write operation fails for some reason @see InputStream::readInt64 */ - virtual void writeInt64 (int64 value); + virtual bool writeInt64 (int64 value); /** Writes a 64-bit integer to the stream in a big-endian byte order. + @returns false if the write operation fails for some reason @see InputStream::readInt64BigEndian */ - virtual void writeInt64BigEndian (int64 value); + virtual bool writeInt64BigEndian (int64 value); /** Writes a 32-bit floating point value to the stream in a binary format. The binary 32-bit encoding of the float is written as a little-endian int. + @returns false if the write operation fails for some reason @see InputStream::readFloat */ - virtual void writeFloat (float value); + virtual bool writeFloat (float value); /** Writes a 32-bit floating point value to the stream in a binary format. The binary 32-bit encoding of the float is written as a big-endian int. + @returns false if the write operation fails for some reason @see InputStream::readFloatBigEndian */ - virtual void writeFloatBigEndian (float value); + virtual bool writeFloatBigEndian (float value); /** Writes a 64-bit floating point value to the stream in a binary format. The eight raw bytes of the double value are written out as a little-endian 64-bit int. + @returns false if the write operation fails for some reason @see InputStream::readDouble */ - virtual void writeDouble (double value); + virtual bool writeDouble (double value); /** Writes a 64-bit floating point value to the stream in a binary format. The eight raw bytes of the double value are written out as a big-endian 64-bit int. @see InputStream::readDoubleBigEndian + @returns false if the write operation fails for some reason */ - virtual void writeDoubleBigEndian (double value); + virtual bool writeDoubleBigEndian (double value); - /** Writes a byte to the output stream a given number of times. */ - virtual void writeRepeatedByte (uint8 byte, size_t numTimesToRepeat); + /** Writes a byte to the output stream a given number of times. + @returns false if the write operation fails for some reason + */ + virtual bool writeRepeatedByte (uint8 byte, size_t numTimesToRepeat); /** Writes a condensed binary encoding of a 32-bit integer. @@ -170,9 +181,10 @@ public: The format used is: number of significant bytes + up to 4 bytes in little-endian order. + @returns false if the write operation fails for some reason @see InputStream::readCompressedInt */ - virtual void writeCompressedInt (int value); + virtual bool writeCompressedInt (int value); /** Stores a string in the stream in a binary format. @@ -184,9 +196,10 @@ public: For appending text to a file, instead use writeText, or operator<< + @returns false if the write operation fails for some reason @see InputStream::readString, writeText, operator<< */ - virtual void writeString (const String& text); + virtual bool writeString (const String& text); /** Writes a string of text to the stream. @@ -195,8 +208,9 @@ public: of a file). The method also replaces '\\n' characters in the text with '\\r\\n'. + @returns false if the write operation fails for some reason */ - virtual void writeText (const String& text, + virtual bool writeText (const String& text, bool asUTF16, bool writeUTF16ByteOrderMark); @@ -206,6 +220,7 @@ public: @param maxNumBytesToWrite the number of bytes to read from the stream (if this is less than zero, it will keep reading until the input is exhausted) + @returns the number of bytes written */ virtual int writeFromInputStream (InputStream& source, int64 maxNumBytesToWrite); @@ -258,5 +273,4 @@ BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, InputSt */ BEAST_API OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const NewLine&); - -#endif // BEAST_OUTPUTSTREAM_BEASTHEADER +#endif diff --git a/modules/beast_core/zip/beast_GZIPCompressorOutputStream.h b/modules/beast_core/zip/beast_GZIPCompressorOutputStream.h index c083afc45..d13e72802 100644 --- a/modules/beast_core/zip/beast_GZIPCompressorOutputStream.h +++ b/modules/beast_core/zip/beast_GZIPCompressorOutputStream.h @@ -80,9 +80,9 @@ public: */ void flush(); - int64 getPosition(); - bool setPosition (int64 newPosition); - bool write (const void* destBuffer, size_t howMany); + int64 getPosition() override; + bool setPosition (int64) override; + bool write (const void*, size_t) override; /** These are preset values that can be used for the constructor's windowBits paramter. For more info about this, see the zlib documentation for its windowBits parameter.