#include <UTF8_Latin1_Translator.h>


Public Member Functions | |
| TAO_UTF8_Latin1_Translator () | |
| constructor | |
| virtual | ~TAO_UTF8_Latin1_Translator (void) |
| Virtual destruction. | |
| virtual ACE_CDR::Boolean | read_char (ACE_InputCDR &, ACE_CDR::Char &) |
| virtual ACE_CDR::Boolean | read_string (ACE_InputCDR &, ACE_CDR::Char *&) |
| virtual ACE_CDR::Boolean | read_char_array (ACE_InputCDR &, ACE_CDR::Char *, ACE_CDR::ULong) |
| virtual ACE_CDR::Boolean | write_char (ACE_OutputCDR &, ACE_CDR::Char) |
| virtual ACE_CDR::Boolean | write_string (ACE_OutputCDR &, ACE_CDR::ULong, const ACE_CDR::Char *) |
| virtual ACE_CDR::Boolean | write_char_array (ACE_OutputCDR &, const ACE_CDR::Char *, ACE_CDR::ULong) |
| virtual ACE_CDR::ULong | ncs () |
| virtual ACE_CDR::ULong | tcs () |
Private Member Functions | |
| ACE_CDR::ULong | read_char_i (ACE_InputCDR &, ACE_CDR::Char &) |
| ACE_CDR::Boolean | write_char_i (ACE_OutputCDR &, ACE_CDR::Char) |
Definition at line 48 of file UTF8_Latin1_Translator.h.
| TAO_UTF8_Latin1_Translator::TAO_UTF8_Latin1_Translator | ( | ) |
| TAO_UTF8_Latin1_Translator::~TAO_UTF8_Latin1_Translator | ( | void | ) | [virtual] |
| virtual ACE_CDR::ULong TAO_UTF8_Latin1_Translator::ncs | ( | void | ) | [inline, virtual] |
Implements ACE_Char_Codeset_Translator.
Definition at line 74 of file UTF8_Latin1_Translator.h.
{return 0x00010001U;}
| ACE_CDR::Boolean TAO_UTF8_Latin1_Translator::read_char | ( | ACE_InputCDR & | cdr, | |
| ACE_CDR::Char & | x | |||
| ) | [virtual] |
Implements ACE_Char_Codeset_Translator.
Definition at line 38 of file UTF8_Latin1_Translator.cpp.
{
// We cannot have a codepoint > 0xBF at this point, since we are expecting
// only one single char.
ACE_CDR::Octet ox;
if (this->read_1 (cdr, &ox))
{
if (ox < 0xC0)
{
x = ox;
return true;
}
}
return false;
}
| ACE_CDR::Boolean TAO_UTF8_Latin1_Translator::read_char_array | ( | ACE_InputCDR & | cdr, | |
| ACE_CDR::Char * | x, | |||
| ACE_CDR::ULong | length | |||
| ) | [virtual] |
Implements ACE_Char_Codeset_Translator.
Definition at line 124 of file UTF8_Latin1_Translator.cpp.
{
if (length == 0)
return 1;
for (size_t i = 0; i < length; ++i)
if (!this->read_char(cdr,x[i]))
return 0;
return 1;
}
| ACE_CDR::ULong TAO_UTF8_Latin1_Translator::read_char_i | ( | ACE_InputCDR & | cdr, | |
| ACE_CDR::Char & | x | |||
| ) | [private] |
Definition at line 55 of file UTF8_Latin1_Translator.cpp.
{
// This will read up to 2 octets and combine them into one char if possible
ACE_CDR::Octet upper;
if (this->read_1 (cdr, &upper))
{
if ( upper >= 0xC4) // Anything with a leading char > 110001xx converts
// to a codepoint value > 0x00FF, thus won't fit in
// a single char.
return 0;
if ( upper < 0xC0 )
{
x = static_cast<ACE_CDR::Char>(upper);
return 1;
}
ACE_CDR::Octet lower;
if (this->read_1 (cdr, &lower))
{
ACE_CDR::Octet final = ((upper & 0xBF) << 6) + (lower & 0xC0);
x = static_cast<ACE_CDR::Char>(final);
return 2;
};
}
return 0;
}
| ACE_CDR::Boolean TAO_UTF8_Latin1_Translator::read_string | ( | ACE_InputCDR & | cdr, | |
| ACE_CDR::Char *& | x | |||
| ) | [virtual] |
Implements ACE_Char_Codeset_Translator.
Definition at line 82 of file UTF8_Latin1_Translator.cpp.
{
ACE_CDR::ULong len;
if (!cdr.read_ulong (len))
return 0;
// A check for the length being too great is done later in the
// call to read_char_array but we want to have it done before
// the memory is allocated.
if (len > 0 && len <= cdr.length())
{
ACE_NEW_RETURN (x,
ACE_CDR::Char [len],
0);
// pos keeps track of the character position, it will never be
// greater than len
size_t pos = 0;
ACE_CDR::ULong incr = 1;
for (ACE_CDR::ULong i = 0; incr > 0 && i < len; i += incr)
{
incr = this->read_char_i(cdr,x[pos++]);
}
if (incr > 0)
return 1;
delete [] x;
}
else if (len == 0)
{
// Convert any null strings to empty strings since empty
// strings can cause crashes. (See bug 58.)
ACE_NEW_RETURN (x,
ACE_CDR::Char[1],
0);
x[0] = '\x00';
return 1;
}
x = 0;
return 0;
}
| virtual ACE_CDR::ULong TAO_UTF8_Latin1_Translator::tcs | ( | ) | [inline, virtual] |
Implements ACE_Char_Codeset_Translator.
Definition at line 75 of file UTF8_Latin1_Translator.h.
{return 0x05010001U;}
| ACE_CDR::Boolean TAO_UTF8_Latin1_Translator::write_char | ( | ACE_OutputCDR & | cdr, | |
| ACE_CDR::Char | x | |||
| ) | [virtual] |
Implements ACE_Char_Codeset_Translator.
Definition at line 139 of file UTF8_Latin1_Translator.cpp.
{
ACE_CDR::Octet ox = x;
if (ox < 0xC0)
return this->write_1 (cdr,&ox);
else
{ // character cannot be represented in a single octet
errno = EINVAL;
return 0;
}
}
| ACE_CDR::Boolean TAO_UTF8_Latin1_Translator::write_char_array | ( | ACE_OutputCDR & | cdr, | |
| const ACE_CDR::Char * | x, | |||
| ACE_CDR::ULong | length | |||
| ) | [virtual] |
Implements ACE_Char_Codeset_Translator.
Definition at line 205 of file UTF8_Latin1_Translator.cpp.
{
if (length == 0)
return true;
for (size_t i = 0; i < length; ++i)
// We still have to write each char individually, as any translated
// value may fail to fit in a single octet.
if (this->write_char (cdr, x[i]) == 0)
return false;
return true;
}
| ACE_CDR::Boolean TAO_UTF8_Latin1_Translator::write_char_i | ( | ACE_OutputCDR & | cdr, | |
| ACE_CDR::Char | x | |||
| ) | [private] |
Definition at line 153 of file UTF8_Latin1_Translator.cpp.
{
// @@@ Strictly speaking, we should test for 7F < x < C0 and do
// something else in that case, but for now we will just let it
// pass.
ACE_CDR::Octet ox = x;
if (ox < 0xC0)
return this->write_1 (cdr,&ox);
else
{ // character cannot be represented in a single octet
// Since the source will never be > 0xFF, we don't have to worry about
// using a third octet.
ACE_CDR::Octet upper = 0xC0 + (ox >> 6);
ACE_CDR::Octet lower = 0x80 + (ox & 0x3F);
if (this->write_1(cdr, &upper))
return this->write_1(cdr, &lower);
}
return 0;
}
| ACE_CDR::Boolean TAO_UTF8_Latin1_Translator::write_string | ( | ACE_OutputCDR & | cdr, | |
| ACE_CDR::ULong | len, | |||
| const ACE_CDR::Char * | x | |||
| ) | [virtual] |
Implements ACE_Char_Codeset_Translator.
Definition at line 176 of file UTF8_Latin1_Translator.cpp.
{
// we'll accept a null pointer but only for an empty string
if (x == 0 && len != 0)
return 0;
ACE_CDR::ULong l = len;
// Compute the real buffer size by adding in multi-byte codepoints.
for (ACE_CDR::ULong i = 0; i < len; i++)
if (static_cast<ACE_CDR::Octet>(x[i]) > 0xbf) l++;
// Always add one for the nul
l++;
if (cdr.write_ulong (l))
{
for (ACE_CDR::ULong i = 0; i < len; ++i)
{
if (this->write_char_i (cdr,x[i]) == 0)
return 0;
}
ACE_CDR::Octet s = 0;
return this->write_1 (cdr, &s);
}
return 0;
}
1.7.0