X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/538f3830191e25eaf0edb0a379e08d4f85ee49bc..18138662efd0bc550d78cbe32e93e25b43bbcbd2:/src/xml/xml.cpp diff --git a/src/xml/xml.cpp b/src/xml/xml.cpp index 4a13a5e879..61617537a9 100644 --- a/src/xml/xml.cpp +++ b/src/xml/xml.cpp @@ -386,7 +386,11 @@ void wxXmlDocument::DoCopy(const wxXmlDocument& doc) m_encoding = doc.m_encoding; #endif m_fileEncoding = doc.m_fileEncoding; - m_root = new wxXmlNode(*doc.m_root); + + if (doc.m_root) + m_root = new wxXmlNode(*doc.m_root); + else + m_root = NULL; } bool wxXmlDocument::Load(const wxString& filename, const wxString& encoding, int flags) @@ -414,7 +418,7 @@ bool wxXmlDocument::Save(const wxString& filename, int indentstep) const // converts Expat-produced string in UTF-8 into wxString using the specified // conv or keep in UTF-8 if conv is NULL static wxString CharToString(wxMBConv *conv, - const char *s, size_t len = wxSTRING_MAXLEN) + const char *s, size_t len = wxString::npos) { #if wxUSE_UNICODE wxUnusedVar(conv); @@ -426,13 +430,13 @@ static wxString CharToString(wxMBConv *conv, // there can be no embedded NULs in this string so we don't need the // output length, it will be NUL-terminated const wxWCharBuffer wbuf( - wxConvUTF8.cMB2WC(s, len == wxSTRING_MAXLEN ? wxNO_LEN : len, NULL)); + wxConvUTF8.cMB2WC(s, len == wxString::npos ? wxNO_LEN : len, NULL)); return wxString(wbuf, *conv); } else // already in UTF-8, no conversion needed { - return wxString(s, len != wxSTRING_MAXLEN ? len : strlen(s)); + return wxString(s, len != wxString::npos ? len : strlen(s)); } #endif // wxUSE_UNICODE/!wxUSE_UNICODE } @@ -455,7 +459,7 @@ struct wxXmlParsingContext wxXmlNode *lastAsText; wxString encoding; wxString version; - bool bLastCdata; + bool bLastCdata; bool removeWhiteOnlyNodes; }; @@ -497,15 +501,15 @@ static void TextHnd(void *userData, const char *s, int len) if (ctx->lastAsText) { - if ( ctx->bLastCdata ) - { - ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + + if ( ctx->bLastCdata ) + { + ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + CharToString(NULL, s, len)); - } - else - { + } + else + { ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + str); - } + } } else { @@ -527,10 +531,10 @@ 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); + ctx->bLastCdata = true; + + ctx->lastAsText = new wxXmlNode(wxXML_CDATA_SECTION_NODE, wxT("cdata"),wxT("")); + ctx->node->AddChild(ctx->lastAsText); } } @@ -539,7 +543,7 @@ static void EndCdataHnd(void *userData) { wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - ctx->bLastCdata = false; + ctx->bLastCdata = false; } } @@ -632,16 +636,16 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding, int fl ctx.encoding = wxT("UTF-8"); // default in absence of encoding="" ctx.conv = NULL; #if !wxUSE_UNICODE - if ( encoding != wxT("UTF-8") && encoding != wxT("utf-8") ) + if ( encoding.CmpNoCase(wxT("UTF-8")) != 0 ) ctx.conv = new wxCSConv(encoding); #endif ctx.removeWhiteOnlyNodes = (flags & wxXMLDOC_KEEP_WHITESPACE_NODES) == 0; - ctx.bLastCdata = false; + ctx.bLastCdata = false; XML_SetUserData(parser, (void*)&ctx); XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); XML_SetCharacterDataHandler(parser, TextHnd); - XML_SetCdataSectionHandler(parser, StartCdataHnd, EndCdataHnd ); + XML_SetCdataSectionHandler(parser, StartCdataHnd, EndCdataHnd ); XML_SetCommentHandler(parser, CommentHnd); XML_SetDefaultHandler(parser, DefaultHnd); XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL); @@ -784,11 +788,11 @@ 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_CDATA_SECTION_NODE: + OutputString( stream, wxT("GetContent() ); + OutputString( stream, wxT("]]>") ); + break; case wxXML_TEXT_NODE: OutputStringEnt(stream, node->GetContent(), convMem, convFile); @@ -849,17 +853,23 @@ bool wxXmlDocument::Save(wxOutputStream& stream, int indentstep) const wxString s; - wxMBConv *convMem = NULL; + wxMBConv *convMem = NULL, + *convFile; #if wxUSE_UNICODE - wxMBConv *convFile = new wxCSConv(GetFileEncoding()); + convFile = new wxCSConv(GetFileEncoding()); + convMem = NULL; #else - wxMBConv *convFile = NULL; - if ( GetFileEncoding() != GetEncoding() ) + if ( GetFileEncoding().CmpNoCase(GetEncoding()) != 0 ) { convFile = new wxCSConv(GetFileEncoding()); convMem = new wxCSConv(GetEncoding()); } + else // file and in-memory encodings are the same, no conversion needed + { + convFile = + convMem = NULL; + } #endif s.Printf(wxT("\n"), @@ -869,10 +879,8 @@ bool wxXmlDocument::Save(wxOutputStream& stream, int indentstep) const OutputNode(stream, GetRoot(), 0, convMem, convFile, indentstep); OutputString(stream, wxT("\n")); - if ( convFile ) - delete convFile; - if ( convMem ) - delete convMem; + delete convFile; + delete convMem; return true; }