1 #include "ace/Codecs.h"
2 #include "ace/Log_Msg.h"
3 #include "ace/OS_Memory.h"
4 #include "ace/OS_NS_ctype.h"
8 "$Id: Codecs.cpp 80826 2008-03-04 14:51:23Z wotte $")
17 // Symbols which form the Base64 alphabet (Defined as per RFC 2045)
18 ACE_Byte
const alphabet
[] =
19 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
21 // The padding character used in the encoding
22 ACE_Byte
const pad
= '=';
24 // Number of columns per line of encoded output (Can have a maximum
26 int const max_columns
= 72;
29 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
31 bool ACE_Base64::init_
= false;
33 ACE_Byte
ACE_Base64::decoder_
[256];
35 ACE_Byte
ACE_Base64::member_
[256];
38 ACE_Base64::encode (const ACE_Byte
* input
,
39 const size_t input_len
,
43 if (!ACE_Base64::init_
)
51 size_t length
= ((input_len
+ 2) / 3) * 4;
52 size_t num_lines
= length
/ max_columns
+ 1;
53 length
+= num_lines
+ 1;
54 ACE_NEW_RETURN (result
, ACE_Byte
[length
], 0);
61 for (size_t i
= 0; i
< input_len
; ++i
)
68 result
[pos
++] = alphabet
[bits
>> 18];
69 result
[pos
++] = alphabet
[(bits
>> 12) & 0x3f];
70 result
[pos
++] = alphabet
[(bits
>> 6) & 0x3f];
71 result
[pos
++] = alphabet
[bits
& 0x3f];
73 if (cols
== max_columns
) {
89 bits
<<= (16 - (8 * char_count
));
90 result
[pos
++] = alphabet
[bits
>> 18];
91 result
[pos
++] = alphabet
[(bits
>> 12) & 0x3f];
101 result
[pos
++] = alphabet
[(bits
>> 6) & 0x3f];
107 if (cols
> 0 && is_chunked
)
108 result
[pos
++] = '\n';
116 ACE_Base64::length (const ACE_Byte
* input
)
118 if (!ACE_Base64::init_
)
121 ACE_Byte
* ptr
= const_cast<ACE_Byte
*> (input
);
123 (member_
[*(ptr
)] == 1 || *ptr
== pad
124 || ACE_OS::ace_isspace (*ptr
)))
126 size_t len
= ptr
- input
;
127 len
= ((len
+ 3) / 4) * 3 + 1 ;
132 ACE_Base64::decode (const ACE_Byte
* input
, size_t* output_len
)
134 if (!ACE_Base64::init_
)
140 size_t result_len
= ACE_Base64::length (input
);
141 ACE_Byte
* result
= 0;
142 ACE_NEW_RETURN (result
, ACE_Byte
[result_len
], 0);
144 ACE_Byte
* ptr
= const_cast<ACE_Byte
*> (input
);
146 (member_
[*(ptr
)] == 1 || *ptr
== pad
147 || ACE_OS::ace_isspace (*ptr
)))
149 size_t input_len
= ptr
- input
;
156 for (; i
< input_len
; ++i
)
160 if (!ACE_Base64::member_
[input
[i
]])
162 bits
+= decoder_
[input
[i
]];
167 result
[pos
++] = static_cast<ACE_Byte
> (bits
>> 16);
168 result
[pos
++] = static_cast<ACE_Byte
> ((bits
>> 8) & 0xff);
169 result
[pos
++] = static_cast<ACE_Byte
> (bits
& 0xff);
184 ACE_ERROR ((LM_ERROR
,
185 ACE_TEXT ("Decoding incomplete: atleast %d bits truncated\n"),
186 (4 - char_count
) * 6));
195 ACE_ERROR ((LM_ERROR
,
196 ACE_TEXT ("Decoding incomplete: atleast 2 bits missing\n")));
200 result
[pos
++] = static_cast<ACE_Byte
> (bits
>> 10);
203 result
[pos
++] = static_cast<ACE_Byte
> (bits
>> 16);
204 result
[pos
++] = static_cast<ACE_Byte
> ((bits
>> 8) & 0xff);
222 if (!ACE_Base64::init_
)
224 for (ACE_Byte i
= 0; i
< sizeof (alphabet
); ++i
)
226 ACE_Base64::decoder_
[alphabet
[i
]] = i
;
227 ACE_Base64::member_
[alphabet
[i
]] = 1;
229 ACE_Base64::init_
= true;
234 ACE_END_VERSIONED_NAMESPACE_DECL