aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Foundation/include/Poco/TeeStream.h
blob: 07744d83413cf1449b0f9e1d50e0d49c72cef0fc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//
// TeeStream.h
//
// Library: Foundation
// Package: Streams
// Module:  TeeStream
//
// Definition of the TeeStream class.
//
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Foundation_TeeStream_INCLUDED
#define Foundation_TeeStream_INCLUDED


#include "Poco/Foundation.h"
#include "Poco/UnbufferedStreamBuf.h"
#include <vector>
#include <istream>
#include <ostream>


namespace Poco {


class Foundation_API TeeStreamBuf: public UnbufferedStreamBuf
	/// This stream buffer copies all data written to or
	/// read from it to one or multiple output streams.
{
public:
	TeeStreamBuf();
		/// Creates an unconnected CountingStreamBuf.
		/// Use addStream() to attach output streams.
	
	TeeStreamBuf(std::istream& istr);
		/// Creates the CountingStreamBuf and connects it
		/// to the given input stream.

	TeeStreamBuf(std::ostream& ostr);
		/// Creates the CountingStreamBuf and connects it
		/// to the given output stream.

	~TeeStreamBuf();
		/// Destroys the CountingStream.

	void addStream(std::ostream& ostr);
		/// Adds the given output stream.

protected:
	int readFromDevice();
	int writeToDevice(char c);

private:
	typedef std::vector<std::ostream*> StreamVec;
	
	std::istream* _pIstr;
	StreamVec     _streams;
};


class Foundation_API TeeIOS: public virtual std::ios
	/// The base class for TeeInputStream and TeeOutputStream.
	///
	/// This class is needed to ensure the correct initialization
	/// order of the stream buffer and base classes.
{
public:
	TeeIOS();
		/// Creates the basic stream and leaves it unconnected.

	TeeIOS(std::istream& istr);
		/// Creates the basic stream and connects it
		/// to the given input stream.

	TeeIOS(std::ostream& ostr);
		/// Creates the basic stream and connects it
		/// to the given output stream.

	~TeeIOS();
		/// Destroys the stream.

	void addStream(std::ostream& ostr);
		/// Adds the given output stream.

	TeeStreamBuf* rdbuf();
		/// Returns a pointer to the underlying streambuf.

protected:
	TeeStreamBuf _buf;
};


class Foundation_API TeeInputStream: public TeeIOS, public std::istream
	/// This stream copies all characters read through it
	/// to one or multiple output streams.
{
public:
	TeeInputStream(std::istream& istr);
		/// Creates the TeeInputStream and connects it
		/// to the given input stream.

	~TeeInputStream();
		/// Destroys the TeeInputStream.
};


class Foundation_API TeeOutputStream: public TeeIOS, public std::ostream
	/// This stream copies all characters written to it
	/// to one or multiple output streams.
{
public:
	TeeOutputStream();
		/// Creates an unconnected TeeOutputStream.
	
	TeeOutputStream(std::ostream& ostr);
		/// Creates the TeeOutputStream and connects it
		/// to the given input stream.

	~TeeOutputStream();
		/// Destroys the TeeOutputStream.
};


} // namespace Poco


#endif // Foundation_TeeStream_INCLUDED