]> git.saurik.com Git - wxWidgets.git/commitdiff
fixed 2 encoding handling bugs in XRC/wxrcedit
authorVáclav Slavík <vslavik@fastmail.fm>
Sat, 21 Dec 2002 13:35:13 +0000 (13:35 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sat, 21 Dec 2002 13:35:13 +0000 (13:35 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18384 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

contrib/include/wx/xrc/xml.h
contrib/src/xrc/xml.cpp
contrib/utils/wxrcedit/editor.cpp
include/wx/xrc/xml.h
src/xrc/xml.cpp

index d7b636c0dff867ac70d2c52c16ac6b95c19784b1..c3122942e479845cc22599b3548993527ff349a6 100644 (file)
@@ -164,7 +164,7 @@ private:
 class WXXMLDLLEXPORT wxXmlDocument : public wxObject
 {
 public:
-    wxXmlDocument() : wxObject(), m_version(wxT("1.0")), m_root(NULL)  {}
+    wxXmlDocument();
     wxXmlDocument(const wxString& filename,
                   const wxString& encoding = wxT("UTF-8"));
     wxXmlDocument(wxInputStream& stream,
@@ -180,7 +180,7 @@ public:
               const wxString& encoding = wxT("UTF-8"));
     bool Load(wxInputStream& stream,
               const wxString& encoding = wxT("UTF-8"));
-
+    
     // Saves document as .xml file.
     bool Save(const wxString& filename) const;
     bool Save(wxOutputStream& stream) const;
@@ -193,7 +193,7 @@ public:
     // Returns version of document (may be empty).
     wxString GetVersion() const { return m_version; }
     // Returns encoding of document (may be empty).
-    // Note: this is the encoding original fail was saved in, *not* the
+    // Note: this is the encoding original file was saved in, *not* the
     // encoding of in-memory representation!
     wxString GetFileEncoding() const { return m_fileEncoding; }
 
@@ -207,6 +207,7 @@ public:
     // (same as passed to Load or ctor, defaults to UTF-8).
     // NB: this is meaningless in Unicode build where data are stored as wchar_t*
     wxString GetEncoding() const { return m_encoding; }
+    void SetEncoding(const wxString& enc) { m_encoding = enc; }
 #endif
 
 private:
index a1c6a01796dcc8c1f13f3fcb0f758d24c6df6dea..dac33413295b718ab4c630cca6386f973169c11d 100644 (file)
@@ -10,7 +10,6 @@
 
 #ifdef __GNUG__
 #pragma implementation "xml.h"
-#pragma implementation "xmlio.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
@@ -274,6 +273,14 @@ bool wxXmlNode::DeleteProperty(const wxString& name)
 //  wxXmlDocument
 //-----------------------------------------------------------------------------
 
+wxXmlDocument::wxXmlDocument()
+    : m_version(wxT("1.0")), m_fileEncoding(wxT("utf-8")), m_root(NULL)
+{
+#if !wxUSE_UNICODE
+    m_encoding = wxT("UTF-8");
+#endif
+}
+
 wxXmlDocument::wxXmlDocument(const wxString& filename, const wxString& encoding)
                           : wxObject(), m_root(NULL)
 {
@@ -353,9 +360,9 @@ inline static wxString CharToString(wxMBConv *conv,
         wchar_t *buf = new wchar_t[nLen+1];
         wxConvUTF8.MB2WC(buf, s, nLen);
         buf[nLen] = 0;
-        wxString s(buf, *conv, len);
+        wxString str(buf, *conv, len);
         delete[] buf;
-        return s;
+        return str;
     }
     else
         return wxString(s, len);
@@ -465,26 +472,29 @@ static void DefaultHnd(void *userData, const char *s, int len)
 }
 
 static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData),
-                               const XML_Char *name, XML_Encoding *info)
+                              const XML_Char *name, XML_Encoding *info)
 {
     // We must build conversion table for expat. The easiest way to do so
     // is to let wxCSConv convert as string containing all characters to
     // wide character representation:
     wxCSConv conv(wxString(name, wxConvLibc));
-    char mbBuf[255];
-    wchar_t wcBuf[255];
+    char mbBuf[2];
+    wchar_t wcBuf[10];
     size_t i;
 
-    for (i = 0; i < 255; i++)
-        mbBuf[i] = (char) (i+1);
-    mbBuf[255] = 0;
-    conv.MB2WC(wcBuf, mbBuf, 255);
-    wcBuf[255] = 0;
-
+    mbBuf[1] = 0;
     info->map[0] = 0;
     for (i = 0; i < 255; i++)
-        info->map[i+1] = (int)wcBuf[i];
-
+    {
+        mbBuf[0] = (char)(i+1);
+        if (conv.MB2WC(wcBuf, mbBuf, 2) == (size_t)-1)
+        {
+            // invalid/undefined byte in the encoding:
+            info->map[i+1] = -1;
+        }
+        info->map[i+1] = (int)wcBuf[0];
+    }
+    
     info->data = NULL;
     info->convert = NULL;
     info->release = NULL;
index 8b5a75951c3db678adf25f35e7e6284244fb6e59..97b3f0658f3d75ba5930cdfc523a7d4942c0533d 100644 (file)
@@ -344,6 +344,9 @@ void EditorFrame::NewFile()
     m_Resource->SetRoot(new wxXmlNode(wxXML_ELEMENT_NODE, _("resource")));
        
        m_Resource->SetFileEncoding("utf-8");
+#if !wxUSE_UNICODE
+    m_Resource->SetEncoding(wxLocale::GetSystemEncodingName());
+#endif
     
        m_Resource->GetRoot()->AddProperty(_T("version"),
                                        WX_XMLRES_CURRENT_VERSION_STRING);
index d7b636c0dff867ac70d2c52c16ac6b95c19784b1..c3122942e479845cc22599b3548993527ff349a6 100644 (file)
@@ -164,7 +164,7 @@ private:
 class WXXMLDLLEXPORT wxXmlDocument : public wxObject
 {
 public:
-    wxXmlDocument() : wxObject(), m_version(wxT("1.0")), m_root(NULL)  {}
+    wxXmlDocument();
     wxXmlDocument(const wxString& filename,
                   const wxString& encoding = wxT("UTF-8"));
     wxXmlDocument(wxInputStream& stream,
@@ -180,7 +180,7 @@ public:
               const wxString& encoding = wxT("UTF-8"));
     bool Load(wxInputStream& stream,
               const wxString& encoding = wxT("UTF-8"));
-
+    
     // Saves document as .xml file.
     bool Save(const wxString& filename) const;
     bool Save(wxOutputStream& stream) const;
@@ -193,7 +193,7 @@ public:
     // Returns version of document (may be empty).
     wxString GetVersion() const { return m_version; }
     // Returns encoding of document (may be empty).
-    // Note: this is the encoding original fail was saved in, *not* the
+    // Note: this is the encoding original file was saved in, *not* the
     // encoding of in-memory representation!
     wxString GetFileEncoding() const { return m_fileEncoding; }
 
@@ -207,6 +207,7 @@ public:
     // (same as passed to Load or ctor, defaults to UTF-8).
     // NB: this is meaningless in Unicode build where data are stored as wchar_t*
     wxString GetEncoding() const { return m_encoding; }
+    void SetEncoding(const wxString& enc) { m_encoding = enc; }
 #endif
 
 private:
index a1c6a01796dcc8c1f13f3fcb0f758d24c6df6dea..dac33413295b718ab4c630cca6386f973169c11d 100644 (file)
@@ -10,7 +10,6 @@
 
 #ifdef __GNUG__
 #pragma implementation "xml.h"
-#pragma implementation "xmlio.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
@@ -274,6 +273,14 @@ bool wxXmlNode::DeleteProperty(const wxString& name)
 //  wxXmlDocument
 //-----------------------------------------------------------------------------
 
+wxXmlDocument::wxXmlDocument()
+    : m_version(wxT("1.0")), m_fileEncoding(wxT("utf-8")), m_root(NULL)
+{
+#if !wxUSE_UNICODE
+    m_encoding = wxT("UTF-8");
+#endif
+}
+
 wxXmlDocument::wxXmlDocument(const wxString& filename, const wxString& encoding)
                           : wxObject(), m_root(NULL)
 {
@@ -353,9 +360,9 @@ inline static wxString CharToString(wxMBConv *conv,
         wchar_t *buf = new wchar_t[nLen+1];
         wxConvUTF8.MB2WC(buf, s, nLen);
         buf[nLen] = 0;
-        wxString s(buf, *conv, len);
+        wxString str(buf, *conv, len);
         delete[] buf;
-        return s;
+        return str;
     }
     else
         return wxString(s, len);
@@ -465,26 +472,29 @@ static void DefaultHnd(void *userData, const char *s, int len)
 }
 
 static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData),
-                               const XML_Char *name, XML_Encoding *info)
+                              const XML_Char *name, XML_Encoding *info)
 {
     // We must build conversion table for expat. The easiest way to do so
     // is to let wxCSConv convert as string containing all characters to
     // wide character representation:
     wxCSConv conv(wxString(name, wxConvLibc));
-    char mbBuf[255];
-    wchar_t wcBuf[255];
+    char mbBuf[2];
+    wchar_t wcBuf[10];
     size_t i;
 
-    for (i = 0; i < 255; i++)
-        mbBuf[i] = (char) (i+1);
-    mbBuf[255] = 0;
-    conv.MB2WC(wcBuf, mbBuf, 255);
-    wcBuf[255] = 0;
-
+    mbBuf[1] = 0;
     info->map[0] = 0;
     for (i = 0; i < 255; i++)
-        info->map[i+1] = (int)wcBuf[i];
-
+    {
+        mbBuf[0] = (char)(i+1);
+        if (conv.MB2WC(wcBuf, mbBuf, 2) == (size_t)-1)
+        {
+            // invalid/undefined byte in the encoding:
+            info->map[i+1] = -1;
+        }
+        info->map[i+1] = (int)wcBuf[0];
+    }
+    
     info->data = NULL;
     info->convert = NULL;
     info->release = NULL;