--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: xmlbin.cpp
+// Purpose: wxXmlIOHandlerBin
+// Author: Vaclav Slavik
+// Created: 2000/07/24
+// RCS-ID: $Id$
+// Copyright: (c) 2000 Vaclav Slavik
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+// nothing, already in xml.cpp
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/datstrm.h"
+#include "wx/log.h"
+#include "wx/intl.h"
+
+#include "wx/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);
+}
+
+