Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * Version: MPL 1.1 / GPLv3+ / LGPLv3+
4 : : *
5 : : * The contents of this file are subject to the Mozilla Public License Version
6 : : * 1.1 (the "License"); you may not use this file except in compliance with
7 : : * the License or as specified alternatively below. You may obtain a copy of
8 : : * the License at http://www.mozilla.org/MPL/
9 : : *
10 : : * Software distributed under the License is distributed on an "AS IS" basis,
11 : : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 : : * for the specific language governing rights and limitations under the
13 : : * License.
14 : : *
15 : : * Major Contributor(s):
16 : : * [ Copyright (C) 2011 Lubos Lunak <l.lunak@suse.cz> (initial developer) ]
17 : : *
18 : : * All Rights Reserved.
19 : : *
20 : : * For minor contributions see the git repository.
21 : : *
22 : : * Alternatively, the contents of this file may be used under the terms of
23 : : * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
24 : : * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
25 : : * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
26 : : * instead of those above.
27 : : */
28 : :
29 : : #include "doc.hxx"
30 : : #include "ndtxt.hxx"
31 : :
32 : : #include <libxml/encoding.h>
33 : : #include <libxml/xmlwriter.h>
34 : :
35 : : namespace
36 : : {
37 : :
38 : : // Small helper class to ensure that we write to nodes.xml if nothing
39 : : // has been explicitly specified.
40 : : // Always use at the beginning of dumpAsXml().
41 : : // Also, there are some functions to save typing.
42 : : class WriterHelper
43 : : {
44 : : public:
45 : : WriterHelper( xmlTextWriterPtr );
46 : : ~WriterHelper();
47 : : operator xmlTextWriterPtr();
48 : : xmlTextWriterPtr operator->();
49 : : void startElement( const char* element );
50 : : void endElement();
51 : : void writeFormatAttribute( const char* attribute, const char* format, ... )
52 : : #ifdef LIBXML_ATTR_FORMAT
53 : : LIBXML_ATTR_FORMAT(3,4)
54 : : #endif
55 : : ;
56 : : private:
57 : : xmlTextWriterPtr writer;
58 : : bool owns;
59 : : };
60 : :
61 : 0 : WriterHelper::WriterHelper( xmlTextWriterPtr w )
62 : : : writer( w )
63 : 0 : , owns( false )
64 : : {
65 [ # # ]: 0 : if( writer == NULL )
66 : : {
67 : 0 : writer = xmlNewTextWriterFilename( "nodes.xml", 0 );
68 : 0 : xmlTextWriterStartDocument( writer, NULL, NULL, NULL );
69 : 0 : owns = true;
70 : : }
71 : 0 : }
72 : :
73 : 0 : WriterHelper::~WriterHelper()
74 : : {
75 [ # # ]: 0 : if( owns )
76 : : {
77 : 0 : xmlTextWriterEndDocument( writer );
78 : 0 : xmlFreeTextWriter( writer );
79 : : }
80 : 0 : }
81 : :
82 : 0 : WriterHelper::operator xmlTextWriterPtr()
83 : : {
84 : 0 : return writer;
85 : : }
86 : :
87 : 0 : xmlTextWriterPtr WriterHelper::operator->()
88 : : {
89 : 0 : return writer;
90 : : }
91 : :
92 : 0 : void WriterHelper::startElement( const char* element )
93 : : {
94 : 0 : xmlTextWriterStartElement( writer, BAD_CAST( element ));
95 : 0 : }
96 : :
97 : 0 : void WriterHelper::endElement()
98 : : {
99 : 0 : xmlTextWriterEndElement( writer );
100 : 0 : }
101 : :
102 : 0 : void WriterHelper::writeFormatAttribute( const char* attribute, const char* format, ... )
103 : : {
104 : : va_list va;
105 : 0 : va_start( va, format );
106 [ # # ]: 0 : xmlTextWriterWriteVFormatAttribute( writer, BAD_CAST( attribute ), format, va );
107 : 0 : va_end( va );
108 : 0 : }
109 : :
110 : : }
111 : :
112 : 0 : void SwDoc::dumpAsXml( xmlTextWriterPtr w )
113 : : {
114 [ # # ]: 0 : WriterHelper writer( w );
115 [ # # ]: 0 : writer.startElement( "doc" );
116 [ # # ]: 0 : writer.writeFormatAttribute( "ptr", "%p", this );
117 [ # # ]: 0 : m_pNodes->dumpAsXml( writer );
118 [ # # ][ # # ]: 0 : writer.endElement();
119 : 0 : }
120 : :
121 : 0 : void SwNodes::dumpAsXml( xmlTextWriterPtr w )
122 : : {
123 [ # # ]: 0 : WriterHelper writer( w );
124 [ # # ]: 0 : writer.startElement( "swnodes" );
125 [ # # ]: 0 : writer.writeFormatAttribute( "ptr", "%p", this );
126 [ # # ]: 0 : for( unsigned int i = 0; i < Count(); ++i )
127 : : {
128 [ # # ][ # # ]: 0 : ( *this )[ i ]->dumpAsXml( writer );
129 : : }
130 [ # # ][ # # ]: 0 : writer.endElement();
131 : 0 : }
132 : :
133 : 0 : void SwNode::dumpAsXml( xmlTextWriterPtr w )
134 : : {
135 [ # # ]: 0 : WriterHelper writer( w );
136 : 0 : const char* name = "???";
137 [ # # # # : 0 : switch( GetNodeType())
# # ]
138 : : {
139 : : case ND_ENDNODE:
140 : 0 : name = "end";
141 : 0 : break;
142 : : case ND_STARTNODE:
143 : : case ND_TEXTNODE:
144 : 0 : abort(); // overriden
145 : : case ND_TABLENODE:
146 : 0 : name = "table";
147 : 0 : break;
148 : : case ND_GRFNODE:
149 : 0 : name = "grf";
150 : 0 : break;
151 : : case ND_OLENODE:
152 : 0 : name = "ole";
153 : 0 : break;
154 : : }
155 [ # # ]: 0 : writer.startElement( name );
156 [ # # ]: 0 : writer.writeFormatAttribute( "ptr", "%p", this );
157 [ # # ]: 0 : writer.writeFormatAttribute( "index", "%lu", GetIndex() );
158 [ # # ]: 0 : writer.endElement();
159 [ # # ]: 0 : if( GetNodeType() == ND_ENDNODE )
160 [ # # ][ # # ]: 0 : writer.endElement(); // end start node
161 : 0 : }
162 : :
163 : 0 : void SwStartNode::dumpAsXml( xmlTextWriterPtr w )
164 : : {
165 [ # # ]: 0 : WriterHelper writer( w );
166 : 0 : const char* name = "???";
167 [ # # # # : 0 : switch( GetStartNodeType())
# # # ]
168 : : {
169 : : case SwNormalStartNode:
170 : 0 : name = "start";
171 : 0 : break;
172 : : case SwTableBoxStartNode:
173 : 0 : name = "tablebox";
174 : 0 : break;
175 : : case SwFlyStartNode:
176 : 0 : name = "fly";
177 : 0 : break;
178 : : case SwFootnoteStartNode:
179 : 0 : name = "footnote";
180 : 0 : break;
181 : : case SwHeaderStartNode:
182 : 0 : name = "header";
183 : 0 : break;
184 : : case SwFooterStartNode:
185 : 0 : name = "footer";
186 : 0 : break;
187 : : }
188 [ # # ]: 0 : writer.startElement( name );
189 [ # # ]: 0 : writer.writeFormatAttribute( "ptr", "%p", this );
190 [ # # ][ # # ]: 0 : writer.writeFormatAttribute( "index", "%lu", GetIndex() );
191 : : // writer.endElement(); - it is a start node, so don't end, will make xml better nested
192 : 0 : }
193 : :
194 : 0 : void SwTxtNode::dumpAsXml( xmlTextWriterPtr w )
195 : : {
196 [ # # ]: 0 : WriterHelper writer( w );
197 [ # # ]: 0 : writer.startElement( "text" );
198 [ # # ]: 0 : writer.writeFormatAttribute( "ptr", "%p", this );
199 [ # # ]: 0 : writer.writeFormatAttribute( "index", "%lu", GetIndex() );
200 [ # # ]: 0 : rtl::OUString txt = GetTxt();
201 [ # # ]: 0 : for( int i = 0; i < 32; ++i )
202 : 0 : txt = txt.replace( i, '*' );
203 [ # # ]: 0 : rtl::OString txt8 = ::rtl::OUStringToOString( txt, RTL_TEXTENCODING_UTF8 );
204 [ # # ]: 0 : xmlTextWriterWriteString( writer, BAD_CAST( txt8.getStr()));
205 [ # # ][ # # ]: 0 : writer.endElement();
206 : 0 : }
207 : :
208 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|