X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/27b0c286444b5f2404f29fb2bc233bfcfaaa6bba..645a8fabef258b730261c2e85e32cf072d8a796f:/src/xml/xml.cpp diff --git a/src/xml/xml.cpp b/src/xml/xml.cpp index 3b59fcf271..f55ad6f7a1 100644 --- a/src/xml/xml.cpp +++ b/src/xml/xml.cpp @@ -8,7 +8,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "xml.h" #endif @@ -32,6 +32,10 @@ #include "expat.h" // from Expat +// DLL options compatibility check: +#include "wx/app.h" +WX_CHECK_BUILD_OPTIONS("wxXML") + //----------------------------------------------------------------------------- // wxXmlNode //----------------------------------------------------------------------------- @@ -152,8 +156,8 @@ wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& default wxString tmp; if (GetPropVal(propName, &tmp)) return tmp; - else - return defaultVal; + + return defaultVal; } void wxXmlNode::AddChild(wxXmlNode *child) @@ -356,7 +360,7 @@ inline static wxString CharToString(wxMBConv *conv, if ( conv ) { size_t nLen = (len != wxSTRING_MAXLEN) ? len : - nLen = wxConvUTF8.MB2WC((wchar_t*) NULL, s, 0); + wxConvUTF8.MB2WC((wchar_t*) NULL, s, 0); wchar_t *buf = new wchar_t[nLen+1]; wxConvUTF8.MB2WC(buf, s, nLen); @@ -366,7 +370,7 @@ inline static wxString CharToString(wxMBConv *conv, return str; } else - return wxString(s, len); + return wxString(s, len != wxSTRING_MAXLEN ? len : strlen(s)); #endif } @@ -478,7 +482,8 @@ static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData), // 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)); + wxString str(name, wxConvLibc); + wxCSConv conv(str); char mbBuf[2]; wchar_t wcBuf[10]; size_t i; @@ -495,7 +500,7 @@ static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData), } info->map[i+1] = (int)wcBuf[0]; } - + info->data = NULL; info->convert = NULL; info->release = NULL; @@ -539,8 +544,10 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) done = (len < BUFSIZE); if (!XML_Parse(parser, buf, len, done)) { + wxString error(XML_ErrorString(XML_GetErrorCode(parser)), + *wxConvCurrent); wxLogError(_("XML parsing error: '%s' at line %d"), - XML_ErrorString(XML_GetErrorCode(parser)), + error.c_str(), XML_GetCurrentLineNumber(parser)); ok = false; break; @@ -549,10 +556,16 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) if (ok) { - SetVersion(ctx.version); - SetFileEncoding(ctx.encoding); + if (!ctx.version.IsEmpty()) + SetVersion(ctx.version); + if (!ctx.encoding.IsEmpty()) + SetFileEncoding(ctx.encoding); SetRoot(ctx.root); } + else + { + delete ctx.root; + } XML_ParserFree(parser); #if !wxUSE_UNICODE @@ -572,11 +585,16 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) // write string to output: inline static void OutputString(wxOutputStream& stream, const wxString& str, - wxMBConv *convMem, wxMBConv *convFile) +#if wxUSE_UNICODE + wxMBConv * WXUNUSED(convMem), +#else + wxMBConv *convMem, +#endif + wxMBConv *convFile) { if (str.IsEmpty()) return; #if wxUSE_UNICODE - const wxWX2MBbuf buf(str.mb_str(convFile ? *convFile : wxConvUTF8)); + const wxWX2MBbuf buf(str.mb_str(*(convFile ? convFile : &wxConvUTF8))); stream.Write((const char*)buf, strlen((const char*)buf)); #else if ( convFile == NULL ) @@ -592,7 +610,8 @@ inline static void OutputString(wxOutputStream& stream, const wxString& str, // Same as above, but create entities first. // Translates '<' to "<", '>' to ">" and '&' to "&" static void OutputStringEnt(wxOutputStream& stream, const wxString& str, - wxMBConv *convMem, wxMBConv *convFile) + wxMBConv *convMem, wxMBConv *convFile, + bool escapeQuotes = false) { wxString buf; size_t i, last, len; @@ -604,7 +623,8 @@ static void OutputStringEnt(wxOutputStream& stream, const wxString& str, { c = str.GetChar(i); if (c == wxT('<') || c == wxT('>') || - (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;"))) + (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;")) || + (escapeQuotes && c == wxT('"'))) { OutputString(stream, str.Mid(last, i - last), convMem, convFile); switch (c) @@ -618,6 +638,9 @@ static void OutputStringEnt(wxOutputStream& stream, const wxString& str, case wxT('&'): OutputString(stream, wxT("&"), NULL, NULL); break; + case wxT('"'): + OutputString(stream, wxT("""), NULL, NULL); + break; default: break; } last = i + 1; @@ -653,10 +676,11 @@ static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, prop = node->GetProperties(); while (prop) { - OutputString(stream, wxT(" ") + prop->GetName() + - wxT("=\"") + prop->GetValue() + wxT("\""), + OutputString(stream, wxT(" ") + prop->GetName() + wxT("=\""), NULL, NULL); - // FIXME - what if prop contains '"'? + OutputStringEnt(stream, prop->GetValue(), NULL, NULL, + true/*escapeQuotes*/); + OutputString(stream, wxT("\""), NULL, NULL); prop = prop->GetNext(); }