1 /* 2 * This source file is part of libRocket, the HTML/CSS Interface Middleware 3 * 4 * For the latest information, see http://www.librocket.com 5 * 6 * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a copy 9 * of this software and associated documentation files (the "Software"), to deal 10 * in the Software without restriction, including without limitation the rights 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 * copies of the Software, and to permit persons to whom the Software is 13 * furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included in 16 * all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 * THE SOFTWARE. 25 * 26 */ 27 28 #ifndef ROCKETCORESTREAMMEMORY_H 29 #define ROCKETCORESTREAMMEMORY_H 30 31 #include "Header.h" 32 #include "Stream.h" 33 34 namespace Rocket { 35 namespace Core { 36 37 /** 38 Memory Byte Stream Class 39 @author Lloyd Weehuizen 40 */ 41 42 class ROCKETCORE_API StreamMemory : public Stream 43 { 44 public: 45 /// Empty memory stream with default size buffer 46 StreamMemory(); 47 /// Empty memory stream with specified buffer size 48 StreamMemory(size_t initial_size); 49 /// Read only memory stream based on the existing buffer 50 StreamMemory(const byte* buffer, size_t buffer_size); 51 /// Copy a memory stream 52 StreamMemory(const StreamMemory& copy); 53 virtual ~StreamMemory(); 54 55 StreamMemory& operator=(const StreamMemory& copy); 56 57 /// Close the stream 58 virtual void Close(); 59 60 /// Are we at the end of the stream 61 virtual bool IsEOS() const; 62 63 /// Size of this stream ( in bytes ) 64 virtual size_t Length() const; 65 66 /// Get Stream position ( in bytes ) 67 size_t Tell() const; 68 69 /// Set Stream position ( in bytes ) 70 bool Seek(long offset, int origin) const; 71 72 /// Read from the stream 73 using Stream::Read; 74 virtual size_t Read(void* buffer, size_t bytes) const; 75 76 /// Peek into the stream 77 virtual size_t Peek(void *buffer, size_t bytes) const; 78 79 /// Write to the stream 80 using Stream::Write; 81 virtual size_t Write(const void* buffer, size_t bytes); 82 83 /// Truncate the stream to the specified length 84 virtual size_t Truncate(size_t bytes); 85 86 /// Push onto the front of the stream 87 virtual size_t PushFront(const void* buffer, size_t bytes); 88 89 /// Pop from the front of the stream 90 virtual size_t PopFront(size_t bytes); 91 92 /// Raw access to the stream 93 const byte* RawStream() const; 94 95 /// Erase a section of the stream 96 void Erase(size_t offset, size_t bytes); 97 98 /// Does the stream have data available for reading 99 virtual bool IsReadReady(); 100 101 /// Is the stream able to accept data now 102 virtual bool IsWriteReady(); 103 104 /// Sets this streams source URL, useful data that is stored 105 /// in memory streams that originated from files 106 void SetSourceURL(const URL& url); 107 108 private: 109 110 byte* buffer; 111 mutable byte* buffer_ptr; 112 size_t buffer_size; 113 size_t buffer_used; 114 bool owns_buffer; 115 116 bool Reallocate(size_t size); 117 }; 118 119 } 120 } 121 122 #endif 123