X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4d312c222ee634bb8597ffa9cfa71b9414d67145..f3f0d961af5454a3544a4f4f9aced750d4641d69:/src/common/strconv.cpp diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index dd806d2c1c..6363e4001c 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -69,6 +69,13 @@ #include "wx/encconv.h" #include "wx/fontmap.h" +#ifdef __WXMAC__ +#include "ATSUnicode.h" +#include "TextCommon.h" +#include "TextEncodingConverter.h" + +#include "wx/mac/private.h" // includes mac headers +#endif // ---------------------------------------------------------------------------- // macros // ---------------------------------------------------------------------------- @@ -1171,6 +1178,123 @@ public: #endif // wxHAVE_WIN32_MB2WC +// ============================================================================ +// Mac conversion classes +// ============================================================================ + +#if defined(__WXMAC__) && defined(TARGET_CARBON) + +class wxMBConv_mac : public wxMBConv +{ +public: + wxMBConv_mac() + { + Init(CFStringGetSystemEncoding()) ; + } + + wxMBConv_mac(const wxChar* name) + { + Init( wxMacGetSystemEncFromFontEnc(wxFontMapper::Get()->CharsetToEncoding(name, FALSE) ) ) ; + } + + wxMBConv_mac(wxFontEncoding encoding) + { + Init( wxMacGetSystemEncFromFontEnc(encoding) ); + } + + ~wxMBConv_mac() + { + OSStatus status = noErr ; + status = TECDisposeConverter(m_MB2WC_converter); + status = TECDisposeConverter(m_WC2MB_converter); + } + + + void Init( TextEncodingBase encoding) + { + OSStatus status = noErr ; + m_char_encoding = encoding ; +#if SIZEOF_WCHAR_T == 4 + m_unicode_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode32BitFormat) ; +#else + m_unicode_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode16BitFormat) ; +#endif + status = TECCreateConverter(&m_MB2WC_converter, + m_char_encoding, + m_unicode_encoding); + status = TECCreateConverter(&m_WC2MB_converter, + m_unicode_encoding, + m_char_encoding); + } + + size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const + { + OSStatus status = noErr ; + ByteCount byteOutLen ; + ByteCount byteInLen = strlen(psz) ; + wchar_t *tbuf = NULL ; + + if (buf == NULL) + { + n = byteInLen ; + tbuf = (wchar_t*) malloc( n * SIZEOF_WCHAR_T) ; + } + + ByteCount byteBufferLen = n * SIZEOF_WCHAR_T ; + status = TECConvertText(m_MB2WC_converter, (ConstTextPtr) psz , byteInLen, &byteInLen, + (TextPtr) (buf ? buf : tbuf) , byteBufferLen, &byteOutLen); + + if ( buf == NULL ) + free(tbuf) ; + + size_t res = byteOutLen / SIZEOF_WCHAR_T ; + if ( buf && res < n) + buf[res] = 0; + + return res ; + } + + size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const + { + OSStatus status = noErr ; + ByteCount byteOutLen ; + ByteCount byteInLen = wxWcslen(psz) * SIZEOF_WCHAR_T ; + + char *tbuf = NULL ; + + if (buf == NULL) + { + // worst case + n = byteInLen * 2 ; + tbuf = (char*) malloc( n ) ; + } + + ByteCount byteBufferLen = n ; + status = TECConvertText(m_WC2MB_converter, (ConstTextPtr) psz , byteInLen, &byteInLen, + (TextPtr) ( buf ? buf : tbuf ) , byteBufferLen, &byteOutLen); + + if ( buf == NULL ) + free(tbuf) ; + + size_t res = byteOutLen ; + if ( buf && res < n) + buf[res] = 0; + + return res ; + } + + bool IsOk() const + { return m_MB2WC_converter != NULL && m_WC2MB_converter != NULL ; } + +private: + TECObjectRef m_MB2WC_converter ; + TECObjectRef m_WC2MB_converter ; + + TextEncodingBase m_char_encoding ; + TextEncodingBase m_unicode_encoding ; +}; + +#endif // defined(__WXMAC__) && defined(TARGET_CARBON) // ============================================================================ // wxEncodingConverter based conversion classes @@ -1367,7 +1491,20 @@ wxMBConv *wxCSConv::DoCreate() const delete conv; } #endif // wxHAVE_WIN32_MB2WC - +#if defined(__WXMAC__) + { + if ( m_name || ( m_encoding < wxFONTENCODING_UTF16BE ) ) + { + + wxMBConv_mac *conv = m_name ? new wxMBConv_mac(m_name) + : new wxMBConv_mac(m_encoding); + if ( conv->IsOk() ) + return conv; + + delete conv; + } + } +#endif // step (2) wxFontEncoding enc = m_encoding; #if wxUSE_FONTMAP