aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Foundation/include/Poco/Base64Encoder.h
blob: 4371803a5961b8bbcb4a56dd392e4c9c01ac9bb3 (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
133
134
135
136
137
138
//
// Base64Encoder.h
//
// Library: Foundation
// Package: Streams
// Module:  Base64
//
// Definition of class Base64Encoder.
//
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Foundation_Base64Encoder_INCLUDED
#define Foundation_Base64Encoder_INCLUDED


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


namespace Poco {


enum Base64EncodingOptions
{
	BASE64_URL_ENCODING = 0x01,
		/// Use the URL and filename-safe alphabet,
		/// replacing '+' with '-' and '/' with '_'.
		///
		/// Will also set line length to unlimited.

	BASE64_NO_PADDING   = 0x02
		/// Do not append padding characters ('=') at end.
};


class Foundation_API Base64EncoderBuf: public UnbufferedStreamBuf
	/// This streambuf base64-encodes all data written
	/// to it and forwards it to a connected
	/// ostream.
	///
	/// Note: The characters are directly written
	/// to the ostream's streambuf, thus bypassing
	/// the ostream. The ostream's state is therefore
	/// not updated to match the buffer's state.
{
public:
	Base64EncoderBuf(std::ostream& ostr, int options = 0);
	~Base64EncoderBuf();

	int close();
		/// Closes the stream buffer.

	void setLineLength(int lineLength);
		/// Specify the line length.
		///
		/// After the given number of characters have been written, 
		/// a newline character will be written.
		///
		/// Specify 0 for an unlimited line length.

	int getLineLength() const;
		/// Returns the currently set line length.

private:
	int writeToDevice(char c);

	int             _options;
	unsigned char   _group[3];
	int             _groupLength;
	int             _pos;
	int             _lineLength;
	std::streambuf& _buf;
	const unsigned char* _pOutEncoding;

	static const unsigned char OUT_ENCODING[64];
	static const unsigned char OUT_ENCODING_URL[64];

	friend class Base64DecoderBuf;

	Base64EncoderBuf(const Base64EncoderBuf&);
	Base64EncoderBuf& operator = (const Base64EncoderBuf&);
};


class Foundation_API Base64EncoderIOS: public virtual std::ios
	/// The base class for Base64Encoder.
	///
	/// This class is needed to ensure the correct initialization
	/// order of the stream buffer and base classes.
{
public:
	Base64EncoderIOS(std::ostream& ostr, int options = 0);
	~Base64EncoderIOS();
	int close();
	Base64EncoderBuf* rdbuf();

protected:
	Base64EncoderBuf _buf;

private:
	Base64EncoderIOS(const Base64EncoderIOS&);
	Base64EncoderIOS& operator = (const Base64EncoderIOS&);
};


class Foundation_API Base64Encoder: public Base64EncoderIOS, public std::ostream
	/// This ostream base64-encodes all data
	/// written to it and forwards it to
	/// a connected ostream.
	/// Always call close() when done
	/// writing data, to ensure proper
	/// completion of the encoding operation.
	///
	/// Note: The characters are directly written
	/// to the ostream's streambuf, thus bypassing
	/// the ostream. The ostream's state is therefore
	/// not updated to match the buffer's state.
{
public:
	Base64Encoder(std::ostream& ostr, int options = 0);
	~Base64Encoder();

private:
	Base64Encoder(const Base64Encoder&);
	Base64Encoder& operator = (const Base64Encoder&);
};


} // namespace Poco


#endif // Foundation_Base64Encoder_INCLUDED