#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()
{
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() ;
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 ) ;
+ UniChar *dcubuf = (UniChar*) malloc( dcubuflen ) ;
status = TECConvertText(
m_MB2WC_converter, (ConstTextPtr) psz, byteInLen, &byteInLen,
// 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 ,
+ 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 ) ;
#else
res = byteOutLen / sizeof( UniChar ) ;
#endif
-
+
if ( buf == NULL )
free(tbuf) ;
-
+
if ( buf && res < n)
buf[res] = 0;
-
+
return res ;
}
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);
+ err = CreateUnicodeToTextInfo(&m_map, &m_uniBack);
wxASSERT_MSG( err == noErr , _(" Couldn't create the UnicodeConverter")) ;
}
}
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;