summaryrefslogtreecommitdiff
path: root/ACE/ace/Encoding_Converter_Factory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/Encoding_Converter_Factory.cpp')
-rw-r--r--ACE/ace/Encoding_Converter_Factory.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/ACE/ace/Encoding_Converter_Factory.cpp b/ACE/ace/Encoding_Converter_Factory.cpp
new file mode 100644
index 00000000000..8cf1ed22c3f
--- /dev/null
+++ b/ACE/ace/Encoding_Converter_Factory.cpp
@@ -0,0 +1,74 @@
+// $Id$
+#include "ace/Encoding_Converter_Factory.h"
+
+#if defined (ACE_USES_WCHAR)
+#include "ace/UTF32_Encoding_Converter.h"
+#include "ace/UTF16_Encoding_Converter.h"
+#include "ace/UTF8_Encoding_Converter.h"
+#include "ace/OS_Memory.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_Encoding_Converter*
+ACE_Encoding_Converter_Factory::create (
+ const ACE_Byte* source,
+ size_t source_size,
+ ACE_Encoding_Converter_Factory::Encoding_Hint hint)
+{
+#if defined (ACE_BIG_ENDIAN)
+ bool const convert_for_bigendian = true;
+#else
+ bool const convert_for_bigendian = false;
+#endif /* ACE_BIG_ENDIAN */
+ ACE_Encoding_Converter* converter = 0;
+
+ switch (hint)
+ {
+ case ACE_UTF_32BE:
+ ACE_NEW_RETURN (converter,
+ ACE_UTF32_Encoding_Converter (!convert_for_bigendian),
+ 0);
+ break;
+ case ACE_UTF_32LE:
+ ACE_NEW_RETURN (converter,
+ ACE_UTF32_Encoding_Converter (convert_for_bigendian),
+ 0);
+ break;
+ case ACE_UTF_16BE:
+ ACE_NEW_RETURN (converter,
+ ACE_UTF16_Encoding_Converter (!convert_for_bigendian),
+ 0);
+ break;
+ case ACE_UTF_16LE:
+ ACE_NEW_RETURN (converter,
+ ACE_UTF16_Encoding_Converter (convert_for_bigendian),
+ 0);
+ break;
+ case ACE_UTF_8:
+ ACE_NEW_RETURN (converter,
+ ACE_UTF8_Encoding_Converter,
+ 0);
+ break;
+ default:
+ // First check for ASCII since much of ASCII text will appear to
+ // convert from UTF-16 to UTF-8.
+ converter = ACE_UTF8_Encoding_Converter::encoded (source, source_size);
+ if (converter != 0)
+ return converter;
+
+ // Check for UTF-32
+ converter = ACE_UTF32_Encoding_Converter::encoded (source, source_size);
+ if (converter != 0)
+ return converter;
+
+ // Check for UTF-16
+ converter = ACE_UTF16_Encoding_Converter::encoded (source, source_size);
+ if (converter != 0)
+ return converter;
+ }
+
+ return converter;
+}
+
+ACE_END_VERSIONED_NAMESPACE_DECL
+#endif /* ACE_USES_WCHAR */