};
-// 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 <img src="hello.gif" id="3"/> "src" is property with value
// "hello.gif" and "id" is prop. with value "3".
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; }
// 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; }
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;
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_
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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_
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 \
# 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
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 \
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 \
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 \
$(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
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 &
#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,
}
}
-
-
wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name,
const wxString& content)
: m_type(type), m_name(name), m_content(content),
m_children(NULL), m_next(NULL)
{}
-
-
wxXmlNode::wxXmlNode(const wxXmlNode& node)
{
m_next = NULL;
DoCopy(node);
}
-
-
wxXmlNode::~wxXmlNode()
{
wxXmlNode *c, *c2;
}
}
-
-
wxXmlNode& wxXmlNode::operator=(const wxXmlNode& node)
{
wxDELETE(m_properties);
return *this;
}
-
-
void wxXmlNode::DoCopy(const wxXmlNode& node)
{
m_type = node.m_type;
}
}
-
bool wxXmlNode::HasProp(const wxString& propName) const
{
wxXmlProperty *prop = GetProperties();
return FALSE;
}
-
-
bool wxXmlNode::GetPropVal(const wxString& propName, wxString *value) const
{
wxXmlProperty *prop = GetProperties();
return FALSE;
}
-
-
wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& defaultVal) const
{
wxString tmp;
return defaultVal;
}
-
-
void wxXmlNode::AddChild(wxXmlNode *child)
{
if (m_children == NULL)
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"));
child->m_next = before_node;
}
-
-
bool wxXmlNode::RemoveChild(wxXmlNode *child)
{
if (m_children == NULL)
}
}
-
-
void wxXmlNode::AddProperty(const wxString& name, const wxString& value)
{
AddProperty(new wxXmlProperty(name, value, NULL));
}
}
-
-
bool wxXmlNode::DeleteProperty(const wxString& name)
{
wxXmlProperty *prop;
+//-----------------------------------------------------------------------------
+// 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);
return *this;
}
-
-
void wxXmlDocument::DoCopy(const wxXmlDocument& doc)
{
m_version = doc.m_version;
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, "<?xml ", 6) == 0)
{
- sm_handlers = new wxList;
- sm_handlers->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("</"), NULL, NULL);
+ OutputString(stream, node->GetName(), NULL, NULL);
+ OutputString(stream, wxT(">"), NULL, NULL);
+ }
+ else
+ OutputString(stream, wxT("/>"), NULL, NULL);
+ break;
+
+ case wxXML_COMMENT_NODE:
+ OutputString(stream, wxT("<!--"), NULL, NULL);
+ OutputString(stream, node->GetContent(), convMem, convFile);
+ 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("<?xml version=\"%s\" encoding=\"%s\"?>\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;
}
-
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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);
-}
-
-
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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, "<?xml ") == 0);
-}
-
-
-struct wxXmlParsingContext
-{
- wxMBConv *conv;
-
- wxXmlNode *root;
- wxXmlNode *node;
- wxXmlNode *lastAsText;
- wxString encoding;
- wxString version;
-};
-
-static void StartElementHnd(void *userData, const char *name, const char **atts)
-{
- 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;
-}
-
-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, "<?xml ", 6) == 0)
- {
- 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]);
- }
-}
-
-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;
-}
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());
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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("</"), NULL, NULL);
- OutputString(stream, node->GetName(), NULL, NULL);
- OutputString(stream, wxT(">"), NULL, NULL);
- }
- else
- OutputString(stream, wxT("/>"), NULL, NULL);
- break;
-
- case wxXML_COMMENT_NODE:
- OutputString(stream, wxT("<!--"), NULL, NULL);
- OutputString(stream, node->GetContent(), convMem, convFile);
- 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("<?xml version=\"%s\" encoding=\"%s\"?>\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;
-}
#include "wx/cmdline.h"
#include "wx/xrc/xml.h"
-#include "wx/xrc/xmlio.h"
#include "wx/ffile.h"
#include "wx/wfstream.h"
wxArrayString FindStrings();
wxArrayString FindStrings(wxXmlNode *node);
- bool flagVerbose, flagCPP, flagCompress, flagGettext;
+ bool flagVerbose, flagCPP, flagGettext;
wxString parOutput, parFuncname, parOutputPath;
wxArrayString parFiles;
int retCode;
{ 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]" },
delete wxLog::SetActiveTarget(new wxLogStderr);
#endif
- wxXmlDocument::AddHandler(new wxXmlIOHandlerBinZ);
-
wxCmdLineParser parser(cmdLineDesc, argc, argv);
switch (parser.Parse())
flagGettext = cmdline.Found("g");
flagVerbose = cmdline.Found("v");
flagCPP = cmdline.Found("c");
- flagCompress = flagCPP && !cmdline.Found("u");
if (!cmdline.Found("o", &parOutput))
{
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;
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");
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;
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
}
};
-// 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 <img src="hello.gif" id="3"/> "src" is property with value
// "hello.gif" and "id" is prop. with value "3".
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; }
// 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; }
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;
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_
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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_
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 \
# 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
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 \
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 \
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 \
$(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
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 &
#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,
}
}
-
-
wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name,
const wxString& content)
: m_type(type), m_name(name), m_content(content),
m_children(NULL), m_next(NULL)
{}
-
-
wxXmlNode::wxXmlNode(const wxXmlNode& node)
{
m_next = NULL;
DoCopy(node);
}
-
-
wxXmlNode::~wxXmlNode()
{
wxXmlNode *c, *c2;
}
}
-
-
wxXmlNode& wxXmlNode::operator=(const wxXmlNode& node)
{
wxDELETE(m_properties);
return *this;
}
-
-
void wxXmlNode::DoCopy(const wxXmlNode& node)
{
m_type = node.m_type;
}
}
-
bool wxXmlNode::HasProp(const wxString& propName) const
{
wxXmlProperty *prop = GetProperties();
return FALSE;
}
-
-
bool wxXmlNode::GetPropVal(const wxString& propName, wxString *value) const
{
wxXmlProperty *prop = GetProperties();
return FALSE;
}
-
-
wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& defaultVal) const
{
wxString tmp;
return defaultVal;
}
-
-
void wxXmlNode::AddChild(wxXmlNode *child)
{
if (m_children == NULL)
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"));
child->m_next = before_node;
}
-
-
bool wxXmlNode::RemoveChild(wxXmlNode *child)
{
if (m_children == NULL)
}
}
-
-
void wxXmlNode::AddProperty(const wxString& name, const wxString& value)
{
AddProperty(new wxXmlProperty(name, value, NULL));
}
}
-
-
bool wxXmlNode::DeleteProperty(const wxString& name)
{
wxXmlProperty *prop;
+//-----------------------------------------------------------------------------
+// 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);
return *this;
}
-
-
void wxXmlDocument::DoCopy(const wxXmlDocument& doc)
{
m_version = doc.m_version;
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, "<?xml ", 6) == 0)
{
- sm_handlers = new wxList;
- sm_handlers->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("</"), NULL, NULL);
+ OutputString(stream, node->GetName(), NULL, NULL);
+ OutputString(stream, wxT(">"), NULL, NULL);
+ }
+ else
+ OutputString(stream, wxT("/>"), NULL, NULL);
+ break;
+
+ case wxXML_COMMENT_NODE:
+ OutputString(stream, wxT("<!--"), NULL, NULL);
+ OutputString(stream, node->GetContent(), convMem, convFile);
+ 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("<?xml version=\"%s\" encoding=\"%s\"?>\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;
}
-
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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);
-}
-
-
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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, "<?xml ") == 0);
-}
-
-
-struct wxXmlParsingContext
-{
- wxMBConv *conv;
-
- wxXmlNode *root;
- wxXmlNode *node;
- wxXmlNode *lastAsText;
- wxString encoding;
- wxString version;
-};
-
-static void StartElementHnd(void *userData, const char *name, const char **atts)
-{
- 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;
-}
-
-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, "<?xml ", 6) == 0)
- {
- 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]);
- }
-}
-
-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;
-}
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());
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// 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("</"), NULL, NULL);
- OutputString(stream, node->GetName(), NULL, NULL);
- OutputString(stream, wxT(">"), NULL, NULL);
- }
- else
- OutputString(stream, wxT("/>"), NULL, NULL);
- break;
-
- case wxXML_COMMENT_NODE:
- OutputString(stream, wxT("<!--"), NULL, NULL);
- OutputString(stream, node->GetContent(), convMem, convFile);
- 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("<?xml version=\"%s\" encoding=\"%s\"?>\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;
-}
#include "wx/cmdline.h"
#include "wx/xrc/xml.h"
-#include "wx/xrc/xmlio.h"
#include "wx/ffile.h"
#include "wx/wfstream.h"
wxArrayString FindStrings();
wxArrayString FindStrings(wxXmlNode *node);
- bool flagVerbose, flagCPP, flagCompress, flagGettext;
+ bool flagVerbose, flagCPP, flagGettext;
wxString parOutput, parFuncname, parOutputPath;
wxArrayString parFiles;
int retCode;
{ 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]" },
delete wxLog::SetActiveTarget(new wxLogStderr);
#endif
- wxXmlDocument::AddHandler(new wxXmlIOHandlerBinZ);
-
wxCmdLineParser parser(cmdLineDesc, argc, argv);
switch (parser.Parse())
flagGettext = cmdline.Found("g");
flagVerbose = cmdline.Found("v");
flagCPP = cmdline.Found("c");
- flagCompress = flagCPP && !cmdline.Found("u");
if (!cmdline.Found("o", &parOutput))
{
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;
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");