Public Member Functions | Private Member Functions

TAO_UTF8_Latin1_Translator Class Reference

#include <UTF8_Latin1_Translator.h>

Inheritance diagram for TAO_UTF8_Latin1_Translator:
Inheritance graph
[legend]
Collaboration diagram for TAO_UTF8_Latin1_Translator:
Collaboration graph
[legend]

List of all members.

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)

Detailed Description

Definition at line 48 of file UTF8_Latin1_Translator.h.


Constructor & Destructor Documentation

TAO_UTF8_Latin1_Translator::TAO_UTF8_Latin1_Translator (  ) 

constructor

Definition at line 28 of file UTF8_Latin1_Translator.cpp.

{
}

TAO_UTF8_Latin1_Translator::~TAO_UTF8_Latin1_Translator ( void   )  [virtual]

Virtual destruction.

Definition at line 32 of file UTF8_Latin1_Translator.cpp.

{
}


Member Function Documentation

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;
}


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines