1//
2// StreamConverter.h
3//
4// Library: Foundation
5// Package: Text
6// Module: StreamConverter
7//
8// Definition of the StreamConverter class.
9//
10// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
11// and Contributors.
12//
13// SPDX-License-Identifier: BSL-1.0
14//
15
16
17#ifndef Foundation_StreamConverter_INCLUDED
18#define Foundation_StreamConverter_INCLUDED
19
20
21#include "Poco/Foundation.h"
22#include "Poco/TextEncoding.h"
23#include "Poco/UnbufferedStreamBuf.h"
24#include <istream>
25#include <ostream>
26
27
28namespace Poco {
29
30
31class Foundation_API StreamConverterBuf: public UnbufferedStreamBuf
32 /// A StreamConverter converts streams from one encoding (inEncoding)
33 /// into another (outEncoding).
34 /// If a character cannot be represented in outEncoding, defaultChar
35 /// is used instead.
36 /// If a byte sequence is not valid in inEncoding, defaultChar is used
37 /// instead and the encoding error count is incremented.
38{
39public:
40 StreamConverterBuf(std::istream& istr, const TextEncoding& inEncoding, const TextEncoding& outEncoding, int defaultChar = '?');
41 /// Creates the StreamConverterBuf and connects it
42 /// to the given input stream.
43
44 StreamConverterBuf(std::ostream& ostr, const TextEncoding& inEncoding, const TextEncoding& outEncoding, int defaultChar = '?');
45 /// Creates the StreamConverterBuf and connects it
46 /// to the given output stream.
47
48 ~StreamConverterBuf();
49 /// Destroys the StreamConverterBuf.
50
51 int errors() const;
52 /// Returns the number of encoding errors encountered.
53
54protected:
55 int readFromDevice();
56 int writeToDevice(char c);
57
58private:
59 std::istream* _pIstr;
60 std::ostream* _pOstr;
61 const TextEncoding& _inEncoding;
62 const TextEncoding& _outEncoding;
63 int _defaultChar;
64 unsigned char _buffer[TextEncoding::MAX_SEQUENCE_LENGTH];
65 int _sequenceLength;
66 int _pos;
67 int _errors;
68};
69
70
71class Foundation_API StreamConverterIOS: public virtual std::ios
72 /// The base class for InputStreamConverter and OutputStreamConverter.
73 ///
74 /// This class is needed to ensure the correct initialization
75 /// order of the stream buffer and base classes.
76{
77public:
78 StreamConverterIOS(std::istream& istr, const TextEncoding& inEncoding, const TextEncoding& outEncoding, int defaultChar = '?');
79 StreamConverterIOS(std::ostream& ostr, const TextEncoding& inEncoding, const TextEncoding& outEncoding, int defaultChar = '?');
80 ~StreamConverterIOS();
81 StreamConverterBuf* rdbuf();
82 int errors() const;
83
84protected:
85 StreamConverterBuf _buf;
86};
87
88
89class Foundation_API InputStreamConverter: public StreamConverterIOS, public std::istream
90 /// This stream converts all characters read from the
91 /// underlying istream from one character encoding into another.
92 /// If a character cannot be represented in outEncoding, defaultChar
93 /// is used instead.
94 /// If a byte sequence read from the underlying stream is not valid in inEncoding,
95 /// defaultChar is used instead and the encoding error count is incremented.
96{
97public:
98 InputStreamConverter(std::istream& istr, const TextEncoding& inEncoding, const TextEncoding& outEncoding, int defaultChar = '?');
99 /// Creates the InputStreamConverter and connects it
100 /// to the given input stream.
101
102 ~InputStreamConverter();
103 /// Destroys the stream.
104};
105
106
107class Foundation_API OutputStreamConverter: public StreamConverterIOS, public std::ostream
108 /// This stream converts all characters written to the
109 /// underlying ostream from one character encoding into another.
110 /// If a character cannot be represented in outEncoding, defaultChar
111 /// is used instead.
112 /// If a byte sequence written to the stream is not valid in inEncoding,
113 /// defaultChar is used instead and the encoding error count is incremented.
114{
115public:
116 OutputStreamConverter(std::ostream& ostr, const TextEncoding& inEncoding, const TextEncoding& outEncoding, int defaultChar = '?');
117 /// Creates the OutputStreamConverter and connects it
118 /// to the given input stream.
119
120 ~OutputStreamConverter();
121 /// Destroys the CountingOutputStream.
122};
123
124
125} // namespace Poco
126
127
128#endif // Foundation_StreamConverter_INCLUDED
129