summaryrefslogtreecommitdiff
path: root/include/udm/xml/xmlitem.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'include/udm/xml/xmlitem.hxx')
-rw-r--r--include/udm/xml/xmlitem.hxx339
1 files changed, 339 insertions, 0 deletions
diff --git a/include/udm/xml/xmlitem.hxx b/include/udm/xml/xmlitem.hxx
new file mode 100644
index 000000000000..eab5798feca0
--- /dev/null
+++ b/include/udm/xml/xmlitem.hxx
@@ -0,0 +1,339 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef CSI_XML_XMLITEM_HXX
+#define CSI_XML_XMLITEM_HXX
+
+// USED SERVICES
+ // BASE CLASSES
+ // COMPONENTS
+#include <cosv/tpl/swelist.hxx>
+#include <cosv/tpl/dyn.hxx>
+ // PARAMETERS
+
+namespace csv
+{
+ class bostream;
+}
+
+
+namespace csi
+{
+namespace xml
+{
+
+
+/* Basics:
+ Item, Attribute, Element, TextContext
+*/
+
+class Item
+{
+ public:
+ virtual ~Item() {}
+ void WriteOut(
+ csv::bostream & io_aFile ) const;
+ private:
+ virtual void do_WriteOut(
+ csv::bostream & io_aFile ) const = 0;
+};
+
+typedef csv::SweList_dyn< Item > ItemList;
+
+class Attribute
+{
+ public:
+ virtual ~Attribute() {}
+
+ void WriteOut(
+ csv::bostream & io_aFile ) const;
+
+ const ::csv::String& Name() const;
+ const ::csv::String& Value() const;
+
+ private:
+ virtual const ::csv::String &
+ inq_Name() const = 0;
+ virtual const ::csv::String &
+ inq_Value() const = 0;
+};
+
+typedef csv::SweList_dyn< Attribute > AttrList;
+
+
+class Element : public Item
+{
+ public:
+ Element & operator<<( /// For multiple content items.
+ DYN Item * let_dpItem );
+ Element & operator<<( /// For multiple content items.
+ const ::csv::String& let_drText );
+ Element & operator<<( /// For multiple content items.
+ const char * let_dpText );
+ Element & operator<<(
+ DYN Attribute * let_dpAttr );
+
+ Element & operator>>( /// For multiple content items. @return the child Element.
+ DYN Element & let_drElement );
+
+
+ Item * SetContent( /// For only one content item.
+ DYN Item * let_dpItem ); /// Replaces previous content. May be 0, then all content is deleted.
+ private:
+ // Interface Item:
+ virtual void do_WriteOut(
+ csv::bostream & io_aFile ) const;
+ // Local
+ virtual void op_streamout(
+ DYN Item * let_dpItem ) = 0;
+ virtual void op_streamout(
+ DYN Attribute * let_dpAttr ) = 0;
+
+ virtual void do_SetContent(
+ DYN Item * let_dpItem ) = 0;
+ // Helpers
+ virtual const ::csv::String &
+ inq_TagName() const = 0;
+ virtual const Item *
+ inq_Content() const = 0;
+ virtual const AttrList *
+ inq_Attrs() const = 0;
+
+ virtual bool FinishEmptyTag_XmlStyle() const; /// Defaulted to: true
+
+ virtual bool LineBreakAfterBeginTag() const; /// Defaulted to: false
+ virtual bool LineBreakAfterEndTag() const; /// Defaulted to: true, if LineBreakAfterBeginTag()
+};
+
+class TextContent : public Item
+{
+};
+
+
+/* Implementation simplifiers:
+ EmptyElement, PureElement, SglTag
+*/
+
+class EmptyElement : public Element
+{
+ private:
+ // Interface Element:
+ virtual void op_streamout( /// does nothing
+ DYN Item * let_dpItem );
+ virtual void op_streamout(
+ DYN Attribute * let_dpAttr );
+ virtual void do_SetContent( /// does nothing
+ DYN Item * let_dpItem );
+ virtual const Item *
+ inq_Content() const; /// @return 0
+ virtual const AttrList *
+ inq_Attrs() const;
+
+ // Local
+ virtual AttrList & inq_RefAttrs() = 0;
+};
+
+class PureElement : public Element
+{
+ private:
+ // Interface Element:
+ virtual void op_streamout(
+ DYN Item * let_dpItem );
+ virtual void op_streamout( /// does nothing
+ DYN Attribute * let_dpAttr );
+ virtual void do_SetContent(
+ DYN Item * let_dpItem );
+ virtual const Item *
+ inq_Content() const;
+ virtual const AttrList *
+ inq_Attrs() const; /// @return 0
+ // Local
+ virtual Dyn< Item > &
+ inq_RefContent() = 0;
+};
+
+class SglTag : public Element
+{
+ private:
+ // Interface Element:
+ virtual void op_streamout( /// does nothing
+ DYN Item * let_dpItem );
+ virtual void op_streamout( /// does nothing
+ DYN Attribute * let_dpAttr );
+ virtual void do_SetContent( /// does nothing
+ DYN Item * let_dpItem );
+ virtual const Item *
+ inq_Content() const; /// @return 0
+ virtual const AttrList *
+ inq_Attrs() const; /// @return 0
+};
+
+
+
+/* Standard Element implementations, if there are not any
+ specialized ones.
+*/
+
+class AnElement : public Element
+{
+ public:
+ AnElement(
+ const char * i_sTagName );
+ ~AnElement();
+ private:
+ // Interface Element
+ virtual void op_streamout(
+ DYN Item * let_dpItem );
+ virtual void op_streamout(
+ DYN Attribute * let_dpAttr );
+ virtual void do_SetContent(
+ DYN Item * let_dpItem );
+ virtual const ::csv::String &
+ inq_TagName() const;
+ virtual const Item *
+ inq_Content() const;
+ virtual const AttrList *
+ inq_Attrs() const;
+ // DATA
+ ::csv::String sTagName;
+ Dyn< Item > pContent;
+ AttrList aAttrs;
+};
+
+class APureElement : public PureElement
+{
+ public:
+ APureElement(
+ const char * i_sTagName );
+ ~APureElement();
+ private:
+ // Interface Element:
+ virtual const ::csv::String &
+ inq_TagName() const;
+ // Interface PureElement:
+ virtual Dyn< Item > &
+ inq_RefContent();
+ // DATA
+ ::csv::String sTagName;
+ Dyn< Item > pContent;
+};
+
+/* Standard Attribute implementation
+*/
+class AnAttribute : public Attribute
+{
+ public:
+ AnAttribute(
+ const ::csv::String & i_sName,
+ const ::csv::String & i_sValue );
+ AnAttribute(
+ const char * i_sName,
+ const char * i_sValue );
+ ~AnAttribute();
+ private:
+ // Interface Attribute:
+ virtual const ::csv::String &
+ inq_Name() const;
+ virtual const ::csv::String &
+ inq_Value() const;
+ // DATA
+ ::csv::String sName;
+ ::csv::String sValue;
+};
+
+
+
+/* Implementations of TextContent:
+
+ Text ( reserved characters will be replaced and appear unchanged )
+ XmlCode ( reserved characters stay and are interpreted
+ by the XML-viewer )
+*/
+class Text : public TextContent
+{
+ public:
+ Text(
+ const ::csv::String & i_sText );
+ Text(
+ const char * i_sText );
+ ~Text();
+ private:
+ virtual void do_WriteOut(
+ csv::bostream & io_aFile ) const;
+ // DATA
+ ::csv::String sText;
+};
+
+
+class XmlCode : public TextContent
+{
+ public:
+ XmlCode(
+ const ::csv::String & i_sText );
+ XmlCode(
+ const char * i_sText );
+ ~XmlCode();
+ private:
+ virtual void do_WriteOut(
+ csv::bostream & io_aFile ) const;
+ // DATA
+ ::csv::String sText;
+};
+
+
+
+// IMPLEMENTATION
+
+inline void
+Item::WriteOut( csv::bostream & io_aFile ) const
+ { do_WriteOut(io_aFile); }
+
+inline const ::csv::String &
+Attribute::Name() const
+ { return inq_Name(); }
+inline const ::csv::String &
+Attribute::Value() const
+ { return inq_Value(); }
+
+inline Element &
+Element::operator<<( DYN Item * let_dpItem )
+ { op_streamout(let_dpItem); return *this; }
+inline Element &
+Element::operator<<( const ::csv::String & let_drText )
+ { op_streamout( new Text(let_drText) ); return *this; }
+inline Element &
+Element::operator<<( const char * let_drText )
+ { op_streamout( new Text(let_drText) ); return *this; }
+inline Element &
+Element::operator<<( DYN Attribute * let_dpAttr )
+ { op_streamout(let_dpAttr); return *this; }
+inline Element &
+Element::operator>>( DYN Element & let_drElement )
+ { op_streamout(&let_drElement); return let_drElement; }
+inline Item *
+Element::SetContent( DYN Item * let_dpItem )
+ { do_SetContent(let_dpItem); return let_dpItem; }
+
+
+} // namespace xml
+} // namespace csi
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */