]> git.saurik.com Git - wxWidgets.git/commitdiff
adding back-conversion to filenames (wide composed)
authorStefan Csomor <csomor@advancedconcepts.ch>
Sat, 22 Jul 2006 07:18:32 +0000 (07:18 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Sat, 22 Jul 2006 07:18:32 +0000 (07:18 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40227 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/strconv.cpp

index 77c16d0d26a763fa75cf47dd179de34bb4968ac8..a603d02f18eeaee87abec04920ce164955230fe9 100644 (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)