adding back-conversion to filenames (wide composed)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40227 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -2909,11 +2909,15 @@ public :
|
||||
{
|
||||
Init( kTextEncodingUnicodeDefault , kUnicodeNoSubset , kUnicodeUTF8Format ) ;
|
||||
m_uni = NULL;
|
||||
m_uniBack = NULL ;
|
||||
}
|
||||
|
||||
~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
|
||||
@@ -2979,6 +2983,68 @@ public :
|
||||
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() ;
|
||||
@@ -2992,10 +3058,19 @@ public :
|
||||
|
||||
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)
|
||||
|
Reference in New Issue
Block a user