Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "tao/Codeset/UTF8_Latin1_Translator.h"
00018 #include "tao/debug.h"
00019 #include "ace/OS_Memory.h"
00020
00021
00022
00023 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00024
00025
00026
00027
00028 TAO_UTF8_Latin1_Translator::TAO_UTF8_Latin1_Translator ()
00029 {
00030 }
00031
00032 TAO_UTF8_Latin1_Translator::~TAO_UTF8_Latin1_Translator (void)
00033 {
00034 }
00035
00036
00037 ACE_CDR::Boolean
00038 TAO_UTF8_Latin1_Translator::read_char (ACE_InputCDR &cdr, ACE_CDR::Char &x)
00039 {
00040
00041
00042 ACE_CDR::Octet ox;
00043 if (this->read_1 (cdr, &ox))
00044 {
00045 if (ox < 0xC0)
00046 {
00047 x = ox;
00048 return true;
00049 }
00050 }
00051 return false;
00052 }
00053
00054 ACE_CDR::ULong
00055 TAO_UTF8_Latin1_Translator::read_char_i (ACE_InputCDR &cdr, ACE_CDR::Char &x)
00056 {
00057
00058 ACE_CDR::Octet upper;
00059 if (this->read_1 (cdr, &upper))
00060 {
00061 if ( upper >= 0xC4)
00062
00063
00064 return 0;
00065 if ( upper < 0xC0 )
00066 {
00067 x = static_cast<ACE_CDR::Char>(upper);
00068 return 1;
00069 }
00070 ACE_CDR::Octet lower;
00071 if (this->read_1 (cdr, &lower))
00072 {
00073 ACE_CDR::Octet final = ((upper & 0xBF) << 6) + (lower & 0xC0);
00074 x = static_cast<ACE_CDR::Char>(final);
00075 return 2;
00076 };
00077 }
00078 return 0;
00079 }
00080
00081 ACE_CDR::Boolean
00082 TAO_UTF8_Latin1_Translator::read_string (ACE_InputCDR &cdr,
00083 ACE_CDR::Char *&x)
00084 {
00085 ACE_CDR::ULong len;
00086 if (!cdr.read_ulong (len))
00087 return 0;
00088
00089
00090
00091
00092 if (len > 0 && len <= cdr.length())
00093 {
00094 ACE_NEW_RETURN (x,
00095 ACE_CDR::Char [len],
00096 0);
00097
00098
00099 size_t pos = 0;
00100 ACE_CDR::ULong incr = 1;
00101 for (ACE_CDR::ULong i = 0; incr > 0 && i < len; i += incr)
00102 {
00103 incr = this->read_char_i(cdr,x[pos++]);
00104 }
00105 if (incr > 0)
00106 return 1;
00107 delete [] x;
00108 }
00109 else if (len == 0)
00110 {
00111
00112
00113 ACE_NEW_RETURN (x,
00114 ACE_CDR::Char[1],
00115 0);
00116 x[0] = '\x00';
00117 return 1;
00118 }
00119 x = 0;
00120 return 0;
00121 }
00122
00123 ACE_CDR::Boolean
00124 TAO_UTF8_Latin1_Translator::read_char_array (ACE_InputCDR & cdr,
00125 ACE_CDR::Char *x,
00126 ACE_CDR::ULong length)
00127 {
00128 if (length == 0)
00129 return 1;
00130
00131 for (size_t i = 0; i < length; ++i)
00132 if (!this->read_char(cdr,x[i]))
00133 return 0;
00134
00135 return 1;
00136 }
00137
00138 ACE_CDR::Boolean
00139 TAO_UTF8_Latin1_Translator::write_char (ACE_OutputCDR &cdr,
00140 ACE_CDR::Char x)
00141 {
00142 ACE_CDR::Octet ox = x;
00143 if (ox < 0xC0)
00144 return this->write_1 (cdr,&ox);
00145 else
00146 {
00147 errno = EINVAL;
00148 return 0;
00149 }
00150 }
00151
00152 ACE_CDR::Boolean
00153 TAO_UTF8_Latin1_Translator::write_char_i (ACE_OutputCDR &cdr,
00154 ACE_CDR::Char x)
00155 {
00156
00157
00158
00159
00160 ACE_CDR::Octet ox = x;
00161 if (ox < 0xC0)
00162 return this->write_1 (cdr,&ox);
00163 else
00164 {
00165
00166
00167 ACE_CDR::Octet upper = 0xC0 + (ox >> 6);
00168 ACE_CDR::Octet lower = 0x80 + (ox & 0x3F);
00169 if (this->write_1(cdr, &upper))
00170 return this->write_1(cdr, &lower);
00171 }
00172 return 0;
00173 }
00174
00175 ACE_CDR::Boolean
00176 TAO_UTF8_Latin1_Translator::write_string (ACE_OutputCDR & cdr,
00177 ACE_CDR::ULong len,
00178 const ACE_CDR::Char *x)
00179 {
00180
00181 if (x == 0 && len != 0)
00182 return 0;
00183
00184 ACE_CDR::ULong l = len;
00185
00186 for (ACE_CDR::ULong i = 0; i < len; i++)
00187 if (static_cast<ACE_CDR::Octet>(x[i]) > 0xbf) l++;
00188
00189
00190 l++;
00191 if (cdr.write_ulong (l))
00192 {
00193 for (ACE_CDR::ULong i = 0; i < len; ++i)
00194 {
00195 if (this->write_char_i (cdr,x[i]) == 0)
00196 return 0;
00197 }
00198 ACE_CDR::Octet s = 0;
00199 return this->write_1 (cdr, &s);
00200 }
00201 return 0;
00202 }
00203
00204 ACE_CDR::Boolean
00205 TAO_UTF8_Latin1_Translator::write_char_array (ACE_OutputCDR & cdr,
00206 const ACE_CDR::Char *x,
00207 ACE_CDR::ULong length)
00208 {
00209 if (length == 0)
00210 return true;
00211
00212 for (size_t i = 0; i < length; ++i)
00213
00214
00215 if (this->write_char (cdr, x[i]) == 0)
00216 return false;
00217
00218 return true;
00219 }
00220
00221 TAO_END_VERSIONED_NAMESPACE_DECL