xref: /aoo4110/main/udm/inc/udm/xml/xmlitem.hxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef CSI_XML_XMLITEM_HXX
25 #define CSI_XML_XMLITEM_HXX
26 
27 // USED SERVICES
28 	// BASE CLASSES
29 	// COMPONENTS
30 #include <cosv/tpl/swelist.hxx>
31 #include <cosv/tpl/dyn.hxx>
32 	// PARAMETERS
33 
34 namespace csv
35 {
36 	class bostream;
37 }
38 
39 
40 namespace csi
41 {
42 namespace xml
43 {
44 
45 
46 /*	Basics:
47 	Item, Attribute, Element, TextContext
48 */
49 
50 class Item
51 {
52   public:
~Item()53 	virtual				~Item() {}
54 	void				WriteOut(
55 							csv::bostream &		io_aFile ) const;
56   private:
57 	virtual void		do_WriteOut(
58 							csv::bostream &		io_aFile ) const = 0;
59 };
60 
61 typedef csv::SweList_dyn< Item >			ItemList;
62 
63 class Attribute
64 {
65   public:
~Attribute()66 	virtual				~Attribute() {}
67 
68 	void				WriteOut(
69 							csv::bostream &		io_aFile ) const;
70 
71 	const ::csv::String& Name() const;
72 	const ::csv::String& Value() const;
73 
74   private:
75 	virtual const ::csv::String &
76 						inq_Name() const = 0;
77 	virtual const ::csv::String &
78 						inq_Value() const = 0;
79 };
80 
81 typedef csv::SweList_dyn< Attribute >	AttrList;
82 
83 
84 class Element : public Item
85 {
86   public:
87 	Element &			operator<<(				/// For multiple content items.
88 							DYN Item *			let_dpItem );
89 	Element &			operator<<(				/// For multiple content items.
90 							const ::csv::String& let_drText );
91 	Element &			operator<<(				/// For multiple content items.
92 							const char *		let_dpText );
93 	Element &			operator<<(
94 							DYN Attribute *		let_dpAttr );
95 
96 	Element &			operator>>(				/// For multiple content items. @return the child Element.
97 							DYN Element &		let_drElement );
98 
99 
100 	Item *				SetContent(             /// For only one content item.
101 							DYN Item *			let_dpItem );   	/// Replaces previous content. May be 0, then all content is deleted.
102   private:
103 	// Interface Item:
104 	virtual void		do_WriteOut(
105 							csv::bostream &		io_aFile ) const;
106 	// Local
107 	virtual void	  	op_streamout(
108 							DYN Item *			let_dpItem ) = 0;
109 	virtual void	  	op_streamout(
110 							DYN Attribute *		let_dpAttr ) = 0;
111 
112 	virtual void	  	do_SetContent(
113 							DYN Item *			let_dpItem ) = 0;
114 	// Helpers
115 	virtual const ::csv::String &
116 						inq_TagName() const = 0;
117 	virtual const Item *
118 						inq_Content() const = 0;
119 	virtual const AttrList *
120 						inq_Attrs() const = 0;
121 
122 	virtual bool		FinishEmptyTag_XmlStyle() const;    /// Defaulted to: true
123 
124 	virtual bool		LineBreakAfterBeginTag() const;	    /// Defaulted to: false
125 	virtual bool		LineBreakAfterEndTag() const;	    /// Defaulted to: true, if LineBreakAfterBeginTag()
126 };
127 
128 class TextContent : public Item
129 {
130 };
131 
132 
133 /*	Implementation simplifiers:
134 	EmptyElement, PureElement, SglTag
135 */
136 
137 class EmptyElement : public Element
138 {
139   private:
140 	// Interface Element:
141 	virtual void	  	op_streamout(          /// does nothing
142 							DYN Item *			let_dpItem );
143 	virtual void	  	op_streamout(
144 							DYN Attribute *		let_dpAttr );
145 	virtual void	  	do_SetContent(          /// does nothing
146 							DYN Item *			let_dpItem );
147 	virtual const Item *
148 						inq_Content() const;	/// @return 0
149 	virtual const AttrList *
150 						inq_Attrs() const;
151 
152 	// Local
153 	virtual AttrList &	inq_RefAttrs() = 0;
154 };
155 
156 class PureElement : public Element
157 {
158   private:
159 	// Interface Element:
160 	virtual void	  	op_streamout(
161 							DYN Item *			let_dpItem );
162 	virtual void	  	op_streamout(          /// does nothing
163 							DYN Attribute *		let_dpAttr );
164 	virtual void	  	do_SetContent(
165 							DYN Item *			let_dpItem );
166 	virtual const Item *
167 						inq_Content() const;
168 	virtual const AttrList *
169 						inq_Attrs() const;      /// @return 0
170 	// Local
171 	virtual Dyn< Item > &
172 						inq_RefContent() = 0;
173 };
174 
175 class SglTag : public Element
176 {
177   private:
178 	// Interface Element:
179 	virtual void	  	op_streamout(          /// does nothing
180 							DYN Item *			let_dpItem );
181 	virtual void	  	op_streamout(          /// does nothing
182 							DYN Attribute *		let_dpAttr );
183 	virtual void	  	do_SetContent(          /// does nothing
184 							DYN Item *			let_dpItem );
185 	virtual const Item *
186 						inq_Content() const;	/// @return 0
187 	virtual const AttrList *
188 						inq_Attrs() const;      /// @return 0
189 };
190 
191 
192 
193 /* 	Standard Element implementations, if there are not any
194 	specialized ones.
195 */
196 
197 class AnElement : public Element
198 {
199   public:
200 						AnElement(
201 							const ::csv::String& i_sTagName );
202 						AnElement(
203 							const char *         i_sTagName );
204 						~AnElement();
205   private:
206 	// Interface Element
207 	virtual void	  	op_streamout(
208 							DYN Item *			let_dpItem );
209 	virtual void	  	op_streamout(
210 							DYN Attribute *		let_dpAttr );
211 	virtual void	  	do_SetContent(
212 							DYN Item *			let_dpItem );
213 	virtual const ::csv::String &
214 						inq_TagName() const;
215 	virtual const Item *
216 						inq_Content() const;
217 	virtual const AttrList *
218 						inq_Attrs() const;
219 	// DATA
220 	::csv::String       sTagName;
221 	Dyn< Item >			pContent;
222 	AttrList			aAttrs;
223 };
224 
225 
226 class AnEmptyElement : public EmptyElement
227 {
228   public:
229 						AnEmptyElement(
230 							const ::csv::String & i_sTagName );
231 						AnEmptyElement(
232 							const char * i_sTagName );
233 						~AnEmptyElement();
234   private:
235 	// Interface Element:
236 	virtual const ::csv::String &
237 						inq_TagName() const;
238 	// Interface EmptyElement:
239 	virtual AttrList &	inq_RefAttrs();
240 
241 	// DATA
242 	::csv::String	    sTagName;
243 	AttrList			aAttrs;
244 };
245 
246 class APureElement : public PureElement
247 {
248   public:
249 						APureElement(
250 							const ::csv::String &	i_sTagName );
251 						APureElement(
252 							const char *            i_sTagName );
253 						~APureElement();
254   private:
255 	// Interface Element:
256 	virtual const ::csv::String &
257 						inq_TagName() const;
258 	// Interface PureElement:
259 	virtual Dyn< Item > &
260 						inq_RefContent();
261 	// DATA
262 	::csv::String       sTagName;
263 	Dyn< Item >			pContent;
264 };
265 
266 class ASglTag : public SglTag
267 {
268   public:
269 						ASglTag(
270 							const ::csv::String & i_sTagName );
271 						ASglTag(
272 							const char *          i_sTagName );
273 						~ASglTag();
274   private:
275 	// Interface Element:
276 	virtual const ::csv::String &
277 						inq_TagName() const;
278 	// DATA
279 	::csv::String         sTagName;
280 };
281 
282 
283 /* Standard Attribute implementation
284 */
285 class AnAttribute : public Attribute
286 {
287   public:
288 						AnAttribute(
289 							const ::csv::String & i_sName,
290                             const ::csv::String & i_sValue );
291 						AnAttribute(
292 							const char *          i_sName,
293                             const char *          i_sValue );
294 						~AnAttribute();
295   private:
296 	// Interface Attribute:
297 	virtual const ::csv::String &
298 						inq_Name() const;
299 	virtual const ::csv::String &
300 						inq_Value() const;
301 	// DATA
302 	::csv::String         sName;
303 	::csv::String         sValue;
304 };
305 
306 
307 
308 /*	Implementations of TextContent:
309 
310 	Text  		( reserved characters will be replaced and appear unchanged )
311 	XmlCode		( reserved characters stay and are interpreted
312 				  by the XML-viewer )
313 */
314 class Text : public TextContent
315 {
316   public:
317 						Text(
318 							const ::csv::String & i_sText );
319 						Text(
320 							const char *		i_sText );
321 						~Text();
322   private:
323 	virtual void		do_WriteOut(
324 							csv::bostream &		io_aFile ) const;
325 	// DATA
326 	::csv::String         sText;
327 };
328 
329 
330 class XmlCode : public TextContent
331 {
332   public:
333 						XmlCode(
334 							const ::csv::String & i_sText );
335 						XmlCode(
336 							const char *          i_sText );
337 						~XmlCode();
338   private:
339 	virtual void		do_WriteOut(
340 							csv::bostream &		io_aFile ) const;
341 	// DATA
342 	::csv::String         sText;
343 };
344 
345 
346 
347 // IMPLEMENTATION
348 
349 inline void
WriteOut(csv::bostream & io_aFile) const350 Item::WriteOut( csv::bostream &	io_aFile ) const
351 	{ do_WriteOut(io_aFile); }
352 
353 inline const ::csv::String &
Name() const354 Attribute::Name() const
355 	{ return inq_Name(); }
356 inline const ::csv::String &
Value() const357 Attribute::Value() const
358 	{ return inq_Value(); }
359 
360 inline Element &
operator <<(DYN Item * let_dpItem)361 Element::operator<<( DYN Item *	let_dpItem )
362 	{ op_streamout(let_dpItem); return *this; }
363 inline Element &
operator <<(const::csv::String & let_drText)364 Element::operator<<( const ::csv::String & let_drText )
365 	{ op_streamout( new Text(let_drText) ); return *this; }
366 inline Element &
operator <<(const char * let_drText)367 Element::operator<<( const char * let_drText )
368 	{ op_streamout( new Text(let_drText) ); return *this; }
369 inline Element &
operator <<(DYN Attribute * let_dpAttr)370 Element::operator<<( DYN Attribute * let_dpAttr )
371 	{ op_streamout(let_dpAttr); return *this; }
372 inline Element &
operator >>(DYN Element & let_drElement)373 Element::operator>>( DYN Element & let_drElement )
374 	{ op_streamout(&let_drElement); return let_drElement; }
375 inline Item *
SetContent(DYN Item * let_dpItem)376 Element::SetContent( DYN Item *	let_dpItem )
377 	{ do_SetContent(let_dpItem); return let_dpItem; }
378 
379 
380 }   // namespace xml
381 }   // namespace csi
382 
383 #endif
384