1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_extensions.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir //#include <tools/presys.h> 32*cdf0e10cSrcweir #include <vector> 33*cdf0e10cSrcweir //#include <tools/postsys.h> 34*cdf0e10cSrcweir #include <smart/com/sun/star/test/XSimpleTest.hxx> 35*cdf0e10cSrcweir #include <smart/com/sun/star/lang/XMultiServiceFactory.hxx> // for the multiservice-factories 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #include <stdio.h> 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir #include <smart/com/sun/star/io/XActiveDataSource.hxx> 40*cdf0e10cSrcweir #include <smart/com/sun/star/io/XOutputStream.hxx> 41*cdf0e10cSrcweir #include <smart/com/sun/star/xml/sax/SAXParseException.hxx> 42*cdf0e10cSrcweir #include <smart/com/sun/star/xml/sax/XParser.hxx> 43*cdf0e10cSrcweir #include <smart/com/sun/star/xml/sax/XExtendedDocumentHandler.hxx> 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir #include <rtl/wstring.hxx> 46*cdf0e10cSrcweir #include <osl/time.h> 47*cdf0e10cSrcweir #include <usr/weak.hxx> 48*cdf0e10cSrcweir #include <tools/string.hxx> 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir #include <usr/factoryhlp.hxx> 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir #include <usr/reflserv.hxx> // for EXTERN_SERVICE_CALLTYPE 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir using namespace std; 55*cdf0e10cSrcweir using namespace rtl; 56*cdf0e10cSrcweir using namespace vos; 57*cdf0e10cSrcweir using namespace usr; 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir #define BUILD_ERROR(expr, Message)\ 60*cdf0e10cSrcweir {\ 61*cdf0e10cSrcweir m_seqErrors.realloc( m_seqErrors.getLen() + 1 ); \ 62*cdf0e10cSrcweir m_seqExceptions.realloc( m_seqExceptions.getLen() + 1 ); \ 63*cdf0e10cSrcweir String str; \ 64*cdf0e10cSrcweir str += __FILE__;\ 65*cdf0e10cSrcweir str += " "; \ 66*cdf0e10cSrcweir str += "(" ; \ 67*cdf0e10cSrcweir str += __LINE__ ;\ 68*cdf0e10cSrcweir str += ")\n";\ 69*cdf0e10cSrcweir str += "[ " ; \ 70*cdf0e10cSrcweir str += #expr; \ 71*cdf0e10cSrcweir str += " ] : " ; \ 72*cdf0e10cSrcweir str += Message; \ 73*cdf0e10cSrcweir m_seqErrors.getArray()[ m_seqErrors.getLen()-1] = StringToUString( str , CHARSET_SYSTEM ); \ 74*cdf0e10cSrcweir }\ 75*cdf0e10cSrcweir ((void)0) 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir #define WARNING_ASSERT(expr, Message) \ 79*cdf0e10cSrcweir if( ! (expr) ) { \ 80*cdf0e10cSrcweir m_seqWarnings.realloc( m_seqErrors.getLen() +1 ); \ 81*cdf0e10cSrcweir String str;\ 82*cdf0e10cSrcweir str += __FILE__;\ 83*cdf0e10cSrcweir str += " "; \ 84*cdf0e10cSrcweir str += "(" ; \ 85*cdf0e10cSrcweir str += __LINE__ ;\ 86*cdf0e10cSrcweir str += ")\n";\ 87*cdf0e10cSrcweir str += "[ " ; \ 88*cdf0e10cSrcweir str += #expr; \ 89*cdf0e10cSrcweir str += " ] : " ; \ 90*cdf0e10cSrcweir str += Message; \ 91*cdf0e10cSrcweir m_seqWarnings.getArray()[ m_seqWarnings.getLen()-1] = StringToUString( str , CHARSET_SYSTEM ); \ 92*cdf0e10cSrcweir return; \ 93*cdf0e10cSrcweir }\ 94*cdf0e10cSrcweir ((void)0) 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir #define ERROR_ASSERT(expr, Message) \ 97*cdf0e10cSrcweir if( ! (expr) ) { \ 98*cdf0e10cSrcweir BUILD_ERROR(expr, Message );\ 99*cdf0e10cSrcweir return; \ 100*cdf0e10cSrcweir }\ 101*cdf0e10cSrcweir ((void)0) 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir #define ERROR_EXCEPTION_ASSERT(expr, Message, Exception) \ 104*cdf0e10cSrcweir if( !(expr)) { \ 105*cdf0e10cSrcweir BUILD_ERROR(expr,Message);\ 106*cdf0e10cSrcweir m_seqExceptions.getArray()[ m_seqExceptions.getLen()-1] = UsrAny( Exception );\ 107*cdf0e10cSrcweir return; \ 108*cdf0e10cSrcweir } \ 109*cdf0e10cSrcweir ((void)0) 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir /**** 112*cdf0e10cSrcweir * test szenarios : 113*cdf0e10cSrcweir * 114*cdf0e10cSrcweir * 115*cdf0e10cSrcweir * 116*cdf0e10cSrcweir ****/ 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir class OFileWriter : 120*cdf0e10cSrcweir public XOutputStream, 121*cdf0e10cSrcweir public OWeakObject 122*cdf0e10cSrcweir { 123*cdf0e10cSrcweir public: 124*cdf0e10cSrcweir OFileWriter( char *pcFile ) { strcpy( m_pcFile , pcFile ); m_f = 0; } 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir public: // refcounting 128*cdf0e10cSrcweir BOOL queryInterface( Uik aUik, XInterfaceRef & rOut ) 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir if( XOutputStream::getSmartUik() == aUik ) { 131*cdf0e10cSrcweir rOut = (XOutputStream *) this; 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir else return OWeakObject::queryInterface( aUik , rOut ); 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir return TRUE; 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir void acquire() { OWeakObject::acquire(); } 138*cdf0e10cSrcweir void release() { OWeakObject::release(); } 139*cdf0e10cSrcweir void* getImplementation(Reflection *p) { return OWeakObject::getImplementation(p); } 140*cdf0e10cSrcweir 141*cdf0e10cSrcweir public: 142*cdf0e10cSrcweir virtual void writeBytes(const Sequence< BYTE >& aData) 143*cdf0e10cSrcweir THROWS( (NotConnectedException, BufferSizeExceededException, UsrSystemException) ); 144*cdf0e10cSrcweir virtual void flush(void) 145*cdf0e10cSrcweir THROWS( (NotConnectedException, BufferSizeExceededException, UsrSystemException) ); 146*cdf0e10cSrcweir virtual void closeOutput(void) 147*cdf0e10cSrcweir THROWS( (NotConnectedException, BufferSizeExceededException, UsrSystemException) ); 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir private: 151*cdf0e10cSrcweir char m_pcFile[256]; 152*cdf0e10cSrcweir FILE *m_f; 153*cdf0e10cSrcweir }; 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir void OFileWriter::writeBytes(const Sequence< BYTE >& aData) 157*cdf0e10cSrcweir THROWS( (NotConnectedException, BufferSizeExceededException, UsrSystemException) ) 158*cdf0e10cSrcweir { 159*cdf0e10cSrcweir if( ! m_f ) { 160*cdf0e10cSrcweir m_f = fopen( m_pcFile , "w" ); 161*cdf0e10cSrcweir } 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir fwrite( aData.getConstArray() , 1 , aData.getLen() , m_f ); 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir void OFileWriter::flush(void) 169*cdf0e10cSrcweir THROWS( (NotConnectedException, BufferSizeExceededException, UsrSystemException) ) 170*cdf0e10cSrcweir { 171*cdf0e10cSrcweir fflush( m_f ); 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir void OFileWriter::closeOutput(void) 175*cdf0e10cSrcweir THROWS( (NotConnectedException, BufferSizeExceededException, UsrSystemException) ) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir fclose( m_f ); 178*cdf0e10cSrcweir m_f = 0; 179*cdf0e10cSrcweir } 180*cdf0e10cSrcweir 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir class OSaxWriterTest : 183*cdf0e10cSrcweir public XSimpleTest, 184*cdf0e10cSrcweir public OWeakObject 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir public: 187*cdf0e10cSrcweir OSaxWriterTest( const XMultiServiceFactoryRef & rFactory ) : m_rFactory( rFactory ) 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir ~OSaxWriterTest() {} 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir public: // refcounting 194*cdf0e10cSrcweir BOOL queryInterface( Uik aUik, XInterfaceRef & rOut ); 195*cdf0e10cSrcweir void acquire() { OWeakObject::acquire(); } 196*cdf0e10cSrcweir void release() { OWeakObject::release(); } 197*cdf0e10cSrcweir void* getImplementation(Reflection *p) { return OWeakObject::getImplementation(p); } 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir public: 200*cdf0e10cSrcweir virtual void testInvariant(const UString& TestName, const XInterfaceRef& TestObject) 201*cdf0e10cSrcweir THROWS( ( IllegalArgumentException, 202*cdf0e10cSrcweir UsrSystemException) ); 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir virtual INT32 test( const UString& TestName, 205*cdf0e10cSrcweir const XInterfaceRef& TestObject, 206*cdf0e10cSrcweir INT32 hTestHandle) THROWS( ( IllegalArgumentException, 207*cdf0e10cSrcweir UsrSystemException) ); 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir virtual BOOL testPassed(void) THROWS( ( UsrSystemException) ); 210*cdf0e10cSrcweir virtual Sequence< UString > getErrors(void) THROWS( (UsrSystemException) ); 211*cdf0e10cSrcweir virtual Sequence< UsrAny > getErrorExceptions(void) THROWS( (UsrSystemException) ); 212*cdf0e10cSrcweir virtual Sequence< UString > getWarnings(void) THROWS( (UsrSystemException) ); 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir private: 215*cdf0e10cSrcweir void testSimple( const XExtendedDocumentHandlerRef &r ); 216*cdf0e10cSrcweir void testExceptions( const XExtendedDocumentHandlerRef &r ); 217*cdf0e10cSrcweir void testDTD( const XExtendedDocumentHandlerRef &r ); 218*cdf0e10cSrcweir void testPerformance( const XExtendedDocumentHandlerRef &r ); 219*cdf0e10cSrcweir void writeParagraph( const XExtendedDocumentHandlerRef &r , const UString & s); 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir private: 222*cdf0e10cSrcweir Sequence<UsrAny> m_seqExceptions; 223*cdf0e10cSrcweir Sequence<UString> m_seqErrors; 224*cdf0e10cSrcweir Sequence<UString> m_seqWarnings; 225*cdf0e10cSrcweir XMultiServiceFactoryRef m_rFactory; 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir }; 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir /*---------------------------------------- 232*cdf0e10cSrcweir * 233*cdf0e10cSrcweir * Attributlist implementation 234*cdf0e10cSrcweir * 235*cdf0e10cSrcweir *----------------------------------------*/ 236*cdf0e10cSrcweir struct AttributeListImpl_impl; 237*cdf0e10cSrcweir class AttributeListImpl : 238*cdf0e10cSrcweir public XAttributeList, 239*cdf0e10cSrcweir public OWeakObject 240*cdf0e10cSrcweir { 241*cdf0e10cSrcweir public: 242*cdf0e10cSrcweir AttributeListImpl(); 243*cdf0e10cSrcweir AttributeListImpl( const AttributeListImpl & ); 244*cdf0e10cSrcweir ~AttributeListImpl(); 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir public: 247*cdf0e10cSrcweir BOOL queryInterface( Uik aUik, XInterfaceRef & rOut ); 248*cdf0e10cSrcweir void acquire() { OWeakObject::acquire(); } 249*cdf0e10cSrcweir void release() { OWeakObject::release(); } 250*cdf0e10cSrcweir void* getImplementation(Reflection *p) { return OWeakObject::getImplementation(p); } 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir public: 253*cdf0e10cSrcweir virtual INT16 getLength(void) THROWS( (UsrSystemException) ); 254*cdf0e10cSrcweir virtual UString getNameByIndex(INT16 i) THROWS( (UsrSystemException) ); 255*cdf0e10cSrcweir virtual UString getTypeByIndex(INT16 i) THROWS( (UsrSystemException) ); 256*cdf0e10cSrcweir virtual UString getTypeByName(const UString& aName) THROWS( (UsrSystemException) ); 257*cdf0e10cSrcweir virtual UString getValueByIndex(INT16 i) THROWS( (UsrSystemException) ); 258*cdf0e10cSrcweir virtual UString getValueByName(const UString& aName) THROWS( (UsrSystemException) ); 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir public: 261*cdf0e10cSrcweir void addAttribute( const UString &sName , const UString &sType , const UString &sValue ); 262*cdf0e10cSrcweir void clear(); 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir private: 265*cdf0e10cSrcweir struct AttributeListImpl_impl *m_pImpl; 266*cdf0e10cSrcweir }; 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir 269*cdf0e10cSrcweir struct TagAttribute 270*cdf0e10cSrcweir { 271*cdf0e10cSrcweir TagAttribute(){} 272*cdf0e10cSrcweir TagAttribute( const UString &sName, const UString &sType , const UString &sValue ) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir this->sName = sName; 275*cdf0e10cSrcweir this->sType = sType; 276*cdf0e10cSrcweir this->sValue = sValue; 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir UString sName; 280*cdf0e10cSrcweir UString sType; 281*cdf0e10cSrcweir UString sValue; 282*cdf0e10cSrcweir }; 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir struct AttributeListImpl_impl 285*cdf0e10cSrcweir { 286*cdf0e10cSrcweir AttributeListImpl_impl() 287*cdf0e10cSrcweir { 288*cdf0e10cSrcweir // performance improvement during adding 289*cdf0e10cSrcweir vecAttribute.reserve(20); 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir vector<struct TagAttribute> vecAttribute; 292*cdf0e10cSrcweir }; 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir INT16 AttributeListImpl::getLength(void) THROWS( (UsrSystemException) ) 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir return m_pImpl->vecAttribute.size(); 299*cdf0e10cSrcweir } 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir AttributeListImpl::AttributeListImpl( const AttributeListImpl &r ) 303*cdf0e10cSrcweir { 304*cdf0e10cSrcweir m_pImpl = new AttributeListImpl_impl; 305*cdf0e10cSrcweir *m_pImpl = *(r.m_pImpl); 306*cdf0e10cSrcweir } 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir UString AttributeListImpl::getNameByIndex(INT16 i) THROWS( (UsrSystemException) ) 309*cdf0e10cSrcweir { 310*cdf0e10cSrcweir if( i < m_pImpl->vecAttribute.size() ) { 311*cdf0e10cSrcweir return m_pImpl->vecAttribute[i].sName; 312*cdf0e10cSrcweir } 313*cdf0e10cSrcweir return UString(); 314*cdf0e10cSrcweir } 315*cdf0e10cSrcweir 316*cdf0e10cSrcweir 317*cdf0e10cSrcweir UString AttributeListImpl::getTypeByIndex(INT16 i) THROWS( (UsrSystemException) ) 318*cdf0e10cSrcweir { 319*cdf0e10cSrcweir if( i < m_pImpl->vecAttribute.size() ) { 320*cdf0e10cSrcweir return m_pImpl->vecAttribute[i].sType; 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir return UString(); 323*cdf0e10cSrcweir } 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir UString AttributeListImpl::getValueByIndex(INT16 i) THROWS( (UsrSystemException) ) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir if( i < m_pImpl->vecAttribute.size() ) { 328*cdf0e10cSrcweir return m_pImpl->vecAttribute[i].sValue; 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir return UString(); 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir } 333*cdf0e10cSrcweir 334*cdf0e10cSrcweir UString AttributeListImpl::getTypeByName( const UString& sName ) THROWS( (UsrSystemException) ) 335*cdf0e10cSrcweir { 336*cdf0e10cSrcweir vector<struct TagAttribute>::iterator ii = m_pImpl->vecAttribute.begin(); 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir for( ; ii != m_pImpl->vecAttribute.end() ; ii ++ ) { 339*cdf0e10cSrcweir if( (*ii).sName == sName ) { 340*cdf0e10cSrcweir return (*ii).sType; 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir } 343*cdf0e10cSrcweir return UString(); 344*cdf0e10cSrcweir } 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir UString AttributeListImpl::getValueByName(const UString& sName) THROWS( (UsrSystemException) ) 347*cdf0e10cSrcweir { 348*cdf0e10cSrcweir vector<struct TagAttribute>::iterator ii = m_pImpl->vecAttribute.begin(); 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir for( ; ii != m_pImpl->vecAttribute.end() ; ii ++ ) { 351*cdf0e10cSrcweir if( (*ii).sName == sName ) { 352*cdf0e10cSrcweir return (*ii).sValue; 353*cdf0e10cSrcweir } 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir return UString(); 356*cdf0e10cSrcweir } 357*cdf0e10cSrcweir 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir BOOL AttributeListImpl::queryInterface( Uik aUik, XInterfaceRef & rOut ) 360*cdf0e10cSrcweir { 361*cdf0e10cSrcweir if( aUik == XAttributeList::getSmartUik() ) { 362*cdf0e10cSrcweir rOut = (XAttributeList * )this; 363*cdf0e10cSrcweir } 364*cdf0e10cSrcweir else { 365*cdf0e10cSrcweir return OWeakObject::queryInterface( aUik , rOut ); 366*cdf0e10cSrcweir } 367*cdf0e10cSrcweir return TRUE; 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir AttributeListImpl::AttributeListImpl() 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir m_pImpl = new AttributeListImpl_impl; 374*cdf0e10cSrcweir } 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir AttributeListImpl::~AttributeListImpl() 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir delete m_pImpl; 381*cdf0e10cSrcweir } 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir void AttributeListImpl::addAttribute( const UString &sName , 385*cdf0e10cSrcweir const UString &sType , 386*cdf0e10cSrcweir const UString &sValue ) 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir m_pImpl->vecAttribute.push_back( TagAttribute( sName , sType , sValue ) ); 389*cdf0e10cSrcweir } 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir void AttributeListImpl::clear() 392*cdf0e10cSrcweir { 393*cdf0e10cSrcweir vector<struct TagAttribute> dummy; 394*cdf0e10cSrcweir m_pImpl->vecAttribute.swap( dummy ); 395*cdf0e10cSrcweir 396*cdf0e10cSrcweir OSL_ASSERT( ! getLength() ); 397*cdf0e10cSrcweir } 398*cdf0e10cSrcweir 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir 406*cdf0e10cSrcweir 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir 409*cdf0e10cSrcweir /** 410*cdf0e10cSrcweir * for external binding 411*cdf0e10cSrcweir * 412*cdf0e10cSrcweir * 413*cdf0e10cSrcweir **/ 414*cdf0e10cSrcweir XInterfaceRef OSaxWriterTest_CreateInstance( const XMultiServiceFactoryRef & rSMgr ) THROWS((Exception)) 415*cdf0e10cSrcweir { 416*cdf0e10cSrcweir OSaxWriterTest *p = new OSaxWriterTest( rSMgr ); 417*cdf0e10cSrcweir XInterfaceRef xService = *p; 418*cdf0e10cSrcweir return xService; 419*cdf0e10cSrcweir } 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir UString OSaxWriterTest_getServiceName( ) THROWS( () ) 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir return L"test.com.sun.star.xml.sax.Writer"; 424*cdf0e10cSrcweir } 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir UString OSaxWriterTest_getImplementationName( ) THROWS( () ) 427*cdf0e10cSrcweir { 428*cdf0e10cSrcweir return L"test.extensions.xml.sax.Writer"; 429*cdf0e10cSrcweir } 430*cdf0e10cSrcweir 431*cdf0e10cSrcweir Sequence<UString> OSaxWriterTest_getSupportedServiceNames( ) THROWS( () ) 432*cdf0e10cSrcweir { 433*cdf0e10cSrcweir Sequence<UString> aRet(1); 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir aRet.getArray()[0] = OSaxWriterTest_getImplementationName( ); 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir return aRet; 438*cdf0e10cSrcweir } 439*cdf0e10cSrcweir 440*cdf0e10cSrcweir 441*cdf0e10cSrcweir BOOL OSaxWriterTest::queryInterface( Uik uik , XInterfaceRef &rOut ) 442*cdf0e10cSrcweir { 443*cdf0e10cSrcweir if( XSimpleTest::getSmartUik() == uik ) { 444*cdf0e10cSrcweir rOut = (XSimpleTest *) this; 445*cdf0e10cSrcweir } 446*cdf0e10cSrcweir else { 447*cdf0e10cSrcweir return OWeakObject::queryInterface( uik , rOut ); 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir return TRUE; 450*cdf0e10cSrcweir } 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir void OSaxWriterTest::testInvariant( const UString& TestName, const XInterfaceRef& TestObject ) 454*cdf0e10cSrcweir THROWS( ( IllegalArgumentException, 455*cdf0e10cSrcweir UsrSystemException) ) 456*cdf0e10cSrcweir { 457*cdf0e10cSrcweir if( L"com.sun.star.xml.sax.Writer" == TestName ) { 458*cdf0e10cSrcweir XDocumentHandlerRef doc( TestObject , USR_QUERY ); 459*cdf0e10cSrcweir XExtendedDocumentHandlerRef ext( TestObject , USR_QUERY ); 460*cdf0e10cSrcweir XActiveDataSourceRef source( TestObject , USR_QUERY ); 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir ERROR_ASSERT( doc.is() , "XDocumentHandler cannot be queried" ); 463*cdf0e10cSrcweir ERROR_ASSERT( ext.is() , "XExtendedDocumentHandler cannot be queried" ); 464*cdf0e10cSrcweir ERROR_ASSERT( source.is() , "XActiveDataSource cannot be queried" ); 465*cdf0e10cSrcweir } 466*cdf0e10cSrcweir else { 467*cdf0e10cSrcweir BUILD_ERROR( 0 , "wrong test" ); 468*cdf0e10cSrcweir } 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir 471*cdf0e10cSrcweir 472*cdf0e10cSrcweir INT32 OSaxWriterTest::test( const UString& TestName, 473*cdf0e10cSrcweir const XInterfaceRef& TestObject, 474*cdf0e10cSrcweir INT32 hTestHandle) THROWS( ( IllegalArgumentException, 475*cdf0e10cSrcweir UsrSystemException) ) 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir if( L"com.sun.star.xml.sax.Writer" == TestName ) { 478*cdf0e10cSrcweir try { 479*cdf0e10cSrcweir if( 0 == hTestHandle ) { 480*cdf0e10cSrcweir testInvariant( TestName , TestObject ); 481*cdf0e10cSrcweir } 482*cdf0e10cSrcweir else { 483*cdf0e10cSrcweir 484*cdf0e10cSrcweir XExtendedDocumentHandlerRef writer( TestObject , USR_QUERY ); 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir if( 1 == hTestHandle ) { 487*cdf0e10cSrcweir testSimple( writer ); 488*cdf0e10cSrcweir } 489*cdf0e10cSrcweir else if( 2 == hTestHandle ) { 490*cdf0e10cSrcweir testExceptions( writer ); 491*cdf0e10cSrcweir } 492*cdf0e10cSrcweir else if( 3 == hTestHandle ) { 493*cdf0e10cSrcweir testDTD( writer ); 494*cdf0e10cSrcweir } 495*cdf0e10cSrcweir else if( 4 == hTestHandle ) { 496*cdf0e10cSrcweir testPerformance( writer ); 497*cdf0e10cSrcweir } 498*cdf0e10cSrcweir } 499*cdf0e10cSrcweir } 500*cdf0e10cSrcweir catch( Exception& e ) { 501*cdf0e10cSrcweir BUILD_ERROR( 0 , UStringToString( e.getName() , CHARSET_SYSTEM ).GetCharStr() ); 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir catch(...) { 504*cdf0e10cSrcweir BUILD_ERROR( 0 , "unknown exception (Exception is not base class)" ); 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir 507*cdf0e10cSrcweir hTestHandle ++; 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir if( hTestHandle >= 5) { 510*cdf0e10cSrcweir // all tests finished. 511*cdf0e10cSrcweir hTestHandle = -1; 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir } 514*cdf0e10cSrcweir else { 515*cdf0e10cSrcweir BUILD_ERROR( 0 , "service not supported by test." ); 516*cdf0e10cSrcweir } 517*cdf0e10cSrcweir return hTestHandle; 518*cdf0e10cSrcweir } 519*cdf0e10cSrcweir 520*cdf0e10cSrcweir 521*cdf0e10cSrcweir 522*cdf0e10cSrcweir BOOL OSaxWriterTest::testPassed(void) THROWS( (UsrSystemException) ) 523*cdf0e10cSrcweir { 524*cdf0e10cSrcweir return m_seqErrors.getLen() == 0; 525*cdf0e10cSrcweir } 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir Sequence< UString > OSaxWriterTest::getErrors(void) THROWS( (UsrSystemException) ) 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir return m_seqErrors; 531*cdf0e10cSrcweir } 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir Sequence< UsrAny > OSaxWriterTest::getErrorExceptions(void) THROWS( (UsrSystemException) ) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir return m_seqExceptions; 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir 539*cdf0e10cSrcweir 540*cdf0e10cSrcweir Sequence< UString > OSaxWriterTest::getWarnings(void) THROWS( (UsrSystemException) ) 541*cdf0e10cSrcweir { 542*cdf0e10cSrcweir return m_seqWarnings; 543*cdf0e10cSrcweir } 544*cdf0e10cSrcweir 545*cdf0e10cSrcweir void OSaxWriterTest::writeParagraph( const XExtendedDocumentHandlerRef &r , const UString & s) 546*cdf0e10cSrcweir { 547*cdf0e10cSrcweir int nMax = s.len(); 548*cdf0e10cSrcweir int nStart = 0; 549*cdf0e10cSrcweir 550*cdf0e10cSrcweir Sequence<UINT16> seq( s.len() ); 551*cdf0e10cSrcweir memcpy( seq.getArray() , s.getStr() , s.len() * sizeof( UINT16 ) ); 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir for( int n = 1 ; n < nMax ; n++ ){ 554*cdf0e10cSrcweir if( 32 == seq.getArray()[n] ) { 555*cdf0e10cSrcweir r->allowLineBreak(); 556*cdf0e10cSrcweir r->characters( s.copy( nStart , n - nStart ) ); 557*cdf0e10cSrcweir nStart = n; 558*cdf0e10cSrcweir } 559*cdf0e10cSrcweir } 560*cdf0e10cSrcweir r->allowLineBreak(); 561*cdf0e10cSrcweir r->characters( s.copy( nStart , n - nStart ) ); 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir 564*cdf0e10cSrcweir } 565*cdf0e10cSrcweir 566*cdf0e10cSrcweir 567*cdf0e10cSrcweir 568*cdf0e10cSrcweir void OSaxWriterTest::testSimple( const XExtendedDocumentHandlerRef &r ) 569*cdf0e10cSrcweir { 570*cdf0e10cSrcweir UString testParagraph = L"Dies ist ein bloeder Test um zu uberpruefen, ob der SAXWriter " 571*cdf0e10cSrcweir L"wohl Zeilenumbrueche halbwegs richtig macht oder ob er die Zeile " 572*cdf0e10cSrcweir L"bis zum bitteren Ende schreibt."; 573*cdf0e10cSrcweir 574*cdf0e10cSrcweir OFileWriter *pw = new OFileWriter("output.xml"); 575*cdf0e10cSrcweir AttributeListImpl *pList = new AttributeListImpl; 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir XAttributeListRef rList( (XAttributeList *) pList , USR_QUERY ); 578*cdf0e10cSrcweir XOutputStreamRef ref( ( XOutputStream * ) pw , USR_QUERY ); 579*cdf0e10cSrcweir 580*cdf0e10cSrcweir XActiveDataSourceRef source( r , USR_QUERY ); 581*cdf0e10cSrcweir 582*cdf0e10cSrcweir ERROR_ASSERT( ref.is() , "no output stream" ); 583*cdf0e10cSrcweir ERROR_ASSERT( source.is() , "no active data source" ); 584*cdf0e10cSrcweir 585*cdf0e10cSrcweir source->setOutputStream( ref ); 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir r->startDocument(); 588*cdf0e10cSrcweir 589*cdf0e10cSrcweir pList->addAttribute( L"Arg1" , L"CDATA" , L"bla\n u" ); 590*cdf0e10cSrcweir pList->addAttribute( L"Arg2" , L"CDATA" , L"blub" ); 591*cdf0e10cSrcweir 592*cdf0e10cSrcweir r->startElement( L"tag1" , rList ); 593*cdf0e10cSrcweir r->ignorableWhitespace( L"" ); 594*cdf0e10cSrcweir 595*cdf0e10cSrcweir r->characters( L"huhu" ); 596*cdf0e10cSrcweir r->ignorableWhitespace( L"" ); 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir r->startElement( L"hi" , rList ); 599*cdf0e10cSrcweir r->ignorableWhitespace( L"" ); 600*cdf0e10cSrcweir 601*cdf0e10cSrcweir // the enpassant must be converted & -> & 602*cdf0e10cSrcweir r->characters( L"ü" ); 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir // Test added for mib. Tests if errors during conversions occurs 605*cdf0e10cSrcweir r->ignorableWhitespace( UString() ); 606*cdf0e10cSrcweir sal_Char array[256]; 607*cdf0e10cSrcweir for( sal_Int32 n = 32 ; n < 254 ; n ++ ) { 608*cdf0e10cSrcweir array[n-32] = n; 609*cdf0e10cSrcweir } 610*cdf0e10cSrcweir array[254-32] = 0; 611*cdf0e10cSrcweir r->characters( 612*cdf0e10cSrcweir StringToUString( array , RTL_TEXTENCODING_SYMBOL ) 613*cdf0e10cSrcweir ); 614*cdf0e10cSrcweir r->ignorableWhitespace( UString() ); 615*cdf0e10cSrcweir 616*cdf0e10cSrcweir // '>' must not be converted 617*cdf0e10cSrcweir r->startCDATA(); 618*cdf0e10cSrcweir r->characters( L">fsfsdf<" ); 619*cdf0e10cSrcweir r->endCDATA(); 620*cdf0e10cSrcweir r->ignorableWhitespace( UString() ); 621*cdf0e10cSrcweir 622*cdf0e10cSrcweir writeParagraph( r , testParagraph ); 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir 625*cdf0e10cSrcweir r->ignorableWhitespace( UString() ); 626*cdf0e10cSrcweir r->comment( L"Dies ist ein Kommentar !" ); 627*cdf0e10cSrcweir r->ignorableWhitespace( UString() ); 628*cdf0e10cSrcweir 629*cdf0e10cSrcweir r->startElement( L"emptytagtest" , rList ); 630*cdf0e10cSrcweir r->endElement( L"emptytagtest" ); 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir r->endElement( L"hi" ); 633*cdf0e10cSrcweir r->ignorableWhitespace( L"" ); 634*cdf0e10cSrcweir 635*cdf0e10cSrcweir r->endElement( L"tag1" ); 636*cdf0e10cSrcweir r->endDocument(); 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir } 639*cdf0e10cSrcweir 640*cdf0e10cSrcweir void OSaxWriterTest::testExceptions( const XExtendedDocumentHandlerRef & r ) 641*cdf0e10cSrcweir { 642*cdf0e10cSrcweir 643*cdf0e10cSrcweir OFileWriter *pw = new OFileWriter("output2.xml"); 644*cdf0e10cSrcweir AttributeListImpl *pList = new AttributeListImpl; 645*cdf0e10cSrcweir 646*cdf0e10cSrcweir XAttributeListRef rList( (XAttributeList *) pList , USR_QUERY ); 647*cdf0e10cSrcweir XOutputStreamRef ref( ( XOutputStream * ) pw , USR_QUERY ); 648*cdf0e10cSrcweir 649*cdf0e10cSrcweir XActiveDataSourceRef source( r , USR_QUERY ); 650*cdf0e10cSrcweir 651*cdf0e10cSrcweir ERROR_ASSERT( ref.is() , "no output stream" ); 652*cdf0e10cSrcweir ERROR_ASSERT( source.is() , "no active data source" ); 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir source->setOutputStream( ref ); 655*cdf0e10cSrcweir 656*cdf0e10cSrcweir { // startDocument must be called before start element 657*cdf0e10cSrcweir BOOL bException = TRUE; 658*cdf0e10cSrcweir try { 659*cdf0e10cSrcweir r->startElement( L"huhu" , rList ); 660*cdf0e10cSrcweir bException = FALSE; 661*cdf0e10cSrcweir } 662*cdf0e10cSrcweir catch( SAXException& e ) { 663*cdf0e10cSrcweir 664*cdf0e10cSrcweir } 665*cdf0e10cSrcweir ERROR_ASSERT( bException , "expected exception not thrown !" ); 666*cdf0e10cSrcweir } 667*cdf0e10cSrcweir 668*cdf0e10cSrcweir r->startDocument(); 669*cdf0e10cSrcweir 670*cdf0e10cSrcweir r->startElement( L"huhu" , rList ); 671*cdf0e10cSrcweir r->startCDATA(); 672*cdf0e10cSrcweir 673*cdf0e10cSrcweir { 674*cdf0e10cSrcweir BOOL bException = TRUE; 675*cdf0e10cSrcweir try { 676*cdf0e10cSrcweir r->startElement( L"huhu" , rList ); 677*cdf0e10cSrcweir bException = FALSE; 678*cdf0e10cSrcweir } 679*cdf0e10cSrcweir catch( SAXException& e ) { 680*cdf0e10cSrcweir 681*cdf0e10cSrcweir } 682*cdf0e10cSrcweir ERROR_ASSERT( bException , "expected exception not thrown !" ); 683*cdf0e10cSrcweir } 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir r->endCDATA(); 686*cdf0e10cSrcweir r->endElement( L"hi" ); 687*cdf0e10cSrcweir 688*cdf0e10cSrcweir r->endDocument(); 689*cdf0e10cSrcweir } 690*cdf0e10cSrcweir 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir void OSaxWriterTest::testDTD(const XExtendedDocumentHandlerRef &r ) 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir OFileWriter *pw = new OFileWriter("outputDTD.xml"); 695*cdf0e10cSrcweir AttributeListImpl *pList = new AttributeListImpl; 696*cdf0e10cSrcweir 697*cdf0e10cSrcweir XAttributeListRef rList( (XAttributeList *) pList , USR_QUERY ); 698*cdf0e10cSrcweir XOutputStreamRef ref( ( XOutputStream * ) pw , USR_QUERY ); 699*cdf0e10cSrcweir 700*cdf0e10cSrcweir XActiveDataSourceRef source( r , USR_QUERY ); 701*cdf0e10cSrcweir 702*cdf0e10cSrcweir ERROR_ASSERT( ref.is() , "no output stream" ); 703*cdf0e10cSrcweir ERROR_ASSERT( source.is() , "no active data source" ); 704*cdf0e10cSrcweir 705*cdf0e10cSrcweir source->setOutputStream( ref ); 706*cdf0e10cSrcweir 707*cdf0e10cSrcweir 708*cdf0e10cSrcweir r->startDocument(); 709*cdf0e10cSrcweir r->unknown( L"<!DOCTYPE iCalendar >\n" ); 710*cdf0e10cSrcweir r->startElement( L"huhu" , rList ); 711*cdf0e10cSrcweir 712*cdf0e10cSrcweir r->endElement( L"huhu" ); 713*cdf0e10cSrcweir r->endDocument(); 714*cdf0e10cSrcweir } 715*cdf0e10cSrcweir 716*cdf0e10cSrcweir void OSaxWriterTest::testPerformance(const XExtendedDocumentHandlerRef &r ) 717*cdf0e10cSrcweir { 718*cdf0e10cSrcweir OFileWriter *pw = new OFileWriter("testPerformance.xml"); 719*cdf0e10cSrcweir AttributeListImpl *pList = new AttributeListImpl; 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir UString testParagraph = L"Dies ist ein bloeder Test um zu uberpruefen, ob der SAXWriter " 722*cdf0e10cSrcweir L"wohl > Zeilenumbrueche halbwegs richtig macht oder ob er die Zeile " 723*cdf0e10cSrcweir L"bis zum bitteren Ende schreibt."; 724*cdf0e10cSrcweir 725*cdf0e10cSrcweir 726*cdf0e10cSrcweir XAttributeListRef rList( (XAttributeList *) pList , USR_QUERY ); 727*cdf0e10cSrcweir XOutputStreamRef ref( ( XOutputStream * ) pw , USR_QUERY ); 728*cdf0e10cSrcweir 729*cdf0e10cSrcweir XActiveDataSourceRef source( r , USR_QUERY ); 730*cdf0e10cSrcweir 731*cdf0e10cSrcweir ERROR_ASSERT( ref.is() , "no output stream" ); 732*cdf0e10cSrcweir ERROR_ASSERT( source.is() , "no active data source" ); 733*cdf0e10cSrcweir 734*cdf0e10cSrcweir source->setOutputStream( ref ); 735*cdf0e10cSrcweir 736*cdf0e10cSrcweir TimeValue aStartTime, aEndTime; 737*cdf0e10cSrcweir osl_getSystemTime( &aStartTime ); 738*cdf0e10cSrcweir 739*cdf0e10cSrcweir 740*cdf0e10cSrcweir r->startDocument(); 741*cdf0e10cSrcweir // just write a bunch of xml tags ! 742*cdf0e10cSrcweir // for performance testing 743*cdf0e10cSrcweir sal_Int32 i2; 744*cdf0e10cSrcweir for( i2 = 0 ; i2 < 15 ; i2 ++ ) 745*cdf0e10cSrcweir { 746*cdf0e10cSrcweir r->startElement( UString( L"tag" ) + UString::valueOf( i2 ), rList ); 747*cdf0e10cSrcweir for( sal_Int32 i = 0 ; i < 450 ; i ++ ) 748*cdf0e10cSrcweir { 749*cdf0e10cSrcweir r->ignorableWhitespace( L""); 750*cdf0e10cSrcweir r->startElement( L"huhu" , rList ); 751*cdf0e10cSrcweir r->characters( testParagraph ); 752*cdf0e10cSrcweir // writeParagraph( r , testParagraph ); 753*cdf0e10cSrcweir 754*cdf0e10cSrcweir r->ignorableWhitespace( L""); 755*cdf0e10cSrcweir r->endElement( L"huhu" ); 756*cdf0e10cSrcweir } 757*cdf0e10cSrcweir } 758*cdf0e10cSrcweir for( i2 = 14 ; i2 >= 0 ; i2-- ) 759*cdf0e10cSrcweir { 760*cdf0e10cSrcweir r->ignorableWhitespace( L""); 761*cdf0e10cSrcweir r->endElement( UString( L"tag" ) + UString::valueOf( i2 ) ); 762*cdf0e10cSrcweir } 763*cdf0e10cSrcweir 764*cdf0e10cSrcweir r->endDocument(); 765*cdf0e10cSrcweir 766*cdf0e10cSrcweir osl_getSystemTime( &aEndTime ); 767*cdf0e10cSrcweir 768*cdf0e10cSrcweir double fStart = (double)aStartTime.Seconds + ((double)aStartTime.Nanosec / 1000000000.0); 769*cdf0e10cSrcweir double fEnd = (double)aEndTime.Seconds + ((double)aEndTime.Nanosec / 1000000000.0); 770*cdf0e10cSrcweir 771*cdf0e10cSrcweir printf( "Performance writing : %g s\n" , fEnd - fStart ); 772*cdf0e10cSrcweir } 773