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 | |
28 | namespace Poco { |
29 | |
30 | |
31 | class 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 | { |
39 | public: |
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 | |
54 | protected: |
55 | int readFromDevice(); |
56 | int writeToDevice(char c); |
57 | |
58 | private: |
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 | |
71 | class 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 | { |
77 | public: |
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 | |
84 | protected: |
85 | StreamConverterBuf _buf; |
86 | }; |
87 | |
88 | |
89 | class 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 | { |
97 | public: |
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 | |
107 | class 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 | { |
115 | public: |
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 | |