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