aboutsummaryrefslogtreecommitdiff
path: root/dep/ACE_wrappers/ace/Codecs.cpp
diff options
context:
space:
mode:
authormaximius <none@none>2009-10-17 15:51:44 -0700
committermaximius <none@none>2009-10-17 15:51:44 -0700
commite585187b248f48b3c6e9247b49fa07c6565d65e5 (patch)
tree637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /dep/ACE_wrappers/ace/Codecs.cpp
parent26b5e033ffde3d161382fc9addbfa99738379641 (diff)
*Backed out changeset 3be01fb200a5
--HG-- branch : trunk
Diffstat (limited to 'dep/ACE_wrappers/ace/Codecs.cpp')
-rw-r--r--dep/ACE_wrappers/ace/Codecs.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/dep/ACE_wrappers/ace/Codecs.cpp b/dep/ACE_wrappers/ace/Codecs.cpp
index 7556b76088c..d0bb0778304 100644
--- a/dep/ACE_wrappers/ace/Codecs.cpp
+++ b/dep/ACE_wrappers/ace/Codecs.cpp
@@ -2,28 +2,38 @@
#include "ace/Log_Msg.h"
#include "ace/OS_Memory.h"
#include "ace/OS_NS_ctype.h"
+
ACE_RCSID (ace,
Codecs,
"$Id: Codecs.cpp 80826 2008-03-04 14:51:23Z wotte $")
+
namespace
{
// Just in case ...
#undef alphabet
#undef pad
#undef max_columns
+
// Symbols which form the Base64 alphabet (Defined as per RFC 2045)
ACE_Byte const alphabet[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
// The padding character used in the encoding
ACE_Byte const pad = '=';
+
// Number of columns per line of encoded output (Can have a maximum
// value of 76).
int const max_columns = 72;
}
+
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
bool ACE_Base64::init_ = false;
+
ACE_Byte ACE_Base64::decoder_[256];
+
ACE_Byte ACE_Base64::member_[256];
+
ACE_Byte*
ACE_Base64::encode (const ACE_Byte* input,
const size_t input_len,
@@ -32,21 +42,27 @@ ACE_Base64::encode (const ACE_Byte* input,
{
if (!ACE_Base64::init_)
ACE_Base64::init();
+
if (!input)
return 0;
+
ACE_Byte* result = 0;
+
size_t length = ((input_len + 2) / 3) * 4;
size_t num_lines = length / max_columns + 1;
length += num_lines + 1;
ACE_NEW_RETURN (result, ACE_Byte[length], 0);
+
int char_count = 0;
int bits = 0;
size_t pos = 0;
int cols = 0;
+
for (size_t i = 0; i < input_len; ++i)
{
bits += input[i];
++char_count;
+
if (char_count == 3)
{
result[pos++] = alphabet[bits >> 18];
@@ -67,6 +83,7 @@ ACE_Base64::encode (const ACE_Byte* input,
bits <<= 8;
}
}
+
if (char_count != 0)
{
bits <<= (16 - (8 * char_count));
@@ -86,17 +103,21 @@ ACE_Base64::encode (const ACE_Byte* input,
cols += 2;
}
}
+
if (cols > 0 && is_chunked)
result[pos++] = '\n';
+
result[pos] = 0;
*output_len = pos;
return result;
}
+
size_t
ACE_Base64::length (const ACE_Byte* input)
{
if (!ACE_Base64::init_)
ACE_Base64::init();
+
ACE_Byte* ptr = const_cast<ACE_Byte*> (input);
while (*ptr != 0 &&
(member_[*(ptr)] == 1 || *ptr == pad
@@ -106,25 +127,31 @@ ACE_Base64::length (const ACE_Byte* input)
len = ((len + 3) / 4) * 3 + 1 ;
return len;
}
+
ACE_Byte*
ACE_Base64::decode (const ACE_Byte* input, size_t* output_len)
{
if (!ACE_Base64::init_)
ACE_Base64::init();
+
if (!input)
return 0;
+
size_t result_len = ACE_Base64::length (input);
ACE_Byte* result = 0;
ACE_NEW_RETURN (result, ACE_Byte[result_len], 0);
+
ACE_Byte* ptr = const_cast<ACE_Byte*> (input);
while (*ptr != 0 &&
(member_[*(ptr)] == 1 || *ptr == pad
|| ACE_OS::ace_isspace (*ptr)))
++ptr;
size_t input_len = ptr - input;
+
int char_count = 0;
int bits = 0;
size_t pos = 0;
+
size_t i = 0;
for (; i < input_len; ++i)
{
@@ -134,6 +161,7 @@ ACE_Base64::decode (const ACE_Byte* input, size_t* output_len)
continue;
bits += decoder_[input[i]];
++char_count;
+
if (char_count == 4)
{
result[pos++] = static_cast<ACE_Byte> (bits >> 16);
@@ -147,6 +175,7 @@ ACE_Base64::decode (const ACE_Byte* input, size_t* output_len)
bits <<= 6;
}
}
+
int errors = 0;
if ( i == input_len)
{
@@ -176,6 +205,7 @@ ACE_Base64::decode (const ACE_Byte* input, size_t* output_len)
break;
}
}
+
if (errors)
{
delete[] result;
@@ -185,6 +215,7 @@ ACE_Base64::decode (const ACE_Byte* input, size_t* output_len)
*output_len = pos;
return result;
}
+
void
ACE_Base64::init ()
{
@@ -199,5 +230,6 @@ ACE_Base64::init ()
}
return;
}
+
ACE_END_VERSIONED_NAMESPACE_DECL