From 4d876ee3f727afa0d79aa5f7b03bf9a59673bef6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sat, 2 Feb 2002 23:17:38 +0000 Subject: [PATCH] wxXRC cleanup: removed .xmlbin format git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13977 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- contrib/include/wx/xrc/xml.h | 52 +--- contrib/include/wx/xrc/xmlio.h | 89 ------ contrib/src/xrc/Makefile.in | 2 +- contrib/src/xrc/XrcVC.dsp | 16 - contrib/src/xrc/makefile.b32 | 2 +- contrib/src/xrc/makefile.g95 | 2 +- contrib/src/xrc/makefile.vc | 4 +- contrib/src/xrc/makefile.wat | 2 +- contrib/src/xrc/xml.cpp | 475 ++++++++++++++++++++++------- contrib/src/xrc/xmlbin.cpp | 167 ---------- contrib/src/xrc/xmlbinz.cpp | 60 ---- contrib/src/xrc/xmlexpat.cpp | 251 --------------- contrib/src/xrc/xmlres.cpp | 2 +- contrib/src/xrc/xmlwrite.cpp | 184 ----------- contrib/utils/wxrc/wxrc.cpp | 14 +- contrib/utils/wxrcedit/editor.cpp | 2 +- contrib/utils/wxrcedit/preview.cpp | 2 +- include/wx/xrc/xml.h | 52 +--- include/wx/xrc/xmlio.h | 89 ------ src/xrc/Makefile.in | 2 +- src/xrc/XrcVC.dsp | 16 - src/xrc/makefile.b32 | 2 +- src/xrc/makefile.g95 | 2 +- src/xrc/makefile.vc | 4 +- src/xrc/makefile.wat | 2 +- src/xrc/xml.cpp | 475 ++++++++++++++++++++++------- src/xrc/xmlbin.cpp | 167 ---------- src/xrc/xmlbinz.cpp | 60 ---- src/xrc/xmlexpat.cpp | 251 --------------- src/xrc/xmlres.cpp | 2 +- src/xrc/xmlwrite.cpp | 184 ----------- utils/wxrc/wxrc.cpp | 14 +- 32 files changed, 742 insertions(+), 1906 deletions(-) delete mode 100644 contrib/include/wx/xrc/xmlio.h delete mode 100644 contrib/src/xrc/xmlbin.cpp delete mode 100644 contrib/src/xrc/xmlbinz.cpp delete mode 100644 contrib/src/xrc/xmlexpat.cpp delete mode 100644 contrib/src/xrc/xmlwrite.cpp delete mode 100644 include/wx/xrc/xmlio.h delete mode 100644 src/xrc/xmlbin.cpp delete mode 100644 src/xrc/xmlbinz.cpp delete mode 100644 src/xrc/xmlexpat.cpp delete mode 100644 src/xrc/xmlwrite.cpp diff --git a/contrib/include/wx/xrc/xml.h b/contrib/include/wx/xrc/xml.h index 28037b6925..7d5f4e05a6 100644 --- a/contrib/include/wx/xrc/xml.h +++ b/contrib/include/wx/xrc/xml.h @@ -54,18 +54,6 @@ enum wxXmlNodeType }; -// Types of XML files: - -enum wxXmlIOType -{ - wxXML_IO_AUTO = 0, // detect it automatically - wxXML_IO_EXPAT, // use Expat to load from text/xml document - wxXML_IO_TEXT_OUTPUT, // generic saver into text/xml - wxXML_IO_BIN, // save in binary uncompressed proprietary format - wxXML_IO_BINZ // svae in binary zlib-compressed proprietary format -}; - - // Represents node property(ies). // Example: in "src" is property with value // "hello.gif" and "id" is prop. with value "3". @@ -178,10 +166,8 @@ class WXXMLDLLEXPORT wxXmlDocument : public wxObject public: wxXmlDocument() : wxObject(), m_version(wxT("1.0")), m_root(NULL) {} wxXmlDocument(const wxString& filename, - wxXmlIOType io_type = wxXML_IO_AUTO, const wxString& encoding = wxT("UTF-8")); wxXmlDocument(wxInputStream& stream, - wxXmlIOType io_type = wxXML_IO_AUTO, const wxString& encoding = wxT("UTF-8")); ~wxXmlDocument() { delete m_root; } @@ -191,17 +177,13 @@ public: // Parses .xml file and loads data. Returns TRUE on success, FALSE // otherwise. bool Load(const wxString& filename, - wxXmlIOType io_type = wxXML_IO_AUTO, const wxString& encoding = wxT("UTF-8")); bool Load(wxInputStream& stream, - wxXmlIOType io_type = wxXML_IO_AUTO, const wxString& encoding = wxT("UTF-8")); // Saves document as .xml file. - bool Save(const wxString& filename, - wxXmlIOType io_type = wxXML_IO_TEXT_OUTPUT) const; - bool Save(wxOutputStream& stream, - wxXmlIOType io_type = wxXML_IO_TEXT_OUTPUT) const; + bool Save(const wxString& filename) const; + bool Save(wxOutputStream& stream) const; bool IsOk() const { return m_root != NULL; } @@ -227,13 +209,6 @@ public: wxString GetEncoding() const { return m_encoding; } #endif - static void AddHandler(wxXmlIOHandler *handler); - static void CleanUpHandlers(); - static void InitStandardHandlers(); - -protected: - static wxList *sm_handlers; - private: wxString m_version; wxString m_fileEncoding; @@ -245,27 +220,4 @@ private: void DoCopy(const wxXmlDocument& doc); }; - - -// wxXmlIOHandler takes care of loading and/or saving XML data. -// see xmlio.h for available handlers - -class WXXMLDLLEXPORT wxXmlIOHandler : public wxObject -{ - public: - wxXmlIOHandler() {} - - virtual wxXmlIOType GetType() = 0; - virtual bool CanLoad(wxInputStream& stream) = 0; - virtual bool CanSave() = 0; - - virtual bool Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding) = 0; - virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc) = 0; -}; - - - -void wxXmlInitXmlModule(); - #endif // _WX_XML_H_ diff --git a/contrib/include/wx/xrc/xmlio.h b/contrib/include/wx/xrc/xmlio.h deleted file mode 100644 index a4052b6775..0000000000 --- a/contrib/include/wx/xrc/xmlio.h +++ /dev/null @@ -1,89 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlio.h -// Purpose: wxXmlIOHandler - XML I/O classes -// Author: Vaclav Slavik -// Created: 2000/07/24 -// RCS-ID: $Id$ -// Copyright: (c) 2000 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifndef _WX_XMLIO_H_ -#define _WX_XMLIO_H_ - -#ifdef __GNUG__ -#pragma interface "xmlio.h" -#endif - -#include "wx/defs.h" -#include "wx/string.h" -#include "wx/xrc/xml.h" - - -class WXXMLDLLEXPORT wxXmlIOHandlerExpat : public wxXmlIOHandler -{ -public: - virtual wxXmlIOType GetType() { return wxXML_IO_EXPAT; } - virtual bool CanLoad(wxInputStream& stream); - virtual bool CanSave() { return FALSE; } - - virtual bool Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding); - virtual bool Save(wxOutputStream& WXUNUSED(stream), const wxXmlDocument& WXUNUSED(doc)) - { return FALSE; } -}; - - -class WXXMLDLLEXPORT wxXmlIOHandlerWriter : public wxXmlIOHandler -{ -public: - virtual wxXmlIOType GetType() { return wxXML_IO_TEXT_OUTPUT; } - virtual bool CanLoad(wxInputStream& WXUNUSED(stream)) { return FALSE; } - virtual bool CanSave() { return TRUE; } - - virtual bool Load(wxInputStream& WXUNUSED(stream), wxXmlDocument& WXUNUSED(doc), - const wxString& WXUNUSED(encoding)) - { return FALSE; } - virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc); -}; - - -class WXXMLDLLEXPORT wxXmlIOHandlerBin : public wxXmlIOHandler -{ -public: - wxXmlIOHandlerBin() {} - - virtual wxXmlIOType GetType() { return wxXML_IO_BIN; } - virtual bool CanLoad(wxInputStream& stream); - virtual bool CanSave() { return TRUE; } - - virtual bool Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding); - virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc); - -protected: - wxString ReadHeader(wxInputStream& stream); - void WriteHeader(wxOutputStream& stream, const wxString& header); -}; - - - -#if wxUSE_ZLIB - -class WXXMLDLLEXPORT wxXmlIOHandlerBinZ : public wxXmlIOHandlerBin -{ -public: - wxXmlIOHandlerBinZ() {} - - virtual wxXmlIOType GetType() { return wxXML_IO_BINZ; } - virtual bool CanLoad(wxInputStream& stream); - - virtual bool Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding); - virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc); -}; - -#endif - - -#endif // _WX_XMLIO_H_ diff --git a/contrib/src/xrc/Makefile.in b/contrib/src/xrc/Makefile.in index 729c6f1574..f645274010 100644 --- a/contrib/src/xrc/Makefile.in +++ b/contrib/src/xrc/Makefile.in @@ -27,7 +27,7 @@ HEADERS=xh_all.h xh_bttn.h xh_chckb.h xh_chckl.h xh_choic.h xh_combo.h \ xh_stlin.h xh_bmp.h xh_unkwn.h xh_frame.h xh_gdctl.h OBJECTS=$(EXPAT_OBJECTS) \ - xml.o xmlbin.o xmlbinz.o xmlexpat.o xmlwrite.o xmlres.o xmlrsall.o \ + xml.o xmlres.o xmlrsall.o \ xh_bttn.o xh_chckb.o xh_chckl.o xh_choic.o xh_combo.o xh_dlg.o \ xh_gauge.o xh_html.o xh_menu.o xh_notbk.o xh_panel.o xh_radbt.o \ xh_radbx.o xh_sizer.o xh_slidr.o xh_spin.o xh_stbmp.o xh_sttxt.o \ diff --git a/contrib/src/xrc/XrcVC.dsp b/contrib/src/xrc/XrcVC.dsp index 79710adb44..44c9ba9a78 100644 --- a/contrib/src/xrc/XrcVC.dsp +++ b/contrib/src/xrc/XrcVC.dsp @@ -232,27 +232,11 @@ SOURCE=.\xml.cpp # End Source File # Begin Source File -SOURCE=.\xmlbin.cpp -# End Source File -# Begin Source File - -SOURCE=.\xmlbinz.cpp -# End Source File -# Begin Source File - -SOURCE=.\xmlexpat.cpp -# End Source File -# Begin Source File - SOURCE=.\xmlres.cpp # End Source File # Begin Source File SOURCE=.\xmlrsall.cpp # End Source File -# Begin Source File - -SOURCE=.\xmlwrite.cpp -# End Source File # End Target # End Project diff --git a/contrib/src/xrc/makefile.b32 b/contrib/src/xrc/makefile.b32 index ba854f74e6..dc7d4fa68a 100644 --- a/contrib/src/xrc/makefile.b32 +++ b/contrib/src/xrc/makefile.b32 @@ -21,7 +21,7 @@ EXTRACPPFLAGS=$(wxLIBXMLDIR) $(EXPAT_DEFS) LIBTARGET=$(WXDIR)\lib\wxxrc.lib OBJECTS=$(EXPAT_OBJECTS) \ - xml.obj xmlbin.obj xmlbinz.obj xmlexpat.obj xmlwrite.obj xmlres.obj xmlrsall.obj \ + xml.obj xmlres.obj xmlrsall.obj \ xh_bttn.obj xh_chckb.obj xh_chckl.obj xh_choic.obj xh_combo.obj xh_dlg.obj \ xh_gauge.obj xh_html.obj xh_menu.obj xh_notbk.obj xh_panel.obj xh_radbt.obj \ xh_radbx.obj xh_sizer.obj xh_slidr.obj xh_spin.obj xh_stbmp.obj xh_sttxt.obj \ diff --git a/contrib/src/xrc/makefile.g95 b/contrib/src/xrc/makefile.g95 index 2fb8b309a5..8a4bfb322f 100644 --- a/contrib/src/xrc/makefile.g95 +++ b/contrib/src/xrc/makefile.g95 @@ -22,7 +22,7 @@ XMLTOKDIR_OBJECTS=xmltok.o xmlrole.o LIBTARGET=$(WXDIR)/lib/libwxxrc.a OBJECTS= $(XMLPARSEDIR_OBJECTS) $(XMLTOKDIR_OBJECTS) \ - xml.o xmlbin.o xmlbinz.o xmlexpat.o xmlwrite.o xmlres.o xmlrsall.o \ + xml.o xmlres.o xmlrsall.o \ xh_bttn.o xh_chckb.o xh_chckl.o xh_choic.o xh_combo.o xh_dlg.o \ xh_gauge.o xh_html.o xh_menu.o xh_notbk.o xh_panel.o xh_radbt.o \ xh_radbx.o xh_sizer.o xh_slidr.o xh_spin.o xh_stbmp.o xh_sttxt.o \ diff --git a/contrib/src/xrc/makefile.vc b/contrib/src/xrc/makefile.vc index 841ac2d4cd..ff40bb5fcb 100644 --- a/contrib/src/xrc/makefile.vc +++ b/contrib/src/xrc/makefile.vc @@ -47,7 +47,7 @@ LIBTARGET=$(WXDIR)\lib\wxxrc$(LIBEXT).lib EXTRATARGETS=$(D) OBJECTS=$(EXPAT_OBJS) \ - $(D)\xml.obj $(D)\xmlbin.obj $(D)\xmlbinz.obj $(D)\xmlres.obj \ + $(D)\xml.obj \ $(D)\xmlrsall.obj $(D)\xh_bttn.obj $(D)\xh_chckb.obj $(D)\xh_chckl.obj \ $(D)\xh_choic.obj $(D)\xh_combo.obj $(D)\xh_dlg.obj \ $(D)\xh_frame.obj $(D)\xh_gauge.obj $(D)\xh_html.obj $(D)\xh_menu.obj \ @@ -57,7 +57,7 @@ OBJECTS=$(EXPAT_OBJS) \ $(D)\xh_text.obj $(D)\xh_listb.obj $(D)\xh_toolb.obj \ $(D)\xh_bmpbt.obj $(D)\xh_cald.obj $(D)\xh_listc.obj $(D)\xh_scrol.obj \ $(D)\xh_stbox.obj $(D)\xh_tree.obj $(D)\xh_stlin.obj $(D)\xh_bmp.obj \ - $(D)\xh_unkwn.obj $(D)\xmlwrite.obj $(D)\xmlexpat.obj + $(D)\xh_unkwn.obj !include $(WXDIR)\src\makelib.vc diff --git a/contrib/src/xrc/makefile.wat b/contrib/src/xrc/makefile.wat index be5d104e3f..43cfc46647 100644 --- a/contrib/src/xrc/makefile.wat +++ b/contrib/src/xrc/makefile.wat @@ -12,7 +12,7 @@ THISDIR = $(WXDIR)\contrib\src\xrc NAME = wxxrc LNK = $(name).lnk -OBJECTS=xml.obj xmlbin.obj xmlbinz.obj xmlpars.obj xmlres.obj xmlrsall.obj & +OBJECTS=xml.obj xmlres.obj xmlrsall.obj & xh_bttn.obj xh_chckb.obj xh_chckl.obj xh_choic.obj xh_combo.obj xh_dlg.obj & xh_gauge.obj xh_html.obj xh_menu.obj xh_notbk.obj xh_panel.obj xh_radbt.obj & xh_radbx.obj xh_sizer.obj xh_slidr.obj xh_spin.obj xh_stbmp.obj xh_sttxt.obj & diff --git a/contrib/src/xrc/xml.cpp b/contrib/src/xrc/xml.cpp index cf0f9630bf..692a39f0bc 100644 --- a/contrib/src/xrc/xml.cpp +++ b/contrib/src/xrc/xml.cpp @@ -26,11 +26,15 @@ #include "wx/zstream.h" #include "wx/log.h" #include "wx/intl.h" +#include "wx/strconv.h" #include "wx/xrc/xml.h" -#include "wx/xrc/xmlio.h" +#include "xmlparse.h" // from Expat +//----------------------------------------------------------------------------- +// wxXmlNode +//----------------------------------------------------------------------------- wxXmlNode::wxXmlNode(wxXmlNode *parent,wxXmlNodeType type, const wxString& name, const wxString& content, @@ -51,8 +55,6 @@ wxXmlNode::wxXmlNode(wxXmlNode *parent,wxXmlNodeType type, } } - - wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name, const wxString& content) : m_type(type), m_name(name), m_content(content), @@ -60,8 +62,6 @@ wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name, m_children(NULL), m_next(NULL) {} - - wxXmlNode::wxXmlNode(const wxXmlNode& node) { m_next = NULL; @@ -69,8 +69,6 @@ wxXmlNode::wxXmlNode(const wxXmlNode& node) DoCopy(node); } - - wxXmlNode::~wxXmlNode() { wxXmlNode *c, *c2; @@ -88,8 +86,6 @@ wxXmlNode::~wxXmlNode() } } - - wxXmlNode& wxXmlNode::operator=(const wxXmlNode& node) { wxDELETE(m_properties); @@ -98,8 +94,6 @@ wxXmlNode& wxXmlNode::operator=(const wxXmlNode& node) return *this; } - - void wxXmlNode::DoCopy(const wxXmlNode& node) { m_type = node.m_type; @@ -123,7 +117,6 @@ void wxXmlNode::DoCopy(const wxXmlNode& node) } } - bool wxXmlNode::HasProp(const wxString& propName) const { wxXmlProperty *prop = GetProperties(); @@ -137,8 +130,6 @@ bool wxXmlNode::HasProp(const wxString& propName) const return FALSE; } - - bool wxXmlNode::GetPropVal(const wxString& propName, wxString *value) const { wxXmlProperty *prop = GetProperties(); @@ -156,8 +147,6 @@ bool wxXmlNode::GetPropVal(const wxString& propName, wxString *value) const return FALSE; } - - wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& defaultVal) const { wxString tmp; @@ -167,8 +156,6 @@ wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& default return defaultVal; } - - void wxXmlNode::AddChild(wxXmlNode *child) { if (m_children == NULL) @@ -183,8 +170,6 @@ void wxXmlNode::AddChild(wxXmlNode *child) child->m_parent = this; } - - void wxXmlNode::InsertChild(wxXmlNode *child, wxXmlNode *before_node) { wxASSERT_MSG(before_node->GetParent() == this, wxT("wxXmlNode::InsertChild - the node has incorrect parent")); @@ -202,8 +187,6 @@ void wxXmlNode::InsertChild(wxXmlNode *child, wxXmlNode *before_node) child->m_next = before_node; } - - bool wxXmlNode::RemoveChild(wxXmlNode *child) { if (m_children == NULL) @@ -233,8 +216,6 @@ bool wxXmlNode::RemoveChild(wxXmlNode *child) } } - - void wxXmlNode::AddProperty(const wxString& name, const wxString& value) { AddProperty(new wxXmlProperty(name, value, NULL)); @@ -252,8 +233,6 @@ void wxXmlNode::AddProperty(wxXmlProperty *prop) } } - - bool wxXmlNode::DeleteProperty(const wxString& name) { wxXmlProperty *prop; @@ -291,46 +270,33 @@ bool wxXmlNode::DeleteProperty(const wxString& name) +//----------------------------------------------------------------------------- +// wxXmlDocument +//----------------------------------------------------------------------------- - - - - -wxList *wxXmlDocument::sm_handlers = NULL; - - - -wxXmlDocument::wxXmlDocument(const wxString& filename, wxXmlIOType io_type, - const wxString& encoding) +wxXmlDocument::wxXmlDocument(const wxString& filename, const wxString& encoding) : wxObject(), m_root(NULL) { - if (!Load(filename, io_type, encoding)) + if ( !Load(filename, encoding) ) { wxDELETE(m_root); } } - - -wxXmlDocument::wxXmlDocument(wxInputStream& stream, wxXmlIOType io_type, - const wxString& encoding) +wxXmlDocument::wxXmlDocument(wxInputStream& stream, const wxString& encoding) : wxObject(), m_root(NULL) { - if (!Load(stream, io_type, encoding)) + if ( !Load(stream, encoding) ) { wxDELETE(m_root); } } - - wxXmlDocument::wxXmlDocument(const wxXmlDocument& doc) { DoCopy(doc); } - - wxXmlDocument& wxXmlDocument::operator=(const wxXmlDocument& doc) { wxDELETE(m_root); @@ -338,8 +304,6 @@ wxXmlDocument& wxXmlDocument::operator=(const wxXmlDocument& doc) return *this; } - - void wxXmlDocument::DoCopy(const wxXmlDocument& doc) { m_version = doc.m_version; @@ -350,123 +314,398 @@ void wxXmlDocument::DoCopy(const wxXmlDocument& doc) m_root = new wxXmlNode(*doc.m_root); } - - -bool wxXmlDocument::Load(const wxString& filename, wxXmlIOType io_type, - const wxString& encoding) +bool wxXmlDocument::Load(const wxString& filename, const wxString& encoding) { wxFileInputStream stream(filename); - return Load(stream, io_type, encoding); + return Load(stream, encoding); +} + +bool wxXmlDocument::Save(const wxString& filename) const +{ + wxFileOutputStream stream(filename); + return Save(stream); } -bool wxXmlDocument::Load(wxInputStream& stream, wxXmlIOType io_type, - const wxString& encoding) +//----------------------------------------------------------------------------- +// wxXmlDocument loading routines +//----------------------------------------------------------------------------- + +/* + FIXME: + - process all elements, including CDATA + */ + +// converts Expat-produced string in UTF-8 into wxString. +inline static wxString CharToString(wxMBConv *conv, + const char *s, size_t len = wxSTRING_MAXLEN) { #if wxUSE_UNICODE - (void)encoding; + (void)conv; + return wxString(s, wxConvUTF8, len); #else - m_encoding = encoding; -#endif - - wxNode *n = sm_handlers->GetFirst(); - while (n) + if ( conv ) { - wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData(); - - if ((io_type == wxXML_IO_AUTO || io_type == h->GetType()) && - h->CanLoad(stream)) - { - return h->Load(stream, *this, encoding); - } - n = n->GetNext(); + size_t nLen = (len != wxSTRING_MAXLEN) ? len : + nLen = wxConvUTF8.MB2WC((wchar_t*) NULL, s, 0); + + wchar_t *buf = new wchar_t[nLen+1]; + wxConvUTF8.MB2WC(buf, s, nLen); + buf[nLen] = 0; + return wxString(buf, *conv, len); + delete[] buf; } - wxLogError(_("Cannot find XML I/O handler capable of loading this format.")); - return FALSE; + else + return wxString(s, len); +#endif } +struct wxXmlParsingContext +{ + wxMBConv *conv; + wxXmlNode *root; + wxXmlNode *node; + wxXmlNode *lastAsText; + wxString encoding; + wxString version; +}; - -bool wxXmlDocument::Save(const wxString& filename, wxXmlIOType io_type) const +static void StartElementHnd(void *userData, const char *name, const char **atts) { - wxFileOutputStream stream(filename); - return Save(stream, io_type); + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, CharToString(ctx->conv, name)); + const char **a = atts; + while (*a) + { + node->AddProperty(CharToString(ctx->conv, a[0]), CharToString(ctx->conv, a[1])); + a += 2; + } + if (ctx->root == NULL) + ctx->root = node; + else + ctx->node->AddChild(node); + ctx->node = node; + ctx->lastAsText = NULL; } +static void EndElementHnd(void *userData, const char* WXUNUSED(name)) +{ + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + ctx->node = ctx->node->GetParent(); + ctx->lastAsText = NULL; +} -bool wxXmlDocument::Save(wxOutputStream& stream, wxXmlIOType io_type) const +static void TextHnd(void *userData, const char *s, int len) { - wxNode *n = sm_handlers->GetFirst(); - while (n) + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + char *buf = new char[len + 1]; + + buf[len] = '\0'; + memcpy(buf, s, (size_t)len); + + if (ctx->lastAsText) + { + ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + + CharToString(ctx->conv, buf)); + } + else { - wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData(); - if (io_type == h->GetType() && h->CanSave()) + bool whiteOnly = TRUE; + for (char *c = buf; *c != '\0'; c++) + if (*c != ' ' && *c != '\t' && *c != '\n' && *c != '\r') + { + whiteOnly = FALSE; + break; + } + if (!whiteOnly) { - return h->Save(stream, *this); + ctx->lastAsText = new wxXmlNode(wxXML_TEXT_NODE, wxT("text"), + CharToString(ctx->conv, buf)); + ctx->node->AddChild(ctx->lastAsText); } - n = n->GetNext(); } - wxLogError(_("Cannot find XML I/O handler capable of saving in this format.")); - return FALSE; -} - - + delete[] buf; +} +static void CommentHnd(void *userData, const char *data) +{ + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + if (ctx->node) + { + // VS: ctx->node == NULL happens if there is a comment before + // the root element (e.g. wxDesigner's output). We ignore such + // comments, no big deal... + ctx->node->AddChild(new wxXmlNode(wxXML_COMMENT_NODE, + wxT("comment"), CharToString(ctx->conv, data))); + } + ctx->lastAsText = NULL; +} -void wxXmlDocument::AddHandler(wxXmlIOHandler *handler) +static void DefaultHnd(void *userData, const char *s, int len) { - if (sm_handlers == NULL) + // XML header: + if (len > 6 && memcmp(s, "DeleteContents(TRUE); + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + + wxString buf = CharToString(ctx->conv, s, (size_t)len); + int pos; + pos = buf.Find(wxT("encoding=")); + if (pos != wxNOT_FOUND) + ctx->encoding = buf.Mid(pos + 10).BeforeFirst(buf[(size_t)pos+9]); + pos = buf.Find(wxT("version=")); + if (pos != wxNOT_FOUND) + ctx->version = buf.Mid(pos + 9).BeforeFirst(buf[(size_t)pos+8]); } - sm_handlers->Append(handler); } - -void wxXmlDocument::CleanUpHandlers() +static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData), + const XML_Char *name, XML_Encoding *info) { - wxDELETE(sm_handlers); + // 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(name); + char mbBuf[255]; + wchar_t wcBuf[255]; + size_t i; + + for (i = 0; i < 255; i++) + mbBuf[i] = i+1; + mbBuf[255] = 0; + conv.MB2WC(wcBuf, mbBuf, 255); + wcBuf[255] = 0; + + info->map[0] = 0; + for (i = 0; i < 255; i++) + info->map[i+1] = (int)wcBuf[i]; + + info->data = NULL; + info->convert = NULL; + info->release = NULL; + + return 1; } - -void wxXmlDocument::InitStandardHandlers() +bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) { - AddHandler(new wxXmlIOHandlerBin); -#if wxUSE_ZLIB - AddHandler(new wxXmlIOHandlerBinZ); +#if wxUSE_UNICODE + (void)encoding; +#else + m_encoding = encoding; +#endif + + const size_t BUFSIZE = 1024; + char buf[BUFSIZE]; + wxXmlParsingContext ctx; + bool done; + XML_Parser parser = XML_ParserCreate(NULL); + + ctx.root = ctx.node = NULL; + 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") ) + ctx.conv = new wxCSConv(encoding); #endif - AddHandler(new wxXmlIOHandlerExpat); - AddHandler(new wxXmlIOHandlerWriter); + + XML_SetUserData(parser, (void*)&ctx); + XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); + XML_SetCharacterDataHandler(parser, TextHnd); + XML_SetCommentHandler(parser, CommentHnd); + XML_SetDefaultHandler(parser, DefaultHnd); + XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL); + + do + { + size_t len = stream.Read(buf, BUFSIZE).LastRead(); + done = (len < BUFSIZE); + if (!XML_Parse(parser, buf, len, done)) + { + wxLogError(_("XML parsing error: '%s' at line %d"), + XML_ErrorString(XML_GetErrorCode(parser)), + XML_GetCurrentLineNumber(parser)); + return FALSE; + } + } while (!done); + + SetVersion(ctx.version); + SetFileEncoding(ctx.encoding); + SetRoot(ctx.root); + + XML_ParserFree(parser); +#if !wxUSE_UNICODE + if ( ctx.conv ) + delete ctx.conv; +#endif + + return TRUE; + } -#include "wx/module.h" -class wxXmlModule: public wxModule +//----------------------------------------------------------------------------- +// wxXmlDocument saving routines +//----------------------------------------------------------------------------- + +// write string to output: +inline static void OutputString(wxOutputStream& stream, const wxString& str, + wxMBConv *convMem, wxMBConv *convFile) { - DECLARE_DYNAMIC_CLASS(wxXmlModule) - public: - wxXmlModule() {} - bool OnInit() { wxXmlDocument::InitStandardHandlers(); return TRUE; }; - void OnExit() { wxXmlDocument::CleanUpHandlers(); }; -}; + if (str.IsEmpty()) return; +#if wxUSE_UNICODE + const wxW2MBbuf *buf = str.mb_str(convFile ? *convFile : wxConvUTF8); + stream.Write((const char*)buf, strlen((const char*)buf)); +#else + if ( convFile == NULL ) + stream.Write(str.mb_str(), str.Len()); + else + { + wxString str2(str.wc_str(*convMem), *convFile); + stream.Write(str2.mb_str(), str2.Len()); + } +#endif +} -IMPLEMENT_DYNAMIC_CLASS(wxXmlModule, wxModule) +// Same as above, but create entities first. +// Translates '<' to "<", '>' to ">" and '&' to "&" +static void OutputStringEnt(wxOutputStream& stream, const wxString& str, + wxMBConv *convMem, wxMBConv *convFile) +{ + wxString buf; + size_t i, last, len; + wxChar c; + + len = str.Len(); + last = 0; + for (i = 0; i < len; i++) + { + c = str.GetChar(i); + if (c == wxT('<') || c == wxT('>') || + (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;"))) + { + OutputString(stream, str.Mid(last, i - last), convMem, convFile); + switch (c) + { + case wxT('<'): + OutputString(stream, wxT("<"), NULL, NULL); + break; + case wxT('>'): + OutputString(stream, wxT(">"), NULL, NULL); + break; + case wxT('&'): + OutputString(stream, wxT("&"), NULL, NULL); + break; + default: break; + } + last = i + 1; + } + } + OutputString(stream, str.Mid(last, i - last), convMem, convFile); +} +inline static void OutputIndentation(wxOutputStream& stream, int indent) +{ + wxString str = wxT("\n"); + for (int i = 0; i < indent; i++) + str << wxT(' ') << wxT(' '); + OutputString(stream, str, NULL, NULL); +} +static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, + wxMBConv *convMem, wxMBConv *convFile) +{ + wxXmlNode *n, *prev; + wxXmlProperty *prop; + switch (node->GetType()) + { + case wxXML_TEXT_NODE: + OutputStringEnt(stream, node->GetContent(), convMem, convFile); + break; + + case wxXML_ELEMENT_NODE: + OutputString(stream, wxT("<"), NULL, NULL); + OutputString(stream, node->GetName(), NULL, NULL); + + prop = node->GetProperties(); + while (prop) + { + OutputString(stream, wxT(" ") + prop->GetName() + + wxT("=\"") + prop->GetValue() + wxT("\""), + NULL, NULL); + // FIXME - what if prop contains '"'? + prop = prop->GetNext(); + } + + if (node->GetChildren()) + { + OutputString(stream, wxT(">"), NULL, NULL); + prev = NULL; + n = node->GetChildren(); + while (n) + { + if (n && n->GetType() != wxXML_TEXT_NODE) + OutputIndentation(stream, indent + 1); + OutputNode(stream, n, indent + 1, convMem, convFile); + prev = n; + n = n->GetNext(); + } + if (prev && prev->GetType() != wxXML_TEXT_NODE) + OutputIndentation(stream, indent); + OutputString(stream, wxT("GetName(), NULL, NULL); + OutputString(stream, wxT(">"), NULL, NULL); + } + else + OutputString(stream, wxT("/>"), NULL, NULL); + break; + + case wxXML_COMMENT_NODE: + OutputString(stream, wxT(""), NULL, NULL); + break; + + default: + wxFAIL_MSG(wxT("unsupported node type")); + } +} -// When wxXml is loaded dynamically after the application is already running -// then the built-in module system won't pick this one up. Add it manually. -void wxXmlInitXmlModule() +bool wxXmlDocument::Save(wxOutputStream& stream) const { - wxModule* module = new wxXmlModule; - module->Init(); - wxModule::RegisterModule(module); + if ( !IsOk() ) + return FALSE; + + wxString s; + + wxMBConv *convMem = NULL, *convFile = NULL; +#if wxUSE_UNICODE + convFile = new wxCSConv(GetFileEncoding()); +#else + if ( GetFileEncoding() != GetEncoding() ) + { + convFile = new wxCSConv(GetFileEncoding()); + convMem = new wxCSConv(GetEncoding()); + } +#endif + + s.Printf(wxT("\n"), + GetVersion().c_str(), GetFileEncoding().c_str()); + OutputString(stream, s, NULL, NULL); + + OutputNode(stream, GetRoot(), 0, convMem, convFile); + OutputString(stream, wxT("\n"), NULL, NULL); + + if ( convFile ) + delete convFile; + if ( convMem ) + delete convMem; + + return TRUE; } - diff --git a/contrib/src/xrc/xmlbin.cpp b/contrib/src/xrc/xmlbin.cpp deleted file mode 100644 index 730d509590..0000000000 --- a/contrib/src/xrc/xmlbin.cpp +++ /dev/null @@ -1,167 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlbin.cpp -// Purpose: wxXmlIOHandlerBin -// Author: Vaclav Slavik -// Created: 2000/07/24 -// RCS-ID: $Id$ -// Copyright: (c) 2000 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -// nothing, already in xml.cpp -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/datstrm.h" -#include "wx/log.h" -#include "wx/intl.h" - -#include "wx/xrc/xmlio.h" - - - - -bool wxXmlIOHandlerBin::CanLoad(wxInputStream& stream) -{ - bool canread; - canread = (ReadHeader(stream) == wxT("XMLBIN ")); - stream.SeekI(-9, wxFromCurrent); - return canread; -} - - - -wxString wxXmlIOHandlerBin::ReadHeader(wxInputStream& stream) -{ - wxUint8 version; - char cheader[8]; - - stream.Read(cheader, 8); - cheader[7] = 0; - stream.Read(&version, 1); - - if (version != 1) return wxEmptyString; - else return wxString(cheader); -} - - - -void wxXmlIOHandlerBin::WriteHeader(wxOutputStream& stream, const wxString& header) -{ - char cheader[8]; - size_t i; - wxUint8 version = 1; - - for (i = 0; i < header.Length(); i++) cheader[i] = header[i]; - for (; i < 7; i++) cheader[i] = ' '; - cheader[7] = 0; - stream.Write(cheader, 8); - stream.Write(&version, 1); -} - - - -static bool SaveBinNode(wxDataOutputStream& ds, wxXmlNode *node) -{ - if (node) - { - ds << (wxUint8)1 << - (wxUint8)node->GetType() << - node->GetName() << node->GetContent(); - - wxXmlProperty *prop = node->GetProperties(); - while (prop) - { - ds << (wxUint8)1; - ds << prop->GetName() << prop->GetValue(); - prop = prop->GetNext(); - - } - ds << (wxUint8)0; - - SaveBinNode(ds, node->GetNext()); - SaveBinNode(ds, node->GetChildren()); - } - else - ds << (wxUint8)0; - - return TRUE; -} - - - -bool wxXmlIOHandlerBin::Save(wxOutputStream& stream, const wxXmlDocument& doc) -{ - WriteHeader(stream, "XMLBIN "); - wxDataOutputStream ds(stream); - ds << doc.GetVersion(); -#if wxUSE_UNICODE - ds << wxString(wxT("UTF-8")); -#else - ds << doc.GetEncoding(); -#endif - SaveBinNode(ds, doc.GetRoot()); - return stream.LastError() == wxSTREAM_NOERROR; -} - - - -static wxXmlProperty *LoadBinProp(wxDataInputStream& ds) -{ - wxUint8 dummy; - ds >> dummy; - if (dummy == 0) return NULL; - - wxString name, value; - ds >> name >> value; - return new wxXmlProperty(name, value, LoadBinProp(ds)); -} - - - - -static wxXmlNode *LoadBinNode(wxDataInputStream& ds, wxXmlNode *parent) -{ - wxUint8 type; - wxString name, content; - wxUint8 dummy; - - ds >> dummy; - if (dummy == 0) return NULL; - ds >> type >> name >> content; - - wxXmlProperty *prop = LoadBinProp(ds); - - wxXmlNode *nd = new wxXmlNode(parent, (wxXmlNodeType)type, name, content, - prop, LoadBinNode(ds, parent)); - LoadBinNode(ds, nd); - return nd; -} - - - -bool wxXmlIOHandlerBin::Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding) -{ - ReadHeader(stream); - wxDataInputStream ds(stream); - wxString tmp; - - ds >> tmp; - doc.SetVersion(tmp); - ds >> tmp; - doc.SetFileEncoding(tmp); - - doc.SetRoot(LoadBinNode(ds, NULL)); - - return (doc.GetRoot() != NULL); -} - - diff --git a/contrib/src/xrc/xmlbinz.cpp b/contrib/src/xrc/xmlbinz.cpp deleted file mode 100644 index 5520b31161..0000000000 --- a/contrib/src/xrc/xmlbinz.cpp +++ /dev/null @@ -1,60 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlbinz.cpp -// Purpose: wxXmlIOHandlerBinZ -// Author: Vaclav Slavik -// Created: 2000/07/24 -// RCS-ID: $Id$ -// Copyright: (c) 2000 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -// nothing, already in xml.cpp -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/datstrm.h" -#include "wx/log.h" -#include "wx/zstream.h" - -#include "wx/xrc/xmlio.h" - -#if wxUSE_ZLIB - - - -bool wxXmlIOHandlerBinZ::CanLoad(wxInputStream& stream) -{ - bool canread; - canread = (ReadHeader(stream) == wxT("XMLBINZ")); - stream.SeekI(-9, wxFromCurrent); - return canread; -} - - - -bool wxXmlIOHandlerBinZ::Save(wxOutputStream& stream, const wxXmlDocument& doc) -{ - WriteHeader(stream, "XMLBINZ"); - wxZlibOutputStream costr(stream, 9); - return wxXmlIOHandlerBin::Save(costr, doc); -} - - - -bool wxXmlIOHandlerBinZ::Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding) -{ - ReadHeader(stream); - wxZlibInputStream costr(stream); - return wxXmlIOHandlerBin::Load(costr, doc, encoding); -} - - -#endif diff --git a/contrib/src/xrc/xmlexpat.cpp b/contrib/src/xrc/xmlexpat.cpp deleted file mode 100644 index 6d4de6fe39..0000000000 --- a/contrib/src/xrc/xmlexpat.cpp +++ /dev/null @@ -1,251 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlexpat.cpp -// Purpose: wxXmlDocument - XML reader via Expat -// Author: Vaclav Slavik -// Created: 2001/04/30 -// RCS-ID: $Id$ -// Copyright: (c) 2001 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -// nothing - already in xml.cpp -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/wfstream.h" -#include "wx/intl.h" -#include "wx/log.h" -#include "wx/strconv.h" -#include "wx/xrc/xmlio.h" - -#include "xmlparse.h" - -/* - - FIXME: - - process all elements, including CDATA - - */ - - -// converts Expat-produced string in UTF-8 into wxString. -inline static wxString CharToString(wxMBConv *conv, - const char *s, size_t len = wxSTRING_MAXLEN) -{ -#if wxUSE_UNICODE - (void)conv; - return wxString(s, wxConvUTF8, len); -#else - if ( conv ) - { - size_t nLen = (len != wxSTRING_MAXLEN) ? len : - nLen = wxConvUTF8.MB2WC((wchar_t*) NULL, s, 0); - - wchar_t *buf = new wchar_t[nLen+1]; - wxConvUTF8.MB2WC(buf, s, nLen); - buf[nLen] = 0; - return wxString(buf, *conv, len); - delete[] buf; - } - else - return wxString(s, len); -#endif -} - -bool wxXmlIOHandlerExpat::CanLoad(wxInputStream& stream) -{ - char cheader[7]; - cheader[6] = 0; - stream.Read(cheader, 6); - stream.SeekI(-6, wxFromCurrent); - return (strcmp(cheader, "conv, name)); - const char **a = atts; - while (*a) - { - node->AddProperty(CharToString(ctx->conv, a[0]), CharToString(ctx->conv, a[1])); - a += 2; - } - if (ctx->root == NULL) - ctx->root = node; - else - ctx->node->AddChild(node); - ctx->node = node; - ctx->lastAsText = NULL; -} - -static void EndElementHnd(void *userData, const char* WXUNUSED(name)) -{ - wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - - ctx->node = ctx->node->GetParent(); - ctx->lastAsText = NULL; -} - -static void TextHnd(void *userData, const char *s, int len) -{ - wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - char *buf = new char[len + 1]; - - buf[len] = '\0'; - memcpy(buf, s, (size_t)len); - - if (ctx->lastAsText) - { - ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + - CharToString(ctx->conv, buf)); - } - else - { - bool whiteOnly = TRUE; - for (char *c = buf; *c != '\0'; c++) - if (*c != ' ' && *c != '\t' && *c != '\n' && *c != '\r') - { - whiteOnly = FALSE; - break; - } - if (!whiteOnly) - { - ctx->lastAsText = new wxXmlNode(wxXML_TEXT_NODE, wxT("text"), - CharToString(ctx->conv, buf)); - ctx->node->AddChild(ctx->lastAsText); - } - } - - delete[] buf; -} - -static void CommentHnd(void *userData, const char *data) -{ - wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - - if (ctx->node) - { - // VS: ctx->node == NULL happens if there is a comment before - // the root element (e.g. wxDesigner's output). We ignore such - // comments, no big deal... - ctx->node->AddChild(new wxXmlNode(wxXML_COMMENT_NODE, - wxT("comment"), CharToString(ctx->conv, data))); - } - ctx->lastAsText = NULL; -} - -static void DefaultHnd(void *userData, const char *s, int len) -{ - // XML header: - if (len > 6 && memcmp(s, "conv, s, (size_t)len); - int pos; - pos = buf.Find(wxT("encoding=")); - if (pos != wxNOT_FOUND) - ctx->encoding = buf.Mid(pos + 10).BeforeFirst(buf[(size_t)pos+9]); - pos = buf.Find(wxT("version=")); - if (pos != wxNOT_FOUND) - ctx->version = buf.Mid(pos + 9).BeforeFirst(buf[(size_t)pos+8]); - } -} - -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: - wxCSConv conv(name); - char mbBuf[255]; - wchar_t wcBuf[255]; - size_t i; - - for (i = 0; i < 255; i++) - mbBuf[i] = i+1; - mbBuf[255] = 0; - conv.MB2WC(wcBuf, mbBuf, 255); - wcBuf[255] = 0; - - info->map[0] = 0; - for (i = 0; i < 255; i++) - info->map[i+1] = (int)wcBuf[i]; - - info->data = NULL; - info->convert = NULL; - info->release = NULL; - - return 1; -} - -bool wxXmlIOHandlerExpat::Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding) -{ - const size_t BUFSIZE = 1024; - char buf[BUFSIZE]; - wxXmlParsingContext ctx; - bool done; - XML_Parser parser = XML_ParserCreate(NULL); - - ctx.root = ctx.node = NULL; - 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") ) - ctx.conv = new wxCSConv(encoding); -#endif - - XML_SetUserData(parser, (void*)&ctx); - XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); - XML_SetCharacterDataHandler(parser, TextHnd); - XML_SetCommentHandler(parser, CommentHnd); - XML_SetDefaultHandler(parser, DefaultHnd); - XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL); - - do - { - size_t len = stream.Read(buf, BUFSIZE).LastRead(); - done = (len < BUFSIZE); - if (!XML_Parse(parser, buf, len, done)) - { - wxLogError(_("XML parsing error: '%s' at line %d"), - XML_ErrorString(XML_GetErrorCode(parser)), - XML_GetCurrentLineNumber(parser)); - return FALSE; - } - } while (!done); - - doc.SetVersion(ctx.version); - doc.SetFileEncoding(ctx.encoding); - doc.SetRoot(ctx.root); - - XML_ParserFree(parser); -#if !wxUSE_UNICODE - if ( ctx.conv ) - delete ctx.conv; -#endif - - return TRUE; -} diff --git a/contrib/src/xrc/xmlres.cpp b/contrib/src/xrc/xmlres.cpp index ef68779356..bd45b37185 100644 --- a/contrib/src/xrc/xmlres.cpp +++ b/contrib/src/xrc/xmlres.cpp @@ -331,7 +331,7 @@ void wxXmlResource::UpdateResources() delete m_data[i].Doc; m_data[i].Doc = new wxXmlDocument; } - if (!stream || !m_data[i].Doc->Load(*stream, wxXML_IO_AUTO, encoding)) + if (!stream || !m_data[i].Doc->Load(*stream, encoding)) { wxLogError(_("Cannot load resources from file '%s'."), m_data[i].File.c_str()); diff --git a/contrib/src/xrc/xmlwrite.cpp b/contrib/src/xrc/xmlwrite.cpp deleted file mode 100644 index 3b6e3a1047..0000000000 --- a/contrib/src/xrc/xmlwrite.cpp +++ /dev/null @@ -1,184 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlwrite.cpp -// Purpose: wxXmlDocument - XML text writer -// Author: Vaclav Slavik -// Created: 2001/04/30 -// RCS-ID: $Id$ -// Copyright: (c) 2001 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -// nothing - already in xml.cpp -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/wfstream.h" -#include "wx/intl.h" -#include "wx/log.h" -#include "wx/strconv.h" -#include "wx/xrc/xml.h" -#include "wx/xrc/xmlio.h" - -// write string to output: -inline static void OutputString(wxOutputStream& stream, const wxString& str, - wxMBConv *convMem, wxMBConv *convFile) -{ - if (str.IsEmpty()) return; -#if wxUSE_UNICODE - const wxW2MBbuf *buf = str.mb_str(convFile ? *convFile : wxConvUTF8); - stream.Write((const char*)buf, strlen((const char*)buf)); -#else - if ( convFile == NULL ) - stream.Write(str.mb_str(), str.Len()); - else - { - wxString str2(str.wc_str(*convMem), *convFile); - stream.Write(str2.mb_str(), str2.Len()); - } -#endif -} - -// Same as above, but create entities first. -// Translates '<' to "<", '>' to ">" and '&' to "&" -static void OutputStringEnt(wxOutputStream& stream, const wxString& str, - wxMBConv *convMem, wxMBConv *convFile) -{ - wxString buf; - size_t i, last, len; - wxChar c; - - len = str.Len(); - last = 0; - for (i = 0; i < len; i++) - { - c = str.GetChar(i); - if (c == wxT('<') || c == wxT('>') || - (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;"))) - { - OutputString(stream, str.Mid(last, i - last), convMem, convFile); - switch (c) - { - case wxT('<'): - OutputString(stream, wxT("<"), NULL, NULL); - break; - case wxT('>'): - OutputString(stream, wxT(">"), NULL, NULL); - break; - case wxT('&'): - OutputString(stream, wxT("&"), NULL, NULL); - break; - default: break; - } - last = i + 1; - } - } - OutputString(stream, str.Mid(last, i - last), convMem, convFile); -} - -inline static void OutputIndentation(wxOutputStream& stream, int indent) -{ - wxString str = wxT("\n"); - for (int i = 0; i < indent; i++) - str << wxT(' ') << wxT(' '); - OutputString(stream, str, NULL, NULL); -} - -static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, - wxMBConv *convMem, wxMBConv *convFile) -{ - wxXmlNode *n, *prev; - wxXmlProperty *prop; - - switch (node->GetType()) - { - case wxXML_TEXT_NODE: - OutputStringEnt(stream, node->GetContent(), convMem, convFile); - break; - - case wxXML_ELEMENT_NODE: - OutputString(stream, wxT("<"), NULL, NULL); - OutputString(stream, node->GetName(), NULL, NULL); - - prop = node->GetProperties(); - while (prop) - { - OutputString(stream, wxT(" ") + prop->GetName() + - wxT("=\"") + prop->GetValue() + wxT("\""), - NULL, NULL); - // FIXME - what if prop contains '"'? - prop = prop->GetNext(); - } - - if (node->GetChildren()) - { - OutputString(stream, wxT(">"), NULL, NULL); - prev = NULL; - n = node->GetChildren(); - while (n) - { - if (n && n->GetType() != wxXML_TEXT_NODE) - OutputIndentation(stream, indent + 1); - OutputNode(stream, n, indent + 1, convMem, convFile); - prev = n; - n = n->GetNext(); - } - if (prev && prev->GetType() != wxXML_TEXT_NODE) - OutputIndentation(stream, indent); - OutputString(stream, wxT("GetName(), NULL, NULL); - OutputString(stream, wxT(">"), NULL, NULL); - } - else - OutputString(stream, wxT("/>"), NULL, NULL); - break; - - case wxXML_COMMENT_NODE: - OutputString(stream, wxT(""), NULL, NULL); - break; - - default: - wxFAIL_MSG(wxT("unsupported node type")); - } -} - -bool wxXmlIOHandlerWriter::Save(wxOutputStream& stream, const wxXmlDocument& doc) -{ - if (!doc.IsOk()) - return FALSE; - - wxString s; - - wxMBConv *convMem = NULL, *convFile = NULL; -#if wxUSE_UNICODE - convFile = new wxCSConv(doc.GetFileEncoding()); -#else - if ( doc.GetFileEncoding() != doc.GetEncoding() ) - { - convFile = new wxCSConv(doc.GetFileEncoding()); - convMem = new wxCSConv(doc.GetEncoding()); - } -#endif - - s.Printf(wxT("\n"), - doc.GetVersion().c_str(), doc.GetFileEncoding().c_str()); - OutputString(stream, s, NULL, NULL); - - OutputNode(stream, doc.GetRoot(), 0, convMem, convFile); - OutputString(stream, wxT("\n"), NULL, NULL); - - if ( convFile ) - delete convFile; - if ( convMem ) - delete convMem; - - return TRUE; -} diff --git a/contrib/utils/wxrc/wxrc.cpp b/contrib/utils/wxrc/wxrc.cpp index 5ea1c7a477..be9b7b75b5 100644 --- a/contrib/utils/wxrc/wxrc.cpp +++ b/contrib/utils/wxrc/wxrc.cpp @@ -28,7 +28,6 @@ #include "wx/cmdline.h" #include "wx/xrc/xml.h" -#include "wx/xrc/xmlio.h" #include "wx/ffile.h" #include "wx/wfstream.h" @@ -67,7 +66,7 @@ private: wxArrayString FindStrings(); wxArrayString FindStrings(wxXmlNode *node); - bool flagVerbose, flagCPP, flagCompress, flagGettext; + bool flagVerbose, flagCPP, flagGettext; wxString parOutput, parFuncname, parOutputPath; wxArrayString parFiles; int retCode; @@ -86,7 +85,6 @@ int XmlResApp::OnRun() { wxCMD_LINE_SWITCH, "h", "help", "show help message" }, { wxCMD_LINE_SWITCH, "v", "verbose", "be verbose" }, { wxCMD_LINE_SWITCH, "c", "cpp-code", "output C++ source rather than .rsc file" }, - { wxCMD_LINE_SWITCH, "u", "uncompressed", "do not compress .xml files (C++ only)" }, { wxCMD_LINE_SWITCH, "g", "gettext", "output list of translatable strings (to stdout or file if -o used)" }, { wxCMD_LINE_OPTION, "n", "function", "C++ function name (with -c) [InitXmlResource]" }, { wxCMD_LINE_OPTION, "o", "output", "output file [resource.xrs/cpp]" }, @@ -104,8 +102,6 @@ int XmlResApp::OnRun() delete wxLog::SetActiveTarget(new wxLogStderr); #endif - wxXmlDocument::AddHandler(new wxXmlIOHandlerBinZ); - wxCmdLineParser parser(cmdLineDesc, argc, argv); switch (parser.Parse()) @@ -146,7 +142,6 @@ void XmlResApp::ParseParams(const wxCmdLineParser& cmdline) flagGettext = cmdline.Found("g"); flagVerbose = cmdline.Found("v"); flagCPP = cmdline.Found("c"); - flagCompress = flagCPP && !cmdline.Found("u"); if (!cmdline.Found("o", &parOutput)) { @@ -210,9 +205,8 @@ wxArrayString XmlResApp::PrepareTempFiles() FindFilesInXML(doc.GetRoot(), flist, path); - doc.Save(parOutputPath + "/" + name + ".xmlbin", - flagCompress ? wxXML_IO_BINZ : wxXML_IO_BIN); - flist.Add(name + ".xmlbin"); + doc.Save(parOutputPath + "/" + name + ".xrc"); + flist.Add(name + ".xrc"); } return flist; @@ -394,7 +388,7 @@ void " + parFuncname + "()\n\ wxString name, ext, path; wxSplitPath(parFiles[i], &path, &name, &ext); file.Write(" wxXmlResource::Get()->Load(\"memory:xml_resource/" + - name + ".xmlbin" + "\");\n"); + name + ".xrc" + "\");\n"); } file.Write("}\n"); diff --git a/contrib/utils/wxrcedit/editor.cpp b/contrib/utils/wxrcedit/editor.cpp index 201c047d72..affbc9e01b 100644 --- a/contrib/utils/wxrcedit/editor.cpp +++ b/contrib/utils/wxrcedit/editor.cpp @@ -297,7 +297,7 @@ void EditorFrame::LoadFile(const wxString& filename) m_Resource = new wxXmlRcEditDocument; m_Modified = FALSE; - if (!m_Resource->Load(filename, wxXML_IO_AUTO, wxLocale::GetSystemEncodingName())) + if (!m_Resource->Load(filename, wxLocale::GetSystemEncodingName())) { delete m_Resource; m_Resource = NULL; diff --git a/contrib/utils/wxrcedit/preview.cpp b/contrib/utils/wxrcedit/preview.cpp index 9aeb615401..ddf3be2b61 100644 --- a/contrib/utils/wxrcedit/preview.cpp +++ b/contrib/utils/wxrcedit/preview.cpp @@ -154,7 +154,7 @@ void PreviewFrame::Preview(wxXmlNode *node,const wxString &version) if (XmlGetClass(doc.GetRoot()->GetChildren()) == _T("wxDialog")) XmlSetClass(doc.GetRoot()->GetChildren(), _T("wxPanel")); - doc.Save(m_TmpFile, wxXML_IO_BIN); + doc.Save(m_TmpFile); // wxXmlResource will detect change automatically } diff --git a/include/wx/xrc/xml.h b/include/wx/xrc/xml.h index 28037b6925..7d5f4e05a6 100644 --- a/include/wx/xrc/xml.h +++ b/include/wx/xrc/xml.h @@ -54,18 +54,6 @@ enum wxXmlNodeType }; -// Types of XML files: - -enum wxXmlIOType -{ - wxXML_IO_AUTO = 0, // detect it automatically - wxXML_IO_EXPAT, // use Expat to load from text/xml document - wxXML_IO_TEXT_OUTPUT, // generic saver into text/xml - wxXML_IO_BIN, // save in binary uncompressed proprietary format - wxXML_IO_BINZ // svae in binary zlib-compressed proprietary format -}; - - // Represents node property(ies). // Example: in "src" is property with value // "hello.gif" and "id" is prop. with value "3". @@ -178,10 +166,8 @@ class WXXMLDLLEXPORT wxXmlDocument : public wxObject public: wxXmlDocument() : wxObject(), m_version(wxT("1.0")), m_root(NULL) {} wxXmlDocument(const wxString& filename, - wxXmlIOType io_type = wxXML_IO_AUTO, const wxString& encoding = wxT("UTF-8")); wxXmlDocument(wxInputStream& stream, - wxXmlIOType io_type = wxXML_IO_AUTO, const wxString& encoding = wxT("UTF-8")); ~wxXmlDocument() { delete m_root; } @@ -191,17 +177,13 @@ public: // Parses .xml file and loads data. Returns TRUE on success, FALSE // otherwise. bool Load(const wxString& filename, - wxXmlIOType io_type = wxXML_IO_AUTO, const wxString& encoding = wxT("UTF-8")); bool Load(wxInputStream& stream, - wxXmlIOType io_type = wxXML_IO_AUTO, const wxString& encoding = wxT("UTF-8")); // Saves document as .xml file. - bool Save(const wxString& filename, - wxXmlIOType io_type = wxXML_IO_TEXT_OUTPUT) const; - bool Save(wxOutputStream& stream, - wxXmlIOType io_type = wxXML_IO_TEXT_OUTPUT) const; + bool Save(const wxString& filename) const; + bool Save(wxOutputStream& stream) const; bool IsOk() const { return m_root != NULL; } @@ -227,13 +209,6 @@ public: wxString GetEncoding() const { return m_encoding; } #endif - static void AddHandler(wxXmlIOHandler *handler); - static void CleanUpHandlers(); - static void InitStandardHandlers(); - -protected: - static wxList *sm_handlers; - private: wxString m_version; wxString m_fileEncoding; @@ -245,27 +220,4 @@ private: void DoCopy(const wxXmlDocument& doc); }; - - -// wxXmlIOHandler takes care of loading and/or saving XML data. -// see xmlio.h for available handlers - -class WXXMLDLLEXPORT wxXmlIOHandler : public wxObject -{ - public: - wxXmlIOHandler() {} - - virtual wxXmlIOType GetType() = 0; - virtual bool CanLoad(wxInputStream& stream) = 0; - virtual bool CanSave() = 0; - - virtual bool Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding) = 0; - virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc) = 0; -}; - - - -void wxXmlInitXmlModule(); - #endif // _WX_XML_H_ diff --git a/include/wx/xrc/xmlio.h b/include/wx/xrc/xmlio.h deleted file mode 100644 index a4052b6775..0000000000 --- a/include/wx/xrc/xmlio.h +++ /dev/null @@ -1,89 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlio.h -// Purpose: wxXmlIOHandler - XML I/O classes -// Author: Vaclav Slavik -// Created: 2000/07/24 -// RCS-ID: $Id$ -// Copyright: (c) 2000 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifndef _WX_XMLIO_H_ -#define _WX_XMLIO_H_ - -#ifdef __GNUG__ -#pragma interface "xmlio.h" -#endif - -#include "wx/defs.h" -#include "wx/string.h" -#include "wx/xrc/xml.h" - - -class WXXMLDLLEXPORT wxXmlIOHandlerExpat : public wxXmlIOHandler -{ -public: - virtual wxXmlIOType GetType() { return wxXML_IO_EXPAT; } - virtual bool CanLoad(wxInputStream& stream); - virtual bool CanSave() { return FALSE; } - - virtual bool Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding); - virtual bool Save(wxOutputStream& WXUNUSED(stream), const wxXmlDocument& WXUNUSED(doc)) - { return FALSE; } -}; - - -class WXXMLDLLEXPORT wxXmlIOHandlerWriter : public wxXmlIOHandler -{ -public: - virtual wxXmlIOType GetType() { return wxXML_IO_TEXT_OUTPUT; } - virtual bool CanLoad(wxInputStream& WXUNUSED(stream)) { return FALSE; } - virtual bool CanSave() { return TRUE; } - - virtual bool Load(wxInputStream& WXUNUSED(stream), wxXmlDocument& WXUNUSED(doc), - const wxString& WXUNUSED(encoding)) - { return FALSE; } - virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc); -}; - - -class WXXMLDLLEXPORT wxXmlIOHandlerBin : public wxXmlIOHandler -{ -public: - wxXmlIOHandlerBin() {} - - virtual wxXmlIOType GetType() { return wxXML_IO_BIN; } - virtual bool CanLoad(wxInputStream& stream); - virtual bool CanSave() { return TRUE; } - - virtual bool Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding); - virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc); - -protected: - wxString ReadHeader(wxInputStream& stream); - void WriteHeader(wxOutputStream& stream, const wxString& header); -}; - - - -#if wxUSE_ZLIB - -class WXXMLDLLEXPORT wxXmlIOHandlerBinZ : public wxXmlIOHandlerBin -{ -public: - wxXmlIOHandlerBinZ() {} - - virtual wxXmlIOType GetType() { return wxXML_IO_BINZ; } - virtual bool CanLoad(wxInputStream& stream); - - virtual bool Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding); - virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc); -}; - -#endif - - -#endif // _WX_XMLIO_H_ diff --git a/src/xrc/Makefile.in b/src/xrc/Makefile.in index 729c6f1574..f645274010 100644 --- a/src/xrc/Makefile.in +++ b/src/xrc/Makefile.in @@ -27,7 +27,7 @@ HEADERS=xh_all.h xh_bttn.h xh_chckb.h xh_chckl.h xh_choic.h xh_combo.h \ xh_stlin.h xh_bmp.h xh_unkwn.h xh_frame.h xh_gdctl.h OBJECTS=$(EXPAT_OBJECTS) \ - xml.o xmlbin.o xmlbinz.o xmlexpat.o xmlwrite.o xmlres.o xmlrsall.o \ + xml.o xmlres.o xmlrsall.o \ xh_bttn.o xh_chckb.o xh_chckl.o xh_choic.o xh_combo.o xh_dlg.o \ xh_gauge.o xh_html.o xh_menu.o xh_notbk.o xh_panel.o xh_radbt.o \ xh_radbx.o xh_sizer.o xh_slidr.o xh_spin.o xh_stbmp.o xh_sttxt.o \ diff --git a/src/xrc/XrcVC.dsp b/src/xrc/XrcVC.dsp index 79710adb44..44c9ba9a78 100644 --- a/src/xrc/XrcVC.dsp +++ b/src/xrc/XrcVC.dsp @@ -232,27 +232,11 @@ SOURCE=.\xml.cpp # End Source File # Begin Source File -SOURCE=.\xmlbin.cpp -# End Source File -# Begin Source File - -SOURCE=.\xmlbinz.cpp -# End Source File -# Begin Source File - -SOURCE=.\xmlexpat.cpp -# End Source File -# Begin Source File - SOURCE=.\xmlres.cpp # End Source File # Begin Source File SOURCE=.\xmlrsall.cpp # End Source File -# Begin Source File - -SOURCE=.\xmlwrite.cpp -# End Source File # End Target # End Project diff --git a/src/xrc/makefile.b32 b/src/xrc/makefile.b32 index ba854f74e6..dc7d4fa68a 100644 --- a/src/xrc/makefile.b32 +++ b/src/xrc/makefile.b32 @@ -21,7 +21,7 @@ EXTRACPPFLAGS=$(wxLIBXMLDIR) $(EXPAT_DEFS) LIBTARGET=$(WXDIR)\lib\wxxrc.lib OBJECTS=$(EXPAT_OBJECTS) \ - xml.obj xmlbin.obj xmlbinz.obj xmlexpat.obj xmlwrite.obj xmlres.obj xmlrsall.obj \ + xml.obj xmlres.obj xmlrsall.obj \ xh_bttn.obj xh_chckb.obj xh_chckl.obj xh_choic.obj xh_combo.obj xh_dlg.obj \ xh_gauge.obj xh_html.obj xh_menu.obj xh_notbk.obj xh_panel.obj xh_radbt.obj \ xh_radbx.obj xh_sizer.obj xh_slidr.obj xh_spin.obj xh_stbmp.obj xh_sttxt.obj \ diff --git a/src/xrc/makefile.g95 b/src/xrc/makefile.g95 index 2fb8b309a5..8a4bfb322f 100644 --- a/src/xrc/makefile.g95 +++ b/src/xrc/makefile.g95 @@ -22,7 +22,7 @@ XMLTOKDIR_OBJECTS=xmltok.o xmlrole.o LIBTARGET=$(WXDIR)/lib/libwxxrc.a OBJECTS= $(XMLPARSEDIR_OBJECTS) $(XMLTOKDIR_OBJECTS) \ - xml.o xmlbin.o xmlbinz.o xmlexpat.o xmlwrite.o xmlres.o xmlrsall.o \ + xml.o xmlres.o xmlrsall.o \ xh_bttn.o xh_chckb.o xh_chckl.o xh_choic.o xh_combo.o xh_dlg.o \ xh_gauge.o xh_html.o xh_menu.o xh_notbk.o xh_panel.o xh_radbt.o \ xh_radbx.o xh_sizer.o xh_slidr.o xh_spin.o xh_stbmp.o xh_sttxt.o \ diff --git a/src/xrc/makefile.vc b/src/xrc/makefile.vc index 841ac2d4cd..ff40bb5fcb 100644 --- a/src/xrc/makefile.vc +++ b/src/xrc/makefile.vc @@ -47,7 +47,7 @@ LIBTARGET=$(WXDIR)\lib\wxxrc$(LIBEXT).lib EXTRATARGETS=$(D) OBJECTS=$(EXPAT_OBJS) \ - $(D)\xml.obj $(D)\xmlbin.obj $(D)\xmlbinz.obj $(D)\xmlres.obj \ + $(D)\xml.obj \ $(D)\xmlrsall.obj $(D)\xh_bttn.obj $(D)\xh_chckb.obj $(D)\xh_chckl.obj \ $(D)\xh_choic.obj $(D)\xh_combo.obj $(D)\xh_dlg.obj \ $(D)\xh_frame.obj $(D)\xh_gauge.obj $(D)\xh_html.obj $(D)\xh_menu.obj \ @@ -57,7 +57,7 @@ OBJECTS=$(EXPAT_OBJS) \ $(D)\xh_text.obj $(D)\xh_listb.obj $(D)\xh_toolb.obj \ $(D)\xh_bmpbt.obj $(D)\xh_cald.obj $(D)\xh_listc.obj $(D)\xh_scrol.obj \ $(D)\xh_stbox.obj $(D)\xh_tree.obj $(D)\xh_stlin.obj $(D)\xh_bmp.obj \ - $(D)\xh_unkwn.obj $(D)\xmlwrite.obj $(D)\xmlexpat.obj + $(D)\xh_unkwn.obj !include $(WXDIR)\src\makelib.vc diff --git a/src/xrc/makefile.wat b/src/xrc/makefile.wat index be5d104e3f..43cfc46647 100644 --- a/src/xrc/makefile.wat +++ b/src/xrc/makefile.wat @@ -12,7 +12,7 @@ THISDIR = $(WXDIR)\contrib\src\xrc NAME = wxxrc LNK = $(name).lnk -OBJECTS=xml.obj xmlbin.obj xmlbinz.obj xmlpars.obj xmlres.obj xmlrsall.obj & +OBJECTS=xml.obj xmlres.obj xmlrsall.obj & xh_bttn.obj xh_chckb.obj xh_chckl.obj xh_choic.obj xh_combo.obj xh_dlg.obj & xh_gauge.obj xh_html.obj xh_menu.obj xh_notbk.obj xh_panel.obj xh_radbt.obj & xh_radbx.obj xh_sizer.obj xh_slidr.obj xh_spin.obj xh_stbmp.obj xh_sttxt.obj & diff --git a/src/xrc/xml.cpp b/src/xrc/xml.cpp index cf0f9630bf..692a39f0bc 100644 --- a/src/xrc/xml.cpp +++ b/src/xrc/xml.cpp @@ -26,11 +26,15 @@ #include "wx/zstream.h" #include "wx/log.h" #include "wx/intl.h" +#include "wx/strconv.h" #include "wx/xrc/xml.h" -#include "wx/xrc/xmlio.h" +#include "xmlparse.h" // from Expat +//----------------------------------------------------------------------------- +// wxXmlNode +//----------------------------------------------------------------------------- wxXmlNode::wxXmlNode(wxXmlNode *parent,wxXmlNodeType type, const wxString& name, const wxString& content, @@ -51,8 +55,6 @@ wxXmlNode::wxXmlNode(wxXmlNode *parent,wxXmlNodeType type, } } - - wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name, const wxString& content) : m_type(type), m_name(name), m_content(content), @@ -60,8 +62,6 @@ wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name, m_children(NULL), m_next(NULL) {} - - wxXmlNode::wxXmlNode(const wxXmlNode& node) { m_next = NULL; @@ -69,8 +69,6 @@ wxXmlNode::wxXmlNode(const wxXmlNode& node) DoCopy(node); } - - wxXmlNode::~wxXmlNode() { wxXmlNode *c, *c2; @@ -88,8 +86,6 @@ wxXmlNode::~wxXmlNode() } } - - wxXmlNode& wxXmlNode::operator=(const wxXmlNode& node) { wxDELETE(m_properties); @@ -98,8 +94,6 @@ wxXmlNode& wxXmlNode::operator=(const wxXmlNode& node) return *this; } - - void wxXmlNode::DoCopy(const wxXmlNode& node) { m_type = node.m_type; @@ -123,7 +117,6 @@ void wxXmlNode::DoCopy(const wxXmlNode& node) } } - bool wxXmlNode::HasProp(const wxString& propName) const { wxXmlProperty *prop = GetProperties(); @@ -137,8 +130,6 @@ bool wxXmlNode::HasProp(const wxString& propName) const return FALSE; } - - bool wxXmlNode::GetPropVal(const wxString& propName, wxString *value) const { wxXmlProperty *prop = GetProperties(); @@ -156,8 +147,6 @@ bool wxXmlNode::GetPropVal(const wxString& propName, wxString *value) const return FALSE; } - - wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& defaultVal) const { wxString tmp; @@ -167,8 +156,6 @@ wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& default return defaultVal; } - - void wxXmlNode::AddChild(wxXmlNode *child) { if (m_children == NULL) @@ -183,8 +170,6 @@ void wxXmlNode::AddChild(wxXmlNode *child) child->m_parent = this; } - - void wxXmlNode::InsertChild(wxXmlNode *child, wxXmlNode *before_node) { wxASSERT_MSG(before_node->GetParent() == this, wxT("wxXmlNode::InsertChild - the node has incorrect parent")); @@ -202,8 +187,6 @@ void wxXmlNode::InsertChild(wxXmlNode *child, wxXmlNode *before_node) child->m_next = before_node; } - - bool wxXmlNode::RemoveChild(wxXmlNode *child) { if (m_children == NULL) @@ -233,8 +216,6 @@ bool wxXmlNode::RemoveChild(wxXmlNode *child) } } - - void wxXmlNode::AddProperty(const wxString& name, const wxString& value) { AddProperty(new wxXmlProperty(name, value, NULL)); @@ -252,8 +233,6 @@ void wxXmlNode::AddProperty(wxXmlProperty *prop) } } - - bool wxXmlNode::DeleteProperty(const wxString& name) { wxXmlProperty *prop; @@ -291,46 +270,33 @@ bool wxXmlNode::DeleteProperty(const wxString& name) +//----------------------------------------------------------------------------- +// wxXmlDocument +//----------------------------------------------------------------------------- - - - - -wxList *wxXmlDocument::sm_handlers = NULL; - - - -wxXmlDocument::wxXmlDocument(const wxString& filename, wxXmlIOType io_type, - const wxString& encoding) +wxXmlDocument::wxXmlDocument(const wxString& filename, const wxString& encoding) : wxObject(), m_root(NULL) { - if (!Load(filename, io_type, encoding)) + if ( !Load(filename, encoding) ) { wxDELETE(m_root); } } - - -wxXmlDocument::wxXmlDocument(wxInputStream& stream, wxXmlIOType io_type, - const wxString& encoding) +wxXmlDocument::wxXmlDocument(wxInputStream& stream, const wxString& encoding) : wxObject(), m_root(NULL) { - if (!Load(stream, io_type, encoding)) + if ( !Load(stream, encoding) ) { wxDELETE(m_root); } } - - wxXmlDocument::wxXmlDocument(const wxXmlDocument& doc) { DoCopy(doc); } - - wxXmlDocument& wxXmlDocument::operator=(const wxXmlDocument& doc) { wxDELETE(m_root); @@ -338,8 +304,6 @@ wxXmlDocument& wxXmlDocument::operator=(const wxXmlDocument& doc) return *this; } - - void wxXmlDocument::DoCopy(const wxXmlDocument& doc) { m_version = doc.m_version; @@ -350,123 +314,398 @@ void wxXmlDocument::DoCopy(const wxXmlDocument& doc) m_root = new wxXmlNode(*doc.m_root); } - - -bool wxXmlDocument::Load(const wxString& filename, wxXmlIOType io_type, - const wxString& encoding) +bool wxXmlDocument::Load(const wxString& filename, const wxString& encoding) { wxFileInputStream stream(filename); - return Load(stream, io_type, encoding); + return Load(stream, encoding); +} + +bool wxXmlDocument::Save(const wxString& filename) const +{ + wxFileOutputStream stream(filename); + return Save(stream); } -bool wxXmlDocument::Load(wxInputStream& stream, wxXmlIOType io_type, - const wxString& encoding) +//----------------------------------------------------------------------------- +// wxXmlDocument loading routines +//----------------------------------------------------------------------------- + +/* + FIXME: + - process all elements, including CDATA + */ + +// converts Expat-produced string in UTF-8 into wxString. +inline static wxString CharToString(wxMBConv *conv, + const char *s, size_t len = wxSTRING_MAXLEN) { #if wxUSE_UNICODE - (void)encoding; + (void)conv; + return wxString(s, wxConvUTF8, len); #else - m_encoding = encoding; -#endif - - wxNode *n = sm_handlers->GetFirst(); - while (n) + if ( conv ) { - wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData(); - - if ((io_type == wxXML_IO_AUTO || io_type == h->GetType()) && - h->CanLoad(stream)) - { - return h->Load(stream, *this, encoding); - } - n = n->GetNext(); + size_t nLen = (len != wxSTRING_MAXLEN) ? len : + nLen = wxConvUTF8.MB2WC((wchar_t*) NULL, s, 0); + + wchar_t *buf = new wchar_t[nLen+1]; + wxConvUTF8.MB2WC(buf, s, nLen); + buf[nLen] = 0; + return wxString(buf, *conv, len); + delete[] buf; } - wxLogError(_("Cannot find XML I/O handler capable of loading this format.")); - return FALSE; + else + return wxString(s, len); +#endif } +struct wxXmlParsingContext +{ + wxMBConv *conv; + wxXmlNode *root; + wxXmlNode *node; + wxXmlNode *lastAsText; + wxString encoding; + wxString version; +}; - -bool wxXmlDocument::Save(const wxString& filename, wxXmlIOType io_type) const +static void StartElementHnd(void *userData, const char *name, const char **atts) { - wxFileOutputStream stream(filename); - return Save(stream, io_type); + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, CharToString(ctx->conv, name)); + const char **a = atts; + while (*a) + { + node->AddProperty(CharToString(ctx->conv, a[0]), CharToString(ctx->conv, a[1])); + a += 2; + } + if (ctx->root == NULL) + ctx->root = node; + else + ctx->node->AddChild(node); + ctx->node = node; + ctx->lastAsText = NULL; } +static void EndElementHnd(void *userData, const char* WXUNUSED(name)) +{ + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + ctx->node = ctx->node->GetParent(); + ctx->lastAsText = NULL; +} -bool wxXmlDocument::Save(wxOutputStream& stream, wxXmlIOType io_type) const +static void TextHnd(void *userData, const char *s, int len) { - wxNode *n = sm_handlers->GetFirst(); - while (n) + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + char *buf = new char[len + 1]; + + buf[len] = '\0'; + memcpy(buf, s, (size_t)len); + + if (ctx->lastAsText) + { + ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + + CharToString(ctx->conv, buf)); + } + else { - wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData(); - if (io_type == h->GetType() && h->CanSave()) + bool whiteOnly = TRUE; + for (char *c = buf; *c != '\0'; c++) + if (*c != ' ' && *c != '\t' && *c != '\n' && *c != '\r') + { + whiteOnly = FALSE; + break; + } + if (!whiteOnly) { - return h->Save(stream, *this); + ctx->lastAsText = new wxXmlNode(wxXML_TEXT_NODE, wxT("text"), + CharToString(ctx->conv, buf)); + ctx->node->AddChild(ctx->lastAsText); } - n = n->GetNext(); } - wxLogError(_("Cannot find XML I/O handler capable of saving in this format.")); - return FALSE; -} - - + delete[] buf; +} +static void CommentHnd(void *userData, const char *data) +{ + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + if (ctx->node) + { + // VS: ctx->node == NULL happens if there is a comment before + // the root element (e.g. wxDesigner's output). We ignore such + // comments, no big deal... + ctx->node->AddChild(new wxXmlNode(wxXML_COMMENT_NODE, + wxT("comment"), CharToString(ctx->conv, data))); + } + ctx->lastAsText = NULL; +} -void wxXmlDocument::AddHandler(wxXmlIOHandler *handler) +static void DefaultHnd(void *userData, const char *s, int len) { - if (sm_handlers == NULL) + // XML header: + if (len > 6 && memcmp(s, "DeleteContents(TRUE); + wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; + + wxString buf = CharToString(ctx->conv, s, (size_t)len); + int pos; + pos = buf.Find(wxT("encoding=")); + if (pos != wxNOT_FOUND) + ctx->encoding = buf.Mid(pos + 10).BeforeFirst(buf[(size_t)pos+9]); + pos = buf.Find(wxT("version=")); + if (pos != wxNOT_FOUND) + ctx->version = buf.Mid(pos + 9).BeforeFirst(buf[(size_t)pos+8]); } - sm_handlers->Append(handler); } - -void wxXmlDocument::CleanUpHandlers() +static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData), + const XML_Char *name, XML_Encoding *info) { - wxDELETE(sm_handlers); + // 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(name); + char mbBuf[255]; + wchar_t wcBuf[255]; + size_t i; + + for (i = 0; i < 255; i++) + mbBuf[i] = i+1; + mbBuf[255] = 0; + conv.MB2WC(wcBuf, mbBuf, 255); + wcBuf[255] = 0; + + info->map[0] = 0; + for (i = 0; i < 255; i++) + info->map[i+1] = (int)wcBuf[i]; + + info->data = NULL; + info->convert = NULL; + info->release = NULL; + + return 1; } - -void wxXmlDocument::InitStandardHandlers() +bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding) { - AddHandler(new wxXmlIOHandlerBin); -#if wxUSE_ZLIB - AddHandler(new wxXmlIOHandlerBinZ); +#if wxUSE_UNICODE + (void)encoding; +#else + m_encoding = encoding; +#endif + + const size_t BUFSIZE = 1024; + char buf[BUFSIZE]; + wxXmlParsingContext ctx; + bool done; + XML_Parser parser = XML_ParserCreate(NULL); + + ctx.root = ctx.node = NULL; + 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") ) + ctx.conv = new wxCSConv(encoding); #endif - AddHandler(new wxXmlIOHandlerExpat); - AddHandler(new wxXmlIOHandlerWriter); + + XML_SetUserData(parser, (void*)&ctx); + XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); + XML_SetCharacterDataHandler(parser, TextHnd); + XML_SetCommentHandler(parser, CommentHnd); + XML_SetDefaultHandler(parser, DefaultHnd); + XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL); + + do + { + size_t len = stream.Read(buf, BUFSIZE).LastRead(); + done = (len < BUFSIZE); + if (!XML_Parse(parser, buf, len, done)) + { + wxLogError(_("XML parsing error: '%s' at line %d"), + XML_ErrorString(XML_GetErrorCode(parser)), + XML_GetCurrentLineNumber(parser)); + return FALSE; + } + } while (!done); + + SetVersion(ctx.version); + SetFileEncoding(ctx.encoding); + SetRoot(ctx.root); + + XML_ParserFree(parser); +#if !wxUSE_UNICODE + if ( ctx.conv ) + delete ctx.conv; +#endif + + return TRUE; + } -#include "wx/module.h" -class wxXmlModule: public wxModule +//----------------------------------------------------------------------------- +// wxXmlDocument saving routines +//----------------------------------------------------------------------------- + +// write string to output: +inline static void OutputString(wxOutputStream& stream, const wxString& str, + wxMBConv *convMem, wxMBConv *convFile) { - DECLARE_DYNAMIC_CLASS(wxXmlModule) - public: - wxXmlModule() {} - bool OnInit() { wxXmlDocument::InitStandardHandlers(); return TRUE; }; - void OnExit() { wxXmlDocument::CleanUpHandlers(); }; -}; + if (str.IsEmpty()) return; +#if wxUSE_UNICODE + const wxW2MBbuf *buf = str.mb_str(convFile ? *convFile : wxConvUTF8); + stream.Write((const char*)buf, strlen((const char*)buf)); +#else + if ( convFile == NULL ) + stream.Write(str.mb_str(), str.Len()); + else + { + wxString str2(str.wc_str(*convMem), *convFile); + stream.Write(str2.mb_str(), str2.Len()); + } +#endif +} -IMPLEMENT_DYNAMIC_CLASS(wxXmlModule, wxModule) +// Same as above, but create entities first. +// Translates '<' to "<", '>' to ">" and '&' to "&" +static void OutputStringEnt(wxOutputStream& stream, const wxString& str, + wxMBConv *convMem, wxMBConv *convFile) +{ + wxString buf; + size_t i, last, len; + wxChar c; + + len = str.Len(); + last = 0; + for (i = 0; i < len; i++) + { + c = str.GetChar(i); + if (c == wxT('<') || c == wxT('>') || + (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;"))) + { + OutputString(stream, str.Mid(last, i - last), convMem, convFile); + switch (c) + { + case wxT('<'): + OutputString(stream, wxT("<"), NULL, NULL); + break; + case wxT('>'): + OutputString(stream, wxT(">"), NULL, NULL); + break; + case wxT('&'): + OutputString(stream, wxT("&"), NULL, NULL); + break; + default: break; + } + last = i + 1; + } + } + OutputString(stream, str.Mid(last, i - last), convMem, convFile); +} +inline static void OutputIndentation(wxOutputStream& stream, int indent) +{ + wxString str = wxT("\n"); + for (int i = 0; i < indent; i++) + str << wxT(' ') << wxT(' '); + OutputString(stream, str, NULL, NULL); +} +static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, + wxMBConv *convMem, wxMBConv *convFile) +{ + wxXmlNode *n, *prev; + wxXmlProperty *prop; + switch (node->GetType()) + { + case wxXML_TEXT_NODE: + OutputStringEnt(stream, node->GetContent(), convMem, convFile); + break; + + case wxXML_ELEMENT_NODE: + OutputString(stream, wxT("<"), NULL, NULL); + OutputString(stream, node->GetName(), NULL, NULL); + + prop = node->GetProperties(); + while (prop) + { + OutputString(stream, wxT(" ") + prop->GetName() + + wxT("=\"") + prop->GetValue() + wxT("\""), + NULL, NULL); + // FIXME - what if prop contains '"'? + prop = prop->GetNext(); + } + + if (node->GetChildren()) + { + OutputString(stream, wxT(">"), NULL, NULL); + prev = NULL; + n = node->GetChildren(); + while (n) + { + if (n && n->GetType() != wxXML_TEXT_NODE) + OutputIndentation(stream, indent + 1); + OutputNode(stream, n, indent + 1, convMem, convFile); + prev = n; + n = n->GetNext(); + } + if (prev && prev->GetType() != wxXML_TEXT_NODE) + OutputIndentation(stream, indent); + OutputString(stream, wxT("GetName(), NULL, NULL); + OutputString(stream, wxT(">"), NULL, NULL); + } + else + OutputString(stream, wxT("/>"), NULL, NULL); + break; + + case wxXML_COMMENT_NODE: + OutputString(stream, wxT(""), NULL, NULL); + break; + + default: + wxFAIL_MSG(wxT("unsupported node type")); + } +} -// When wxXml is loaded dynamically after the application is already running -// then the built-in module system won't pick this one up. Add it manually. -void wxXmlInitXmlModule() +bool wxXmlDocument::Save(wxOutputStream& stream) const { - wxModule* module = new wxXmlModule; - module->Init(); - wxModule::RegisterModule(module); + if ( !IsOk() ) + return FALSE; + + wxString s; + + wxMBConv *convMem = NULL, *convFile = NULL; +#if wxUSE_UNICODE + convFile = new wxCSConv(GetFileEncoding()); +#else + if ( GetFileEncoding() != GetEncoding() ) + { + convFile = new wxCSConv(GetFileEncoding()); + convMem = new wxCSConv(GetEncoding()); + } +#endif + + s.Printf(wxT("\n"), + GetVersion().c_str(), GetFileEncoding().c_str()); + OutputString(stream, s, NULL, NULL); + + OutputNode(stream, GetRoot(), 0, convMem, convFile); + OutputString(stream, wxT("\n"), NULL, NULL); + + if ( convFile ) + delete convFile; + if ( convMem ) + delete convMem; + + return TRUE; } - diff --git a/src/xrc/xmlbin.cpp b/src/xrc/xmlbin.cpp deleted file mode 100644 index 730d509590..0000000000 --- a/src/xrc/xmlbin.cpp +++ /dev/null @@ -1,167 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlbin.cpp -// Purpose: wxXmlIOHandlerBin -// Author: Vaclav Slavik -// Created: 2000/07/24 -// RCS-ID: $Id$ -// Copyright: (c) 2000 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -// nothing, already in xml.cpp -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/datstrm.h" -#include "wx/log.h" -#include "wx/intl.h" - -#include "wx/xrc/xmlio.h" - - - - -bool wxXmlIOHandlerBin::CanLoad(wxInputStream& stream) -{ - bool canread; - canread = (ReadHeader(stream) == wxT("XMLBIN ")); - stream.SeekI(-9, wxFromCurrent); - return canread; -} - - - -wxString wxXmlIOHandlerBin::ReadHeader(wxInputStream& stream) -{ - wxUint8 version; - char cheader[8]; - - stream.Read(cheader, 8); - cheader[7] = 0; - stream.Read(&version, 1); - - if (version != 1) return wxEmptyString; - else return wxString(cheader); -} - - - -void wxXmlIOHandlerBin::WriteHeader(wxOutputStream& stream, const wxString& header) -{ - char cheader[8]; - size_t i; - wxUint8 version = 1; - - for (i = 0; i < header.Length(); i++) cheader[i] = header[i]; - for (; i < 7; i++) cheader[i] = ' '; - cheader[7] = 0; - stream.Write(cheader, 8); - stream.Write(&version, 1); -} - - - -static bool SaveBinNode(wxDataOutputStream& ds, wxXmlNode *node) -{ - if (node) - { - ds << (wxUint8)1 << - (wxUint8)node->GetType() << - node->GetName() << node->GetContent(); - - wxXmlProperty *prop = node->GetProperties(); - while (prop) - { - ds << (wxUint8)1; - ds << prop->GetName() << prop->GetValue(); - prop = prop->GetNext(); - - } - ds << (wxUint8)0; - - SaveBinNode(ds, node->GetNext()); - SaveBinNode(ds, node->GetChildren()); - } - else - ds << (wxUint8)0; - - return TRUE; -} - - - -bool wxXmlIOHandlerBin::Save(wxOutputStream& stream, const wxXmlDocument& doc) -{ - WriteHeader(stream, "XMLBIN "); - wxDataOutputStream ds(stream); - ds << doc.GetVersion(); -#if wxUSE_UNICODE - ds << wxString(wxT("UTF-8")); -#else - ds << doc.GetEncoding(); -#endif - SaveBinNode(ds, doc.GetRoot()); - return stream.LastError() == wxSTREAM_NOERROR; -} - - - -static wxXmlProperty *LoadBinProp(wxDataInputStream& ds) -{ - wxUint8 dummy; - ds >> dummy; - if (dummy == 0) return NULL; - - wxString name, value; - ds >> name >> value; - return new wxXmlProperty(name, value, LoadBinProp(ds)); -} - - - - -static wxXmlNode *LoadBinNode(wxDataInputStream& ds, wxXmlNode *parent) -{ - wxUint8 type; - wxString name, content; - wxUint8 dummy; - - ds >> dummy; - if (dummy == 0) return NULL; - ds >> type >> name >> content; - - wxXmlProperty *prop = LoadBinProp(ds); - - wxXmlNode *nd = new wxXmlNode(parent, (wxXmlNodeType)type, name, content, - prop, LoadBinNode(ds, parent)); - LoadBinNode(ds, nd); - return nd; -} - - - -bool wxXmlIOHandlerBin::Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding) -{ - ReadHeader(stream); - wxDataInputStream ds(stream); - wxString tmp; - - ds >> tmp; - doc.SetVersion(tmp); - ds >> tmp; - doc.SetFileEncoding(tmp); - - doc.SetRoot(LoadBinNode(ds, NULL)); - - return (doc.GetRoot() != NULL); -} - - diff --git a/src/xrc/xmlbinz.cpp b/src/xrc/xmlbinz.cpp deleted file mode 100644 index 5520b31161..0000000000 --- a/src/xrc/xmlbinz.cpp +++ /dev/null @@ -1,60 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlbinz.cpp -// Purpose: wxXmlIOHandlerBinZ -// Author: Vaclav Slavik -// Created: 2000/07/24 -// RCS-ID: $Id$ -// Copyright: (c) 2000 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -// nothing, already in xml.cpp -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/datstrm.h" -#include "wx/log.h" -#include "wx/zstream.h" - -#include "wx/xrc/xmlio.h" - -#if wxUSE_ZLIB - - - -bool wxXmlIOHandlerBinZ::CanLoad(wxInputStream& stream) -{ - bool canread; - canread = (ReadHeader(stream) == wxT("XMLBINZ")); - stream.SeekI(-9, wxFromCurrent); - return canread; -} - - - -bool wxXmlIOHandlerBinZ::Save(wxOutputStream& stream, const wxXmlDocument& doc) -{ - WriteHeader(stream, "XMLBINZ"); - wxZlibOutputStream costr(stream, 9); - return wxXmlIOHandlerBin::Save(costr, doc); -} - - - -bool wxXmlIOHandlerBinZ::Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding) -{ - ReadHeader(stream); - wxZlibInputStream costr(stream); - return wxXmlIOHandlerBin::Load(costr, doc, encoding); -} - - -#endif diff --git a/src/xrc/xmlexpat.cpp b/src/xrc/xmlexpat.cpp deleted file mode 100644 index 6d4de6fe39..0000000000 --- a/src/xrc/xmlexpat.cpp +++ /dev/null @@ -1,251 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlexpat.cpp -// Purpose: wxXmlDocument - XML reader via Expat -// Author: Vaclav Slavik -// Created: 2001/04/30 -// RCS-ID: $Id$ -// Copyright: (c) 2001 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -// nothing - already in xml.cpp -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/wfstream.h" -#include "wx/intl.h" -#include "wx/log.h" -#include "wx/strconv.h" -#include "wx/xrc/xmlio.h" - -#include "xmlparse.h" - -/* - - FIXME: - - process all elements, including CDATA - - */ - - -// converts Expat-produced string in UTF-8 into wxString. -inline static wxString CharToString(wxMBConv *conv, - const char *s, size_t len = wxSTRING_MAXLEN) -{ -#if wxUSE_UNICODE - (void)conv; - return wxString(s, wxConvUTF8, len); -#else - if ( conv ) - { - size_t nLen = (len != wxSTRING_MAXLEN) ? len : - nLen = wxConvUTF8.MB2WC((wchar_t*) NULL, s, 0); - - wchar_t *buf = new wchar_t[nLen+1]; - wxConvUTF8.MB2WC(buf, s, nLen); - buf[nLen] = 0; - return wxString(buf, *conv, len); - delete[] buf; - } - else - return wxString(s, len); -#endif -} - -bool wxXmlIOHandlerExpat::CanLoad(wxInputStream& stream) -{ - char cheader[7]; - cheader[6] = 0; - stream.Read(cheader, 6); - stream.SeekI(-6, wxFromCurrent); - return (strcmp(cheader, "conv, name)); - const char **a = atts; - while (*a) - { - node->AddProperty(CharToString(ctx->conv, a[0]), CharToString(ctx->conv, a[1])); - a += 2; - } - if (ctx->root == NULL) - ctx->root = node; - else - ctx->node->AddChild(node); - ctx->node = node; - ctx->lastAsText = NULL; -} - -static void EndElementHnd(void *userData, const char* WXUNUSED(name)) -{ - wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - - ctx->node = ctx->node->GetParent(); - ctx->lastAsText = NULL; -} - -static void TextHnd(void *userData, const char *s, int len) -{ - wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - char *buf = new char[len + 1]; - - buf[len] = '\0'; - memcpy(buf, s, (size_t)len); - - if (ctx->lastAsText) - { - ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + - CharToString(ctx->conv, buf)); - } - else - { - bool whiteOnly = TRUE; - for (char *c = buf; *c != '\0'; c++) - if (*c != ' ' && *c != '\t' && *c != '\n' && *c != '\r') - { - whiteOnly = FALSE; - break; - } - if (!whiteOnly) - { - ctx->lastAsText = new wxXmlNode(wxXML_TEXT_NODE, wxT("text"), - CharToString(ctx->conv, buf)); - ctx->node->AddChild(ctx->lastAsText); - } - } - - delete[] buf; -} - -static void CommentHnd(void *userData, const char *data) -{ - wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; - - if (ctx->node) - { - // VS: ctx->node == NULL happens if there is a comment before - // the root element (e.g. wxDesigner's output). We ignore such - // comments, no big deal... - ctx->node->AddChild(new wxXmlNode(wxXML_COMMENT_NODE, - wxT("comment"), CharToString(ctx->conv, data))); - } - ctx->lastAsText = NULL; -} - -static void DefaultHnd(void *userData, const char *s, int len) -{ - // XML header: - if (len > 6 && memcmp(s, "conv, s, (size_t)len); - int pos; - pos = buf.Find(wxT("encoding=")); - if (pos != wxNOT_FOUND) - ctx->encoding = buf.Mid(pos + 10).BeforeFirst(buf[(size_t)pos+9]); - pos = buf.Find(wxT("version=")); - if (pos != wxNOT_FOUND) - ctx->version = buf.Mid(pos + 9).BeforeFirst(buf[(size_t)pos+8]); - } -} - -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: - wxCSConv conv(name); - char mbBuf[255]; - wchar_t wcBuf[255]; - size_t i; - - for (i = 0; i < 255; i++) - mbBuf[i] = i+1; - mbBuf[255] = 0; - conv.MB2WC(wcBuf, mbBuf, 255); - wcBuf[255] = 0; - - info->map[0] = 0; - for (i = 0; i < 255; i++) - info->map[i+1] = (int)wcBuf[i]; - - info->data = NULL; - info->convert = NULL; - info->release = NULL; - - return 1; -} - -bool wxXmlIOHandlerExpat::Load(wxInputStream& stream, wxXmlDocument& doc, - const wxString& encoding) -{ - const size_t BUFSIZE = 1024; - char buf[BUFSIZE]; - wxXmlParsingContext ctx; - bool done; - XML_Parser parser = XML_ParserCreate(NULL); - - ctx.root = ctx.node = NULL; - 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") ) - ctx.conv = new wxCSConv(encoding); -#endif - - XML_SetUserData(parser, (void*)&ctx); - XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); - XML_SetCharacterDataHandler(parser, TextHnd); - XML_SetCommentHandler(parser, CommentHnd); - XML_SetDefaultHandler(parser, DefaultHnd); - XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL); - - do - { - size_t len = stream.Read(buf, BUFSIZE).LastRead(); - done = (len < BUFSIZE); - if (!XML_Parse(parser, buf, len, done)) - { - wxLogError(_("XML parsing error: '%s' at line %d"), - XML_ErrorString(XML_GetErrorCode(parser)), - XML_GetCurrentLineNumber(parser)); - return FALSE; - } - } while (!done); - - doc.SetVersion(ctx.version); - doc.SetFileEncoding(ctx.encoding); - doc.SetRoot(ctx.root); - - XML_ParserFree(parser); -#if !wxUSE_UNICODE - if ( ctx.conv ) - delete ctx.conv; -#endif - - return TRUE; -} diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index ef68779356..bd45b37185 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -331,7 +331,7 @@ void wxXmlResource::UpdateResources() delete m_data[i].Doc; m_data[i].Doc = new wxXmlDocument; } - if (!stream || !m_data[i].Doc->Load(*stream, wxXML_IO_AUTO, encoding)) + if (!stream || !m_data[i].Doc->Load(*stream, encoding)) { wxLogError(_("Cannot load resources from file '%s'."), m_data[i].File.c_str()); diff --git a/src/xrc/xmlwrite.cpp b/src/xrc/xmlwrite.cpp deleted file mode 100644 index 3b6e3a1047..0000000000 --- a/src/xrc/xmlwrite.cpp +++ /dev/null @@ -1,184 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: xmlwrite.cpp -// Purpose: wxXmlDocument - XML text writer -// Author: Vaclav Slavik -// Created: 2001/04/30 -// RCS-ID: $Id$ -// Copyright: (c) 2001 Vaclav Slavik -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -// nothing - already in xml.cpp -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/wfstream.h" -#include "wx/intl.h" -#include "wx/log.h" -#include "wx/strconv.h" -#include "wx/xrc/xml.h" -#include "wx/xrc/xmlio.h" - -// write string to output: -inline static void OutputString(wxOutputStream& stream, const wxString& str, - wxMBConv *convMem, wxMBConv *convFile) -{ - if (str.IsEmpty()) return; -#if wxUSE_UNICODE - const wxW2MBbuf *buf = str.mb_str(convFile ? *convFile : wxConvUTF8); - stream.Write((const char*)buf, strlen((const char*)buf)); -#else - if ( convFile == NULL ) - stream.Write(str.mb_str(), str.Len()); - else - { - wxString str2(str.wc_str(*convMem), *convFile); - stream.Write(str2.mb_str(), str2.Len()); - } -#endif -} - -// Same as above, but create entities first. -// Translates '<' to "<", '>' to ">" and '&' to "&" -static void OutputStringEnt(wxOutputStream& stream, const wxString& str, - wxMBConv *convMem, wxMBConv *convFile) -{ - wxString buf; - size_t i, last, len; - wxChar c; - - len = str.Len(); - last = 0; - for (i = 0; i < len; i++) - { - c = str.GetChar(i); - if (c == wxT('<') || c == wxT('>') || - (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;"))) - { - OutputString(stream, str.Mid(last, i - last), convMem, convFile); - switch (c) - { - case wxT('<'): - OutputString(stream, wxT("<"), NULL, NULL); - break; - case wxT('>'): - OutputString(stream, wxT(">"), NULL, NULL); - break; - case wxT('&'): - OutputString(stream, wxT("&"), NULL, NULL); - break; - default: break; - } - last = i + 1; - } - } - OutputString(stream, str.Mid(last, i - last), convMem, convFile); -} - -inline static void OutputIndentation(wxOutputStream& stream, int indent) -{ - wxString str = wxT("\n"); - for (int i = 0; i < indent; i++) - str << wxT(' ') << wxT(' '); - OutputString(stream, str, NULL, NULL); -} - -static void OutputNode(wxOutputStream& stream, wxXmlNode *node, int indent, - wxMBConv *convMem, wxMBConv *convFile) -{ - wxXmlNode *n, *prev; - wxXmlProperty *prop; - - switch (node->GetType()) - { - case wxXML_TEXT_NODE: - OutputStringEnt(stream, node->GetContent(), convMem, convFile); - break; - - case wxXML_ELEMENT_NODE: - OutputString(stream, wxT("<"), NULL, NULL); - OutputString(stream, node->GetName(), NULL, NULL); - - prop = node->GetProperties(); - while (prop) - { - OutputString(stream, wxT(" ") + prop->GetName() + - wxT("=\"") + prop->GetValue() + wxT("\""), - NULL, NULL); - // FIXME - what if prop contains '"'? - prop = prop->GetNext(); - } - - if (node->GetChildren()) - { - OutputString(stream, wxT(">"), NULL, NULL); - prev = NULL; - n = node->GetChildren(); - while (n) - { - if (n && n->GetType() != wxXML_TEXT_NODE) - OutputIndentation(stream, indent + 1); - OutputNode(stream, n, indent + 1, convMem, convFile); - prev = n; - n = n->GetNext(); - } - if (prev && prev->GetType() != wxXML_TEXT_NODE) - OutputIndentation(stream, indent); - OutputString(stream, wxT("GetName(), NULL, NULL); - OutputString(stream, wxT(">"), NULL, NULL); - } - else - OutputString(stream, wxT("/>"), NULL, NULL); - break; - - case wxXML_COMMENT_NODE: - OutputString(stream, wxT(""), NULL, NULL); - break; - - default: - wxFAIL_MSG(wxT("unsupported node type")); - } -} - -bool wxXmlIOHandlerWriter::Save(wxOutputStream& stream, const wxXmlDocument& doc) -{ - if (!doc.IsOk()) - return FALSE; - - wxString s; - - wxMBConv *convMem = NULL, *convFile = NULL; -#if wxUSE_UNICODE - convFile = new wxCSConv(doc.GetFileEncoding()); -#else - if ( doc.GetFileEncoding() != doc.GetEncoding() ) - { - convFile = new wxCSConv(doc.GetFileEncoding()); - convMem = new wxCSConv(doc.GetEncoding()); - } -#endif - - s.Printf(wxT("\n"), - doc.GetVersion().c_str(), doc.GetFileEncoding().c_str()); - OutputString(stream, s, NULL, NULL); - - OutputNode(stream, doc.GetRoot(), 0, convMem, convFile); - OutputString(stream, wxT("\n"), NULL, NULL); - - if ( convFile ) - delete convFile; - if ( convMem ) - delete convMem; - - return TRUE; -} diff --git a/utils/wxrc/wxrc.cpp b/utils/wxrc/wxrc.cpp index 5ea1c7a477..be9b7b75b5 100644 --- a/utils/wxrc/wxrc.cpp +++ b/utils/wxrc/wxrc.cpp @@ -28,7 +28,6 @@ #include "wx/cmdline.h" #include "wx/xrc/xml.h" -#include "wx/xrc/xmlio.h" #include "wx/ffile.h" #include "wx/wfstream.h" @@ -67,7 +66,7 @@ private: wxArrayString FindStrings(); wxArrayString FindStrings(wxXmlNode *node); - bool flagVerbose, flagCPP, flagCompress, flagGettext; + bool flagVerbose, flagCPP, flagGettext; wxString parOutput, parFuncname, parOutputPath; wxArrayString parFiles; int retCode; @@ -86,7 +85,6 @@ int XmlResApp::OnRun() { wxCMD_LINE_SWITCH, "h", "help", "show help message" }, { wxCMD_LINE_SWITCH, "v", "verbose", "be verbose" }, { wxCMD_LINE_SWITCH, "c", "cpp-code", "output C++ source rather than .rsc file" }, - { wxCMD_LINE_SWITCH, "u", "uncompressed", "do not compress .xml files (C++ only)" }, { wxCMD_LINE_SWITCH, "g", "gettext", "output list of translatable strings (to stdout or file if -o used)" }, { wxCMD_LINE_OPTION, "n", "function", "C++ function name (with -c) [InitXmlResource]" }, { wxCMD_LINE_OPTION, "o", "output", "output file [resource.xrs/cpp]" }, @@ -104,8 +102,6 @@ int XmlResApp::OnRun() delete wxLog::SetActiveTarget(new wxLogStderr); #endif - wxXmlDocument::AddHandler(new wxXmlIOHandlerBinZ); - wxCmdLineParser parser(cmdLineDesc, argc, argv); switch (parser.Parse()) @@ -146,7 +142,6 @@ void XmlResApp::ParseParams(const wxCmdLineParser& cmdline) flagGettext = cmdline.Found("g"); flagVerbose = cmdline.Found("v"); flagCPP = cmdline.Found("c"); - flagCompress = flagCPP && !cmdline.Found("u"); if (!cmdline.Found("o", &parOutput)) { @@ -210,9 +205,8 @@ wxArrayString XmlResApp::PrepareTempFiles() FindFilesInXML(doc.GetRoot(), flist, path); - doc.Save(parOutputPath + "/" + name + ".xmlbin", - flagCompress ? wxXML_IO_BINZ : wxXML_IO_BIN); - flist.Add(name + ".xmlbin"); + doc.Save(parOutputPath + "/" + name + ".xrc"); + flist.Add(name + ".xrc"); } return flist; @@ -394,7 +388,7 @@ void " + parFuncname + "()\n\ wxString name, ext, path; wxSplitPath(parFiles[i], &path, &name, &ext); file.Write(" wxXmlResource::Get()->Load(\"memory:xml_resource/" + - name + ".xmlbin" + "\");\n"); + name + ".xrc" + "\");\n"); } file.Write("}\n"); -- 2.45.2