]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xml/xml.cpp
remove .cvsignore files, they're useless with svn
[wxWidgets.git] / src / xml / xml.cpp
index 4a13a5e8792e31b786e086b02d8c90b8fa047ac6..16ced8c8f6a34480467b2ff68317b32ffba3486a 100644 (file)
@@ -40,7 +40,7 @@ IMPLEMENT_CLASS(wxXmlDocument, wxObject)
 
 
 // a private utility used by wxXML
-static bool wxIsWhiteOnly(const wxChar *buf);
+static bool wxIsWhiteOnly(const wxString& buf);
 
 
 //-----------------------------------------------------------------------------
@@ -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,35 +418,34 @@ 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);
-
-    return wxString(s, wxConvUTF8, len);
-#else // !wxUSE_UNICODE
+#if !wxUSE_UNICODE
     if ( 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));
-    }
-#endif // wxUSE_UNICODE/!wxUSE_UNICODE
+    // else: the string is wanted in UTF-8
+#endif // !wxUSE_UNICODE
+
+    wxUnusedVar(conv);
+    return wxString::FromUTF8(s, len);
 }
 
 // returns true if the given string contains only whitespaces
-bool wxIsWhiteOnly(const wxChar *buf)
+bool wxIsWhiteOnly(const wxString& buf)
 {
-    for (const wxChar *c = buf; *c != wxT('\0'); c++)
-        if (*c != wxT(' ') && *c != wxT('\t') && *c != wxT('\n') && *c != wxT('\r'))
+    for ( wxString::const_iterator i = buf.begin(); i != buf.end(); ++i )
+    {
+        wxChar c = *i;
+        if ( c != wxT(' ') && c != wxT('\t') && c != wxT('\n') && c != wxT('\r'))
             return false;
+    }
     return true;
 }
 
@@ -455,7 +458,6 @@ struct wxXmlParsingContext
     wxXmlNode *lastAsText;
     wxString   encoding;
     wxString   version;
-       bool    bLastCdata;
     bool       removeWhiteOnlyNodes;
 };
 
@@ -477,9 +479,7 @@ static void StartElementHnd(void *userData, const char *name, const char **atts)
     ctx->node = node;
     ctx->lastAsText = NULL;
 }
-}
 
-extern "C" {
 static void EndElementHnd(void *userData, const char* WXUNUSED(name))
 {
     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
@@ -487,9 +487,7 @@ static void EndElementHnd(void *userData, const char* WXUNUSED(name))
     ctx->node = ctx->node->GetParent();
     ctx->lastAsText = NULL;
 }
-}
 
-extern "C" {
 static void TextHnd(void *userData, const char *s, int len)
 {
     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
@@ -497,15 +495,7 @@ static void TextHnd(void *userData, const char *s, int len)
 
     if (ctx->lastAsText)
     {
-               if ( ctx->bLastCdata )
-               {
-                       ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() +
-                                        CharToString(NULL, s, len));
-               }
-               else
-               {
-            ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + str);
-               }
+        ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + str);
     }
     else
     {
@@ -520,30 +510,15 @@ static void TextHnd(void *userData, const char *s, int len)
         }
     }
 }
-}
 
-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;      
-}
+    ctx->lastAsText = new wxXmlNode(wxXML_CDATA_SECTION_NODE, wxT("cdata"),wxT(""));
+    ctx->node->AddChild(ctx->lastAsText);
 }
 
-extern "C" {
 static void CommentHnd(void *userData, const char *data)
 {
     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
@@ -558,9 +533,7 @@ static void CommentHnd(void *userData, const char *data)
     }
     ctx->lastAsText = NULL;
 }
-}
 
-extern "C" {
 static void DefaultHnd(void *userData, const char *s, int len)
 {
     // XML header:
@@ -578,17 +551,14 @@ static void DefaultHnd(void *userData, const char *s, int len)
             ctx->version = buf.Mid(pos + 9).BeforeFirst(buf[(size_t)pos+8]);
     }
 }
-}
 
-extern "C" {
 static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData),
                               const XML_Char *name, XML_Encoding *info)
 {
     // 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:
-    wxString str(name, wxConvLibc);
-    wxCSConv conv(str);
+    wxCSConv conv(name);
     char mbBuf[2];
     wchar_t wcBuf[10];
     size_t i;
@@ -612,7 +582,8 @@ static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData),
 
     return 1;
 }
-}
+
+} // extern "C"
 
 bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding, int flags)
 {
@@ -632,16 +603,15 @@ 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;
 
     XML_SetUserData(parser, (void*)&ctx);
     XML_SetElementHandler(parser, StartElementHnd, EndElementHnd);
     XML_SetCharacterDataHandler(parser, TextHnd);
-       XML_SetCdataSectionHandler(parser, StartCdataHnd, EndCdataHnd );
+    XML_SetStartCdataSectionHandler(parser, StartCdataHnd);
     XML_SetCommentHandler(parser, CommentHnd);
     XML_SetDefaultHandler(parser, DefaultHnd);
     XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL);
@@ -784,11 +754,11 @@ static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent,
 
     switch (node->GetType())
     {
-               case wxXML_CDATA_SECTION_NODE:
-                       OutputString( stream, wxT("<![CDATA["));
-                       OutputString( stream, node->GetContent() );
-                       OutputString( stream, wxT("]]>") );
-                       break;
+        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);
@@ -849,17 +819,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("<?xml version=\"%s\" encoding=\"%s\"?>\n"),
@@ -869,10 +845,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;
 }