X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da452b9eec5e85657dc931891efdfd4218abf680..5a61da16c593ba50964e7925525c128c73464c8a:/src/xml/xml.cpp diff --git a/src/xml/xml.cpp b/src/xml/xml.cpp index 25ffc91ea9..067cd02319 100644 --- a/src/xml/xml.cpp +++ b/src/xml/xml.cpp @@ -178,21 +178,40 @@ void wxXmlNode::AddChild(wxXmlNode *child) child->m_parent = this; } -void wxXmlNode::InsertChild(wxXmlNode *child, wxXmlNode *before_node) +bool wxXmlNode::InsertChild(wxXmlNode *child, wxXmlNode *before_node) { - wxASSERT_MSG(before_node->GetParent() == this, wxT("wxXmlNode::InsertChild - the node has incorrect parent")); + wxCHECK_MSG(before_node == NULL || before_node->GetParent() == this, false, + wxT("wxXmlNode::InsertChild - the node has incorrect parent")); + wxCHECK_MSG(child, false, wxT("Cannot insert a NULL pointer!")); if (m_children == before_node) m_children = child; + else if (m_children == NULL) + { + if (before_node != NULL) + return false; // we have no children so we don't need to search + m_children = child; + } + else if (before_node == NULL) + { + // prepend child + child->m_parent = this; + child->m_next = m_children; + m_children = child; + return true; + } else { wxXmlNode *ch = m_children; - while (ch->m_next != before_node) ch = ch->m_next; + while (ch && ch->m_next != before_node) ch = ch->m_next; + if (!ch) + return false; // before_node not found ch->m_next = child; } child->m_parent = this; child->m_next = before_node; + return true; } bool wxXmlNode::RemoveChild(wxXmlNode *child) @@ -348,12 +367,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); } @@ -402,6 +425,7 @@ struct wxXmlParsingContext wxXmlNode *lastAsText; wxString encoding; wxString version; + bool bLastCdata; }; extern "C" { @@ -445,8 +469,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 +501,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 +614,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 +762,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;