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)
wxXmlNode *lastAsText;
wxString encoding;
wxString version;
+ bool bLastCdata;
};
extern "C" {
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
{
}
}
+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)
{
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);
switch (node->GetType())
{
+ case wxXML_CDATA_SECTION_NODE:
+ OutputString( stream, wxT("<![CDATA["));
+ OutputString( stream, node->GetContent() );
+ OutputString( stream, wxT("]]>") );
+ break;
+
case wxXML_TEXT_NODE:
OutputStringEnt(stream, node->GetContent(), convMem, convFile);
break;