source: vscpl/src/hu/varadiistvan/scpl/io/BlockingStream.h@ 10:1ee8d0a23099

Last change on this file since 10:1ee8d0a23099 was 10:1ee8d0a23099, checked in by István Váradi <ivaradi@…>, 11 years ago

Imported the code of the blocking and data streams

File size: 5.8 KB
Line 
1// Copyright (c) 2013 by István Váradi
2
3// This file is part of VSCPL, a simple cross-platform utility library
4
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are met:
7
8// 1. Redistributions of source code must retain the above copyright notice, this
9// list of conditions and the following disclaimer.
10// 2. Redistributions in binary form must reproduce the above copyright notice,
11// this list of conditions and the following disclaimer in the documentation
12// and/or other materials provided with the distribution.
13
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25// The views and conclusions contained in the software and documentation are those
26// of the authors and should not be interpreted as representing official policies,
27// either expressed or implied, of the FreeBSD Project.
28
29#ifndef HU_VARADIISTVAN_SCPL_IO_BLOCKINGSTREAM_H
30#define HU_VARADIISTVAN_SCPL_IO_BLOCKINGSTREAM_H
31//------------------------------------------------------------------------------
32
33#include "Failable.h"
34
35#include "BufferedStream.h"
36#include "WaitableEvent.h"
37
38#include <cstdlib>
39
40//------------------------------------------------------------------------------
41
42namespace hu { namespace varadiistvan { namespace scpl { namespace io {
43
44//------------------------------------------------------------------------------
45
46/**
47 * Wrapper for a buffered stream, which an event and provides
48 * blocking, but interruptible read() and write() operations.
49 *
50 * The class is designed in a way, that it expects its constructed
51 * instances to be called only from a single thread at a time, except
52 * for the interrupt() function, which may be called from another
53 * thread anytime.
54 */
55class BlockingStream : public Failable
56{
57private:
58 /**
59 * The buffered stream used.
60 */
61 BufferedStream& stream;
62
63 /**
64 * The waitable event.
65 */
66 WaitableEvent event;
67
68 /**
69 * Indicate if we are interrupted.
70 */
71 bool interrupted;
72
73 /**
74 * The offset in the buffer of the reading stream.
75 */
76 size_t readingOffset;
77
78 /**
79 * Indicate if the end-of-file has been reached while reading.
80 */
81 bool eof;
82
83public:
84 /**
85 * Construct the blocking stream for the given buffered stream.
86 *
87 * The stream must have a waiter which is used for waiting.
88 */
89 BlockingStream(BufferedStream& stream);
90
91 /**
92 * Determine if the stream has neither failed nor been
93 * interrupted.
94 */
95 operator bool() const;
96
97 /**
98 * Interrupt the stream. Pending or future read and write calls
99 * will return indicating error. The isInterrupted() function can
100 * be used to check if the stream was interrupted or not.
101 */
102 void interrupt();
103
104 /**
105 * Indicate if the stream is interrupted or not.
106 */
107 bool isInterrupted();
108
109 /**
110 * Read the given number of bytes into the given buffer.
111 *
112 * @return if the reading has succeeded
113 */
114 bool read(void* dest, size_t length);
115
116 /**
117 * Skip the given number of bytes.
118 */
119 bool skip(size_t length);
120
121 /**
122 * Write the given number of bytes from the given buffer. The data
123 * may not be written to the underlying stream fully, so if you
124 * want to make sure that it is sent, call flush() afterwards.
125 *
126 * @return true on success, false on error.
127 */
128 bool write(const void* src, size_t length);
129
130 /**
131 * Flush anything written so far into the buffer, but not to the
132 * underlying stream.
133 *
134 * @return whether the operation has succeeded.
135 */
136 bool flush();
137
138private:
139 /**
140 * Fill the buffer with data from the stream.
141 */
142 bool fill();
143
144 /**
145 * Check for the stream being interrupted.
146 *
147 * @return if the stream is interrupted, false otherwise
148 */
149 bool checkInterrupted();
150};
151
152//------------------------------------------------------------------------------
153// Inline definitions
154//------------------------------------------------------------------------------
155
156inline BlockingStream::BlockingStream(BufferedStream& stream) :
157 stream(stream),
158 event(stream.getWaiter()),
159 interrupted(false),
160 readingOffset(0),
161 eof(false)
162{
163}
164
165//------------------------------------------------------------------------------
166
167inline BlockingStream::operator bool() const
168{
169 return !failed() && !interrupted && !eof;
170}
171
172//------------------------------------------------------------------------------
173
174inline void BlockingStream::interrupt()
175{
176 event.fire();
177}
178
179//------------------------------------------------------------------------------
180
181inline bool BlockingStream::isInterrupted()
182{
183 return interrupted;
184}
185
186//------------------------------------------------------------------------------
187
188} /* namespace hu::varadiistvan::scpl::io */ } /* namespace hu::varadiistvan::scpl */ } /* namespace hu::varadiistvan */ } /* namespace hu */
189
190//------------------------------------------------------------------------------
191#endif // HU_VARADIISTVAN_SCPL_IO_BLOCKINGSTREAM_H
192
193// Local Variables:
194// mode: C++
195// c-basic-offset: 4
196// indent-tabs-mode: nil
197// End:
Note: See TracBrowser for help on using the repository browser.