#include "wx/wxprec.h"
#ifndef WX_PRECOMP
+ #ifdef __WXMSW__
+ #include "wx/msw/missing.h"
+ #endif
#include "wx/intl.h"
#include "wx/log.h"
#include "wx/utils.h"
#ifdef __WINDOWS__
#include "wx/msw/private.h"
- #include "wx/msw/missing.h"
#endif
#ifndef __WXWINCE__
#if wxUSE_FONTMAP
const wxChar **names = wxFontMapperBase::GetAllEncodingNames(WC_ENC);
#else // !wxUSE_FONTMAP
- static const wxChar *names[] =
+ static const wxChar *names_static[] =
{
#if SIZEOF_WCHAR_T == 4
_T("UCS-4"),
#endif
NULL
};
+ const wxChar **names = names_static;
#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
for ( ; *names && ms_wcCharsetName.empty(); ++names )
int verMaj, verMin;
switch ( wxGetOsVersion(&verMaj, &verMin) )
{
- case wxWIN95:
+ case wxOS_WINDOWS_9X:
s_isWin98Or2k = verMaj >= 4 && verMin >= 10;
break;
- case wxWINDOWS_NT:
+ case wxOS_WINDOWS_NT:
s_isWin98Or2k = verMaj >= 5;
break;
Init( wxCFStringEncFromFontEnc(encoding) );
}
- ~wxMBConv_cocoa()
+ virtual ~wxMBConv_cocoa()
{
}
Init( wxMacGetSystemEncFromFontEnc(encoding) );
}
- ~wxMBConv_mac()
+ virtual ~wxMBConv_mac()
{
OSStatus status = noErr ;
if (m_MB2WC_converter)
wxASSERT_MSG( status == noErr , _("Unable to create TextEncodingConverter")) ;
}
}
-
+
size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const
{
CreateIfNeeded() ;
virtual wxMBConv *Clone() const { return new wxMBConv_mac(*this); }
bool IsOk() const
- {
+ {
CreateIfNeeded() ;
- return m_MB2WC_converter != NULL && m_WC2MB_converter != NULL;
+ return m_MB2WC_converter != NULL && m_WC2MB_converter != NULL;
}
protected :
class wxMBConv_macUTF8D : public wxMBConv_mac
{
public :
- wxMBConv_macUTF8D()
+ wxMBConv_macUTF8D()
{
Init( kTextEncodingUnicodeDefault , kUnicodeNoSubset , kUnicodeUTF8Format ) ;
m_uni = NULL;
+ m_uniBack = NULL ;
}
-
- ~wxMBConv_macUTF8D()
+
+ virtual ~wxMBConv_macUTF8D()
{
- DisposeUnicodeToTextInfo(&m_uni);
+ if (m_uni!=NULL)
+ DisposeUnicodeToTextInfo(&m_uni);
+ if (m_uniBack!=NULL)
+ DisposeUnicodeToTextInfo(&m_uniBack);
}
-
+
size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const
{
CreateIfNeeded() ;
ubuf = (UniChar*) psz ;
#endif
- // ubuf is a non-decomposed UniChar buffer
-
+ // ubuf is a non-decomposed UniChar buffer
+
ByteCount dcubuflen = byteInLen * 2 + 2 ;
ByteCount dcubufread , dcubufwritten ;
- UniChar *dcubuf = (UniChar*) malloc( dcubuflen ) ;
-
- ConvertFromUnicodeToText( m_uni , byteInLen , ubuf ,
+ UniChar *dcubuf = (UniChar*) malloc( dcubuflen ) ;
+
+ ConvertFromUnicodeToText( m_uni , byteInLen , ubuf ,
kUnicodeDefaultDirectionMask, 0, NULL, NULL, NULL, dcubuflen , &dcubufread , &dcubufwritten , dcubuf ) ;
-
+
// we now convert that decomposed buffer into UTF8
status = TECConvertText(
return res ;
}
-
+
+ size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const
+ {
+ CreateIfNeeded() ;
+ OSStatus status = noErr ;
+ ByteCount byteOutLen ;
+ ByteCount byteInLen = strlen(psz) + 1;
+ wchar_t *tbuf = NULL ;
+ UniChar* ubuf = NULL ;
+ size_t res = 0 ;
+
+ if (buf == NULL)
+ {
+ // Apple specs say at least 32
+ n = wxMax( 32, byteInLen ) ;
+ tbuf = (wchar_t*) malloc( n * SIZEOF_WCHAR_T ) ;
+ }
+
+ ByteCount byteBufferLen = n * sizeof( UniChar ) ;
+
+#if SIZEOF_WCHAR_T == 4
+ ubuf = (UniChar*) malloc( byteBufferLen + 2 ) ;
+#else
+ ubuf = (UniChar*) (buf ? buf : tbuf) ;
+#endif
+
+ ByteCount dcubuflen = byteBufferLen * 2 + 2 ;
+ ByteCount dcubufread , dcubufwritten ;
+ UniChar *dcubuf = (UniChar*) malloc( dcubuflen ) ;
+
+ status = TECConvertText(
+ m_MB2WC_converter, (ConstTextPtr) psz, byteInLen, &byteInLen,
+ (TextPtr) dcubuf, dcubuflen, &byteOutLen);
+ // we have to terminate here, because n might be larger for the trailing zero, and if UniChar
+ // is not properly terminated we get random characters at the end
+ dcubuf[byteOutLen / sizeof( UniChar ) ] = 0 ;
+
+ // now from the decomposed UniChar to properly composed uniChar
+ ConvertFromUnicodeToText( m_uniBack , byteOutLen , dcubuf ,
+ kUnicodeDefaultDirectionMask, 0, NULL, NULL, NULL, dcubuflen , &dcubufread , &dcubufwritten , ubuf ) ;
+
+ free( dcubuf );
+ byteOutLen = dcubufwritten ;
+ ubuf[byteOutLen / sizeof( UniChar ) ] = 0 ;
+
+
+#if SIZEOF_WCHAR_T == 4
+ wxMBConvUTF16 converter ;
+ res = converter.MB2WC( (buf ? buf : tbuf), (const char*)ubuf, n ) ;
+ free( ubuf ) ;
+#else
+ res = byteOutLen / sizeof( UniChar ) ;
+#endif
+
+ if ( buf == NULL )
+ free(tbuf) ;
+
+ if ( buf && res < n)
+ buf[res] = 0;
+
+ return res ;
+ }
+
virtual void CreateIfNeeded() const
{
wxMBConv_mac::CreateIfNeeded() ;
m_map.otherEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
kUnicodeCanonicalDecompVariant, kTextEncodingDefaultFormat);
m_map.mappingVersion = kUnicodeUseLatestMapping;
-
- OSStatus err = CreateUnicodeToTextInfo(&m_map, &m_uni);
+
+ OSStatus err = CreateUnicodeToTextInfo(&m_map, &m_uni);
+ wxASSERT_MSG( err == noErr , _(" Couldn't create the UnicodeConverter")) ;
+
+ m_map.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
+ kUnicodeNoSubset, kTextEncodingDefaultFormat);
+ m_map.otherEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
+ kUnicodeCanonicalCompVariant, kTextEncodingDefaultFormat);
+ m_map.mappingVersion = kUnicodeUseLatestMapping;
+ err = CreateUnicodeToTextInfo(&m_map, &m_uniBack);
wxASSERT_MSG( err == noErr , _(" Couldn't create the UnicodeConverter")) ;
}
}
protected :
mutable UnicodeToTextInfo m_uni;
+ mutable UnicodeToTextInfo m_uniBack;
mutable UnicodeMapping m_map;
-};
+};
#endif // defined(__WXMAC__) && defined(TARGET_CARBON)
// ============================================================================
#endif // !wxUSE_FONTMAP
{
wxString name(m_name);
+#if wxUSE_FONTMAP
wxFontEncoding encoding(m_encoding);
+#endif
if ( !name.empty() )
{
}
const wxChar** names = wxFontMapperBase::GetAllEncodingNames(encoding);
-
- for ( ; *names; ++names )
+ // CS : in case this does not return valid names (eg for MacRoman) encoding
+ // got a 'failure' entry in the cache all the same, although it just has to
+ // be created using a different method, so only store failed iconv creation
+ // attempts (or perhaps we shoulnd't do this at all ?)
+ if ( names[0] != NULL )
{
- wxMBConv_iconv *conv = new wxMBConv_iconv(*names);
- if ( conv->IsOk() )
+ for ( ; *names; ++names )
{
- gs_nameCache[encoding] = *names;
- return conv;
+ wxMBConv_iconv *conv = new wxMBConv_iconv(*names);
+ if ( conv->IsOk() )
+ {
+ gs_nameCache[encoding] = *names;
+ return conv;
+ }
+
+ delete conv;
}
- delete conv;
+ gs_nameCache[encoding] = _T(""); // cache the failure
}
-
- gs_nameCache[encoding] = _T(""); // cache the failure
}
#endif // wxUSE_FONTMAP
}
#if wxUSE_FONTMAP
wxFontMapperBase::GetEncodingDescription(m_encoding).c_str()
#else // !wxUSE_FONTMAP
- wxString::Format(_("encoding %s"), m_encoding).c_str()
+ wxString::Format(_("encoding %i"), m_encoding).c_str()
#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
);
{
wxCSConv *self = (wxCSConv *)this; // const_cast
-#if wxUSE_INTL
// if we don't have neither the name nor the encoding, use the default
// encoding for this system
if ( !m_name && m_encoding == wxFONTENCODING_SYSTEM )
{
+#if wxUSE_INTL
self->m_name = wxStrdup(wxLocale::GetSystemEncodingName());
- }
+#else
+ // fallback to some reasonable default:
+ self->m_encoding = wxFONTENCODING_ISO8859_1;
#endif // wxUSE_INTL
+ }
self->m_convReal = DoCreate();
self->m_deferred = false;