From 5dac8a3b0edfc2ec0c4f3ab1e470e439baf426d8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sat, 21 Dec 2002 13:35:13 +0000 Subject: [PATCH 1/1] fixed 2 encoding handling bugs in XRC/wxrcedit git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18384 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/include/wx/xrc/xml.h | 7 +++--- contrib/src/xrc/xml.cpp | 38 +++++++++++++++++++------------ contrib/utils/wxrcedit/editor.cpp | 3 +++ include/wx/xrc/xml.h | 7 +++--- src/xrc/xml.cpp | 38 +++++++++++++++++++------------ 5 files changed, 59 insertions(+), 34 deletions(-) diff --git a/contrib/include/wx/xrc/xml.h b/contrib/include/wx/xrc/xml.h index d7b636c0df..c3122942e4 100644 --- a/contrib/include/wx/xrc/xml.h +++ b/contrib/include/wx/xrc/xml.h @@ -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: diff --git a/contrib/src/xrc/xml.cpp b/contrib/src/xrc/xml.cpp index a1c6a01796..dac3341329 100644 --- a/contrib/src/xrc/xml.cpp +++ b/contrib/src/xrc/xml.cpp @@ -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; diff --git a/contrib/utils/wxrcedit/editor.cpp b/contrib/utils/wxrcedit/editor.cpp index 8b5a75951c..97b3f0658f 100644 --- a/contrib/utils/wxrcedit/editor.cpp +++ b/contrib/utils/wxrcedit/editor.cpp @@ -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); diff --git a/include/wx/xrc/xml.h b/include/wx/xrc/xml.h index d7b636c0df..c3122942e4 100644 --- a/include/wx/xrc/xml.h +++ b/include/wx/xrc/xml.h @@ -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: diff --git a/src/xrc/xml.cpp b/src/xrc/xml.cpp index a1c6a01796..dac3341329 100644 --- a/src/xrc/xml.cpp +++ b/src/xrc/xml.cpp @@ -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; -- 2.47.2