X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/670f9935630beb2123a5ca62894ae92a3f0efa4f..e87f080a8809a36b9fd05f5f9b3d8436dac017c3:/src/xml/xml.cpp diff --git a/src/xml/xml.cpp b/src/xml/xml.cpp index 4c6dcdd771..d53297f0ae 100644 --- a/src/xml/xml.cpp +++ b/src/xml/xml.cpp @@ -348,12 +348,16 @@ void wxXmlDocument::DoCopy(const wxXmlDocument& doc) bool wxXmlDocument::Load(const wxString& filename, const wxString& encoding) { wxFileInputStream stream(filename); + if (!stream.Ok()) + return false; return Load(stream, encoding); } bool wxXmlDocument::Save(const wxString& filename) const { wxFileOutputStream stream(filename); + if (!stream.Ok()) + return false; return Save(stream); } @@ -385,7 +389,7 @@ static wxString CharToString(wxMBConv *conv, const wxWCharBuffer wbuf( wxConvUTF8.cMB2WC(s, len == wxSTRING_MAXLEN ? wxNO_LEN : len, NULL)); - return wxString(wbuf, conv); + return wxString(wbuf, *conv); } else // already in UTF-8, no conversion needed { @@ -402,6 +406,7 @@ struct wxXmlParsingContext wxXmlNode *lastAsText; wxString encoding; wxString version; + bool bLastCdata; }; extern "C" { @@ -445,8 +450,16 @@ static void TextHnd(void *userData, const char *s, int len) if (ctx->lastAsText) { - ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + + if ( ctx->bLastCdata ) + { + ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + + CharToString(NULL, buf)); + } + else + { + ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + CharToString(ctx->conv, buf)); + } } else { @@ -469,6 +482,27 @@ static void TextHnd(void *userData, const char *s, int len) } } +extern "C" { +static void StartCdataHnd(void *userData) +{ + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + + ctx->bLastCdata = true; + + ctx->lastAsText = new wxXmlNode(wxXML_CDATA_SECTION_NODE, wxT("cdata"),wxT("")); + ctx->node->AddChild(ctx->lastAsText); +} +} + +extern "C" { +static void EndCdataHnd(void *userData) +{ + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + + ctx->bLastCdata = false; +} +} + extern "C" { static void CommentHnd(void *userData, const char *data) { @@ -561,10 +595,12 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) if ( encoding != wxT("UTF-8") && encoding != wxT("utf-8") ) ctx.conv = new wxCSConv(encoding); #endif + ctx.bLastCdata = false; XML_SetUserData(parser, (void*)&ctx); XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); XML_SetCharacterDataHandler(parser, TextHnd); + XML_SetCdataSectionHandler(parser, StartCdataHnd, EndCdataHnd ); XML_SetCommentHandler(parser, CommentHnd); XML_SetDefaultHandler(parser, DefaultHnd); XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL); @@ -707,6 +743,12 @@ static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, switch (node->GetType()) { + case wxXML_CDATA_SECTION_NODE: + OutputString( stream, wxT("GetContent() ); + OutputString( stream, wxT("]]>") ); + break; + case wxXML_TEXT_NODE: OutputStringEnt(stream, node->GetContent(), convMem, convFile); break;