]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xml/xml.cpp
Only call GetTextMetrics() in wxDC::GetTextExtent() if necessary.
[wxWidgets.git] / src / xml / xml.cpp
index 0193e5a8591c9ae56702c1394215f6a42e9b31d7..534777558a3aeb965e35df5389352c7ec040d923 100644 (file)
@@ -29,7 +29,7 @@
 #include "wx/datstrm.h"
 #include "wx/zstream.h"
 #include "wx/strconv.h"
 #include "wx/datstrm.h"
 #include "wx/zstream.h"
 #include "wx/strconv.h"
-#include "wx/ptr_scpd.h"
+#include "wx/scopedptr.h"
 
 #include "expat.h" // from Expat
 
 
 #include "expat.h" // from Expat
 
@@ -618,6 +618,17 @@ static void StartCdataHnd(void *userData)
     ctx->lastChild= ctx->lastAsText = textnode;
 }
 
     ctx->lastChild= ctx->lastAsText = textnode;
 }
 
+static void EndCdataHnd(void *userData)
+{
+    wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
+
+    // we need to reset this pointer so that subsequent text nodes don't append
+    // their contents to this one but create new wxXML_TEXT_NODE objects (or
+    // not create anything at all if only white space follows the CDATA section
+    // and wxXMLDOC_KEEP_WHITESPACE_NODES is not used as is commonly the case)
+    ctx->lastAsText = NULL;
+}
+
 static void CommentHnd(void *userData, const char *data)
 {
     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
 static void CommentHnd(void *userData, const char *data)
 {
     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
@@ -717,7 +728,7 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding, int fl
     XML_SetUserData(parser, (void*)&ctx);
     XML_SetElementHandler(parser, StartElementHnd, EndElementHnd);
     XML_SetCharacterDataHandler(parser, TextHnd);
     XML_SetUserData(parser, (void*)&ctx);
     XML_SetElementHandler(parser, StartElementHnd, EndElementHnd);
     XML_SetCharacterDataHandler(parser, TextHnd);
-    XML_SetStartCdataSectionHandler(parser, StartCdataHnd);
+    XML_SetCdataSectionHandler(parser, StartCdataHnd, EndCdataHnd);;
     XML_SetCommentHandler(parser, CommentHnd);
     XML_SetDefaultHandler(parser, DefaultHnd);
     XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL);
     XML_SetCommentHandler(parser, CommentHnd);
     XML_SetDefaultHandler(parser, DefaultHnd);
     XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL);
@@ -783,12 +794,18 @@ bool OutputString(wxOutputStream& stream,
 
 #if wxUSE_UNICODE
     wxUnusedVar(convMem);
 
 #if wxUSE_UNICODE
     wxUnusedVar(convMem);
+    if ( !convFile )
+        convFile = &wxConvUTF8;
 
 
-    const wxWX2MBbuf buf(str.mb_str(*(convFile ? convFile : &wxConvUTF8)));
-    if ( !buf )
+    const wxScopedCharBuffer buf(str.mb_str(*convFile));
+    if ( !buf.length() )
+    {
+        // conversion failed, can't write this string in an XML file in this
+        // (presumably non-UTF-8) encoding
         return false;
         return false;
+    }
 
 
-    stream.Write(buf, strlen(buf));
+    stream.Write(buf, buf.length());
 #else // !wxUSE_UNICODE
     if ( convFile && convMem )
     {
 #else // !wxUSE_UNICODE
     if ( convFile && convMem )
     {
@@ -825,10 +842,11 @@ bool OutputStringEnt(wxOutputStream& stream,
     {
         wxChar c = str.GetChar(i);
         if (c == wxS('<') || c == wxS('>') ||
     {
         wxChar c = str.GetChar(i);
         if (c == wxS('<') || c == wxS('>') ||
-            (c == wxS('&') && str.Mid(i+1, 4) != wxS("amp;")) ||
+            (c == wxS('&') && str.substr(i+1, 4) != wxS("amp;")) ||
             ((flags & XML_ESCAPE_QUOTES) && c == wxS('"')))
         {
             ((flags & XML_ESCAPE_QUOTES) && c == wxS('"')))
         {
-            if ( !OutputString(stream, str.substr(last, i), convMem, convFile) )
+            if ( !OutputString(stream, str.substr(last, i - last),
+                               convMem, convFile) )
                 return false;
 
             const char *escaped;
                 return false;
 
             const char *escaped;
@@ -858,7 +876,7 @@ bool OutputStringEnt(wxOutputStream& stream,
         }
     }
 
         }
     }
 
-    return OutputString(stream, str.substr(last, i), convMem, convFile);
+    return OutputString(stream, str.substr(last, i - last), convMem, convFile);
 }
 
 bool OutputIndentation(wxOutputStream& stream,
 }
 
 bool OutputIndentation(wxOutputStream& stream,
@@ -867,7 +885,7 @@ bool OutputIndentation(wxOutputStream& stream,
                        wxMBConv *convFile)
 {
     wxString str(wxS("\n"));
                        wxMBConv *convFile)
 {
     wxString str(wxS("\n"));
-    str += wxString(2*indent, wxS(' '));
+    str += wxString(indent, wxS(' '));
     return OutputString(stream, str, convMem, convFile);
 }
 
     return OutputString(stream, str, convMem, convFile);
 }