X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca7408bd9ab49ba525517eb03c6b861c850c3199..56d2f75071fc2a29ec10abe97c5a908bb35f30f4:/contrib/src/xml/xmlbin.cpp diff --git a/contrib/src/xml/xmlbin.cpp b/contrib/src/xml/xmlbin.cpp new file mode 100644 index 0000000000..d647e8fe9b --- /dev/null +++ b/contrib/src/xml/xmlbin.cpp @@ -0,0 +1,161 @@ +///////////////////////////////////////////////////////////////////////////// +// 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/xml/xmlio.h" + + + + +bool wxXmlIOHandlerBin::CanLoad(wxInputStream& stream) +{ + bool canread; + canread = (ReadHeader(stream) == _T("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() << doc.GetEncoding(); + 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) +{ + ReadHeader(stream); + wxDataInputStream ds(stream); + wxString tmp; + + ds >> tmp; + doc.SetVersion(tmp); + ds >> tmp; + doc.SetEncoding(tmp); + + doc.SetRoot(LoadBinNode(ds, NULL)); + + return (doc.GetRoot() != NULL); +} + +