From 9c4990c88a02c2480040688d175fb0922ebac464 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 30 Aug 2011 02:55:15 +0000 Subject: [PATCH] new file --- direct/src/plugin/wstring_encode.cxx | 85 ++++++++++++++++++++++++++++ direct/src/plugin/wstring_encode.h | 33 +++++++++++ 2 files changed, 118 insertions(+) create mode 100755 direct/src/plugin/wstring_encode.cxx create mode 100755 direct/src/plugin/wstring_encode.h diff --git a/direct/src/plugin/wstring_encode.cxx b/direct/src/plugin/wstring_encode.cxx new file mode 100755 index 0000000000..13e0b113c3 --- /dev/null +++ b/direct/src/plugin/wstring_encode.cxx @@ -0,0 +1,85 @@ +// Filename: wstring_encode.cxx +// Created by: drose (29Aug11) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "wstring_encode.h" + +#ifdef _WIN32 +#include +#endif // _WIN32 + + +#ifdef _WIN32 +//////////////////////////////////////////////////////////////////// +// Function: wstring_to_string +// Description: Encodes std::wstring to std::string using UTF-8. +//////////////////////////////////////////////////////////////////// +bool +wstring_to_string(string &result, const wstring &source) { + bool success = false; + int size = WideCharToMultiByte(CP_UTF8, 0, source.data(), source.length(), + NULL, 0, NULL, NULL); + if (size > 0) { + char *buffer = new char[size + 1]; + int rc = WideCharToMultiByte(CP_UTF8, 0, source.data(), source.length(), + buffer, size, NULL, NULL); + if (rc != 0) { + buffer[size] = 0; + result = buffer; + success = true; + } + delete[] buffer; + } + + return success; +} +#endif // _WIN32 + +#ifdef _WIN32 +//////////////////////////////////////////////////////////////////// +// Function: string_to_wstring +// Description: Decodes std::string to std::wstring using UTF-8. +//////////////////////////////////////////////////////////////////// +bool +string_to_wstring(wstring &result, const string &source) { + bool success = false; + int size = MultiByteToWideChar(CP_UTF8, 0, source.data(), source.length(), + NULL, 0); + if (size > 0) { + wchar_t *buffer = new wchar_t[size + 1]; + int rc = MultiByteToWideChar(CP_UTF8, 0, source.data(), source.length(), + buffer, size); + if (rc != 0) { + buffer[size] = 0; + result = buffer; + success = true; + } + delete[] buffer; + } + + return success; +} +#endif // _WIN32 + +//////////////////////////////////////////////////////////////////// +// Function: wstring ostream operator +// Description: Converts the wstring to utf-8 for output. +//////////////////////////////////////////////////////////////////// +ostream & +operator << (ostream &out, const wstring &str) { + string result; + if (wstring_to_string(result, str)) { + out << result; + } + return out; +} diff --git a/direct/src/plugin/wstring_encode.h b/direct/src/plugin/wstring_encode.h new file mode 100755 index 0000000000..8061b9c0f5 --- /dev/null +++ b/direct/src/plugin/wstring_encode.h @@ -0,0 +1,33 @@ +// Filename: wstring_encode.h +// Created by: drose (29Jun09) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef WSTRING_ENCODE_H +#define WSTRING_ENCODE_H + +#include +using namespace std; + +// Presently, these two functions are implemented only for Windows, +// which is the only place they are needed. (Only Windows requires +// wstrings for filenames.) +#ifdef _WIN32 +bool wstring_to_string(string &result, const wstring &source); +bool string_to_wstring(wstring &result, const string &source); + +ostream &operator << (ostream &out, const wstring &str); +#endif // _WIN32 + +#endif + +