wxXRC cleanup: removed .xmlbin format
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13977 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
bf504f980a
commit
4d876ee3f7
@ -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 <img src="hello.gif" id="3"/> "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_
|
||||
|
@ -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_
|
@ -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 \
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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 \
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 &
|
||||
|
@ -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,19 +314,184 @@ 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)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
|
||||
}
|
||||
|
||||
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 wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding)
|
||||
{
|
||||
#if wxUSE_UNICODE
|
||||
(void)encoding;
|
||||
@ -370,103 +499,213 @@ bool wxXmlDocument::Load(wxInputStream& stream, wxXmlIOType io_type,
|
||||
m_encoding = encoding;
|
||||
#endif
|
||||
|
||||
wxNode *n = sm_handlers->GetFirst();
|
||||
while (n)
|
||||
{
|
||||
wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData();
|
||||
const size_t BUFSIZE = 1024;
|
||||
char buf[BUFSIZE];
|
||||
wxXmlParsingContext ctx;
|
||||
bool done;
|
||||
XML_Parser parser = XML_ParserCreate(NULL);
|
||||
|
||||
if ((io_type == wxXML_IO_AUTO || io_type == h->GetType()) &&
|
||||
h->CanLoad(stream))
|
||||
{
|
||||
return h->Load(stream, *this, encoding);
|
||||
}
|
||||
n = n->GetNext();
|
||||
}
|
||||
wxLogError(_("Cannot find XML I/O handler capable of loading this format."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxXmlDocument::Save(const wxString& filename, wxXmlIOType io_type) const
|
||||
{
|
||||
wxFileOutputStream stream(filename);
|
||||
return Save(stream, io_type);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxXmlDocument::Save(wxOutputStream& stream, wxXmlIOType io_type) const
|
||||
{
|
||||
wxNode *n = sm_handlers->GetFirst();
|
||||
while (n)
|
||||
{
|
||||
wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData();
|
||||
if (io_type == h->GetType() && h->CanSave())
|
||||
{
|
||||
return h->Save(stream, *this);
|
||||
}
|
||||
n = n->GetNext();
|
||||
}
|
||||
wxLogError(_("Cannot find XML I/O handler capable of saving in this format."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxXmlDocument::AddHandler(wxXmlIOHandler *handler)
|
||||
{
|
||||
if (sm_handlers == NULL)
|
||||
{
|
||||
sm_handlers = new wxList;
|
||||
sm_handlers->DeleteContents(TRUE);
|
||||
}
|
||||
sm_handlers->Append(handler);
|
||||
}
|
||||
|
||||
|
||||
void wxXmlDocument::CleanUpHandlers()
|
||||
{
|
||||
wxDELETE(sm_handlers);
|
||||
}
|
||||
|
||||
|
||||
void wxXmlDocument::InitStandardHandlers()
|
||||
{
|
||||
AddHandler(new wxXmlIOHandlerBin);
|
||||
#if wxUSE_ZLIB
|
||||
AddHandler(new wxXmlIOHandlerBinZ);
|
||||
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(); };
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxXmlModule, wxModule)
|
||||
|
||||
|
||||
|
||||
|
||||
// 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()
|
||||
{
|
||||
wxModule* module = new wxXmlModule;
|
||||
module->Init();
|
||||
wxModule::RegisterModule(module);
|
||||
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 wxXmlDocument::Save(wxOutputStream& stream) const
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
@ -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, "<?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;
|
||||
}
|
@ -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());
|
||||
|
@ -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("</"), 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;
|
||||
}
|
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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 <img src="hello.gif" id="3"/> "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_
|
||||
|
@ -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_
|
@ -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 \
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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 \
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 &
|
||||
|
531
src/xrc/xml.cpp
531
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,19 +314,184 @@ 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)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
|
||||
}
|
||||
|
||||
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 wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding)
|
||||
{
|
||||
#if wxUSE_UNICODE
|
||||
(void)encoding;
|
||||
@ -370,103 +499,213 @@ bool wxXmlDocument::Load(wxInputStream& stream, wxXmlIOType io_type,
|
||||
m_encoding = encoding;
|
||||
#endif
|
||||
|
||||
wxNode *n = sm_handlers->GetFirst();
|
||||
while (n)
|
||||
{
|
||||
wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData();
|
||||
const size_t BUFSIZE = 1024;
|
||||
char buf[BUFSIZE];
|
||||
wxXmlParsingContext ctx;
|
||||
bool done;
|
||||
XML_Parser parser = XML_ParserCreate(NULL);
|
||||
|
||||
if ((io_type == wxXML_IO_AUTO || io_type == h->GetType()) &&
|
||||
h->CanLoad(stream))
|
||||
{
|
||||
return h->Load(stream, *this, encoding);
|
||||
}
|
||||
n = n->GetNext();
|
||||
}
|
||||
wxLogError(_("Cannot find XML I/O handler capable of loading this format."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxXmlDocument::Save(const wxString& filename, wxXmlIOType io_type) const
|
||||
{
|
||||
wxFileOutputStream stream(filename);
|
||||
return Save(stream, io_type);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxXmlDocument::Save(wxOutputStream& stream, wxXmlIOType io_type) const
|
||||
{
|
||||
wxNode *n = sm_handlers->GetFirst();
|
||||
while (n)
|
||||
{
|
||||
wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData();
|
||||
if (io_type == h->GetType() && h->CanSave())
|
||||
{
|
||||
return h->Save(stream, *this);
|
||||
}
|
||||
n = n->GetNext();
|
||||
}
|
||||
wxLogError(_("Cannot find XML I/O handler capable of saving in this format."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxXmlDocument::AddHandler(wxXmlIOHandler *handler)
|
||||
{
|
||||
if (sm_handlers == NULL)
|
||||
{
|
||||
sm_handlers = new wxList;
|
||||
sm_handlers->DeleteContents(TRUE);
|
||||
}
|
||||
sm_handlers->Append(handler);
|
||||
}
|
||||
|
||||
|
||||
void wxXmlDocument::CleanUpHandlers()
|
||||
{
|
||||
wxDELETE(sm_handlers);
|
||||
}
|
||||
|
||||
|
||||
void wxXmlDocument::InitStandardHandlers()
|
||||
{
|
||||
AddHandler(new wxXmlIOHandlerBin);
|
||||
#if wxUSE_ZLIB
|
||||
AddHandler(new wxXmlIOHandlerBinZ);
|
||||
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(); };
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxXmlModule, wxModule)
|
||||
|
||||
|
||||
|
||||
|
||||
// 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()
|
||||
{
|
||||
wxModule* module = new wxXmlModule;
|
||||
module->Init();
|
||||
wxModule::RegisterModule(module);
|
||||
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 wxXmlDocument::Save(wxOutputStream& stream) const
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
@ -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, "<?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;
|
||||
}
|
@ -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());
|
||||
|
@ -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("</"), 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;
|
||||
}
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user