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 :
10 : #include <test/mtfxmldump.hxx>
11 : #include <test/xmltesttools.hxx>
12 : #include <test/xmlwriter.hxx>
13 :
14 : #include <vcl/metaact.hxx>
15 : #include <rtl/string.hxx>
16 : #include <rtl/strbuf.hxx>
17 :
18 : #include <boost/scoped_ptr.hpp>
19 :
20 : namespace
21 : {
22 :
23 0 : OUString flagToString(PushFlags nFlag)
24 : {
25 0 : if (nFlag & PushFlags::LINECOLOR)
26 0 : return OUString("PushLineColor");
27 0 : else if (nFlag & PushFlags::FILLCOLOR)
28 0 : return OUString("PushFillColor");
29 0 : else if (nFlag & PushFlags::FONT)
30 0 : return OUString("PushFont");
31 0 : else if (nFlag & PushFlags::TEXTCOLOR)
32 0 : return OUString("PushTextColor");
33 0 : else if (nFlag & PushFlags::MAPMODE)
34 0 : return OUString("PushMapMode");
35 0 : else if (nFlag & PushFlags::CLIPREGION)
36 0 : return OUString("PushClipRegion");
37 0 : else if (nFlag & PushFlags::RASTEROP)
38 0 : return OUString("PushRasterOp");
39 0 : else if (nFlag & PushFlags::TEXTFILLCOLOR)
40 0 : return OUString("PushTextFillColor");
41 0 : else if (nFlag & PushFlags::TEXTALIGN)
42 0 : return OUString("PushTextAlign");
43 0 : else if (nFlag & PushFlags::REFPOINT)
44 0 : return OUString("PushRefPoint");
45 0 : else if (nFlag & PushFlags::TEXTLINECOLOR)
46 0 : return OUString("PushTextLineColor");
47 0 : else if (nFlag & PushFlags::TEXTLAYOUTMODE)
48 0 : return OUString("PushTextLayoutMode");
49 0 : else if (nFlag & PushFlags::TEXTLANGUAGE)
50 0 : return OUString("PushTextLanguage");
51 0 : else if (nFlag & PushFlags::OVERLINECOLOR)
52 0 : return OUString("PushOverlineColor");
53 :
54 0 : return OUString();
55 : }
56 :
57 0 : OUString collectPushFlags(PushFlags nFlags)
58 : {
59 0 : if ((nFlags & PushFlags::ALL) == nFlags)
60 0 : return OUString("PushAll");
61 0 : else if ((nFlags & PUSH_ALLFONT) == nFlags)
62 0 : return OUString("PushAllFont");
63 0 : else if ((nFlags & PUSH_ALLTEXT) == nFlags)
64 0 : return OUString("PushAllText");
65 :
66 0 : OUString sFlags;
67 :
68 0 : for (sal_uInt16 nFlag = 1; nFlag > 0; nFlag <<= 1)
69 : {
70 0 : OUString sFlag = flagToString(static_cast<PushFlags>(nFlag));
71 0 : if (!sFlag.isEmpty())
72 : {
73 0 : if (!sFlags.isEmpty())
74 : {
75 0 : sFlags += ",";
76 : }
77 0 : sFlags += flagToString(static_cast<PushFlags>(nFlag));
78 : }
79 0 : }
80 :
81 0 : return sFlags;
82 : }
83 :
84 0 : OUString convertRopToString(RasterOp eRop)
85 : {
86 0 : switch (eRop)
87 : {
88 0 : case ROP_OVERPAINT: return OUString("overpaint");
89 0 : case ROP_XOR: return OUString("xor");
90 0 : case ROP_0: return OUString("0");
91 0 : case ROP_1: return OUString("1");
92 0 : case ROP_INVERT: return OUString("invert");
93 : }
94 0 : return OUString();
95 : }
96 :
97 0 : OUString convertTextAlignToString(TextAlign eAlign)
98 : {
99 0 : switch (eAlign)
100 : {
101 0 : case ALIGN_BASELINE: return OUString("baseline");
102 0 : case ALIGN_BOTTOM: return OUString("bottom");
103 0 : case ALIGN_TOP: return OUString("top");
104 0 : case TextAlign_FORCE_EQUAL_SIZE: return OUString("equalsize");
105 : }
106 0 : return OUString();
107 : }
108 :
109 36 : OUString convertColorToString(Color aColor)
110 : {
111 36 : OUString aRGBString = aColor.AsRGBHexString();
112 36 : return "#" + aRGBString;
113 : }
114 :
115 46 : OUString convertLineStyleToString(LineStyle eAlign)
116 : {
117 46 : switch (eAlign)
118 : {
119 11 : case LINE_NONE: return OUString("none");
120 35 : case LINE_SOLID: return OUString("solid");
121 0 : case LINE_DASH: return OUString("dash");
122 0 : case LineStyle_FORCE_EQUAL_SIZE: return OUString("equalsize");
123 : }
124 0 : return OUString();
125 : }
126 :
127 8 : OUString convertFontWeigthToString(FontWeight eFontWeight)
128 : {
129 : enum FontWeight { WEIGHT_DONTKNOW, WEIGHT_THIN, WEIGHT_ULTRALIGHT,
130 : WEIGHT_LIGHT, WEIGHT_SEMILIGHT, WEIGHT_NORMAL,
131 : WEIGHT_MEDIUM, WEIGHT_SEMIBOLD, WEIGHT_BOLD,
132 : WEIGHT_ULTRABOLD, WEIGHT_BLACK, FontWeight_FORCE_EQUAL_SIZE=SAL_MAX_ENUM };
133 8 : switch (eFontWeight)
134 : {
135 0 : case WEIGHT_DONTKNOW: return OUString("unknown");
136 0 : case WEIGHT_THIN: return OUString("thin");
137 0 : case WEIGHT_ULTRALIGHT: return OUString("ultralight");
138 0 : case WEIGHT_LIGHT: return OUString("light");
139 0 : case WEIGHT_SEMILIGHT: return OUString("semilight");
140 4 : case WEIGHT_NORMAL: return OUString("normal");
141 0 : case WEIGHT_MEDIUM: return OUString("medium");
142 0 : case WEIGHT_SEMIBOLD: return OUString("semibold");
143 4 : case WEIGHT_BOLD: return OUString("bold");
144 0 : case WEIGHT_ULTRABOLD: return OUString("ultrabold");
145 0 : case WEIGHT_BLACK: return OUString("black");
146 0 : case FontWeight_FORCE_EQUAL_SIZE: return OUString("equalsize");
147 : }
148 0 : return OUString();
149 : }
150 :
151 106 : OString convertLineStyleToString(const MetaActionType nActionType)
152 : {
153 106 : switch (nActionType)
154 : {
155 0 : case MetaActionType::NONE: return "null";
156 0 : case MetaActionType::PIXEL: return "pixel";
157 0 : case MetaActionType::POINT: return "point";
158 0 : case MetaActionType::LINE: return "line";
159 0 : case MetaActionType::RECT: return "rect";
160 0 : case MetaActionType::ROUNDRECT: return "roundrect";
161 0 : case MetaActionType::ELLIPSE: return "ellipse";
162 0 : case MetaActionType::ARC: return "arc";
163 0 : case MetaActionType::PIE: return "pie";
164 0 : case MetaActionType::CHORD: return "chord";
165 46 : case MetaActionType::POLYLINE: return "polyline";
166 0 : case MetaActionType::POLYGON: return "polygon";
167 1 : case MetaActionType::POLYPOLYGON: return "polypolygon";
168 0 : case MetaActionType::TEXT: return "text";
169 0 : case MetaActionType::TEXTARRAY: return "textarray";
170 0 : case MetaActionType::STRETCHTEXT: return "stretchtext";
171 0 : case MetaActionType::TEXTRECT: return "textrect";
172 0 : case MetaActionType::TEXTLINE: return "textline";
173 0 : case MetaActionType::BMP: return "bmp";
174 0 : case MetaActionType::BMPSCALE: return "bmpscale";
175 0 : case MetaActionType::BMPSCALEPART: return "bmpscalepart";
176 0 : case MetaActionType::BMPEX: return "bmpex";
177 0 : case MetaActionType::BMPEXSCALE: return "bmpexscale";
178 0 : case MetaActionType::BMPEXSCALEPART: return "bmpexscalepart";
179 0 : case MetaActionType::MASK: return "mask";
180 0 : case MetaActionType::MASKSCALE: return "maskscale";
181 0 : case MetaActionType::MASKSCALEPART: return "maskscalepart";
182 0 : case MetaActionType::GRADIENT: return "gradient";
183 0 : case MetaActionType::GRADIENTEX: return "gradientex";
184 0 : case MetaActionType::HATCH: return "hatch";
185 0 : case MetaActionType::WALLPAPER: return "wallpaper";
186 5 : case MetaActionType::CLIPREGION: return "clipregion";
187 12 : case MetaActionType::ISECTRECTCLIPREGION: return "sectrectclipregion";
188 0 : case MetaActionType::ISECTREGIONCLIPREGION: return "sectregionclipregion";
189 0 : case MetaActionType::MOVECLIPREGION: return "moveclipregion";
190 13 : case MetaActionType::LINECOLOR: return "linecolor";
191 7 : case MetaActionType::FILLCOLOR: return "fillcolor";
192 0 : case MetaActionType::TEXTCOLOR: return "textcolor";
193 0 : case MetaActionType::TEXTFILLCOLOR: return "textfillcolor";
194 0 : case MetaActionType::TEXTLINECOLOR: return "textlinecolor";
195 0 : case MetaActionType::OVERLINECOLOR: return "overlinecolor";
196 0 : case MetaActionType::TEXTALIGN: return "textalign";
197 1 : case MetaActionType::MAPMODE: return "mapmode";
198 8 : case MetaActionType::FONT: return "font";
199 0 : case MetaActionType::PUSH: return "push";
200 0 : case MetaActionType::POP: return "pop";
201 0 : case MetaActionType::RASTEROP: return "rasterop";
202 0 : case MetaActionType::Transparent: return "transparent";
203 0 : case MetaActionType::FLOATTRANSPARENT: return "floattransparent";
204 0 : case MetaActionType::EPS: return "eps";
205 0 : case MetaActionType::REFPOINT: return "refpoint";
206 12 : case MetaActionType::COMMENT: return "comment";
207 0 : case MetaActionType::LAYOUTMODE: return "layoutmode";
208 1 : case MetaActionType::TEXTLANGUAGE: return "textlanguage";
209 : }
210 0 : return "";
211 : }
212 :
213 : } // anonymous namespace
214 :
215 6 : MetafileXmlDump::MetafileXmlDump()
216 : {
217 6 : maFilter.fill(false);
218 6 : }
219 :
220 6 : MetafileXmlDump::~MetafileXmlDump()
221 6 : {}
222 :
223 5 : void MetafileXmlDump::filterActionType(const MetaActionType nActionType, bool bShouldFilter)
224 : {
225 5 : maFilter[nActionType] = bShouldFilter;
226 5 : }
227 :
228 5 : void MetafileXmlDump::filterAllActionTypes()
229 : {
230 5 : maFilter.fill(true);
231 5 : }
232 :
233 6 : xmlDocPtr MetafileXmlDump::dumpAndParse(const GDIMetaFile& rMetaFile, const OUString& rTempStreamName)
234 : {
235 6 : boost::scoped_ptr<SvStream> pStream;
236 :
237 6 : if (rTempStreamName.isEmpty())
238 6 : pStream.reset(new SvMemoryStream());
239 : else
240 0 : pStream.reset(new SvFileStream(rTempStreamName, STREAM_STD_READWRITE | StreamMode::TRUNC));
241 :
242 12 : XmlWriter aWriter(pStream.get());
243 6 : aWriter.startDocument();
244 6 : aWriter.startElement("metafile");
245 :
246 6 : writeXml(rMetaFile, aWriter);
247 :
248 6 : aWriter.endElement();
249 6 : aWriter.endDocument();
250 :
251 6 : pStream->Seek(STREAM_SEEK_TO_BEGIN);
252 :
253 6 : xmlDocPtr pDoc = XmlTestTools::parseXmlStream(pStream.get());
254 :
255 12 : return pDoc;
256 : }
257 :
258 6 : void MetafileXmlDump::writeXml(const GDIMetaFile& rMetaFile, XmlWriter& rWriter)
259 : {
260 1137 : for(size_t nAction = 0; nAction < rMetaFile.GetActionSize(); ++nAction)
261 : {
262 1131 : MetaAction* pAction = rMetaFile.GetAction(nAction);
263 1131 : const MetaActionType nActionType = pAction->GetType();
264 1131 : if (maFilter[nActionType])
265 1025 : continue;
266 :
267 106 : OString sCurrentElementTag = convertLineStyleToString(nActionType);
268 :
269 106 : switch (nActionType)
270 : {
271 : case MetaActionType::LINE:
272 : {
273 0 : MetaLineAction* pMetaLineAction = static_cast<MetaLineAction*>(pAction);
274 0 : rWriter.startElement(sCurrentElementTag);
275 :
276 0 : rWriter.attribute("startx", pMetaLineAction->GetStartPoint().X());
277 0 : rWriter.attribute("starty", pMetaLineAction->GetStartPoint().Y());
278 0 : rWriter.attribute("endx", pMetaLineAction->GetEndPoint().X());
279 0 : rWriter.attribute("endy", pMetaLineAction->GetEndPoint().Y());
280 :
281 0 : LineInfo aLineInfo = pMetaLineAction->GetLineInfo();
282 0 : rWriter.attribute("style", convertLineStyleToString(aLineInfo.GetStyle()));
283 0 : rWriter.attribute("width", aLineInfo.GetWidth());
284 0 : rWriter.attribute("dashlen", aLineInfo.GetDashLen());
285 0 : rWriter.attribute("dotlen", aLineInfo.GetDotLen());
286 0 : rWriter.attribute("distance", aLineInfo.GetDistance());
287 :
288 0 : rWriter.endElement();
289 : }
290 0 : break;
291 :
292 : case MetaActionType::PUSH:
293 : {
294 0 : MetaPushAction* pMetaPushAction = static_cast<MetaPushAction*>(pAction);
295 0 : rWriter.startElement(sCurrentElementTag);
296 :
297 0 : rWriter.attribute("flags", collectPushFlags(pMetaPushAction->GetFlags()));
298 : }
299 0 : break;
300 :
301 : case MetaActionType::POP:
302 : {
303 0 : rWriter.endElement();
304 : }
305 0 : break;
306 :
307 : case MetaActionType::RASTEROP:
308 : {
309 0 : MetaRasterOpAction* pMetaRasterOpAction = static_cast<MetaRasterOpAction*>(pAction);
310 0 : rWriter.startElement(sCurrentElementTag);
311 :
312 0 : if (pMetaRasterOpAction->GetRasterOp() != ROP_OVERPAINT)
313 : {
314 0 : rWriter.attribute("operation", convertRopToString(pMetaRasterOpAction->GetRasterOp()));
315 : }
316 0 : rWriter.endElement();
317 : }
318 0 : break;
319 :
320 : case MetaActionType::TEXTLINECOLOR:
321 : {
322 0 : MetaTextLineColorAction* pMetaTextLineColorAction = static_cast<MetaTextLineColorAction*>(pAction);
323 0 : rWriter.startElement(sCurrentElementTag);
324 :
325 0 : rWriter.attribute("color", convertColorToString(pMetaTextLineColorAction->GetColor()));
326 0 : rWriter.endElement();
327 : }
328 0 : break;
329 :
330 : case MetaActionType::TEXTFILLCOLOR:
331 : {
332 0 : MetaTextFillColorAction* pMetaTextFillColorAction = static_cast<MetaTextFillColorAction*>(pAction);
333 0 : rWriter.startElement(sCurrentElementTag);
334 :
335 0 : rWriter.attribute("color", convertColorToString(pMetaTextFillColorAction->GetColor()));
336 :
337 0 : if (pMetaTextFillColorAction->IsSetting())
338 0 : rWriter.attribute("setting", OUString("true"));
339 :
340 0 : rWriter.endElement();
341 : }
342 0 : break;
343 :
344 : case MetaActionType::FONT:
345 : {
346 8 : MetaFontAction* pMetaFontAction = static_cast<MetaFontAction*>(pAction);
347 8 : rWriter.startElement(sCurrentElementTag);
348 :
349 8 : vcl::Font aFont = pMetaFontAction->GetFont();
350 :
351 8 : rWriter.attribute("color", convertColorToString(aFont.GetColor()));
352 8 : rWriter.attribute("fillcolor", convertColorToString(aFont.GetFillColor()));
353 8 : rWriter.attribute("name", aFont.GetName());
354 8 : rWriter.attribute("stylename", aFont.GetStyleName());
355 8 : rWriter.attribute("width", aFont.GetSize().Width());
356 8 : rWriter.attribute("height", aFont.GetSize().Height());
357 8 : rWriter.attribute("orientation", aFont.GetOrientation());
358 8 : rWriter.attribute("weight", convertFontWeigthToString(aFont.GetWeight()));
359 :
360 8 : rWriter.endElement();
361 : }
362 8 : break;
363 :
364 : case MetaActionType::TEXTALIGN:
365 : {
366 0 : MetaTextAlignAction* pMetaTextAlignAction = static_cast<MetaTextAlignAction*>(pAction);
367 0 : rWriter.startElement(sCurrentElementTag);
368 0 : OUString sAlign = convertTextAlignToString(pMetaTextAlignAction->GetTextAlign());
369 0 : if (!sAlign.isEmpty())
370 0 : rWriter.attribute("align", sAlign);
371 0 : rWriter.endElement();
372 : }
373 0 : break;
374 :
375 : case MetaActionType::TEXTCOLOR:
376 : {
377 0 : MetaTextColorAction* pMetaTextColorAction = static_cast<MetaTextColorAction*>(pAction);
378 0 : rWriter.startElement(sCurrentElementTag);
379 :
380 0 : rWriter.attribute("color", convertColorToString(pMetaTextColorAction->GetColor()));
381 0 : rWriter.endElement();
382 : }
383 0 : break;
384 :
385 : case MetaActionType::TEXTARRAY:
386 : {
387 0 : MetaTextArrayAction* pMetaTextArrayAction = static_cast<MetaTextArrayAction*>(pAction);
388 0 : rWriter.startElement(sCurrentElementTag);
389 :
390 0 : sal_Int32 aIndex = pMetaTextArrayAction->GetIndex();
391 0 : sal_Int32 aLength = pMetaTextArrayAction->GetLen();
392 :
393 0 : rWriter.attribute("x", pMetaTextArrayAction->GetPoint().X());
394 0 : rWriter.attribute("y", pMetaTextArrayAction->GetPoint().Y());
395 0 : rWriter.attribute("index", aIndex);
396 0 : rWriter.attribute("length", aLength);
397 :
398 0 : rWriter.startElement("dxarray");
399 0 : OUString sDxLengthString;
400 0 : for (sal_Int32 i = 0; i < aLength; ++i)
401 : {
402 0 : sDxLengthString += OUString::number(pMetaTextArrayAction->GetDXArray()[aIndex+i]);
403 0 : sDxLengthString += " ";
404 : }
405 0 : rWriter.content(sDxLengthString);
406 0 : rWriter.endElement();
407 :
408 0 : rWriter.startElement("text");
409 0 : rWriter.content(pMetaTextArrayAction->GetText());
410 0 : rWriter.endElement();
411 :
412 0 : rWriter.endElement();
413 : }
414 0 : break;
415 :
416 : case MetaActionType::LINECOLOR:
417 : {
418 13 : MetaLineColorAction* pMetaLineColorAction = static_cast<MetaLineColorAction*>(pAction);
419 13 : rWriter.startElement(sCurrentElementTag);
420 :
421 13 : rWriter.attribute("color", convertColorToString(pMetaLineColorAction->GetColor()));
422 13 : rWriter.endElement();
423 : }
424 13 : break;
425 :
426 : case MetaActionType::FILLCOLOR:
427 : {
428 7 : MetaFillColorAction* pMetaFillColorAction = static_cast<MetaFillColorAction*>(pAction);
429 7 : rWriter.startElement(sCurrentElementTag);
430 :
431 7 : rWriter.attribute("color", convertColorToString(pMetaFillColorAction->GetColor()));
432 7 : rWriter.endElement();
433 : }
434 7 : break;
435 :
436 : case MetaActionType::CLIPREGION:
437 : {
438 5 : const MetaClipRegionAction* pA = static_cast< const MetaClipRegionAction* >(pAction);
439 5 : rWriter.startElement(sCurrentElementTag);
440 :
441 : // FIXME for now we dump only the bounding box; this is
442 : // enough for the tests we have, but may need extending to
443 : // dumping the real polypolygon in the future
444 5 : Rectangle aRectangle = pA->GetRegion().GetBoundRect();
445 5 : rWriter.attribute("top", aRectangle.Top());
446 5 : rWriter.attribute("left", aRectangle.Left());
447 5 : rWriter.attribute("bottom", aRectangle.Bottom());
448 5 : rWriter.attribute("right", aRectangle.Right());
449 :
450 5 : rWriter.endElement();
451 : }
452 5 : break;
453 :
454 : case MetaActionType::ISECTRECTCLIPREGION:
455 : {
456 12 : MetaISectRectClipRegionAction* pMetaISectRectClipRegionAction = static_cast<MetaISectRectClipRegionAction*>(pAction);
457 12 : rWriter.startElement(sCurrentElementTag);
458 :
459 12 : Rectangle aRectangle = pMetaISectRectClipRegionAction->GetRect();
460 12 : rWriter.attribute("top", aRectangle.Top());
461 12 : rWriter.attribute("left", aRectangle.Left());
462 12 : rWriter.attribute("bottom", aRectangle.Bottom());
463 12 : rWriter.attribute("right", aRectangle.Right());
464 :
465 12 : rWriter.endElement();
466 : }
467 12 : break;
468 :
469 : case MetaActionType::POLYLINE:
470 : {
471 46 : MetaPolyLineAction* pMetaPolyLineAction = static_cast<MetaPolyLineAction*>(pAction);
472 46 : rWriter.startElement(sCurrentElementTag);
473 :
474 46 : Polygon aPolygon = pMetaPolyLineAction->GetPolygon();
475 451 : for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++)
476 : {
477 405 : rWriter.startElement("point");
478 405 : rWriter.attribute("x", aPolygon[i].X());
479 405 : rWriter.attribute("y", aPolygon[i].Y());
480 405 : rWriter.endElement();
481 : }
482 :
483 92 : LineInfo aLineInfo = pMetaPolyLineAction->GetLineInfo();
484 46 : rWriter.attribute("style", convertLineStyleToString(aLineInfo.GetStyle()));
485 46 : rWriter.attribute("width", aLineInfo.GetWidth());
486 46 : rWriter.attribute("dashlen", aLineInfo.GetDashLen());
487 46 : rWriter.attribute("dotlen", aLineInfo.GetDotLen());
488 46 : rWriter.attribute("distance", aLineInfo.GetDistance());
489 :
490 92 : rWriter.endElement();
491 : }
492 46 : break;
493 :
494 : case MetaActionType::POLYGON:
495 : {
496 0 : MetaPolygonAction* pMetaPolygonAction = static_cast<MetaPolygonAction*>(pAction);
497 0 : rWriter.startElement(sCurrentElementTag);
498 :
499 0 : Polygon aPolygon = pMetaPolygonAction->GetPolygon();
500 0 : for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++)
501 : {
502 0 : rWriter.startElement("point");
503 0 : rWriter.attribute("x", aPolygon[i].X());
504 0 : rWriter.attribute("y", aPolygon[i].Y());
505 0 : rWriter.endElement();
506 : }
507 :
508 0 : rWriter.endElement();
509 : }
510 0 : break;
511 :
512 : case MetaActionType::COMMENT:
513 : {
514 12 : MetaCommentAction* pMetaCommentAction = static_cast<MetaCommentAction*>(pAction);
515 12 : rWriter.startElement(sCurrentElementTag);
516 :
517 12 : if (pMetaCommentAction->GetDataSize() > 0)
518 : {
519 6 : rWriter.attribute("datasize", pMetaCommentAction->GetDataSize());
520 : }
521 12 : if (!pMetaCommentAction->GetComment().isEmpty())
522 : {
523 12 : rWriter.startElement("comment");
524 12 : rWriter.content(pMetaCommentAction->GetComment());
525 12 : rWriter.endElement();
526 : }
527 :
528 12 : rWriter.endElement();
529 : }
530 12 : break;
531 :
532 : default:
533 : {
534 3 : rWriter.element(sCurrentElementTag);
535 : }
536 3 : break;
537 : }
538 106 : }
539 378 : }
540 :
541 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|