]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/xml/xmlbin.cpp
added XML resources library
[wxWidgets.git] / contrib / src / xml / xmlbin.cpp
diff --git a/contrib/src/xml/xmlbin.cpp b/contrib/src/xml/xmlbin.cpp
new file mode 100644 (file)
index 0000000..d647e8f
--- /dev/null
@@ -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);
+}
+
+