/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef CSI_XML_XMLITEM_HXX #define CSI_XML_XMLITEM_HXX // USED SERVICES // BASE CLASSES // COMPONENTS #include #include // 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 ::csv::String& i_sTagName ); 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 AnEmptyElement : public EmptyElement { public: AnEmptyElement( const ::csv::String & i_sTagName ); AnEmptyElement( const char * i_sTagName ); ~AnEmptyElement(); private: // Interface Element: virtual const ::csv::String & inq_TagName() const; // Interface EmptyElement: virtual AttrList & inq_RefAttrs(); // DATA ::csv::String sTagName; AttrList aAttrs; }; class APureElement : public PureElement { public: APureElement( const ::csv::String & i_sTagName ); 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; }; class ASglTag : public SglTag { public: ASglTag( const ::csv::String & i_sTagName ); ASglTag( const char * i_sTagName ); ~ASglTag(); private: // Interface Element: virtual const ::csv::String & inq_TagName() const; // DATA ::csv::String sTagName; }; /* 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