// -*- c++ -*- /* $Id: convert.ccg,v 1.4 2006/06/05 17:32:14 murrayc Exp $ */ /* Copyright (C) 2002 The gtkmm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include namespace Glib { /**** Glib::IConv **********************************************************/ IConv::IConv(const std::string& to_codeset, const std::string& from_codeset) : gobject_ (g_iconv_open(to_codeset.c_str(), from_codeset.c_str())) { if(gobject_ == reinterpret_cast(-1)) { GError* gerror = 0; // Abuse g_convert() to create a GError object. This may seem a weird // thing to do, but it gives us consistently translated error messages // at no further cost. g_convert("", 0, to_codeset.c_str(), from_codeset.c_str(), 0, 0, &gerror); // If this should ever fail we're fucked. g_assert(gerror != 0); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED } } IConv::IConv(GIConv gobject) : gobject_ (gobject) {} IConv::~IConv() { g_iconv_close(gobject_); } size_t IConv::iconv(char** inbuf, gsize* inbytes_left, char** outbuf, gsize* outbytes_left) { return g_iconv(gobject_, inbuf, inbytes_left, outbuf, outbytes_left); } void IConv::reset() { // Apparently iconv() on Solaris <= 7 segfaults if you pass in // NULL for anything but inbuf; work around that. (NULL outbuf // or NULL *outbuf is allowed by Unix98.) char* outbuf = 0; gsize inbytes_left = 0; gsize outbytes_left = 0; g_iconv(gobject_, 0, &inbytes_left, &outbuf, &outbytes_left); } #ifdef GLIBMM_EXCEPTIONS_ENABLED std::string IConv::convert(const std::string& str) #else std::string IConv::convert(const std::string& str, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { gsize bytes_written = 0; GError* gerror = 0; char *const buf = g_convert_with_iconv( str.data(), str.size(), gobject_, 0, &bytes_written, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return std::string(ScopedPtr(buf).get(), bytes_written); } /**** charset conversion functions *****************************************/ bool get_charset() { return g_get_charset(0); } bool get_charset(std::string& charset) { const char* charset_cstr = 0; const bool is_utf8 = g_get_charset(&charset_cstr); charset = charset_cstr; return is_utf8; } #ifdef GLIBMM_EXCEPTIONS_ENABLED std::string convert(const std::string& str, const std::string& to_codeset, const std::string& from_codeset) #else std::string convert(const std::string& str, const std::string& to_codeset, const std::string& from_codeset, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { gsize bytes_written = 0; GError* gerror = 0; char *const buf = g_convert( str.data(), str.size(), to_codeset.c_str(), from_codeset.c_str(), 0, &bytes_written, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return std::string(ScopedPtr(buf).get(), bytes_written); } #ifdef GLIBMM_EXCEPTIONS_ENABLED std::string convert_with_fallback(const std::string& str, const std::string& to_codeset, const std::string& from_codeset) #else std::string convert_with_fallback(const std::string& str, const std::string& to_codeset, const std::string& from_codeset, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { gsize bytes_written = 0; GError* gerror = 0; char *const buf = g_convert_with_fallback( str.data(), str.size(), to_codeset.c_str(), from_codeset.c_str(), 0, 0, &bytes_written, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return std::string(ScopedPtr(buf).get(), bytes_written); } #ifdef GLIBMM_EXCEPTIONS_ENABLED std::string convert_with_fallback(const std::string& str, const std::string& to_codeset, const std::string& from_codeset, const Glib::ustring& fallback) #else std::string convert_with_fallback(const std::string& str, const std::string& to_codeset, const std::string& from_codeset, const Glib::ustring& fallback, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { gsize bytes_written = 0; GError* gerror = 0; char *const buf = g_convert_with_fallback( str.data(), str.size(), to_codeset.c_str(), from_codeset.c_str(), const_cast(fallback.c_str()), 0, &bytes_written, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return std::string(ScopedPtr(buf).get(), bytes_written); } #ifdef GLIBMM_EXCEPTIONS_ENABLED Glib::ustring locale_to_utf8(const std::string& opsys_string) #else Glib::ustring locale_to_utf8(const std::string& opsys_string, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { gsize bytes_written = 0; GError* gerror = 0; char *const buf = g_locale_to_utf8( opsys_string.data(), opsys_string.size(), 0, &bytes_written, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED const ScopedPtr scoped_buf (buf); return Glib::ustring(scoped_buf.get(), scoped_buf.get() + bytes_written); } #ifdef GLIBMM_EXCEPTIONS_ENABLED std::string locale_from_utf8(const Glib::ustring& utf8_string) #else std::string locale_from_utf8(const Glib::ustring& utf8_string, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { gsize bytes_written = 0; GError* gerror = 0; char *const buf = g_locale_from_utf8( utf8_string.data(), utf8_string.bytes(), 0, &bytes_written, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return std::string(ScopedPtr(buf).get(), bytes_written); } #ifdef GLIBMM_EXCEPTIONS_ENABLED Glib::ustring filename_to_utf8(const std::string& opsys_string) #else Glib::ustring filename_to_utf8(const std::string& opsys_string, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { gsize bytes_written = 0; GError* gerror = 0; char *const buf = g_filename_to_utf8( opsys_string.data(), opsys_string.size(), 0, &bytes_written, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED const ScopedPtr scoped_buf (buf); return Glib::ustring(scoped_buf.get(), scoped_buf.get() + bytes_written); } #ifdef GLIBMM_EXCEPTIONS_ENABLED std::string filename_from_utf8(const Glib::ustring& utf8_string) #else std::string filename_from_utf8(const Glib::ustring& utf8_string, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { gsize bytes_written = 0; GError* gerror = 0; char *const buf = g_filename_from_utf8( utf8_string.data(), utf8_string.bytes(), 0, &bytes_written, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return std::string(ScopedPtr(buf).get(), bytes_written); } #ifdef GLIBMM_EXCEPTIONS_ENABLED std::string filename_from_uri(const Glib::ustring& uri, Glib::ustring& hostname) #else std::string filename_from_uri(const Glib::ustring& uri, Glib::ustring& hostname, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { char* hostname_buf = 0; GError* gerror = 0; char *const buf = g_filename_from_uri(uri.c_str(), &hostname_buf, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED // Let's take ownership at this point. const ScopedPtr scoped_buf (buf); if(hostname_buf) hostname = ScopedPtr(hostname_buf).get(); else hostname.erase(); return std::string(scoped_buf.get()); } #ifdef GLIBMM_EXCEPTIONS_ENABLED std::string filename_from_uri(const Glib::ustring& uri) #else std::string filename_from_uri(const Glib::ustring& uri, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { GError* gerror = 0; char *const buf = g_filename_from_uri(uri.c_str(), 0, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return std::string(ScopedPtr(buf).get()); } #ifdef GLIBMM_EXCEPTIONS_ENABLED Glib::ustring filename_to_uri(const std::string& filename, const Glib::ustring& hostname) #else Glib::ustring filename_to_uri(const std::string& filename, const Glib::ustring& hostname, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { GError* gerror = 0; char *const buf = g_filename_to_uri(filename.c_str(), hostname.c_str(), &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return Glib::ustring(ScopedPtr(buf).get()); } #ifdef GLIBMM_EXCEPTIONS_ENABLED Glib::ustring filename_to_uri(const std::string& filename) #else Glib::ustring filename_to_uri(const std::string& filename, std::auto_ptr& error) #endif //GLIBMM_EXCEPTIONS_ENABLED { GError* gerror = 0; char *const buf = g_filename_to_uri(filename.c_str(), 0, &gerror); #ifdef GLIBMM_EXCEPTIONS_ENABLED if(gerror) ::Glib::Error::throw_exception(gerror); #else if(gerror) error = ::Glib::Error::throw_exception(gerror); #endif //GLIBMM_EXCEPTIONS_ENABLED return Glib::ustring(ScopedPtr(buf).get()); } Glib::ustring filename_display_basename(const std::string& filename) { char *const buf = g_filename_display_basename(filename.c_str()); return Glib::ustring(ScopedPtr(buf).get()); } Glib::ustring filename_display_name(const std::string& filename) { char *const buf = g_filename_display_name(filename.c_str()); return Glib::ustring(ScopedPtr(buf).get()); } } // namespace Glib