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