Codeset translation specialization - Manages Byte Order Marker. More...
#include <UTF16_BOM_Translator.h>
Codeset translation specialization - Manages Byte Order Marker.
This class performs the codeset translation:
Definition at line 43 of file UTF16_BOM_Translator.h.
TAO_UTF16_BOM_Translator::TAO_UTF16_BOM_Translator | ( | bool | forceBE | ) |
constructor
forceBE,: | true forces all wchar, warray, and wstrings to big-endian byte order |
Definition at line 38 of file UTF16_BOM_Translator.cpp.
TAO_UTF16_BOM_Translator::~TAO_UTF16_BOM_Translator | ( | void | ) | [virtual] |
virtual ACE_CDR::ULong TAO_UTF16_BOM_Translator::ncs | ( | void | ) | [inline, virtual] |
Implements ACE_WChar_Codeset_Translator.
Definition at line 70 of file UTF16_BOM_Translator.h.
{return 0x00010109;}
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::read_wchar | ( | ACE_InputCDR & | cdr, | |
ACE_CDR::WChar & | x | |||
) | [virtual] |
Implements ACE_WChar_Codeset_Translator.
Definition at line 53 of file UTF16_BOM_Translator.cpp.
{ if (static_cast<ACE_CDR::Short> (this->major_version (cdr)) == 1 && static_cast<ACE_CDR::Short> (this->minor_version (cdr)) == 2) { ACE_CDR::Octet len; if (! this->read_1 (cdr, &len)) return 0; if (len == 2) // no BOM present { ACE_CDR::Short sx; if (!this->read_array (cdr, reinterpret_cast<char *> (&sx), 1,1,2)) return 0; #if defined (ACE_LITTLE_ENDIAN) ACE_CDR::Short ux; ACE_CDR::swap_2 (reinterpret_cast<const char*> (&sx), reinterpret_cast<char *> (&ux)); x = static_cast<ACE_CDR::WChar> (ux); #else x = static_cast<ACE_CDR::WChar> (sx); #endif // ACE_LITTLE_ENDIAN return 1; } ACE_UTF16_T buf[2]; if (len != 4 || !this->read_array (cdr, reinterpret_cast<char *> (buf), 1,1,4)) // get BO & payload return 0; // Check for byte order mark, if found, consume and honor it. if (buf[0] == ACE_UNICODE_BOM_CORRECT || buf[0] == ACE_UNICODE_BOM_SWAPPED) { // if we found it, but it came in in the wrong order // invert the byte order flag for the duration of this method if (buf[0] == ACE_UNICODE_BOM_SWAPPED) { ACE_CDR::Short ux; ACE_CDR::swap_2 (reinterpret_cast<const char*> (&buf[1]), reinterpret_cast<char *> (&ux)); x = static_cast<ACE_CDR::WChar> (ux); } else x = static_cast<ACE_CDR::WChar> (buf[1]); return 1; } // What do we do here? The length is > 2 but the first word // is not a BOM. Just return an error I suppose return 0; } ACE_UTF16_T sx; if (this->read_2 (cdr, &sx)) { x = static_cast<ACE_CDR::WChar> (sx); return 1; } return 0; }
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::read_wchar_array | ( | ACE_InputCDR & | cdr, | |
ACE_CDR::WChar * | x, | |||
ACE_CDR::ULong | length | |||
) | [virtual] |
Implements ACE_WChar_Codeset_Translator.
Definition at line 234 of file UTF16_BOM_Translator.cpp.
{ if (length == 0) return 1; if (static_cast<ACE_CDR::Short> (this->major_version (cdr)) == 1 && static_cast<ACE_CDR::Short> (this->minor_version (cdr)) > 1) { for (size_t i = 0; i < length; ++i) if (!this->read_wchar (cdr, x[i])) return 0; return 1; } else return this->read_wchar_array_i (cdr, x, length); }
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::read_wchar_array_i | ( | ACE_InputCDR & | cdr, | |
ACE_CDR::WChar * | x, | |||
ACE_CDR::ULong & | length, | |||
int | adjust_len = 0 | |||
) | [private] |
Definition at line 174 of file UTF16_BOM_Translator.cpp.
{ int has_bom = 0; int must_swap = 0; char* buf; static const size_t align = ACE_CDR::SHORT_ALIGN; if (cdr.adjust (ACE_UTF16_CODEPOINT_SIZE * length, align, buf) == 0) { // check for byte order mark. If found, honor it then discard it ACE_UTF16_T *sb = reinterpret_cast<ACE_UTF16_T *> (buf); if (*sb == ACE_UNICODE_BOM_CORRECT || *sb == ACE_UNICODE_BOM_SWAPPED) { must_swap = (*sb == ACE_UNICODE_BOM_SWAPPED); has_bom = 1; } else { #if defined (ACE_LITTLE_ENDIAN) must_swap = 1; #endif // ACE_LITTLE_ENDIAN } if (has_bom) { buf += ACE_UTF16_CODEPOINT_SIZE; ++sb; if (adjust_len) length -= 1; } for (size_t i = 0; i < length; ++i) #if defined (ACE_DISABLE_SWAP_ON_READ) x[i] = static_cast<ACE_CDR::WChar> (sb[i]); #else if (!must_swap) { x[i] = static_cast<ACE_CDR::WChar> (sb[i]); } else { ACE_CDR::UShort sx; ACE_CDR::swap_2 (&buf[i*2], reinterpret_cast<char *> (&sx)); x[i] = static_cast<ACE_CDR::WChar> (sx); } #endif /* ACE_DISABLE_SWAP_ON_READ */ if (has_bom && !adjust_len) { cdr.adjust (ACE_UTF16_CODEPOINT_SIZE, align, buf); } return 1; } return 0; }
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::read_wstring | ( | ACE_InputCDR & | cdr, | |
ACE_CDR::WChar *& | x | |||
) | [virtual] |
Implements ACE_WChar_Codeset_Translator.
Definition at line 118 of file UTF16_BOM_Translator.cpp.
{ ACE_CDR::ULong len; if (!this->read_4 (cdr, &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 ()) { if (static_cast<ACE_CDR::Short> (this->major_version (cdr)) == 1 && static_cast<ACE_CDR::Short> (this->minor_version (cdr)) > 1) { len /= ACE_UTF16_CODEPOINT_SIZE; //allocating one extra for the null character needed by applications ACE_NEW_RETURN (x, ACE_CDR::WChar [len + 1], 0); x[len] = L'\x00'; if (this->read_wchar_array_i (cdr, x, len, 1)) { // Since reading the array may have adjusted the length, // we simply rewrite the null terminator x[len] = L'\x00'; return 1; } } else { ACE_NEW_RETURN (x, ACE_CDR::WChar [len], 0); if (this->read_wchar_array (cdr, x, len)) 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::WChar[1], 0); x[0] = '\x00'; return 1; } x = 0; return 0; }
virtual ACE_CDR::ULong TAO_UTF16_BOM_Translator::tcs | ( | ) | [inline, virtual] |
Implements ACE_WChar_Codeset_Translator.
Definition at line 71 of file UTF16_BOM_Translator.h.
{return 0x00010109;}
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::write_swapped_wchar_array_i | ( | ACE_OutputCDR & | cdr, | |
const ACE_CDR::WChar * | x, | |||
ACE_CDR::ULong | length | |||
) | [private] |
Definition at line 425 of file UTF16_BOM_Translator.cpp.
{ if (length == 0) return 1; char* buf; static const size_t align = ACE_CDR::SHORT_ALIGN; if (cdr.adjust (ACE_UTF16_CODEPOINT_SIZE * length, align, buf) != 0) { return 0; } ACE_UTF16_T *sb = reinterpret_cast<ACE_UTF16_T *> (buf); for (size_t i = 0; i < length; ++i) { ACE_CDR::swap_2 (reinterpret_cast<const char*> (&x[i]), reinterpret_cast<char *> (&sb[i])); } return 1; }
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::write_wchar | ( | ACE_OutputCDR & | cdr, | |
ACE_CDR::WChar | x | |||
) | [virtual] |
Implements ACE_WChar_Codeset_Translator.
Definition at line 255 of file UTF16_BOM_Translator.cpp.
{ return this->write_wchar_i (cdr, x, true); }
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::write_wchar_array | ( | ACE_OutputCDR & | cdr, | |
const ACE_CDR::WChar * | x, | |||
ACE_CDR::ULong | length | |||
) | [virtual] |
Implements ACE_WChar_Codeset_Translator.
Definition at line 382 of file UTF16_BOM_Translator.cpp.
{ if (static_cast<ACE_CDR::Short> (this->major_version (cdr)) == 1 && static_cast<ACE_CDR::Short> (this->minor_version (cdr)) > 1) { for (size_t i = 0; i < length; ++i) if (this->write_wchar_i (cdr, x[i], false) == 0) return 0; return 1; } return this->write_wchar_array_i (cdr, x, length); }
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::write_wchar_array_i | ( | ACE_OutputCDR & | cdr, | |
const ACE_CDR::WChar * | x, | |||
ACE_CDR::ULong | length | |||
) | [private] |
Definition at line 400 of file UTF16_BOM_Translator.cpp.
{ if (length == 0) return 1; char* buf; static const size_t align = ACE_CDR::SHORT_ALIGN; if (cdr.adjust (ACE_UTF16_CODEPOINT_SIZE * length, align, buf) != 0) { return 0; } ACE_UTF16_T *sb = reinterpret_cast<ACE_UTF16_T *> (buf); for (size_t i = 0; i < length; ++i) { sb[i] = static_cast<ACE_UTF16_T> (x[i]); } return 1; }
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::write_wchar_i | ( | ACE_OutputCDR & | cdr, | |
ACE_CDR::WChar | x, | |||
bool | allow_BOM | |||
) | [private] |
Definition at line 262 of file UTF16_BOM_Translator.cpp.
{ if (static_cast<ACE_CDR::Short> (this->major_version (cdr)) == 1 && static_cast<ACE_CDR::Short> (this->minor_version (cdr)) > 1) { int len = 0; ACE_CDR::UShort buffer[2]; if( allow_BOM && cdr.byte_order()) { len = 2; #if defined (ACE_LITTLE_ENDIAN) if (this->forceBE_) { // force both the byte order mark and the data to Big Endian order buffer[0] = ACE_UNICODE_BOM_SWAPPED; ACE_CDR::swap_2 (reinterpret_cast<const char *> (&x), reinterpret_cast<char *> (&buffer[1])); } else #endif { // store both the byte order mark and the data in native order buffer[0] = ACE_UNICODE_BOM_CORRECT; buffer[1] = static_cast<ACE_CDR::Short> (x); } } else { // not using a byte order mark // force it to be big endian w/o BOM len = 1; if (cdr.byte_order ()) ACE_CDR::swap_2 (reinterpret_cast<const char *> (&x), reinterpret_cast<char *> (buffer)); else buffer[0] = static_cast<ACE_CDR::Short> (x); } unsigned char tcsize = static_cast<unsigned char> (len * ACE_UTF16_CODEPOINT_SIZE); if (this->write_1 (cdr, &tcsize)) return this->write_array(cdr, &buffer, tcsize, 1, 1); else return 0; } else if (static_cast<ACE_CDR::Short> (this->minor_version (cdr)) != 0) { // GIOP 1.1 simple support ACE_UTF16_T sx = static_cast<ACE_UTF16_T> (x); return this->write_2 (cdr, &sx); } else { // wchar is not allowed with GIOP 1.0. errno = EINVAL; return 0; } }
ACE_CDR::Boolean TAO_UTF16_BOM_Translator::write_wstring | ( | ACE_OutputCDR & | cdr, | |
ACE_CDR::ULong | len, | |||
const ACE_CDR::WChar * | x | |||
) | [virtual] |
Implements ACE_WChar_Codeset_Translator.
Definition at line 325 of file UTF16_BOM_Translator.cpp.
{ // we'll accept a null pointer but only for an empty string ACE_ASSERT (x != 0 || len == 0); if (static_cast<ACE_CDR::Short> (this->major_version (cdr)) == 1 && static_cast<ACE_CDR::Short> (this->minor_version (cdr)) > 1) { if (len == 0) // for zero length strings, only write a length of // zero. The BOM is not needed in this case. return this->write_4(cdr, &len); if (this->forceBE_ && cdr.byte_order()) { ACE_CDR::ULong l = (len+1) * static_cast<ACE_CDR::ULong> ( ACE_UTF16_CODEPOINT_SIZE); if (this->write_4 (cdr, &l) && this->write_2 (cdr, &ACE_UNICODE_BOM_SWAPPED) && x != 0) return this->write_swapped_wchar_array_i (cdr, x, len); } else { ACE_CDR::ULong l = (len+1) * static_cast<ACE_CDR::ULong> ( ACE_UTF16_CODEPOINT_SIZE); if (this->write_4 (cdr, &l) && this->write_2 (cdr, &ACE_UNICODE_BOM_CORRECT) && x != 0) return this->write_wchar_array_i (cdr, x, len); } } else { // pre GIOP 1.2: include null terminator in length ACE_CDR::ULong l = len + 1; if (this->write_4 (cdr, &l)) { if (x != 0) { return this->write_wchar_array_i (cdr, x, len + 1); } else { ACE_UTF16_T s = 0; return this->write_2 (cdr,&s); } } } return 0; }
bool TAO_UTF16_BOM_Translator::forceBE_ [private] |
if this flag is true, force wchar's to big endian order
Definition at line 94 of file UTF16_BOM_Translator.h.