]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xml/xml.cpp
Committing in .
[wxWidgets.git] / src / xml / xml.cpp
index ed0b3c0b0731ca1710c044755461b52c5b76d434..f55ad6f7a1ead4267637837e5c6d404e57556588 100644 (file)
@@ -8,7 +8,7 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "xml.h"
 #endif
 
 
 #include "expat.h" // from Expat
 
+// DLL options compatibility check:
+#include "wx/app.h"
+WX_CHECK_BUILD_OPTIONS("wxXML")
+
 //-----------------------------------------------------------------------------
 //  wxXmlNode
 //-----------------------------------------------------------------------------
@@ -152,8 +156,8 @@ wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& default
     wxString tmp;
     if (GetPropVal(propName, &tmp))
         return tmp;
-    else
-        return defaultVal;
+
+    return defaultVal;
 }
 
 void wxXmlNode::AddChild(wxXmlNode *child)
@@ -366,7 +370,7 @@ inline static wxString CharToString(wxMBConv *conv,
         return str;
     }
     else
-        return wxString(s, len);
+        return wxString(s, len != wxSTRING_MAXLEN ? len : strlen(s));
 #endif
 }
 
@@ -478,7 +482,8 @@ static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData),
     // We must build conversion table for expat. The easiest way to do so
     // is to let wxCSConv convert as string containing all characters to
     // wide character representation:
-    wxCSConv conv(wxString(name, wxConvLibc));
+    wxString str(name, wxConvLibc);
+    wxCSConv conv(str);
     char mbBuf[2];
     wchar_t wcBuf[10];
     size_t i;
@@ -495,7 +500,7 @@ static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData),
         }
         info->map[i+1] = (int)wcBuf[0];
     }
-    
+
     info->data = NULL;
     info->convert = NULL;
     info->release = NULL;
@@ -539,8 +544,10 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding)
         done = (len < BUFSIZE);
         if (!XML_Parse(parser, buf, len, done))
         {
+            wxString error(XML_ErrorString(XML_GetErrorCode(parser)),
+                           *wxConvCurrent);
             wxLogError(_("XML parsing error: '%s' at line %d"),
-                       XML_ErrorString(XML_GetErrorCode(parser)),
+                       error.c_str(),
                        XML_GetCurrentLineNumber(parser));
             ok = false;
             break;
@@ -549,10 +556,16 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding)
 
     if (ok)
     {
-        SetVersion(ctx.version);
-        SetFileEncoding(ctx.encoding);
+        if (!ctx.version.IsEmpty())
+            SetVersion(ctx.version);
+        if (!ctx.encoding.IsEmpty())
+            SetFileEncoding(ctx.encoding);
         SetRoot(ctx.root);
     }
+    else
+    {
+        delete ctx.root;
+    }
 
     XML_ParserFree(parser);
 #if !wxUSE_UNICODE
@@ -572,11 +585,16 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding)
 
 // write string to output:
 inline static void OutputString(wxOutputStream& stream, const wxString& str,
-                                wxMBConv *convMem, wxMBConv *convFile)
+#if wxUSE_UNICODE
+    wxMBConv * WXUNUSED(convMem),
+#else
+    wxMBConv *convMem,
+#endif
+    wxMBConv *convFile)
 {
     if (str.IsEmpty()) return;
 #if wxUSE_UNICODE
-    const wxWX2MBbuf buf(str.mb_str(convFile ? *convFile : wxConvUTF8));
+    const wxWX2MBbuf buf(str.mb_str(*(convFile ? convFile : &wxConvUTF8)));
     stream.Write((const char*)buf, strlen((const char*)buf));
 #else
     if ( convFile == NULL )
@@ -592,7 +610,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;
@@ -604,7 +623,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)
@@ -618,6 +638,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;
@@ -653,10 +676,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();
             }