xref: /aoo4110/main/sax/test/saxdemo.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski //------------------------------------------------------
25*b1cdbd2cSJim Jagielski // testcomponent - Loads a service and its testcomponent from dlls performs a test.
26*b1cdbd2cSJim Jagielski // Expands the dll-names depending on the actual environment.
27*b1cdbd2cSJim Jagielski // Example : testcomponent stardiv.uno.io.Pipe stm
28*b1cdbd2cSJim Jagielski //
29*b1cdbd2cSJim Jagielski // Therefor the testcode must exist in teststm and the testservice must be named test.stardiv.uno.io.Pipe
30*b1cdbd2cSJim Jagielski //
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <stdio.h>
33*b1cdbd2cSJim Jagielski #include <vector>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <com/sun/star/registry/XImplementationRegistration.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/SAXParseException.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XParser.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XOutputStream.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataSource.hpp>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #include <cppuhelper/servicefactory.hxx>
46*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
47*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase3.hxx>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #include <vos/dynload.hxx>
50*b1cdbd2cSJim Jagielski #include <vos/diagnose.hxx>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski using namespace ::rtl;
53*b1cdbd2cSJim Jagielski using namespace ::std;
54*b1cdbd2cSJim Jagielski using namespace ::cppu;
55*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
56*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
57*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::registry;
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::xml::sax;
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::io;
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski /************
63*b1cdbd2cSJim Jagielski  * Sequence of bytes -> InputStream
64*b1cdbd2cSJim Jagielski  ************/
65*b1cdbd2cSJim Jagielski class OInputStream : public WeakImplHelper1 < XInputStream >
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski public:
OInputStream(const Sequence<sal_Int8> & seq)68*b1cdbd2cSJim Jagielski 	OInputStream( const Sequence< sal_Int8 >&seq ) :
69*b1cdbd2cSJim Jagielski 		m_seq( seq ),
70*b1cdbd2cSJim Jagielski 		nPos( 0 )
71*b1cdbd2cSJim Jagielski 		{}
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski public:
readBytes(Sequence<sal_Int8> & aData,sal_Int32 nBytesToRead)74*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL readBytes( Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead )
75*b1cdbd2cSJim Jagielski 		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
76*b1cdbd2cSJim Jagielski 		{
77*b1cdbd2cSJim Jagielski 			nBytesToRead = (nBytesToRead > m_seq.getLength() - nPos ) ?
78*b1cdbd2cSJim Jagielski 				m_seq.getLength() - nPos :
79*b1cdbd2cSJim Jagielski 				nBytesToRead;
80*b1cdbd2cSJim Jagielski 			aData = Sequence< sal_Int8 > ( &(m_seq.getConstArray()[nPos]) , nBytesToRead );
81*b1cdbd2cSJim Jagielski 			nPos += nBytesToRead;
82*b1cdbd2cSJim Jagielski 			return nBytesToRead;
83*b1cdbd2cSJim Jagielski 		}
readSomeBytes(::com::sun::star::uno::Sequence<sal_Int8> & aData,sal_Int32 nMaxBytesToRead)84*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL readSomeBytes(
85*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Sequence< sal_Int8 >& aData,
86*b1cdbd2cSJim Jagielski 		sal_Int32 nMaxBytesToRead )
87*b1cdbd2cSJim Jagielski 		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
88*b1cdbd2cSJim Jagielski 		{
89*b1cdbd2cSJim Jagielski 			return readBytes( aData, nMaxBytesToRead );
90*b1cdbd2cSJim Jagielski 		}
skipBytes(sal_Int32 nBytesToSkip)91*b1cdbd2cSJim Jagielski     virtual void SAL_CALL skipBytes( sal_Int32 nBytesToSkip )
92*b1cdbd2cSJim Jagielski 		throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException)
93*b1cdbd2cSJim Jagielski 		{
94*b1cdbd2cSJim Jagielski 			// not implemented
95*b1cdbd2cSJim Jagielski 		}
available()96*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL available(  )
97*b1cdbd2cSJim Jagielski 		throw(NotConnectedException, IOException, RuntimeException)
98*b1cdbd2cSJim Jagielski 		{
99*b1cdbd2cSJim Jagielski 			return m_seq.getLength() - nPos;
100*b1cdbd2cSJim Jagielski 		}
closeInput()101*b1cdbd2cSJim Jagielski     virtual void SAL_CALL closeInput(  )
102*b1cdbd2cSJim Jagielski 		throw(NotConnectedException, IOException, RuntimeException)
103*b1cdbd2cSJim Jagielski 		{
104*b1cdbd2cSJim Jagielski 			// not needed
105*b1cdbd2cSJim Jagielski 		}
106*b1cdbd2cSJim Jagielski 	sal_Int32 nPos;
107*b1cdbd2cSJim Jagielski 	Sequence< sal_Int8> m_seq;
108*b1cdbd2cSJim Jagielski };
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski //-------------------------------
111*b1cdbd2cSJim Jagielski // Helper : create an input stream from a file
112*b1cdbd2cSJim Jagielski //------------------------------
createStreamFromFile(const char * pcFile)113*b1cdbd2cSJim Jagielski Reference< XInputStream > createStreamFromFile(
114*b1cdbd2cSJim Jagielski 	const char *pcFile )
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski 	FILE *f = fopen( pcFile , "rb" );
117*b1cdbd2cSJim Jagielski 	Reference<  XInputStream >  r;
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 	if( f ) {
120*b1cdbd2cSJim Jagielski 		fseek( f , 0 , SEEK_END );
121*b1cdbd2cSJim Jagielski 		int nLength = ftell( f );
122*b1cdbd2cSJim Jagielski 		fseek( f , 0 , SEEK_SET );
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 		Sequence<sal_Int8> seqIn(nLength);
125*b1cdbd2cSJim Jagielski 		fread( seqIn.getArray() , nLength , 1 , f );
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski 		r = Reference< XInputStream > ( new OInputStream( seqIn ) );
128*b1cdbd2cSJim Jagielski 		fclose( f );
129*b1cdbd2cSJim Jagielski 	}
130*b1cdbd2cSJim Jagielski 	return r;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski //-----------------------------------------
134*b1cdbd2cSJim Jagielski // The document handler, which is needed for the saxparser
135*b1cdbd2cSJim Jagielski // The Documenthandler for reading sax
136*b1cdbd2cSJim Jagielski //-----------------------------------------
137*b1cdbd2cSJim Jagielski class TestDocumentHandler :
138*b1cdbd2cSJim Jagielski 	public WeakImplHelper3< XExtendedDocumentHandler , XEntityResolver , XErrorHandler >
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski public:
TestDocumentHandler()141*b1cdbd2cSJim Jagielski 	TestDocumentHandler(  )
142*b1cdbd2cSJim Jagielski 	{
143*b1cdbd2cSJim Jagielski 	}
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski public: // Error handler
error(const Any & aSAXParseException)146*b1cdbd2cSJim Jagielski     virtual void SAL_CALL error(const Any& aSAXParseException) throw (SAXException, RuntimeException)
147*b1cdbd2cSJim Jagielski     {
148*b1cdbd2cSJim Jagielski     	printf( "Error !\n" );
149*b1cdbd2cSJim Jagielski     	throw  SAXException(
150*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("error from error handler")) ,
151*b1cdbd2cSJim Jagielski 			Reference < XInterface >() ,
152*b1cdbd2cSJim Jagielski 			aSAXParseException );
153*b1cdbd2cSJim Jagielski     }
fatalError(const Any & aSAXParseException)154*b1cdbd2cSJim Jagielski     virtual void SAL_CALL fatalError(const Any& aSAXParseException) throw (SAXException, RuntimeException)
155*b1cdbd2cSJim Jagielski     {
156*b1cdbd2cSJim Jagielski     	printf( "Fatal Error !\n" );
157*b1cdbd2cSJim Jagielski     }
warning(const Any & aSAXParseException)158*b1cdbd2cSJim Jagielski     virtual void SAL_CALL warning(const Any& aSAXParseException) throw (SAXException, RuntimeException)
159*b1cdbd2cSJim Jagielski     {
160*b1cdbd2cSJim Jagielski     	printf( "Warning !\n" );
161*b1cdbd2cSJim Jagielski     }
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski public: // ExtendedDocumentHandler
165*b1cdbd2cSJim Jagielski 
startDocument(void)166*b1cdbd2cSJim Jagielski     virtual void SAL_CALL startDocument(void) throw (SAXException, RuntimeException)
167*b1cdbd2cSJim Jagielski     {
168*b1cdbd2cSJim Jagielski 		m_iElementCount = 0;
169*b1cdbd2cSJim Jagielski 		m_iAttributeCount = 0;
170*b1cdbd2cSJim Jagielski 		m_iWhitespaceCount =0;
171*b1cdbd2cSJim Jagielski 		m_iCharCount=0;
172*b1cdbd2cSJim Jagielski    		printf( "document started\n" );
173*b1cdbd2cSJim Jagielski     }
endDocument(void)174*b1cdbd2cSJim Jagielski     virtual void SAL_CALL endDocument(void) throw (SAXException, RuntimeException)
175*b1cdbd2cSJim Jagielski     {
176*b1cdbd2cSJim Jagielski 		printf( "document finished\n" );
177*b1cdbd2cSJim Jagielski 		printf( "(ElementCount %d),(AttributeCount %d),(WhitespaceCount %d),(CharCount %d)\n",
178*b1cdbd2cSJim Jagielski 				m_iElementCount, m_iAttributeCount, m_iWhitespaceCount , m_iCharCount );
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski     }
startElement(const OUString & aName,const Reference<XAttributeList> & xAttribs)181*b1cdbd2cSJim Jagielski     virtual void SAL_CALL startElement(const OUString& aName,
182*b1cdbd2cSJim Jagielski 							  const Reference< XAttributeList > & xAttribs)
183*b1cdbd2cSJim Jagielski 		throw (SAXException,RuntimeException)
184*b1cdbd2cSJim Jagielski 	{
185*b1cdbd2cSJim Jagielski     	m_iElementCount ++;
186*b1cdbd2cSJim Jagielski     	m_iAttributeCount += xAttribs->getLength();
187*b1cdbd2cSJim Jagielski     }
188*b1cdbd2cSJim Jagielski 
endElement(const OUString & aName)189*b1cdbd2cSJim Jagielski     virtual void SAL_CALL endElement(const OUString& aName) throw (SAXException,RuntimeException)
190*b1cdbd2cSJim Jagielski     {
191*b1cdbd2cSJim Jagielski 		// ignored
192*b1cdbd2cSJim Jagielski     }
193*b1cdbd2cSJim Jagielski 
characters(const OUString & aChars)194*b1cdbd2cSJim Jagielski     virtual void SAL_CALL characters(const OUString& aChars) throw (SAXException,RuntimeException)
195*b1cdbd2cSJim Jagielski     {
196*b1cdbd2cSJim Jagielski     	m_iCharCount += aChars.getLength();
197*b1cdbd2cSJim Jagielski     }
ignorableWhitespace(const OUString & aWhitespaces)198*b1cdbd2cSJim Jagielski     virtual void SAL_CALL ignorableWhitespace(const OUString& aWhitespaces) throw (SAXException,RuntimeException)
199*b1cdbd2cSJim Jagielski     {
200*b1cdbd2cSJim Jagielski 		m_iWhitespaceCount += aWhitespaces.getLength();
201*b1cdbd2cSJim Jagielski     }
202*b1cdbd2cSJim Jagielski 
processingInstruction(const OUString & aTarget,const OUString & aData)203*b1cdbd2cSJim Jagielski     virtual void SAL_CALL processingInstruction(const OUString& aTarget, const OUString& aData) throw (SAXException,RuntimeException)
204*b1cdbd2cSJim Jagielski     {
205*b1cdbd2cSJim Jagielski 		// ignored
206*b1cdbd2cSJim Jagielski     }
207*b1cdbd2cSJim Jagielski 
setDocumentLocator(const Reference<XLocator> & xLocator)208*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setDocumentLocator(const Reference< XLocator> & xLocator)
209*b1cdbd2cSJim Jagielski 		throw (SAXException,RuntimeException)
210*b1cdbd2cSJim Jagielski     {
211*b1cdbd2cSJim Jagielski 		// ignored
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski 
resolveEntity(const OUString & sPublicId,const OUString & sSystemId)214*b1cdbd2cSJim Jagielski     virtual InputSource SAL_CALL resolveEntity(
215*b1cdbd2cSJim Jagielski 		const OUString& sPublicId,
216*b1cdbd2cSJim Jagielski 		const OUString& sSystemId)
217*b1cdbd2cSJim Jagielski 		throw (SAXException,RuntimeException)
218*b1cdbd2cSJim Jagielski 	{
219*b1cdbd2cSJim Jagielski 		InputSource source;
220*b1cdbd2cSJim Jagielski 		source.sSystemId = sSystemId;
221*b1cdbd2cSJim Jagielski 		source.sPublicId = sPublicId;
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski 		source.aInputStream = createStreamFromFile(
224*b1cdbd2cSJim Jagielski 			OUStringToOString( sSystemId , RTL_TEXTENCODING_ASCII_US) );
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 		return source;
227*b1cdbd2cSJim Jagielski 	}
228*b1cdbd2cSJim Jagielski 
startCDATA(void)229*b1cdbd2cSJim Jagielski     virtual void SAL_CALL startCDATA(void) throw (SAXException,RuntimeException)
230*b1cdbd2cSJim Jagielski     {
231*b1cdbd2cSJim Jagielski     }
endCDATA(void)232*b1cdbd2cSJim Jagielski     virtual void SAL_CALL endCDATA(void) throw (SAXException,RuntimeException)
233*b1cdbd2cSJim Jagielski     {
234*b1cdbd2cSJim Jagielski     }
comment(const OUString & sComment)235*b1cdbd2cSJim Jagielski     virtual void SAL_CALL comment(const OUString& sComment) throw (SAXException,RuntimeException)
236*b1cdbd2cSJim Jagielski     {
237*b1cdbd2cSJim Jagielski     }
unknown(const OUString & sString)238*b1cdbd2cSJim Jagielski     virtual void SAL_CALL unknown(const OUString& sString) throw (SAXException,RuntimeException)
239*b1cdbd2cSJim Jagielski     {
240*b1cdbd2cSJim Jagielski     }
241*b1cdbd2cSJim Jagielski 
allowLineBreak(void)242*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL allowLineBreak( void) throw (SAXException, RuntimeException )
243*b1cdbd2cSJim Jagielski 	{
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	}
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski public:
248*b1cdbd2cSJim Jagielski 	int m_iElementCount;
249*b1cdbd2cSJim Jagielski 	int m_iAttributeCount;
250*b1cdbd2cSJim Jagielski 	int m_iWhitespaceCount;
251*b1cdbd2cSJim Jagielski 	int m_iCharCount;
252*b1cdbd2cSJim Jagielski };
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski //--------------------------------------
255*b1cdbd2cSJim Jagielski // helper implementation for writing
256*b1cdbd2cSJim Jagielski // implements an XAttributeList
257*b1cdbd2cSJim Jagielski //-------------------------------------
258*b1cdbd2cSJim Jagielski struct AttributeListImpl_impl;
259*b1cdbd2cSJim Jagielski class AttributeListImpl : public WeakImplHelper1< XAttributeList >
260*b1cdbd2cSJim Jagielski {
261*b1cdbd2cSJim Jagielski public:
262*b1cdbd2cSJim Jagielski 	AttributeListImpl();
263*b1cdbd2cSJim Jagielski 	AttributeListImpl( const AttributeListImpl & );
264*b1cdbd2cSJim Jagielski 	~AttributeListImpl();
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski public:
267*b1cdbd2cSJim Jagielski     virtual sal_Int16 SAL_CALL getLength(void) throw  (RuntimeException);
268*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL getNameByIndex(sal_Int16 i) throw  (RuntimeException);
269*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL getTypeByIndex(sal_Int16 i) throw  (RuntimeException);
270*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL getTypeByName(const OUString& aName) throw  (RuntimeException);
271*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL getValueByIndex(sal_Int16 i) throw  (RuntimeException);
272*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL getValueByName(const OUString& aName) throw  (RuntimeException);
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski public:
275*b1cdbd2cSJim Jagielski 	void addAttribute( const OUString &sName ,
276*b1cdbd2cSJim Jagielski 					   const OUString &sType ,
277*b1cdbd2cSJim Jagielski 					   const OUString &sValue );
278*b1cdbd2cSJim Jagielski 	void clear();
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski private:
281*b1cdbd2cSJim Jagielski 	struct AttributeListImpl_impl *m_pImpl;
282*b1cdbd2cSJim Jagielski };
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski struct TagAttribute
286*b1cdbd2cSJim Jagielski {
TagAttributeTagAttribute287*b1cdbd2cSJim Jagielski 	TagAttribute(){}
TagAttributeTagAttribute288*b1cdbd2cSJim Jagielski 	TagAttribute( const OUString &sName,
289*b1cdbd2cSJim Jagielski 				  const OUString &sType ,
290*b1cdbd2cSJim Jagielski 				  const OUString &sValue )
291*b1cdbd2cSJim Jagielski 	{
292*b1cdbd2cSJim Jagielski 		this->sName 	= sName;
293*b1cdbd2cSJim Jagielski 		this->sType 	= sType;
294*b1cdbd2cSJim Jagielski 		this->sValue 	= sValue;
295*b1cdbd2cSJim Jagielski 	}
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 	OUString sName;
298*b1cdbd2cSJim Jagielski 	OUString sType;
299*b1cdbd2cSJim Jagielski 	OUString sValue;
300*b1cdbd2cSJim Jagielski };
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski struct AttributeListImpl_impl
303*b1cdbd2cSJim Jagielski {
AttributeListImpl_implAttributeListImpl_impl304*b1cdbd2cSJim Jagielski 	AttributeListImpl_impl()
305*b1cdbd2cSJim Jagielski 	{
306*b1cdbd2cSJim Jagielski 		// performance improvement during adding
307*b1cdbd2cSJim Jagielski 		vecAttribute.reserve(20);
308*b1cdbd2cSJim Jagielski 	}
309*b1cdbd2cSJim Jagielski 	vector<struct TagAttribute> vecAttribute;
310*b1cdbd2cSJim Jagielski };
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 
getLength(void)314*b1cdbd2cSJim Jagielski sal_Int16 AttributeListImpl::getLength(void) throw  (RuntimeException)
315*b1cdbd2cSJim Jagielski {
316*b1cdbd2cSJim Jagielski 	return m_pImpl->vecAttribute.size();
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 
AttributeListImpl(const AttributeListImpl & r)320*b1cdbd2cSJim Jagielski AttributeListImpl::AttributeListImpl( const AttributeListImpl &r )
321*b1cdbd2cSJim Jagielski {
322*b1cdbd2cSJim Jagielski 	m_pImpl = new AttributeListImpl_impl;
323*b1cdbd2cSJim Jagielski 	*m_pImpl = *(r.m_pImpl);
324*b1cdbd2cSJim Jagielski }
325*b1cdbd2cSJim Jagielski 
getNameByIndex(sal_Int16 i)326*b1cdbd2cSJim Jagielski OUString AttributeListImpl::getNameByIndex(sal_Int16 i) throw  (RuntimeException)
327*b1cdbd2cSJim Jagielski {
328*b1cdbd2cSJim Jagielski 	if( i < m_pImpl->vecAttribute.size() ) {
329*b1cdbd2cSJim Jagielski 		return m_pImpl->vecAttribute[i].sName;
330*b1cdbd2cSJim Jagielski 	}
331*b1cdbd2cSJim Jagielski 	return OUString();
332*b1cdbd2cSJim Jagielski }
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 
getTypeByIndex(sal_Int16 i)335*b1cdbd2cSJim Jagielski OUString AttributeListImpl::getTypeByIndex(sal_Int16 i) throw  (RuntimeException)
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski 	if( i < m_pImpl->vecAttribute.size() ) {
338*b1cdbd2cSJim Jagielski 		return m_pImpl->vecAttribute[i].sType;
339*b1cdbd2cSJim Jagielski 	}
340*b1cdbd2cSJim Jagielski 	return OUString();
341*b1cdbd2cSJim Jagielski }
342*b1cdbd2cSJim Jagielski 
getValueByIndex(sal_Int16 i)343*b1cdbd2cSJim Jagielski OUString AttributeListImpl::getValueByIndex(sal_Int16 i) throw  (RuntimeException)
344*b1cdbd2cSJim Jagielski {
345*b1cdbd2cSJim Jagielski 	if( i < m_pImpl->vecAttribute.size() ) {
346*b1cdbd2cSJim Jagielski 		return m_pImpl->vecAttribute[i].sValue;
347*b1cdbd2cSJim Jagielski 	}
348*b1cdbd2cSJim Jagielski 	return OUString();
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski }
351*b1cdbd2cSJim Jagielski 
getTypeByName(const OUString & sName)352*b1cdbd2cSJim Jagielski OUString AttributeListImpl::getTypeByName( const OUString& sName ) throw  (RuntimeException)
353*b1cdbd2cSJim Jagielski {
354*b1cdbd2cSJim Jagielski 	vector<struct TagAttribute>::iterator ii = m_pImpl->vecAttribute.begin();
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 	for( ; ii != m_pImpl->vecAttribute.end() ; ii ++ ) {
357*b1cdbd2cSJim Jagielski 		if( (*ii).sName == sName ) {
358*b1cdbd2cSJim Jagielski 			return (*ii).sType;
359*b1cdbd2cSJim Jagielski 		}
360*b1cdbd2cSJim Jagielski 	}
361*b1cdbd2cSJim Jagielski 	return OUString();
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski 
getValueByName(const OUString & sName)364*b1cdbd2cSJim Jagielski OUString AttributeListImpl::getValueByName(const OUString& sName) throw  (RuntimeException)
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski 	vector<struct TagAttribute>::iterator ii = m_pImpl->vecAttribute.begin();
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 	for( ; ii != m_pImpl->vecAttribute.end() ; ii ++ ) {
369*b1cdbd2cSJim Jagielski 		if( (*ii).sName == sName ) {
370*b1cdbd2cSJim Jagielski 			return (*ii).sValue;
371*b1cdbd2cSJim Jagielski 		}
372*b1cdbd2cSJim Jagielski 	}
373*b1cdbd2cSJim Jagielski 	return OUString();
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 
AttributeListImpl()378*b1cdbd2cSJim Jagielski AttributeListImpl::AttributeListImpl()
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski 	m_pImpl = new AttributeListImpl_impl;
381*b1cdbd2cSJim Jagielski }
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 
~AttributeListImpl()385*b1cdbd2cSJim Jagielski AttributeListImpl::~AttributeListImpl()
386*b1cdbd2cSJim Jagielski {
387*b1cdbd2cSJim Jagielski 	delete m_pImpl;
388*b1cdbd2cSJim Jagielski }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 
addAttribute(const OUString & sName,const OUString & sType,const OUString & sValue)391*b1cdbd2cSJim Jagielski void AttributeListImpl::addAttribute( 	const OUString &sName ,
392*b1cdbd2cSJim Jagielski 										const OUString &sType ,
393*b1cdbd2cSJim Jagielski 										const OUString &sValue )
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski 	m_pImpl->vecAttribute.push_back( TagAttribute( sName , sType , sValue ) );
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski 
clear()398*b1cdbd2cSJim Jagielski void AttributeListImpl::clear()
399*b1cdbd2cSJim Jagielski {
400*b1cdbd2cSJim Jagielski 	m_pImpl->vecAttribute.clear();
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski //--------------------------------------
405*b1cdbd2cSJim Jagielski // helper function for writing
406*b1cdbd2cSJim Jagielski // ensures that linebreaks are inserted
407*b1cdbd2cSJim Jagielski // when writing a long text.
408*b1cdbd2cSJim Jagielski // Note: this implementation may be a bit slow,
409*b1cdbd2cSJim Jagielski // but it shows, how the SAX-Writer handles the allowLineBreak calls.
410*b1cdbd2cSJim Jagielski //--------------------------------------
writeParagraphHelper(const Reference<XExtendedDocumentHandler> & r,const OUString & s)411*b1cdbd2cSJim Jagielski void writeParagraphHelper(
412*b1cdbd2cSJim Jagielski 	const  Reference< XExtendedDocumentHandler > &r ,
413*b1cdbd2cSJim Jagielski 	const OUString & s)
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski 	int nMax = s.getLength();
416*b1cdbd2cSJim Jagielski 	int nStart = 0;
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 	Sequence<sal_uInt16> seq( s.getLength() );
419*b1cdbd2cSJim Jagielski 	memcpy( seq.getArray() , s.getStr() , s.getLength() * sizeof( sal_uInt16 ) );
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski 	for( int n = 1 ; n < nMax ; n++ ){
422*b1cdbd2cSJim Jagielski 		if( 32 == seq.getArray()[n] ) {
423*b1cdbd2cSJim Jagielski 			r->allowLineBreak();
424*b1cdbd2cSJim Jagielski 			r->characters( s.copy( nStart , n - nStart ) );
425*b1cdbd2cSJim Jagielski 			nStart = n;
426*b1cdbd2cSJim Jagielski 		}
427*b1cdbd2cSJim Jagielski 	}
428*b1cdbd2cSJim Jagielski 	r->allowLineBreak();
429*b1cdbd2cSJim Jagielski 	r->characters( s.copy( nStart , n - nStart ) );
430*b1cdbd2cSJim Jagielski }
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski //---------------------------------
434*b1cdbd2cSJim Jagielski // helper implementation for SAX-Writer
435*b1cdbd2cSJim Jagielski // writes data to a file
436*b1cdbd2cSJim Jagielski //--------------------------------
437*b1cdbd2cSJim Jagielski class OFileWriter :
438*b1cdbd2cSJim Jagielski 		public WeakImplHelper1< XOutputStream >
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski public:
OFileWriter(char * pcFile)441*b1cdbd2cSJim Jagielski 	OFileWriter( char *pcFile ) { strncpy( m_pcFile , pcFile, 256 - 1 ); m_f = 0; }
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski public:
445*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeBytes(const Sequence< sal_Int8 >& aData)
446*b1cdbd2cSJim Jagielski 		throw  (NotConnectedException, BufferSizeExceededException, RuntimeException);
447*b1cdbd2cSJim Jagielski     virtual void SAL_CALL flush(void)
448*b1cdbd2cSJim Jagielski 		throw  (NotConnectedException, BufferSizeExceededException, RuntimeException);
449*b1cdbd2cSJim Jagielski     virtual void SAL_CALL closeOutput(void)
450*b1cdbd2cSJim Jagielski 		throw  (NotConnectedException, BufferSizeExceededException, RuntimeException);
451*b1cdbd2cSJim Jagielski private:
452*b1cdbd2cSJim Jagielski 	char m_pcFile[256];
453*b1cdbd2cSJim Jagielski 	FILE *m_f;
454*b1cdbd2cSJim Jagielski };
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski 
writeBytes(const Sequence<sal_Int8> & aData)457*b1cdbd2cSJim Jagielski void OFileWriter::writeBytes(const Sequence< sal_Int8 >& aData)
458*b1cdbd2cSJim Jagielski 	throw  (NotConnectedException, BufferSizeExceededException, RuntimeException)
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski 	if( ! m_f ) {
461*b1cdbd2cSJim Jagielski 		m_f = fopen( m_pcFile , "w" );
462*b1cdbd2cSJim Jagielski 	}
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	fwrite( aData.getConstArray() , 1 , aData.getLength() , m_f );
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 
flush(void)468*b1cdbd2cSJim Jagielski void OFileWriter::flush(void)
469*b1cdbd2cSJim Jagielski 	throw  (NotConnectedException, BufferSizeExceededException, RuntimeException)
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski 	fflush( m_f );
472*b1cdbd2cSJim Jagielski }
473*b1cdbd2cSJim Jagielski 
closeOutput(void)474*b1cdbd2cSJim Jagielski void OFileWriter::closeOutput(void)
475*b1cdbd2cSJim Jagielski 	throw  (NotConnectedException, BufferSizeExceededException, RuntimeException)
476*b1cdbd2cSJim Jagielski {
477*b1cdbd2cSJim Jagielski 	fclose( m_f );
478*b1cdbd2cSJim Jagielski 	m_f = 0;
479*b1cdbd2cSJim Jagielski }
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski // Needed to switch on solaris threads
484*b1cdbd2cSJim Jagielski #ifdef SOLARIS
485*b1cdbd2cSJim Jagielski extern "C" void ChangeGlobalInit();
486*b1cdbd2cSJim Jagielski #endif
main(int argc,char ** argv)487*b1cdbd2cSJim Jagielski int main (int argc, char **argv)
488*b1cdbd2cSJim Jagielski {
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski 	if( argc < 3) {
491*b1cdbd2cSJim Jagielski 		printf( "usage : saxdemo inputfile outputfile\n" );
492*b1cdbd2cSJim Jagielski 		exit( 0 );
493*b1cdbd2cSJim Jagielski 	}
494*b1cdbd2cSJim Jagielski #ifdef SOLARIS
495*b1cdbd2cSJim Jagielski 	// switch on threads in solaris
496*b1cdbd2cSJim Jagielski 	ChangeGlobalInit();
497*b1cdbd2cSJim Jagielski #endif
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski 	// create service manager
500*b1cdbd2cSJim Jagielski 	Reference< XMultiServiceFactory > xSMgr = createRegistryServiceFactory(
501*b1cdbd2cSJim Jagielski 		OUString( RTL_CONSTASCII_USTRINGPARAM( "applicat.rdb" )) );
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski 	Reference < XImplementationRegistration > xReg;
504*b1cdbd2cSJim Jagielski 	try
505*b1cdbd2cSJim Jagielski 	{
506*b1cdbd2cSJim Jagielski 		// Create registration service
507*b1cdbd2cSJim Jagielski 		Reference < XInterface > x = xSMgr->createInstance(
508*b1cdbd2cSJim Jagielski 			OUString::createFromAscii( "com.sun.star.registry.ImplementationRegistration" ) );
509*b1cdbd2cSJim Jagielski 		xReg = Reference<  XImplementationRegistration > ( x , UNO_QUERY );
510*b1cdbd2cSJim Jagielski 	}
511*b1cdbd2cSJim Jagielski 	catch( Exception & ) {
512*b1cdbd2cSJim Jagielski 		printf( "Couldn't create ImplementationRegistration service\n" );
513*b1cdbd2cSJim Jagielski 		exit(1);
514*b1cdbd2cSJim Jagielski 	}
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 	OString sTestName;
517*b1cdbd2cSJim Jagielski 	try
518*b1cdbd2cSJim Jagielski 	{
519*b1cdbd2cSJim Jagielski 		// Load dll for the tested component
520*b1cdbd2cSJim Jagielski 		OUString aDllName =
521*b1cdbd2cSJim Jagielski             OUString::createFromAscii( "sax.uno" SAL_DLLEXTENSION );
522*b1cdbd2cSJim Jagielski 		xReg->registerImplementation(
523*b1cdbd2cSJim Jagielski 			OUString::createFromAscii( "com.sun.star.loader.SharedLibrary" ),
524*b1cdbd2cSJim Jagielski 			aDllName,
525*b1cdbd2cSJim Jagielski 			Reference< XSimpleRegistry > ()  );
526*b1cdbd2cSJim Jagielski 	}
527*b1cdbd2cSJim Jagielski 	catch( Exception &e ) {
528*b1cdbd2cSJim Jagielski 		printf( "Couldn't reach sax dll\n" );
529*b1cdbd2cSJim Jagielski 		printf( "%s\n" , OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US ).getStr() );
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski 		exit(1);
532*b1cdbd2cSJim Jagielski 	}
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 	//--------------------------------
536*b1cdbd2cSJim Jagielski 	// parser demo
537*b1cdbd2cSJim Jagielski 	// read xml from a file and count elements
538*b1cdbd2cSJim Jagielski 	//--------------------------------
539*b1cdbd2cSJim Jagielski 	Reference< XInterface > x = xSMgr->createInstance(
540*b1cdbd2cSJim Jagielski 		OUString::createFromAscii( "com.sun.star.xml.sax.Parser" ) );
541*b1cdbd2cSJim Jagielski 	if( x.is() )
542*b1cdbd2cSJim Jagielski 	{
543*b1cdbd2cSJim Jagielski 		Reference< XParser > rParser( x , UNO_QUERY );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 		// create and connect the document handler to the parser
546*b1cdbd2cSJim Jagielski 		TestDocumentHandler *pDocHandler = new TestDocumentHandler( );
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski 		Reference < XDocumentHandler >	rDocHandler( (XDocumentHandler *) pDocHandler );
549*b1cdbd2cSJim Jagielski 		Reference< XEntityResolver > rEntityResolver( (XEntityResolver *) pDocHandler );
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski 		rParser->setDocumentHandler( rDocHandler );
552*b1cdbd2cSJim Jagielski 		rParser->setEntityResolver( rEntityResolver );
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski 		// create the input stream
555*b1cdbd2cSJim Jagielski 		InputSource source;
556*b1cdbd2cSJim Jagielski 		source.aInputStream = createStreamFromFile( argv[1] );
557*b1cdbd2cSJim Jagielski 		source.sSystemId 	= OUString::createFromAscii( argv[1] );
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 		try
560*b1cdbd2cSJim Jagielski 		{
561*b1cdbd2cSJim Jagielski 			// start parsing
562*b1cdbd2cSJim Jagielski 			rParser->parseStream( source );
563*b1cdbd2cSJim Jagielski 		}
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski 		catch( Exception & e )
566*b1cdbd2cSJim Jagielski 		{
567*b1cdbd2cSJim Jagielski 			OString o1 = OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8 );
568*b1cdbd2cSJim Jagielski 			printf( "Exception during parsing : %s\n" ,  o1.getStr() );
569*b1cdbd2cSJim Jagielski 		}
570*b1cdbd2cSJim Jagielski 	}
571*b1cdbd2cSJim Jagielski 	else
572*b1cdbd2cSJim Jagielski 	{
573*b1cdbd2cSJim Jagielski 		printf( "couln't create sax-parser component\n" );
574*b1cdbd2cSJim Jagielski 	}
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 	//----------------------
578*b1cdbd2cSJim Jagielski 	// The SAX-Writer demo
579*b1cdbd2cSJim Jagielski 	//----------------------
580*b1cdbd2cSJim Jagielski 	x= xSMgr->createInstance( OUString::createFromAscii( "com.sun.star.xml.sax.Writer" ) );
581*b1cdbd2cSJim Jagielski 	if( x.is() )
582*b1cdbd2cSJim Jagielski 	{
583*b1cdbd2cSJim Jagielski 		printf( "start writing to %s\n" , argv[2] );
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 		OFileWriter *pw = new OFileWriter( argv[2] );
586*b1cdbd2cSJim Jagielski 		Reference< XActiveDataSource > source( x , UNO_QUERY );
587*b1cdbd2cSJim Jagielski 		source->setOutputStream( Reference< XOutputStream> ( (XOutputStream*) pw ) );
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski 		AttributeListImpl *pList = new AttributeListImpl;
590*b1cdbd2cSJim Jagielski 		Reference< XAttributeList > rList( (XAttributeList *) pList );
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 		Reference< XExtendedDocumentHandler > r( x , UNO_QUERY );
593*b1cdbd2cSJim Jagielski 		r->startDocument();
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski 		pList->addAttribute( OUString( RTL_CONSTASCII_USTRINGPARAM("Arg1" )),
596*b1cdbd2cSJim Jagielski 							 OUString( RTL_CONSTASCII_USTRINGPARAM("CDATA")) ,
597*b1cdbd2cSJim Jagielski 							 OUString( RTL_CONSTASCII_USTRINGPARAM("foo\n	u")) );
598*b1cdbd2cSJim Jagielski 		pList->addAttribute( OUString( RTL_CONSTASCII_USTRINGPARAM("Arg2")) ,
599*b1cdbd2cSJim Jagielski 							 OUString( RTL_CONSTASCII_USTRINGPARAM("CDATA")) ,
600*b1cdbd2cSJim Jagielski 							 OUString( RTL_CONSTASCII_USTRINGPARAM("foo2")) );
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski 		r->startElement( OUString( RTL_CONSTASCII_USTRINGPARAM("tag1"))  , rList );
603*b1cdbd2cSJim Jagielski 		// tells the writer to insert a linefeed
604*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski 		r->characters( OUString( RTL_CONSTASCII_USTRINGPARAM("huhu")) );
607*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski 		r->startElement( OUString( RTL_CONSTASCII_USTRINGPARAM("hi")) , rList );
610*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
611*b1cdbd2cSJim Jagielski 
612*b1cdbd2cSJim Jagielski 		// the enpassant must be converted & -> &amp;
613*b1cdbd2cSJim Jagielski 		r->characters( OUString( RTL_CONSTASCII_USTRINGPARAM("&#252;")) );
614*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski 		// '>' must not be converted
617*b1cdbd2cSJim Jagielski 		r->startCDATA();
618*b1cdbd2cSJim Jagielski 		r->characters( OUString( RTL_CONSTASCII_USTRINGPARAM(" > foo < "))  );
619*b1cdbd2cSJim Jagielski 		r->endCDATA();
620*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski 		OUString testParagraph = OUString( RTL_CONSTASCII_USTRINGPARAM(
623*b1cdbd2cSJim Jagielski 			"This is only a test to check, if the writer inserts line feeds "
624*b1cdbd2cSJim Jagielski 			"if needed or if the writer puts the whole text into one line." ));
625*b1cdbd2cSJim Jagielski 		writeParagraphHelper( r , testParagraph );
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
628*b1cdbd2cSJim Jagielski 		r->comment( OUString( RTL_CONSTASCII_USTRINGPARAM("This is a comment !")) );
629*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski 		r->startElement( OUString( RTL_CONSTASCII_USTRINGPARAM("emptytagtest"))  , rList );
632*b1cdbd2cSJim Jagielski 		r->endElement( OUString( RTL_CONSTASCII_USTRINGPARAM("emptytagtest")) );
633*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski 		r->endElement( OUString( RTL_CONSTASCII_USTRINGPARAM("hi")) );
636*b1cdbd2cSJim Jagielski 		r->ignorableWhitespace( OUString() );
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski 		r->endElement( OUString( RTL_CONSTASCII_USTRINGPARAM("tag1")) );
639*b1cdbd2cSJim Jagielski 		r->endDocument();
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski 		printf( "finished writing\n" );
642*b1cdbd2cSJim Jagielski 	}
643*b1cdbd2cSJim Jagielski 	else
644*b1cdbd2cSJim Jagielski 	{
645*b1cdbd2cSJim Jagielski 		printf( "couln't create sax-writer component\n" );
646*b1cdbd2cSJim Jagielski 	}
647*b1cdbd2cSJim Jagielski }
648