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:
Stefan Csomor
2006-07-22 07:18:32 +00:00
parent f3768653d6
commit fbb0b8afd0

View File

@@ -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)