X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/97ddad38c50cc1d9cd0f752bfa216ac4dc5800dc..e5db28fd7cda3943b41e86a731c65358284bb0ce:/contrib/src/xrc/xml.cpp diff --git a/contrib/src/xrc/xml.cpp b/contrib/src/xrc/xml.cpp index d7001dd1e9..b8b8aabec8 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) { @@ -332,7 +339,7 @@ bool wxXmlDocument::Save(const wxString& filename) const // wxXmlDocument loading routines //----------------------------------------------------------------------------- -/* +/* FIXME: - process all elements, including CDATA */ @@ -349,12 +356,13 @@ inline static wxString CharToString(wxMBConv *conv, { size_t nLen = (len != wxSTRING_MAXLEN) ? len : nLen = wxConvUTF8.MB2WC((wchar_t*) NULL, s, 0); - + wchar_t *buf = new wchar_t[nLen+1]; wxConvUTF8.MB2WC(buf, s, nLen); buf[nLen] = 0; - return wxString(buf, *conv, len); + wxString str(buf, *conv, len); delete[] buf; + return str; } else return wxString(s, len); @@ -464,30 +472,33 @@ 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] = 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; - + return 1; } @@ -512,7 +523,7 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) if ( encoding != wxT("UTF-8") && encoding != wxT("utf-8") ) ctx.conv = new wxCSConv(encoding); #endif - + XML_SetUserData(parser, (void*)&ctx); XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); XML_SetCharacterDataHandler(parser, TextHnd); @@ -520,6 +531,7 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) XML_SetDefaultHandler(parser, DefaultHnd); XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL); + bool ok = true; do { size_t len = stream.Read(buf, BUFSIZE).LastRead(); @@ -529,21 +541,25 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) wxLogError(_("XML parsing error: '%s' at line %d"), XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser)); - return FALSE; + ok = false; + break; } } while (!done); - SetVersion(ctx.version); - SetFileEncoding(ctx.encoding); - SetRoot(ctx.root); + if (ok) + { + SetVersion(ctx.version); + SetFileEncoding(ctx.encoding); + SetRoot(ctx.root); + } XML_ParserFree(parser); #if !wxUSE_UNICODE if ( ctx.conv ) delete ctx.conv; #endif - - return TRUE; + + return ok; } @@ -572,7 +588,7 @@ inline static void OutputString(wxOutputStream& stream, const wxString& str, #endif } -// Same as above, but create entities first. +// Same as above, but create entities first. // Translates '<' to "<", '>' to ">" and '&' to "&" static void OutputStringEnt(wxOutputStream& stream, const wxString& str, wxMBConv *convMem, wxMBConv *convFile) @@ -580,25 +596,25 @@ static void OutputStringEnt(wxOutputStream& stream, const wxString& str, wxString buf; size_t i, last, len; wxChar c; - + len = str.Len(); last = 0; for (i = 0; i < len; i++) { c = str.GetChar(i); - if (c == wxT('<') || c == wxT('>') || + if (c == wxT('<') || c == wxT('>') || (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;"))) { OutputString(stream, str.Mid(last, i - last), convMem, convFile); switch (c) { - case wxT('<'): + case wxT('<'): OutputString(stream, wxT("<"), NULL, NULL); break; - case wxT('>'): + case wxT('>'): OutputString(stream, wxT(">"), NULL, NULL); break; - case wxT('&'): + case wxT('&'): OutputString(stream, wxT("&"), NULL, NULL); break; default: break; @@ -628,11 +644,11 @@ static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, case wxXML_TEXT_NODE: OutputStringEnt(stream, node->GetContent(), convMem, convFile); break; - + case wxXML_ELEMENT_NODE: OutputString(stream, wxT("<"), NULL, NULL); OutputString(stream, node->GetName(), NULL, NULL); - + prop = node->GetProperties(); while (prop) { @@ -642,7 +658,7 @@ static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, // FIXME - what if prop contains '"'? prop = prop->GetNext(); } - + if (node->GetChildren()) { OutputString(stream, wxT(">"), NULL, NULL); @@ -665,13 +681,13 @@ static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, else OutputString(stream, wxT("/>"), NULL, NULL); break; - + case wxXML_COMMENT_NODE: OutputString(stream, wxT(""), NULL, NULL); break; - + default: wxFAIL_MSG(wxT("unsupported node type")); } @@ -681,9 +697,9 @@ bool wxXmlDocument::Save(wxOutputStream& stream) const { if ( !IsOk() ) return FALSE; - + wxString s; - + wxMBConv *convMem = NULL, *convFile = NULL; #if wxUSE_UNICODE convFile = new wxCSConv(GetFileEncoding()); @@ -694,18 +710,18 @@ bool wxXmlDocument::Save(wxOutputStream& stream) const convMem = new wxCSConv(GetEncoding()); } #endif - + s.Printf(wxT("\n"), GetVersion().c_str(), GetFileEncoding().c_str()); OutputString(stream, s, NULL, NULL); - + OutputNode(stream, GetRoot(), 0, convMem, convFile); OutputString(stream, wxT("\n"), NULL, NULL); - + if ( convFile ) delete convFile; if ( convMem ) delete convMem; - + return TRUE; }