From ebf0700dda1c199f5227d91311a0279ef54d0f86 Mon Sep 17 00:00:00 2001
From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= <vslavik@fastmail.fm>
Date: Tue, 30 Sep 2003 19:08:28 +0000
Subject: [PATCH] properly quote characters when streaming out XML properties

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24016 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 src/xml/xml.cpp | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/xml/xml.cpp b/src/xml/xml.cpp
index ab40593bed..755f7e5656 100644
--- a/src/xml/xml.cpp
+++ b/src/xml/xml.cpp
@@ -604,7 +604,8 @@ inline static void OutputString(wxOutputStream& stream, const wxString& str,
 // Same as above, but create entities first.
 // Translates '<' to "&lt;", '>' to "&gt;" and '&' to "&amp;"
 static void OutputStringEnt(wxOutputStream& stream, const wxString& str,
-                            wxMBConv *convMem, wxMBConv *convFile)
+                            wxMBConv *convMem, wxMBConv *convFile,
+                            bool escapeQuotes = false)
 {
     wxString buf;
     size_t i, last, len;
@@ -616,7 +617,8 @@ static void OutputStringEnt(wxOutputStream& stream, const wxString& str,
     {
         c = str.GetChar(i);
         if (c == wxT('<') || c == wxT('>') ||
-            (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;")))
+            (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;")) ||
+            (escapeQuotes && c == wxT('"')))
         {
             OutputString(stream, str.Mid(last, i - last), convMem, convFile);
             switch (c)
@@ -630,6 +632,9 @@ static void OutputStringEnt(wxOutputStream& stream, const wxString& str,
                 case wxT('&'):
                     OutputString(stream, wxT("&amp;"), NULL, NULL);
                     break;
+                case wxT('"'):
+                    OutputString(stream, wxT("&quot;"), NULL, NULL);
+                    break;
                 default: break;
             }
             last = i + 1;
@@ -665,10 +670,11 @@ static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent,
             prop = node->GetProperties();
             while (prop)
             {
-                OutputString(stream, wxT(" ") + prop->GetName() +
-                             wxT("=\"") + prop->GetValue() + wxT("\""),
+                OutputString(stream, wxT(" ") + prop->GetName() +  wxT("=\""),
                              NULL, NULL);
-                // FIXME - what if prop contains '"'?
+                OutputStringEnt(stream, prop->GetValue(), NULL, NULL,
+                                true/*escapeQuotes*/);
+                OutputString(stream, wxT("\""), NULL, NULL);
                 prop = prop->GetNext();
             }
 
-- 
2.47.2