diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2003-03-25 17:22:13 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2003-03-25 17:22:13 +0000 |
commit | 4011187ff516846635d4e2c3256dca3eb8c3719f (patch) | |
tree | c065bc70b3ca137cb2afaa026aa2276ea9171068 /framework/test | |
parent | 27973e334a0fdbc8712bdcb1c693b26717923a1e (diff) |
MWS_SRX644: migrate branch mws_srx644 -> HEAD
Diffstat (limited to 'framework/test')
-rw-r--r-- | framework/test/makefile.mk | 78 | ||||
-rw-r--r-- | framework/test/test.cxx | 1482 | ||||
-rw-r--r-- | framework/test/test_componentenumeration.bas | 78 | ||||
-rw-r--r-- | framework/test/test_documentproperties.bas | 1083 | ||||
-rw-r--r-- | framework/test/test_filterregistration.bas | 95 | ||||
-rw-r--r-- | framework/test/test_statusindicatorfactory.bas | 69 | ||||
-rw-r--r-- | framework/test/threadtest.cxx | 805 | ||||
-rw-r--r-- | framework/test/threadtest/makefile.mk | 115 | ||||
-rw-r--r-- | framework/test/threadtest/test.btm | 29 | ||||
-rw-r--r-- | framework/test/threadtest/threadtest.cxx | 806 | ||||
-rw-r--r-- | framework/test/typecfg/build.btm | 26 | ||||
-rw-r--r-- | framework/test/typecfg/cfgview.cxx | 488 | ||||
-rw-r--r-- | framework/test/typecfg/makefile.mk | 128 | ||||
-rw-r--r-- | framework/test/typecfg/typecfg.cxx | 320 | ||||
-rw-r--r-- | framework/test/typecfg/xml2xcd.cxx | 2474 |
15 files changed, 7702 insertions, 374 deletions
diff --git a/framework/test/makefile.mk b/framework/test/makefile.mk index 7671f82f8fe9..4a0f6503cb87 100644 --- a/framework/test/makefile.mk +++ b/framework/test/makefile.mk @@ -2,9 +2,9 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.9 $ +# $Revision: 1.10 $ # -# last change: $Author: as $ $Date: 2002-08-13 12:20:58 $ +# last change: $Author: hr $ $Date: 2003-03-25 18:21:59 $ # # The Contents of this file are made available subject to the terms of # either of the following licenses @@ -61,8 +61,9 @@ #************************************************************************* PRJ=.. -PRJNAME= framework -TARGET= test +PRJNAME= framework +TARGET= test +LIBTARGET= NO ENABLE_EXCEPTIONS= TRUE USE_DEFFILE= TRUE NO_BSYMBOLIC= TRUE @@ -77,33 +78,64 @@ NO_BSYMBOLIC= TRUE LINKFLAGS+=/SEGMENTS:1024 /PACKD:32768 .ENDIF -CDEFS += -DENABLE_COMPONENT_SELF_CHECK +# --- applikation: "test" -------------------------------------------------- -# --- debug lib: "fwkdbg.dll" -------------------------------------------------- +#APP1TARGET= test -SHL1TARGET= fwkdbg +#APP1OBJS= $(SLO)$/test.obj -SHL1IMPLIB= ifwkdbg +#APP1LIBS= $(SLB)$/fwk_classes.lib \ +# $(SLB)$/fwk_helper.lib -SHL1OBJS= $(SLO)$/debugservice.obj \ - $(SLO)$/register.obj \ - $(SLO)$/argumentanalyzer.obj +#APP1STDLIBS= $(CPPULIB) \ +# $(CPPUHELPERLIB) \ +# $(OSLLIB) \ +# $(SALLIB) \ +# $(VOSLIB) \ +# $(TOOLSLIB) \ +# $(SVTOOLLIB) \ +# $(TKLIB) \ +# $(COMPHELPERLIB) \ +# $(SVLIB) -SHL1STDLIBS= $(CPPULIB) \ - $(CPPUHELPERLIB) \ - $(COMPHELPERLIB) \ - $(UNOTOOLSLIB) \ - $(TOOLSLIB) \ - $(VOSLIB) \ - $(SVLLIB) \ - $(SALLIB) \ - $(FWILIB) +#APP1DEPN= $(SLB)$/fwk_helper.lib \ +# $(SLB)$/fwk_classes.lib -SHL1DEF= $(MISC)$/$(SHL1TARGET).def +#.IF "$(GUI)"=="WIN" || "$(GUI)"=="OS2" +#APP1DEF= $(MISC)$/test.def +#.ENDIF -DEF1NAME= $(SHL1TARGET) +# --- application: "threadtest" -------------------------------------------------- -DEF1EXPORTFILE= exports.dxp +APP2TARGET= threadtest + +APP2OBJS= $(SLO)$/threadtest.obj \ + $(SLO)$/transactionmanager.obj \ + $(SLO)$/transactionguard.obj \ + $(SLO)$/fairrwlock.obj \ + $(SLO)$/resetableguard.obj \ + $(SLO)$/gate.obj \ + $(SLO)$/readguard.obj \ + $(SLO)$/writeguard.obj + +APP2STDLIBS= $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(OSLLIB) \ + $(SALLIB) \ + $(VOSLIB) \ + $(SVLIB) + +APP2DEPN= $(SLO)$/fairrwlock.obj \ + $(SLO)$/transactionmanager.obj \ + $(SLO)$/transactionguard.obj \ + $(SLO)$/resetableguard.obj \ + $(SLO)$/gate.obj \ + $(SLO)$/readguard.obj \ + $(SLO)$/writeguard.obj + +.IF "$(GUI)"=="WIN" || "$(GUI)"=="OS2" +APP2DEF= $(MISC)$/threadtest.def +.ENDIF # --- Targets ------------------------------------------------------ diff --git a/framework/test/test.cxx b/framework/test/test.cxx new file mode 100644 index 000000000000..ab0105f42abe --- /dev/null +++ b/framework/test/test.cxx @@ -0,0 +1,1482 @@ +/************************************************************************* + * + * $RCSfile: test.cxx,v $ + * + * $Revision: 1.11 $ + * + * last change: $Author: hr $ $Date: 2003-03-25 18:22:01 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ + +#ifndef __FRAMEWORK_CLASSES_SERVICEMANAGER_HXX_ +#include <classes/servicemanager.hxx> +#endif + +#ifndef __FRAMEWORK_CLASSES_FILTERCACHE_HXX_ +#include <classes/filtercache.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_ +#include <macros/generic.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_ +#include <macros/debug.hxx> +#endif + +#ifndef __FRAMEWORK_SERVICES_H_ +#include <services.h> +#endif + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ + +#ifndef _COM_SUN_STAR_FRAME_XDESKTOP_HPP_ +#include <com/sun/star/frame/XDesktop.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XFRAME_HPP_ +#include <com/sun/star/frame/XFrame.hpp> +#endif + +#ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_ +#include <com/sun/star/awt/XWindow.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XFRAMELOADER_HPP_ +#include <com/sun/star/frame/XFrameLoader.hpp> +#endif + +#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ +#include <com/sun/star/beans/PropertyValue.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XLOADEVENTLISTENER_HPP_ +#include <com/sun/star/frame/XLoadEventListener.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XDISPATCHPROVIDER_HPP_ +#include <com/sun/star/frame/XDispatchProvider.hpp> +#endif + +#ifndef _COM_SUN_STAR_UTIL_URL_HPP_ +#include <com/sun/star/util/URL.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_ +#include <com/sun/star/frame/FrameSearchFlag.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XFRAMES_HPP_ +#include <com/sun/star/frame/XFrames.hpp> +#endif + +#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_ +#include <com/sun/star/lang/XServiceInfo.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XCOMPONENTLOADER_HPP_ +#include <com/sun/star/frame/XComponentLoader.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XTASKSSUPPLIER_HPP_ +#include <com/sun/star/frame/XTasksSupplier.hpp> +#endif + +#ifndef _COM_SUN_STAR_TASK_XSTATUSINDICATORFACTORY_HPP_ +#include <com/sun/star/task/XStatusIndicatorFactory.hpp> +#endif + +#ifndef _COM_SUN_STAR_BEANS_XMULTIPROPERTYSET_HPP_ +#include <com/sun/star/beans/XMultiPropertySet.hpp> +#endif + +#ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP_ +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#endif + +#ifndef _COM_SUN_STAR_MOZILLA_XPLUGININSTANCEPEER_HPP_ +#include <com/sun/star/mozilla/XPluginInstancePeer.hpp> +#endif + +#ifndef _COM_SUN_STAR_BRIDGE_XINSTANCEPROVIDER_HPP_ +#include <com/sun/star/bridge/XInstanceProvider.hpp> +#endif + +#ifndef _COM_SUN_STAR_DOCUMENT_XTYPEDETECTION_HPP_ +#include <com/sun/star/document/XTypeDetection.hpp> +#endif + +#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_ +#include <com/sun/star/container/XNameAccess.hpp> +#endif + +#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_ +#include <com/sun/star/container/XNameContainer.hpp> +#endif + +#ifndef _COM_SUN_STAR_CONTAINER_XELEMENTACCESS_HPP_ +#include <com/sun/star/container/XElementAccess.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XCONFIGMANAGER_HPP_ +#include <com/sun/star/frame/XConfigManager.hpp> +#endif + +//_________________________________________________________________________________________________________________ +// other includes +//_________________________________________________________________________________________________________________ + +#ifndef _COMPHELPER_PROCESSFACTORY_HXX_ +#include <comphelper/processfactory.hxx> +#endif + +#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_ +#include <com/sun/star/uno/Reference.h> +#endif + +#ifndef _RTL_USTRING_ +#include <rtl/ustring.hxx> +#endif + +#ifndef _RTL_USTRBUF_HXX_ +#include <rtl/ustrbuf.hxx> +#endif + +#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ +#include <toolkit/helper/vclunohelper.hxx> +#endif + +#ifndef _SVT_UNOIFACE_HXX +#include <svtools/unoiface.hxx> +#endif + +#ifndef _URLOBJ_HXX +#include <tools/urlobj.hxx> +#endif + +#include <vcl/event.hxx> +#include <vcl/svapp.hxx> +#include <vcl/wrkwin.hxx> +#include <vcl/msgbox.hxx> +#include <stdio.h> + +//_________________________________________________________________________________________________________________ +// const +//_________________________________________________________________________________________________________________ + +#define APPLICATIONNAME "FrameWork - Testapplication" + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +using namespace ::rtl ; +using namespace ::comphelper ; +using namespace ::framework ; +using namespace ::cppu ; +using namespace ::com::sun::star::uno ; +using namespace ::com::sun::star::lang ; +using namespace ::com::sun::star::frame ; +using namespace ::com::sun::star::awt ; +using namespace ::com::sun::star::beans ; +using namespace ::com::sun::star::util ; +using namespace ::com::sun::star::task ; +using namespace ::com::sun::star::mozilla ; +using namespace ::com::sun::star::bridge ; +using namespace ::com::sun::star::document ; +using namespace ::com::sun::star::container ; + +//_________________________________________________________________________________________________________________ +// defines +//_________________________________________________________________________________________________________________ + +//_________________________________________________________________________________________________________________ +// declarations +//_________________________________________________________________________________________________________________ + +/*-***************************************************************************************************************/ +class TestApplication : public Application +{ + //************************************************************************************************************* + public: + + void Main(); + + //************************************************************************************************************* + private: + + #ifdef TEST_DESKTOP + void impl_testDesktop ( const Reference< XDesktop >& xDesktop ); + void impl_buildTree ( const Reference< XDesktop >& xDesktop ); + void impl_logTree ( const Reference< XDesktop >& xDesktop ); + + #endif + + #ifdef TEST_PLUGIN + void impl_testPlugIn ( const Reference< XDesktop >& xDesktop, const Reference< XMultiServiceFactory >& xFactory ); + #endif + + #ifdef TEST_LOGINDIALOG + void impl_testLoginDialog(); + #endif + + #ifdef TEST_FILTERCACHE + void impl_testFilterCache(); + #endif + + #ifdef TEST_TYPEDETECTION + void impl_testTypeDetection(); + #endif + + #ifdef TEST_FILTERREGISTRATION + void impl_testFilterRegistration(); + #endif + + #ifdef TEST_TREESEARCH + sal_Bool impl_testTreeSearch(); + #endif + + //************************************************************************************************************* + private: + + //************************************************************************************************************* + private: + + Reference< XMultiServiceFactory > m_xFactory; + +}; // class TestApplication + +//_________________________________________________________________________________________________________________ +// global variables +//_________________________________________________________________________________________________________________ + +TestApplication aTestApplication ; + +//_________________________________________________________________________________________________________________ +// main +//_________________________________________________________________________________________________________________ + +void TestApplication::Main() +{ +// RegistryCache aCache; + + /**-*********************************************************************************************************** + initialize program + **************************************************************************************************************/ + + // Init global servicemanager and set it. + ServiceManager aManager; + m_xFactory = aManager.getGlobalUNOServiceManager(); + setProcessServiceFactory( m_xFactory ); + + // Control sucess of operation. + LOG_ASSERT( !(m_xFactory.is() ==sal_False ), "TestApplication::Main()\nCan't create global service manager.\n\n" ) + LOG_ASSERT( !(getProcessServiceFactory()!=m_xFactory), "TestApplication::Main()\nGlobal servicemanager not set in UNOTOOLS.\n\n" ) + + /**-*********************************************************************************************************** + test area + **************************************************************************************************************/ + + sal_Bool bState = sal_True; + + //------------------------------------------------------------------------------------------------------------- + #ifdef TEST_FILTERCACHE + impl_testFilterCache(); + #endif + + //------------------------------------------------------------------------------------------------------------- + #ifdef TEST_TYPEDETECTION + impl_testTypeDetection(); + #endif + + //------------------------------------------------------------------------------------------------------------- + #ifdef TEST_LOGINDIALOG + ResMgr* pRessourceManager = CREATEVERSIONRESMGR( lgd ); + Resource::SetResManager( pRessourceManager ); + impl_testLoginDialog(); + #endif + + //------------------------------------------------------------------------------------------------------------- + #ifdef TEST_DESKTOP + Reference< XDesktop > xDesktop( xGlobalServiceManager->createInstance( SERVICENAME_DESKTOP ), UNO_QUERY ); + impl_testDesktop( xDesktop ); + #endif + + //------------------------------------------------------------------------------------------------------------- + #ifdef TEST_PLUGIN + impl_testPlugIn( xDesktop, xGlobalServiceManager ); + #endif + + //------------------------------------------------------------------------------------------------------------- + #ifdef TEST_FILTERREGISTRATION + impl_testFilterRegistration(); + #endif + + //------------------------------------------------------------------------------------------------------------- + #ifdef TEST_TREESEARCH + bState = impl_testTreeSearch(); + #endif + +// Execute(); +// xFrame->dispose(); +// delete pMainWindow; + if( bState = sal_True ) + { + LOG_ERROR( "TestApplication::Main()", "Test successful ..." ) + } + else + { + LOG_ERROR( "TestApplication::Main()", "Test failed ..." ) + } +} + +//_________________________________________________________________________________________________________________ +// test method +//_________________________________________________________________________________________________________________ +#ifdef TEST_TYPEDETECTION +void TestApplication::impl_testTypeDetection() +{ + // We use a string buffer to log important informations and search results. + // Errors are shown directly by an assert! + OUStringBuffer sBuffer( 100000 ); + + // Create a new type detection service. + Reference< XTypeDetection > xTypeDetection( getProcessServiceFactory()->createInstance( SERVICENAME_TYPEDETECTION ), UNO_QUERY ); + LOG_ASSERT( !(xTypeDetection.is()==sal_False), "TestApplication::impl_testTypeDetection()\nCouldn't create the type detection service.\n" ); + + if( xTypeDetection.is() == sal_True ) + { + // a) Check his implementation and his supported interfaces first. + Reference< XInterface > xInterface ( xTypeDetection, UNO_QUERY ); + Reference< XTypeProvider > xTypeProvider ( xTypeDetection, UNO_QUERY ); + Reference< XServiceInfo > xServiceInfo ( xTypeDetection, UNO_QUERY ); + Reference< XNameAccess > xNameAccess ( xTypeDetection, UNO_QUERY ); + Reference< XElementAccess > xElementAccess ( xTypeDetection, UNO_QUERY ); + + LOG_ASSERT( !( xInterface.is() == sal_False || + xTypeProvider.is() == sal_False || + xServiceInfo.is() == sal_False || + xNameAccess.is() == sal_False || + xElementAccess.is() == sal_False ), "TestApplication::impl_testTypeDetection()\nMiss supported for searched interface!\n" ) + + // b) Check OneInstance mode of service. + Reference< XTypeDetection > xTypeDetection2( getProcessServiceFactory()->createInstance( SERVICENAME_TYPEDETECTION ), UNO_QUERY ); + LOG_ASSERT( !(xTypeDetection!=xTypeDetection2), "TestApplication::impl_testTypeDetection()\nService isn't \"OneInstance\" ...!\n" ) + xTypeDetection2 = Reference< XTypeDetection >(); + + // c) Check "XTypeDetection" ... flat by URL + // Define list of URLs for checking. + OUString pURLs[] = + { + DECLARE_ASCII("file://c|/temp/test.sdw" ), + DECLARE_ASCII("private:factory/scalc" ), + DECLARE_ASCII("file://c|/temp/test.txt" ), + DECLARE_ASCII("slot:5000" ), + }; + sal_uInt32 nCount = 4; + Sequence< OUString > seqURLs( pURLs, nCount ); + + Reference< XMultiServiceFactory > xFilterFactory( getProcessServiceFactory()->createInstance( SERVICENAME_FILTERFACTORY ), UNO_QUERY ); + Reference< XMultiServiceFactory > xLoaderFactory( getProcessServiceFactory()->createInstance( SERVICENAME_FRAMELOADERFACTORY), UNO_QUERY ); + LOG_ASSERT( !(xFilterFactory.is()==sal_False), "TestApplication::impl_testTypeDetection()\nCouldn't create filter factory!\n" ) + LOG_ASSERT( !(xLoaderFactory.is()==sal_False), "TestApplication::impl_testTypeDetection()\nCouldn't create loader factory!\n" ) + + // Step over these list. + for( sal_uInt32 nURL=0; nURL<nCount; ++nURL ) + { + // Try to get a type name for every URL from list and log search result. + OUString sTypeName = xTypeDetection->queryTypeByURL( seqURLs[nURL] ); + sBuffer.appendAscii ( "queryTypeByURL( \"" ); + sBuffer.append ( seqURLs[nURL] ); + sBuffer.appendAscii ( "\" ) returns type \"" ); + sBuffer.append ( sTypeName ); + sBuffer.appendAscii ( "\"\n" ); + // If a type was found - try to get a filter and a frame loader for it. + if( sTypeName.getLength() > 0 ) + { + Reference< XInterface > xFilter = xFilterFactory->createInstance( sTypeName ); + Reference< XInterface > xLoader = xLoaderFactory->createInstance( sTypeName ); + if( xFilter.is() == sal_False ) + { + sBuffer.appendAscii( "Couldn't find an filter.\n" ); + } + else + { + Reference< XPropertySet > xFilterProperties( xFilter, UNO_QUERY ); + LOG_ASSERT( !(xFilterProperties.is()==sal_False), "TestApplication::impl_testTypeDetection()\nFilter don't support XPropertySet!\n" ) + if( xFilterProperties.is() == sal_True ) + { + OUString sUIName; + xFilterProperties->getPropertyValue( DECLARE_ASCII("UIName") ) >>= sUIName; + sBuffer.appendAscii ( "Found filter \"" ); + sBuffer.append ( sUIName ); + sBuffer.appendAscii ( "\"\n" ); + } + + Reference< XPropertySet > xLoaderProperties( xLoader, UNO_QUERY ); + LOG_ASSERT( !(xLoaderProperties.is()==sal_False), "TestApplication::impl_testTypeDetection()\nLoader don't support XPropertySet!\n" ) + if( xLoaderProperties.is() == sal_True ) + { + OUString sUIName; + xLoaderProperties->getPropertyValue( DECLARE_ASCII("UIName") ) >>= sUIName; + sBuffer.appendAscii ( "Found loader \"" ); + sBuffer.append ( sUIName ); + sBuffer.appendAscii ( "\"\n" ); + } + } + } + } + } + + WRITE_LOGFILE( "testTypeDetection.log", U2B(sBuffer.makeStringAndClear()) ) +} +#endif + +//_________________________________________________________________________________________________________________ +// test method +//_________________________________________________________________________________________________________________ +#ifdef TEST_FILTERCACHE +void TestApplication::impl_testFilterCache() +{ + FilterCache aCache; + + OUStringBuffer sBuffer( 100000 ); + if( aCache.isValid() == sal_False ) + { + sBuffer.appendAscii( "Cache isn't valid!\n" ); + } + else + { +/* + // Step over all types and log his values. + // These simulate a XNameAccess! + const Sequence< OUString > seqAllTypeNames = aCache.getAllTypeNames(); + sal_uInt32 nCount = seqAllTypeNames.getLength(); + for( sal_uInt32 nPosition=0; nPosition<nCount; ++nPosition ) + { + sBuffer.appendAscii( "--------------------------------------------------------------------------------\n" ); + const TType* pType = aCache.getTypeByName( seqAllTypeNames[nPosition] ); + if( pType == NULL ) + { + sBuffer.appendAscii ( "Type [" ); + sBuffer.append ( (sal_Int32)nPosition ); + sBuffer.appendAscii ( "] \"" ); + sBuffer.append ( seqAllTypeNames[nPosition]); + sBuffer.appendAscii ( "\" isn't valid!" ); + } + else + { + sBuffer.appendAscii ( "Type [" ); + sBuffer.append ( (sal_Int32)nPosition ); + sBuffer.appendAscii ( "] \"" ); + sBuffer.append ( seqAllTypeNames[nPosition] ); + sBuffer.appendAscii ( "\"\n\t\tUIName\t=\t" ); + sBuffer.append ( pType->sUIName ); + sBuffer.appendAscii ( "\n\t\tMediaType\t=\t" ); + sBuffer.append ( pType->sMediaType ); + sBuffer.appendAscii ( "\n\t\tClipboardFormat\t=\t" ); + sBuffer.append ( pType->sClipboardFormat ); + sBuffer.appendAscii ( "\n\t\tURLPattern\t=\t{" ); + for( TConstStringIterator aIterator=pType->lURLPattern.begin(); aIterator!=pType->lURLPattern.end(); ++aIterator ) + { + sBuffer.append ( *aIterator ); + sBuffer.appendAscii ( ";\n\t\t" ); + } + sBuffer.appendAscii( "}\nExtensions\t=\t" ); + for( aIterator=pType->lExtensions.begin(); aIterator!=pType->lExtensions.end(); ++aIterator ) + { + sBuffer.append ( *aIterator ); + sBuffer.appendAscii ( ";\n\t\t" ); + } + sBuffer.appendAscii ( "}\nDocumentIconID\t=\t" ); + sBuffer.append ( (sal_Int32)pType->nDocumentIconID ); + } + } +*/ + // searchFirstType( URL, MediaType, ClipboardFormat, startEntry ) + TCheckedTypeIterator aIterator; + sBuffer.appendAscii( "search type for \"file://c|/temp/test.sdw\"; no media type; no clipboard format\n" ); + OUString sURL = DECLARE_ASCII("file://c|/temp/test.sdw"); + const OUString* pType = aCache.searchFirstType( &sURL, NULL, NULL, aIterator ); + while( pType != NULL ) + { + sBuffer.appendAscii ( "\tfound \"" ); + sBuffer.append ( *pType ); + sBuffer.appendAscii ( "\"\n" ); + pType = aCache.searchType( &sURL, NULL, NULL, aIterator ); + } + } + + WRITE_LOGFILE( "test_FilterCache.log", U2B(sBuffer.makeStringAndClear()) ) +} +#endif + +//_________________________________________________________________________________________________________________ +// test method +//_________________________________________________________________________________________________________________ +#ifdef TEST_LOGINDIALOG +void TestApplication::impl_testLoginDialog() +{ + // Get global servicemanager to create service "LoginDialog". + Reference< XMultiServiceFactory > xFactory = getProcessServiceFactory(); + LOG_ASSERT( !(xFactory.is()==sal_False), "TestApplication::impl_testLoginDialog()\nServicemanager not valid.\n" ) + // Create LoginDialog. + Reference< XDialog > xDialog( xFactory->createInstance( DECLARE_ASCII("com.sun.star.framework.LoginDialog") ), UNO_QUERY ); + LOG_ASSERT( !(xDialog.is()==sal_False), "TestApplication::impl_testLoginDialog()\nCould not create login dialog.\n" ) + // Check set/getTitle() + /* not implemented yet! */ +// OUString sTitle = DECLARE_ASCII("Login Dialog Test"); +// xDialog->setTitle( sTitle ); +// LOG_ASSERT( !(xDialog->getTitle()!=sTitle), "TestApplication::impl_testLoginDialog()\nset/getTitle don't work correct.\n" ) + + UniString sInternalURL = DECLARE_ASCII("private:factory/scalc"); + UniString sExternalURL = OUString(); + + OString sOut = "internal: "; + sOut += OUStringToOString( sInternalURL, RTL_TEXTENCODING_UTF8 ); + sOut += "\nexternal: "; + sOut += OUStringToOString( sExternalURL, RTL_TEXTENCODING_UTF8 ); + sOut += "\n"; + LOG_ASSERT( sal_False, sOut ) + + INetURLObject::translateToExternal( sInternalURL, sExternalURL ); + sOut = "internal: "; + sOut += OUStringToOString( sInternalURL, RTL_TEXTENCODING_UTF8 ); + sOut += "\nexternal: "; + sOut += OUStringToOString( sExternalURL, RTL_TEXTENCODING_UTF8 ); + sOut += "\n"; + LOG_ASSERT( sal_False, sOut ) + + INetURLObject::translateToInternal( sExternalURL, sInternalURL ); + sOut = "internal: "; + sOut += OUStringToOString( sInternalURL, RTL_TEXTENCODING_UTF8 ); + sOut += "\nexternal: "; + sOut += OUStringToOString( sExternalURL, RTL_TEXTENCODING_UTF8 ); + sOut += "\n"; + LOG_ASSERT( sal_False, sOut ) + + // Work with properties of dialog. + Reference< XPropertySet > xPropertySet( xDialog, UNO_QUERY ); + LOG_ASSERT( !(xPropertySet.is()==sal_False), "TestApplication::impl_testLoginDialog()\nCan't cast dialog to XPropertySet interface.\n" ) + Any aUserName ; + Any aPassword ; + Any aServer ; + Any aConnectionType ; + Any aPort ; + aUserName <<= DECLARE_ASCII("Andreas"); + aPassword <<= DECLARE_ASCII("Test"); + aServer <<= DECLARE_ASCII("www.yahoo.de:7777"); + aConnectionType <<= DECLARE_ASCII("Bla"); + sal_Int32 nPort = 8081; + aPort <<= nPort; + try + { + xPropertySet->setPropertyValue( DECLARE_ASCII("UserName" ), aUserName ); + xPropertySet->setPropertyValue( DECLARE_ASCII("Password" ), aPassword ); + xPropertySet->setPropertyValue( DECLARE_ASCII("Server" ), aServer ); + xPropertySet->setPropertyValue( DECLARE_ASCII("ConnectionType" ), aConnectionType ); + xPropertySet->setPropertyValue( DECLARE_ASCII("Compressed" ), aPort ); + } + catch( ::com::sun::star::beans::UnknownPropertyException& ) + { + LOG_ASSERT( sal_False, "UnkownPropertyException detected!\n" ) + } + catch( ::com::sun::star::beans::PropertyVetoException& ) + { + LOG_ASSERT( sal_False, "PropertyVetoException detected!\n" ) + } + catch( ::com::sun::star::lang::IllegalArgumentException& ) + { + LOG_ASSERT( sal_False, "IllegalArgumentException detected!\n" ) + } + catch( ::com::sun::star::lang::WrappedTargetException& ) + { + LOG_ASSERT( sal_False, "WrappedTargetException detected!\n" ) + } + catch( ::com::sun::star::uno::RuntimeException& ) + { + LOG_ASSERT( sal_False, "RuntimeException detected!\n" ) + } + + xDialog->execute(); + + OUString sUserName ; + OUString sPassword ; + OUString sServer ; + OUString sConnectionType ; + xPropertySet->getPropertyValue( DECLARE_ASCII("UserName" ) ) >>= sUserName ; + xPropertySet->getPropertyValue( DECLARE_ASCII("Password" ) ) >>= sPassword ; + xPropertySet->getPropertyValue( DECLARE_ASCII("Server" ) ) >>= sServer ; + xPropertySet->getPropertyValue( DECLARE_ASCII("ConnectionType" ) ) >>= sConnectionType ; + xPropertySet->getPropertyValue( sConnectionType ) >>= nPort ; + + LOG_ASSERT( sal_False, OUStringToOString( sUserName, RTL_TEXTENCODING_UTF8 ) ) + LOG_ASSERT( sal_False, OUStringToOString( sPassword, RTL_TEXTENCODING_UTF8 ) ) + LOG_ASSERT( sal_False, OUStringToOString( sServer , RTL_TEXTENCODING_UTF8 ) ) + LOG_ASSERT( sal_False, OUStringToOString( sConnectionType , RTL_TEXTENCODING_UTF8 ) ) + LOG_ASSERT( sal_False, OString::valueOf( (sal_Int32)nPort ) ) +} +#endif + +//_________________________________________________________________________________________________________________ +// test method +//_________________________________________________________________________________________________________________ +#ifdef TEST_PLUGIN +void TestApplication::impl_testPlugIn( const Reference< XDesktop >& xDesktop, const Reference< XMultiServiceFactory >& xFactory ) +{ + // create instance provider for creation of factories. + Reference< XInstanceProvider > xInstanceProvider( (OWeakObject*)(new OInstanceProvider( xFactory )), UNO_QUERY ); + LOG_ASSERT( !(xInstanceProvider.is()==sal_False), "TestApplication::impl_testPlugIn()\nCan't create new instance provider!\n" ) + + // try to get factory for create a plugin + Reference< XSingleServiceFactory > xPlugInFactory( xInstanceProvider->getInstance( INSTANCENAME_PLUGINFACTORY ), UNO_QUERY ); + LOG_ASSERT( !(xPlugInFactory.is()==sal_False), "TestApplication::impl_testPlugIn()\nCan't get PlugInFactory from instance provider!\n" ) + + // initialize parameter for creation of plugin + Reference< XPluginInstancePeer > xPlugInDLL =Reference< XPluginInstancePeer >(); + Sequence< Any > seqArguments(1); + seqArguments[0] <<= xPlugInDLL; + + // create plugin + Reference< XFrame > xPlugIn( xPlugInFactory->createInstanceWithArguments( seqArguments ), UNO_QUERY ); + LOG_ASSERT( !(xPlugIn.is()==sal_False), "TestApplication::impl_testPlugIn()\nFactory has created no valid plugin!\n" ) + + xPlugIn->setName( OUString(RTL_CONSTASCII_USTRINGPARAM("PlugIn")) ); + Reference< XFramesSupplier > xSupplier( xDesktop, UNO_QUERY ); + xPlugIn->setCreator( xSupplier ); +} +#endif + +//_________________________________________________________________________________________________________________ +// test method +//_________________________________________________________________________________________________________________ +#ifdef TEST_DESKTOP +#define LOGFILE_TARGETING "targeting.log" +void TestApplication::impl_testDesktop( const Reference< XDesktop >& xDesktop ) +{ + //------------------------------------------------------------------------------------------------------------- + // 1) Test cast to all supported interfaces of Desktop. + + Reference< XInterface > xDesktopInterface ( xDesktop, UNO_QUERY ); + Reference< XTypeProvider > xDesktopTypeProvider ( xDesktop, UNO_QUERY ); + Reference< XServiceInfo > xDesktopServiceInfo ( xDesktop, UNO_QUERY ); + Reference< XComponentLoader > xDesktopComponentLoader ( xDesktop, UNO_QUERY ); + Reference< XTasksSupplier > xDesktopTasksSupplier ( xDesktop, UNO_QUERY ); + Reference< XDispatchProvider > xDesktopDispatchProvider ( xDesktop, UNO_QUERY ); + Reference< XFramesSupplier > xDesktopFramesSupplier ( xDesktop, UNO_QUERY ); + Reference< XFrame > xDesktopFrame ( xDesktop, UNO_QUERY ); + Reference< XComponent > xDesktopComponent ( xDesktop, UNO_QUERY ); + Reference< XStatusIndicatorFactory > xDesktopStatusIndicatorFactory ( xDesktop, UNO_QUERY ); + Reference< XPropertySet > xDesktopPropertySet ( xDesktop, UNO_QUERY ); + Reference< XFastPropertySet > xDesktopFastPropertySet ( xDesktop, UNO_QUERY ); + Reference< XMultiPropertySet > xDesktopMultiPropertySet ( xDesktop, UNO_QUERY ); + + LOG_ASSERT( !(xDesktopInterface.is() ==sal_False), "TestApplication::impl_testDesktop()\nXInterface not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopTypeProvider.is() ==sal_False), "TestApplication::impl_testDesktop()\nXTypeProvider not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopServiceInfo.is() ==sal_False), "TestApplication::impl_testDesktop()\nXServiceInfo not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktop.is() ==sal_False), "TestApplication::impl_testDesktop()\nXDesktop not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopComponentLoader.is() ==sal_False), "TestApplication::impl_testDesktop()\nXComponentLoader not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopTasksSupplier.is() ==sal_False), "TestApplication::impl_testDesktop()\nXTasksSupplier not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopDispatchProvider.is() ==sal_False), "TestApplication::impl_testDesktop()\nXDispatchProvider not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopFramesSupplier.is() ==sal_False), "TestApplication::impl_testDesktop()\nXFramesSupplier not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopFrame.is() ==sal_False), "TestApplication::impl_testDesktop()\nXFrame not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopComponent.is() ==sal_False), "TestApplication::impl_testDesktop()\nXComponent not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopStatusIndicatorFactory.is() ==sal_False), "TestApplication::impl_testDesktop()\nXStatusIndicatorFactory not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopPropertySet.is() ==sal_False), "TestApplication::impl_testDesktop()\nXPropertySet not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopFastPropertySet.is() ==sal_False), "TestApplication::impl_testDesktop()\nXFastPropertySet not supported by Desktop.\n\n" ) + LOG_ASSERT( !(xDesktopMultiPropertySet.is() ==sal_False), "TestApplication::impl_testDesktop()\nXMultiPropertySet not supported by Desktop.\n\n" ) + + //------------------------------------------------------------------------------------------------------------- + // 2) Test set-/getName(). + + // 2a) Test default value "Desktop". + OUString sName( RTL_CONSTASCII_USTRINGPARAM("Desktop") ); + LOG_ASSERT( !(xDesktopFrame->getName()!=sName), "TestApplication::impl_testDesktop()\nDefault value of desktop name is invalid.\n\n" ) + + // 2b) Set name and try to get the same name. + sName = OUString( RTL_CONSTASCII_USTRINGPARAM("New Desktop") ); + xDesktopFrame->setName( sName ); + LOG_ASSERT( !(xDesktopFrame->getName()!=sName), "TestApplication::impl_testDesktop()\nSetting of name works not correct on desktop.\n\n" ) + + // Reset name do default! + // Its neccessary for follow operations. + sName = OUString( RTL_CONSTASCII_USTRINGPARAM("Desktop") ); + xDesktopFrame->setName( sName ); + + //------------------------------------------------------------------------------------------------------------- + // 3) Test findFrame(). + + // Build new example tree and log initial structure in file. + impl_buildTree ( xDesktop ); + impl_logTree ( xDesktop ); + + OUString sTargetFrameName; + sal_uInt32 nSearchFlags ; + Reference< XFrame > xSearchFrame ; + Reference< XFrame > xTask_4 ; + Reference< XFrame > xFrame_41 ; + Reference< XFrame > xFrame_411 ; + Reference< XFrame > xFrame_112 ; + Reference< XFrame > xFrame_1123 ; + Reference< XFrame > xFrame_11231 ; + Reference< XFrame > xFrame_11221 ; + + // 3a) Search for Desktop + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with SELF for \"Desktop\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + sTargetFrameName = OUString(RTL_CONSTASCII_USTRINGPARAM("Desktop")); + nSearchFlags = FrameSearchFlag::SELF; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_False), "TestApplication::impl_testDesktop()\nSearch 3a)-1 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with ALL for \"Desktop\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::ALL; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_False), "TestApplication::impl_testDesktop()\nSearch 3a)-2 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with CHILDREN for \"Desktop\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::CHILDREN; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3a)-3 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with SIBLINGS for \"Desktop\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::SIBLINGS; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3a)-4 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with AUTO for \"Desktop\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::AUTO; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3a)-5 invalid\n" ); + + // 3b) Search for Task_4 + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with SELF for \"Task_4\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + sTargetFrameName = OUString(RTL_CONSTASCII_USTRINGPARAM("Task_4")); + nSearchFlags = FrameSearchFlag::SELF; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3b)-1 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with SIBLINGS for \"Task_4\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::SIBLINGS; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3b)-2 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with CHILDREN for \"Task_4\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::CHILDREN; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_False), "TestApplication::impl_testDesktop()\nSearch 3b)-3 invalid\n" ); + + xTask_4 = xSearchFrame; + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with ALL for \"Task_4\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::ALL; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_False), "TestApplication::impl_testDesktop()\nSearch 3b)-4 invalid\n" ); + + // 3c) Search for Frame_41 + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with SELF for \"Frame_41\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + sTargetFrameName = OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_41")); + nSearchFlags = FrameSearchFlag::SELF; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3c)-1 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with SIBLINGS for \"Frame_41\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::SIBLINGS; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3c)-2 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with CHILDREN for \"Frame_41\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::CHILDREN; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_False), "TestApplication::impl_testDesktop()\nSearch 3c)-3 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with ALL for \"Frame_41\" on Desktop\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::ALL; + xSearchFrame = xDesktopFrame->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_False), "TestApplication::impl_testDesktop()\nSearch 3c)-4 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with SELF for \"Frame_41\" on Task_4\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::SELF; + xSearchFrame = xTask_4->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3c)-5 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with SIBLINGS for \"Frame_41\" on Task_4\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::SIBLINGS; + xSearchFrame = xTask_4->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_True), "TestApplication::impl_testDesktop()\nSearch 3c)-6 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with CHILDREN for \"Frame_41\" on Task_4\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::CHILDREN; + xSearchFrame = xTask_4->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_False), "TestApplication::impl_testDesktop()\nSearch 3c)-7 invalid\n" ); + + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, " Search with ALL for \"Frame_41\" on Task_4\n" ) + WRITE_LOGFILE( LOGFILE_TARGETING, "--------------------------------------------------------------------------------\n" ) + nSearchFlags = FrameSearchFlag::ALL; + xSearchFrame = xTask_4->findFrame(sTargetFrameName, nSearchFlags); + LOG_ASSERT( !(xSearchFrame.is()==sal_False), "TestApplication::impl_testDesktop()\nSearch 3c)-8 invalid\n" ); + + xFrame_41 = xSearchFrame; + + // 3d) Search for Frame_411 + // 3e) Search for Frame_112 + // 3f) Search for Frame_1123 + // 3g) Search for Frame_11231 + // 3h) Search for Frame_11221 +} + +//_________________________________________________________________________________________________________________ +// helper method to build a new binaer-tree with desktop as top-frame +//_________________________________________________________________________________________________________________ +void TestApplication::impl_buildTree( const Reference< XDesktop >& xDesktop ) +{ + // You can append and remove frames only on XFRames interface of desktop. + // But the desktop support this interface not directly! Use getFrames() instantly. + Reference< XFramesSupplier > xDesktopSupplier( xDesktop, UNO_QUERY ); + Reference< XFrames > xFrames = xDesktopSupplier->getFrames(); + LOG_ASSERT( !(xFrames.is()==sal_False), "TestApplication::impl_buildTree()\nCan't get framesaccess on desktop.\n\n" ) + + // Create some tasks and frames. + Reference< XMultiServiceFactory > xServiceManager( getProcessServiceFactory() ); + + Reference< XTask > xTask_1( xServiceManager->createInstance(SERVICENAME_TASK), UNO_QUERY ); + Reference< XTask > xTask_2( xServiceManager->createInstance(SERVICENAME_TASK), UNO_QUERY ); + Reference< XTask > xTask_3( xServiceManager->createInstance(SERVICENAME_TASK), UNO_QUERY ); + Reference< XTask > xTask_4( xServiceManager->createInstance(SERVICENAME_TASK), UNO_QUERY ); + Reference< XTask > xTask_5( xServiceManager->createInstance(SERVICENAME_TASK), UNO_QUERY ); + Reference< XFrame > xFrame_11( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_12( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_21( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_22( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_31( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_32( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_41( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_42( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_51( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_52( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_111( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_112( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_121( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_411( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_1121( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_1122( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_1123( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_4111( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_4112( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_4113( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_11221( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + Reference< XFrame > xFrame_11231( xServiceManager->createInstance(SERVICENAME_FRAME), UNO_QUERY ); + + // Initialize tasks and frames with names to support easy finding! + Reference< XFrame > xTaskFrame_1( xTask_1, UNO_QUERY ); + Reference< XFrame > xTaskFrame_2( xTask_2, UNO_QUERY ); + Reference< XFrame > xTaskFrame_3( xTask_3, UNO_QUERY ); + Reference< XFrame > xTaskFrame_4( xTask_4, UNO_QUERY ); + Reference< XFrame > xTaskFrame_5( xTask_5, UNO_QUERY ); + + xTaskFrame_1->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Task_1"))); + xTaskFrame_2->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Task_2"))); + xTaskFrame_3->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Task_3"))); + xTaskFrame_4->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Task_4"))); + xTaskFrame_5->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Task_5"))); + xFrame_11->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_11"))); + xFrame_12->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_12"))); + xFrame_21->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_21"))); + xFrame_22->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_22"))); + xFrame_31->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_31"))); + xFrame_32->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_32"))); + xFrame_41->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_41"))); + xFrame_42->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_42"))); + xFrame_51->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_51"))); + xFrame_52->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_52"))); + xFrame_111->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_111"))); + xFrame_112->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_112"))); + xFrame_121->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_121"))); + xFrame_411->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_411"))); + xFrame_1121->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_1121"))); + xFrame_1122->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_1122"))); + xFrame_1123->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_1123"))); + xFrame_4111->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_4111"))); + xFrame_4112->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_4112"))); + xFrame_4113->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_4113"))); + xFrame_11221->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_11221"))); + xFrame_11231->setName(OUString(RTL_CONSTASCII_USTRINGPARAM("Frame_11231"))); + + // Build tree. + // Append tasks as childs of desktop. + xFrames->append( xTaskFrame_1 ); + xFrames->append( xTaskFrame_2 ); + xFrames->append( xTaskFrame_3 ); + xFrames->append( xTaskFrame_4 ); + xFrames->append( xTaskFrame_5 ); + + // Append frames as childs of tasks. + Reference< XFramesSupplier > xTaskFramesSupplier_1( xTask_1, UNO_QUERY ); + Reference< XFramesSupplier > xTaskFramesSupplier_2( xTask_2, UNO_QUERY ); + Reference< XFramesSupplier > xTaskFramesSupplier_3( xTask_3, UNO_QUERY ); + Reference< XFramesSupplier > xTaskFramesSupplier_4( xTask_4, UNO_QUERY ); + Reference< XFramesSupplier > xTaskFramesSupplier_5( xTask_5, UNO_QUERY ); + Reference< XFramesSupplier > xFramesSupplier_11( xFrame_11, UNO_QUERY ); + Reference< XFramesSupplier > xFramesSupplier_12( xFrame_12, UNO_QUERY ); + Reference< XFramesSupplier > xFramesSupplier_112( xFrame_112, UNO_QUERY ); + Reference< XFramesSupplier > xFramesSupplier_1122( xFrame_1122, UNO_QUERY ); + Reference< XFramesSupplier > xFramesSupplier_1123( xFrame_1123, UNO_QUERY ); + Reference< XFramesSupplier > xFramesSupplier_41( xFrame_41, UNO_QUERY ); + Reference< XFramesSupplier > xFramesSupplier_411( xFrame_411, UNO_QUERY ); + + xFrames = xTaskFramesSupplier_1->getFrames(); + xFrames->append( xFrame_11 ); + xFrames->append( xFrame_12 ); + xFrames = xTaskFramesSupplier_2->getFrames(); + xFrames->append( xFrame_21 ); + xFrames->append( xFrame_22 ); + xFrames = xTaskFramesSupplier_3->getFrames(); + xFrames->append( xFrame_31 ); + xFrames->append( xFrame_32 ); + xFrames = xTaskFramesSupplier_4->getFrames(); + xFrames->append( xFrame_41 ); + xFrames->append( xFrame_42 ); + xFrames = xTaskFramesSupplier_5->getFrames(); + xFrames->append( xFrame_51 ); + xFrames->append( xFrame_52 ); + xFrames = xFramesSupplier_11->getFrames(); + xFrames->append( xFrame_111 ); + xFrames->append( xFrame_112 ); + xFrames = xFramesSupplier_12->getFrames(); + xFrames->append( xFrame_121 ); + xFrames = xFramesSupplier_112->getFrames(); + xFrames->append( xFrame_1121 ); + xFrames->append( xFrame_1122 ); + xFrames->append( xFrame_1123 ); + xFrames = xFramesSupplier_1122->getFrames(); + xFrames->append( xFrame_11221 ); + xFrames = xFramesSupplier_1123->getFrames(); + xFrames->append( xFrame_11231 ); + xFrames = xFramesSupplier_41->getFrames(); + xFrames->append( xFrame_411 ); + xFrames = xFramesSupplier_411->getFrames(); + xFrames->append( xFrame_4111 ); + xFrames->append( xFrame_4112 ); + xFrames->append( xFrame_4113 ); + + // Create some active paths. + // desktop => task_1 => frame_11 => frame_112 => frame_1122 +// xDesktopSupplier->setActiveFrame( xTaskFrame_1 ); +// xTaskFramesSupplier_1->setActiveFrame( xFrame_11 ); +// xFramesSupplier_11->setActiveFrame( xFrame_112 ); +// xFramesSupplier_112->setActiveFrame( xFrame_1122 ); + // frame_41 => frame_411 => frame_4111 +// xFramesSupplier_41->setActiveFrame( xFrame_411 ); +// xFramesSupplier_411->setActiveFrame( xFrame_4111 ); + // task_3 => frame_31 +// xTaskFramesSupplier_3->setActiveFrame( xFrame_31 ); + // frame_1123 => frame_11231 +// xFramesSupplier_1123->setActiveFrame( xFrame_11231 ); + +// xTask_1->activate(); +// impl_logTree( xDesktop ); +// xFrame_41->activate(); +// impl_logTree( xDesktop ); +// xFrame_52->activate(); +// impl_logTree( xDesktop ); +// WRITE_LOGFILE( LOGFILENAME_TREE, "initiale Hierarchy:" ) + impl_logTree( xDesktop ); + +// xFrame_121->activate(); +// impl_logTree( xDesktop ); +// xFrame_41->activate(); +// impl_logTree( xDesktop ); +// xFrame_52->activate(); +// impl_logTree( xDesktop ); +// WRITE_LOGFILE( LOGFILENAME_EVENTS, "nach xFrame_411->activate():" ) + xFrame_411->activate(); +// WRITE_LOGFILE( LOGFILENAME_TREE, "nach xFrame_411->activate():" ) + impl_logTree( xDesktop ); +// xFrame_41->deactivate(); +// impl_logTree( xDesktop ); +// xFrame_4113->activate(); +// impl_logTree( xDesktop ); +// xFrame_21->activate(); +// impl_logTree( xDesktop ); +// WRITE_LOGFILE( LOGFILENAME_EVENTS, "nach xFrame_11231->activate():" ) + xFrame_11231->activate(); +// WRITE_LOGFILE( LOGFILENAME_TREE, "nach xFrame_11231->activate():" ) + impl_logTree( xDesktop ); + +// WRITE_LOGFILE( LOGFILENAME_EVENTS, "nach xFrame_11221->activate():" ) + xFrame_11221->activate(); +// WRITE_LOGFILE( LOGFILENAME_TREE, "nach xFrame_11221->activate():" ) + impl_logTree( xDesktop ); + +// WRITE_LOGFILE( LOGFILENAME_EVENTS, "nach xFrame_112->deactivate():" ) +// xFrame_112->getCreator()->setActiveFrame( Reference< XFrame >() ); + xFrame_112->deactivate(); +// WRITE_LOGFILE( LOGFILENAME_TREE, "nach xFrame_112->deactivate():" ) + impl_logTree( xDesktop ); + +// WRITE_LOGFILE( LOGFILENAME_EVENTS, "nach xFrame_41->activate():" ) + xFrame_41->activate(); +// WRITE_LOGFILE( LOGFILENAME_TREE, "nach xFrame_41->activate():" ) + impl_logTree( xDesktop ); + +// WRITE_LOGFILE( LOGFILENAME_EVENTS, "nach xTask_4->activate():" ) + xTask_4->activate(); +// WRITE_LOGFILE( LOGFILENAME_TREE, "nach xTask_4->activate():" ) + impl_logTree( xDesktop ); + +// WRITE_LOGFILE( LOGFILENAME_EVENTS, "nach xFrame_1123->deactivate():" ) + xFrame_1123->deactivate(); +// WRITE_LOGFILE( LOGFILENAME_TREE, "nach xFrame_1123->deactivate():" ) + impl_logTree( xDesktop ); +} + +//_________________________________________________________________________________________________________________ +// helper method to log current tree state +//_________________________________________________________________________________________________________________ +void TestApplication::impl_logTree( const Reference< XDesktop >& xDesktop ) +{ +#ifdef ENABLE_SERVICEDEBUG + // Use special feature of Desktop-implementation. + // NEVER USE THIS IN RELEASE VERSIONS!!! + Reference< XSPECIALDEBUGINTERFACE > xDebug( xDesktop, UNO_QUERY ); + + // Get a "stream" of all names of frames in tree. + OUString sTreeNamesStream = xDebug->dumpVariable( DUMPVARIABLE_TREEINFO, 0 ); + // And write it to logfile. + OString sOutPut = OUStringToOString( sTreeNamesStream, RTL_TEXTENCODING_UTF8 ); +// WRITE_LOGFILE( LOGFILENAME_TREE, "\nNew tree log:\n\n" ); +// WRITE_LOGFILE( LOGFILENAME_TREE, sOutPut ); +// WRITE_LOGFILE( LOGFILENAME_TREE, "\n" ); +#endif +} +#endif // TEST_DESKTOP + +//_________________________________________________________________________________________________________________ +// test method for registration of new filters in configuration +//_________________________________________________________________________________________________________________ +#ifdef TEST_FILTERREGISTRATION +void TestApplication::impl_testFilterRegistration() +{ + Reference< XNameContainer > xContainer( m_xFactory->createInstance( SERVICENAME_FILTERFACTORY ), UNO_QUERY ); + LOG_ASSERT( !(xContainer.is()==sal_False), "TestApplication::impl_testFilterRegistration()\nCould not create FilterFactory-service or cast it to XNameContainer.\n" ) + if( xContainer.is() == sal_True ) + { + Sequence< PropertyValue > lProperties( 8 ); + + lProperties[0].Name = DECLARE_ASCII("Type" ); + lProperties[0].Value <<= DECLARE_ASCII("component_DB" ); + + lProperties[1].Name = DECLARE_ASCII("UIName" ); + lProperties[1].Value <<= DECLARE_ASCII("Ein neuer Filter-Eintrag"); + + lProperties[2].Name = DECLARE_ASCII("DocumentService" ); + lProperties[2].Value <<= DECLARE_ASCII("test.document.service" ); + + lProperties[3].Name = DECLARE_ASCII("FilterService" ); + lProperties[3].Value <<= DECLARE_ASCII("test.filter.service" ); + + lProperties[4].Name = DECLARE_ASCII("Flags" ); + lProperties[4].Value <<= (sal_Int32)100; + + Sequence< OUString > lTempData(1); + lTempData[0] = DECLARE_ASCII("meine UserData"); + lProperties[5].Name = DECLARE_ASCII("UserData" ); + lProperties[5].Value <<= lTempData; + + lProperties[6].Name = DECLARE_ASCII("FileFormatVersion" ); + lProperties[6].Value <<= (sal_Int32)1; + + lProperties[7].Name = DECLARE_ASCII("TemplateName" ); + lProperties[7].Value <<= DECLARE_ASCII("Mein Template Name" ); + + Any aProperties; + aProperties <<= lProperties; + xContainer->insertByName( DECLARE_ASCII("mein_eigener_neuer_Filter"), aProperties ); + + lProperties[0].Name = DECLARE_ASCII("Type" ); + lProperties[0].Value <<= DECLARE_ASCII("component_DB" ); + + lProperties[1].Name = DECLARE_ASCII("UIName" ); + lProperties[1].Value <<= DECLARE_ASCII("Ein neuer Filter-Eintrag 2"); + + lProperties[2].Name = DECLARE_ASCII("DocumentService" ); + lProperties[2].Value <<= DECLARE_ASCII("test.document.service 2" ); + + lProperties[3].Name = DECLARE_ASCII("FilterService" ); + lProperties[3].Value <<= DECLARE_ASCII("test.filter.service 2" ); + + lProperties[4].Name = DECLARE_ASCII("Flags" ); + lProperties[4].Value <<= (sal_Int32)200; + + lTempData[0] = DECLARE_ASCII("meine UserData 2"); + lProperties[5].Name = DECLARE_ASCII("UserData" ); + lProperties[5].Value <<= lTempData; + + lProperties[6].Name = DECLARE_ASCII("FileFormatVersion" ); + lProperties[6].Value <<= (sal_Int32)2; + + lProperties[7].Name = DECLARE_ASCII("TemplateName" ); + lProperties[7].Value <<= DECLARE_ASCII("Mein Template Name 2" ); + + aProperties <<= lProperties; + xContainer->insertByName( DECLARE_ASCII("mein_eigener_neuer_Filter_2"), aProperties ); + + xContainer->removeByName( DECLARE_ASCII("mein_eigener_neuer_Filter") ); + } +} +#endif + +//_________________________________________________________________________________________________________________ +// test method for search mechanism in our frame tree +//_________________________________________________________________________________________________________________ +#ifdef TEST_TREESEARCH +sal_Bool TestApplication::impl_testTreeSearch() +{ + // Build an example tree. + Reference< XFrame > xD ( m_xFactory->createInstance( SERVICENAME_DESKTOP ), UNO_QUERY ); + Reference< XFrame > xT1 ( m_xFactory->createInstance( SERVICENAME_TASK ), UNO_QUERY ); + Reference< XFrame > xT2 ( m_xFactory->createInstance( SERVICENAME_TASK ), UNO_QUERY ); + Reference< XFrame > xT3 ( m_xFactory->createInstance( SERVICENAME_TASK ), UNO_QUERY ); + Reference< XFrame > xF11 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF12 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF22 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF211 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF212 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF221 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF2111 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF2112 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF2121 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF2122 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF2211 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21111 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21112 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21121 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21122 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21211 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21212 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21221 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF21222 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + Reference< XFrame > xF22111 ( m_xFactory->createInstance( SERVICENAME_FRAME ), UNO_QUERY ); + + xD->setName ( DECLARE_ASCII("D" ) ); + xT1->setName ( DECLARE_ASCII("T1" ) ); + xT2->setName ( DECLARE_ASCII("T2" ) ); + xT3->setName ( DECLARE_ASCII("T3" ) ); + xF11->setName ( DECLARE_ASCII("F11" ) ); + xF12->setName ( DECLARE_ASCII("F12" ) ); + xF21->setName ( DECLARE_ASCII("F21" ) ); + xF22->setName ( DECLARE_ASCII("F22" ) ); + xF211->setName ( DECLARE_ASCII("F211" ) ); + xF212->setName ( DECLARE_ASCII("F212" ) ); + xF221->setName ( DECLARE_ASCII("F221" ) ); + xF2111->setName ( DECLARE_ASCII("F2111" ) ); + xF2112->setName ( DECLARE_ASCII("F2112" ) ); + xF2121->setName ( DECLARE_ASCII("F2121" ) ); + xF2122->setName ( DECLARE_ASCII("F2122" ) ); + xF2211->setName ( DECLARE_ASCII("F2211" ) ); + xF21111->setName( DECLARE_ASCII("F21111") ); + xF21112->setName( DECLARE_ASCII("F21112") ); + xF21121->setName( DECLARE_ASCII("F21121") ); + xF21122->setName( DECLARE_ASCII("F21122") ); + xF21211->setName( DECLARE_ASCII("F21211") ); + xF21212->setName( DECLARE_ASCII("F21212") ); + xF21221->setName( DECLARE_ASCII("F21221") ); + xF21222->setName( DECLARE_ASCII("F21222") ); + xF22111->setName( DECLARE_ASCII("F22111") ); + + Reference< XFramesSupplier > xSD ( xD , UNO_QUERY ); + Reference< XFramesSupplier > xST1 ( xT1 , UNO_QUERY ); + Reference< XFramesSupplier > xST2 ( xT2 , UNO_QUERY ); + Reference< XFramesSupplier > xST3 ( xT3 , UNO_QUERY ); + Reference< XFramesSupplier > xSF11 ( xF11 , UNO_QUERY ); + Reference< XFramesSupplier > xSF12 ( xF12 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21 ( xF21 , UNO_QUERY ); + Reference< XFramesSupplier > xSF22 ( xF22 , UNO_QUERY ); + Reference< XFramesSupplier > xSF211 ( xF211 , UNO_QUERY ); + Reference< XFramesSupplier > xSF212 ( xF212 , UNO_QUERY ); + Reference< XFramesSupplier > xSF221 ( xF221 , UNO_QUERY ); + Reference< XFramesSupplier > xSF2111 ( xF2111 , UNO_QUERY ); + Reference< XFramesSupplier > xSF2112 ( xF2112 , UNO_QUERY ); + Reference< XFramesSupplier > xSF2121 ( xF2121 , UNO_QUERY ); + Reference< XFramesSupplier > xSF2122 ( xF2122 , UNO_QUERY ); + Reference< XFramesSupplier > xSF2211 ( xF2211 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21111 ( xF21111 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21112 ( xF21112 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21121 ( xF21121 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21122 ( xF21122 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21211 ( xF21211 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21212 ( xF21212 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21221 ( xF21221 , UNO_QUERY ); + Reference< XFramesSupplier > xSF21222 ( xF21222 , UNO_QUERY ); + Reference< XFramesSupplier > xSF22111 ( xF22111 , UNO_QUERY ); + + xSD->getFrames()->append ( xT1 ); + xSD->getFrames()->append ( xT2 ); + xSD->getFrames()->append ( xT3 ); + xST1->getFrames()->append ( xF11 ); + xST1->getFrames()->append ( xF12 ); + xST2->getFrames()->append ( xF21 ); + xST2->getFrames()->append ( xF22 ); + xSF21->getFrames()->append ( xF211 ); + xSF21->getFrames()->append ( xF212 ); + xSF211->getFrames()->append ( xF2111 ); + xSF211->getFrames()->append ( xF2112 ); + xSF212->getFrames()->append ( xF2121 ); + xSF212->getFrames()->append ( xF2122 ); + xSF2111->getFrames()->append ( xF21111 ); + xSF2111->getFrames()->append ( xF21112 ); + xSF2112->getFrames()->append ( xF21121 ); + xSF2112->getFrames()->append ( xF21122 ); + xSF2121->getFrames()->append ( xF21211 ); + xSF2121->getFrames()->append ( xF21212 ); + xSF2122->getFrames()->append ( xF21221 ); + xSF2122->getFrames()->append ( xF21222 ); + xSF22->getFrames()->append ( xF221 ); + xSF221->getFrames()->append ( xF2211 ); + xSF2211->getFrames()->append ( xF22111 ); + + sal_Int32 nFlags = 0; + + // Test deep down search + nFlags = FrameSearchFlag::CHILDREN; + if ( + ( xD->findFrame( DECLARE_ASCII("T1" ), nFlags ) != xT1 ) || + ( xD->findFrame( DECLARE_ASCII("T2" ), nFlags ) != xT2 ) || + ( xD->findFrame( DECLARE_ASCII("T3" ), nFlags ) != xT3 ) || + ( xD->findFrame( DECLARE_ASCII("F11" ), nFlags ) != xF11 ) || + ( xD->findFrame( DECLARE_ASCII("F12" ), nFlags ) != xF12 ) || + ( xD->findFrame( DECLARE_ASCII("F21" ), nFlags ) != xF21 ) || + ( xD->findFrame( DECLARE_ASCII("F22" ), nFlags ) != xF22 ) || + ( xD->findFrame( DECLARE_ASCII("F211" ), nFlags ) != xF211 ) || + ( xD->findFrame( DECLARE_ASCII("F212" ), nFlags ) != xF212 ) || + ( xD->findFrame( DECLARE_ASCII("F2111" ), nFlags ) != xF2111 ) || + ( xD->findFrame( DECLARE_ASCII("F2112" ), nFlags ) != xF2112 ) || + ( xD->findFrame( DECLARE_ASCII("F2121" ), nFlags ) != xF2121 ) || + ( xD->findFrame( DECLARE_ASCII("F2122" ), nFlags ) != xF2122 ) || + ( xD->findFrame( DECLARE_ASCII("F21111" ), nFlags ) != xF21111 ) || + ( xD->findFrame( DECLARE_ASCII("F21112" ), nFlags ) != xF21112 ) || + ( xD->findFrame( DECLARE_ASCII("F21121" ), nFlags ) != xF21121 ) || + ( xD->findFrame( DECLARE_ASCII("F21122" ), nFlags ) != xF21122 ) || + ( xD->findFrame( DECLARE_ASCII("F21211" ), nFlags ) != xF21211 ) || + ( xD->findFrame( DECLARE_ASCII("F21212" ), nFlags ) != xF21212 ) || + ( xD->findFrame( DECLARE_ASCII("F21221" ), nFlags ) != xF21221 ) || + ( xD->findFrame( DECLARE_ASCII("F21222" ), nFlags ) != xF21222 ) || + ( xD->findFrame( DECLARE_ASCII("F221" ), nFlags ) != xF221 ) || + ( xD->findFrame( DECLARE_ASCII("F2211" ), nFlags ) != xF2211 ) || + ( xD->findFrame( DECLARE_ASCII("F22111" ), nFlags ) != xF22111 ) + ) + { + LOG_ERROR( "TestApplikation::impl_testTreeSearch()", "deep down search failed" ) + return sal_False; + } + + // Test flat down search + nFlags = FrameSearchFlag::CHILDREN | FrameSearchFlag::SIBLINGS; + if ( + ( xD->findFrame( DECLARE_ASCII("T1" ), nFlags ) != xT1 ) || + ( xD->findFrame( DECLARE_ASCII("T2" ), nFlags ) != xT2 ) || + ( xD->findFrame( DECLARE_ASCII("T3" ), nFlags ) != xT3 ) || + ( xD->findFrame( DECLARE_ASCII("F11" ), nFlags ) != xF11 ) || + ( xD->findFrame( DECLARE_ASCII("F12" ), nFlags ) != xF12 ) || + ( xD->findFrame( DECLARE_ASCII("F21" ), nFlags ) != xF21 ) || + ( xD->findFrame( DECLARE_ASCII("F22" ), nFlags ) != xF22 ) || + ( xD->findFrame( DECLARE_ASCII("F211" ), nFlags ) != xF211 ) || + ( xD->findFrame( DECLARE_ASCII("F212" ), nFlags ) != xF212 ) || + ( xD->findFrame( DECLARE_ASCII("F2111" ), nFlags ) != xF2111 ) || + ( xD->findFrame( DECLARE_ASCII("F2112" ), nFlags ) != xF2112 ) || + ( xD->findFrame( DECLARE_ASCII("F2121" ), nFlags ) != xF2121 ) || + ( xD->findFrame( DECLARE_ASCII("F2122" ), nFlags ) != xF2122 ) || + ( xD->findFrame( DECLARE_ASCII("F21111" ), nFlags ) != xF21111 ) || + ( xD->findFrame( DECLARE_ASCII("F21112" ), nFlags ) != xF21112 ) || + ( xD->findFrame( DECLARE_ASCII("F21121" ), nFlags ) != xF21121 ) || + ( xD->findFrame( DECLARE_ASCII("F21122" ), nFlags ) != xF21122 ) || + ( xD->findFrame( DECLARE_ASCII("F21211" ), nFlags ) != xF21211 ) || + ( xD->findFrame( DECLARE_ASCII("F21212" ), nFlags ) != xF21212 ) || + ( xD->findFrame( DECLARE_ASCII("F21221" ), nFlags ) != xF21221 ) || + ( xD->findFrame( DECLARE_ASCII("F21222" ), nFlags ) != xF21222 ) || + ( xD->findFrame( DECLARE_ASCII("F221" ), nFlags ) != xF221 ) || + ( xD->findFrame( DECLARE_ASCII("F2211" ), nFlags ) != xF2211 ) || + ( xD->findFrame( DECLARE_ASCII("F22111" ), nFlags ) != xF22111 ) + ) + { + LOG_ERROR( "TestApplikation::impl_testTreeSearch()", "flat down search failed" ) + return sal_False; + } + + // Test deep up search + // All targets must be found. Control search steps in log files! + nFlags = FrameSearchFlag::PARENT; + if ( + ( xF11->findFrame ( DECLARE_ASCII("T1"), nFlags ) != xT1 ) || // search for valid targets + ( xF12->findFrame ( DECLARE_ASCII("T1"), nFlags ) != xT1 ) || + ( xF21->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF22->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF211->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF212->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF221->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF2111->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF2121->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF2122->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF2211->findFrame ( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF21111->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF21112->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF21121->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF21122->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF21211->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF21212->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF21221->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF21222->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF22111->findFrame( DECLARE_ASCII("T2"), nFlags ) != xT2 ) || + ( xF11->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || // search for existing but non valid targets + ( xF12->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF22->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF211->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF212->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF221->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF2111->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF2121->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF2122->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF2211->findFrame ( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21111->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21112->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21121->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21122->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21211->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21212->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21221->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF21222->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) || + ( xF22111->findFrame( DECLARE_ASCII("T3"), nFlags ).is() == sal_True ) + ) + { + LOG_ERROR( "TestApplikation::impl_testTreeSearch()", "deep up search failed" ) + return sal_False; + } + + // Test inside/outside tasks search + // No frames outside current task should be found if TASKS flag isnt set. + // Otherwise he must be found! + if ( + ( xF21211->findFrame( DECLARE_ASCII("F12" ), FrameSearchFlag::ALL ) == xF12 ) || + ( xF21211->findFrame( DECLARE_ASCII("F22111"), FrameSearchFlag::GLOBAL ) != xF22111 ) || + ( xF21211->findFrame( DECLARE_ASCII("T4" ), FrameSearchFlag::GLOBAL | FrameSearchFlag::CREATE ).is() == sal_False) + ) + { + LOG_ERROR( "TestApplikation::impl_testTreeSearch()", "inside/outside task search failed" ) + return sal_False; + } + + // Test SELF + // Use the desktop, one task and one frame node to do that. + // The desktop must ignore these question ... all other must return himself. + LOG_ASSERT2( (xD->findFrame ( DECLARE_ASCII(""), FrameSearchFlag::SELF ) == xD ), "TestApplication::impl_testTreeSearch()", "SELF search for D failed\n" ) + LOG_ASSERT2( (xT1->findFrame ( DECLARE_ASCII(""), FrameSearchFlag::SELF ) != xT1 ), "TestApplication::impl_testTreeSearch()", "SELF search for T1 failed\n" ) + LOG_ASSERT2( (xF12->findFrame ( DECLARE_ASCII(""), FrameSearchFlag::SELF ) != xF12 ), "TestApplication::impl_testTreeSearch()", "SELF search for F12 failed\n" ) + + // Test special task search at desktop + // These search allow TASKS and CREATE flags only! + // We make no deep search - we work on direct children of desktop only. + // Supported for desktop only. + LOG_ASSERT2( (xD->findFrame ( DECLARE_ASCII("T1"), FrameSearchFlag::TASKS ) != xT1 ), "TestApplication::impl_testTreeSearch()", "special TASKS search for T1 failed\n" ) + LOG_ASSERT2( (xD->findFrame ( DECLARE_ASCII("T2"), FrameSearchFlag::TASKS ) != xT2 ), "TestApplication::impl_testTreeSearch()", "special TASKS search for T2 failed\n" ) + LOG_ASSERT2( (xD->findFrame ( DECLARE_ASCII("T3"), FrameSearchFlag::TASKS ) != xT3 ), "TestApplication::impl_testTreeSearch()", "special TASKS search for T3 failed\n" ) + // Attention: T4 was created before! + LOG_ASSERT2( (xD->findFrame ( DECLARE_ASCII("T5"), FrameSearchFlag::TASKS ).is() == sal_True ), "TestApplication::impl_testTreeSearch()", "special TASKS search for T5 failed\n" ) + LOG_ASSERT2( (xD->findFrame ( DECLARE_ASCII("T5"), FrameSearchFlag::TASKS | FrameSearchFlag::CREATE ).is() == sal_False ), "TestApplication::impl_testTreeSearch()", "special TASKS+CREATE search for T5 failed\n" ) + LOG_ASSERT2( (xD->findFrame ( DECLARE_ASCII("F12"), FrameSearchFlag::TASKS ).is() == sal_True ), "TestApplication::impl_testTreeSearch()", "special TASKS search for F12 failed\n" ) + LOG_ASSERT2( (xF12->findFrame ( DECLARE_ASCII("T1"), FrameSearchFlag::TASKS ).is() == sal_True ), "TestApplication::impl_testTreeSearch()", "special TASKS search for T1 from F12 failed\n" ) + LOG_ASSERT2( (xF22111->findFrame( DECLARE_ASCII("T1"), FrameSearchFlag::TASKS ).is() == sal_True ), "TestApplication::impl_testTreeSearch()", "special TASKS search for T1 from F22111 failed\n" ) + + return sal_True; +} +#endif diff --git a/framework/test/test_componentenumeration.bas b/framework/test/test_componentenumeration.bas new file mode 100644 index 000000000000..77b64bb96939 --- /dev/null +++ b/framework/test/test_componentenumeration.bas @@ -0,0 +1,78 @@ +rem _______________________________________________________________________________________________________________________________________ +rem Test script for helper class "framework/helper/OComponentAccess and OComponentEnumeration. +rem These two classes are used for "framework/baeh_services/Desktop::getComponents()" only. +rem _______________________________________________________________________________________________________________________________________ + + +Sub Main + + rem ___________________________________________________________________________________________________________________________________ + rem Get all current components of the frame tree as an enumeration access object. + rem The return value must be a valid reference! + xComponentAccess = StarDesktop.Components + if( isNull(xComponentAccess) = TRUE ) then + msgbox "Error: Desktop return null reference as enumeration access to all tree components!" + exit Sub + endif + + rem ___________________________________________________________________________________________________________________________________ + rem Control service specification of helper class "framework/helper/OComponentAccess". + rem The follow output must occure: com.sun.star.lang.XTypeProvider + rem com.sun.star.container.XEnumerationAccess -> com.sun.star.container.XElementAccess + msgbox xComponentAccess.dbg_supportedInterfaces + + rem ___________________________________________________________________________________________________________________________________ + rem Test interface XElementAccess of helper OComponentAcces. + + rem Method hasElements() must return TRUE, because if you call this from the basic IDE at least one task must exist ... + rem the IDE by himself. Normaly two tasks exist - an empty writer document and a basic frame. + rem Attention: Not all tasks or frames must support a full implemented component! + if( xComponentAccess.hasElements <> TRUE ) then + msgbox "Error: xComponentAccess has no elements - but I can't believe it!" + exit Sub + endif + + rem Method getElementType() must return the cppu type of XComponent. + rem Otherwise something is wrong or implementation has changed. + if( xComponentAccess.getElementType.Name <> "com.sun.star.lang.XComponent" ) then + msgbox "Error: xComponentAccess return wrong type as element type! - Has implementation changed?" + exit Sub + endif + + rem ___________________________________________________________________________________________________________________________________ + rem Test interface XEnumerationAccess of helper OComponentAcces. + rem The return value must be a valid reference! + xComponentEnumeration = xComponentAccess.createEnumeration + if( isNull(xComponentEnumeration) = TRUE ) then + msgbox "Error: Could not create a component enumeration!" + exit Sub + endif + + rem ___________________________________________________________________________________________________________________________________ + rem Control service specification of helper class "framework/helper/OComponentEnumeration". + rem The follow output must occure: com.sun.star.lang.XTypeProvider + rem com.sun.star.lang.XEventListener + rem com.sun.star.container.XEnumeration + msgbox xComponentEnumeration.dbg_supportedInterfaces + + rem ___________________________________________________________________________________________________________________________________ + rem Test interface XEnumeration of helper OComponentEnumeration. + nElementCounter = 0 + while( xComponentEnumeration.hasMoreElements = TRUE ) + xElement = xComponentEnumeration.nextElement + if( isNull(xElement) = TRUE ) then + msgbox "Error: An empty component in enumeration detected! Whats wrong?" + exit Sub + endif + nElementCounter = nElementCounter + 1 + wend + if( nElementCounter < 1 ) then + msgbox "Warning: The enumeration was empty. I think it's wrong ... please check it again." + endif + msgbox "Info: An enumeration with " + nElementCounter + " element(s) was detected." + + rem ___________________________________________________________________________________________________________________________________ + rem If this point arrived our test was successful. + msgbox "Test of framework/helper/OComponentAccess & OComponentEnumeration was successful!" + +End Sub diff --git a/framework/test/test_documentproperties.bas b/framework/test/test_documentproperties.bas new file mode 100644 index 000000000000..15e4f62a2967 --- /dev/null +++ b/framework/test/test_documentproperties.bas @@ -0,0 +1,1083 @@ +Sub Main + ' Oeffnen der LOG-Datei + ' Es gibt 2 Moeglichgkeiten, diesen Test zu absolvieren. + ' 1) Ausgabe von Informationen in MessageBoxen + ' 2) Ausgabe von Informationen in einer LOG-Datei + ' + ' Die Methoden OpenLOG, CloseLOG, Message, ErrorMessage und InfoMessage beruecksichtigen das automatisch! + ' Zum Umschalten zwischen den beiden Zustaenden genuegt es, eine der folgenden + ' zwei Programmzeilen zu aktivieren ... + + 'bLOGOn = cOn + bLOGOn = cOff + + 'bShowErrorsOnly = cOn + bShowErrorsOnly = cOff + + OpenLOG ( cTestPath + "TestDocumentProperties.log" ) + InfoMessage ( "Test DocumentProperties ... [start]" ) + + ' Service besorgen + InfoMessage ( "Service besorgen ... [start]" ) + aDocumentProperties = createUnoService ( "com.sun.star.document.DocumentProperties" ) + + ' Erfolg abtesten + if ( isnull ( aDocumentProperties ) ) then + ErrorMessage ( "Service konnte nicht instanziiert werden!" ) + exit sub + else + InfoMessage ( "Service erfolgreich instanziiert ..." ) + InfoMessage ( "Service besorgen ... [ende]" ) + end if + + ' Unterstuetzte Schnittstellen, Methoden und Properties anzeigen + ' Achtung: Methoden und Properties koennen nicht angezeigt werden ... + ' neues Uno <-> Basic !? + msgbox aDocumentProperties.dbg_supportedInterfaces + 'msgbox aDocumentProperties.dbg_methods + 'msgbox aDocumentProperties.dbg_properties + + ' Testen des Services unter normalen Bedingungen (also wie vorgesehen) + bState = Test_NormalUse ( aDocumentProperties ) + ' Fehlerstatus abfragen + if ( bState = cError ) then + ErrorMessage ( "Der Service arbeitet unter normalen Bedingungen nicht korrekt!" ) + end if + + bState = Test_ErrorUse ( aDocumentProperties ) + ' Fehlerstatus abfragen + if ( bState = cError ) then + ErrorMessage ( "Der Service verhaelt sich in Fehlersituationen nicht korrekt!" ) + end if + + ' Schliessen der Error-Logdatei + InfoMessage ( "Test DocumentProperties ... [ende]" ) + CloseLOG +End Sub + +'***************************************************************************************************************** +' Testfunktionen +'***************************************************************************************************************** + +'---------------------------------------------------------------------------- +' Testmethode: Testet den Service unter normalen Bedingungen +' +' Returnwert cOK bedeutet, dass sich das Objekt normal verhaelt ... +' Returnwert cError bedeutet, dass sich das ein Fehler aufgetreten ist ... +'---------------------------------------------------------------------------- +Function Test_NormalUse ( aDocumentProperties ) as Boolean + + ' Zunaechst wird vom Erfolg des Test ausgegangen. + ' Sollte einer der Detail-Tests fehlschlagen, dann wird dieser Wert + ' zurueckgesetzt. Damit wird dann angezeigt, dass mindestens ein + ' Einzeltest nicht korrekt funktionierte. + + Test_NormalUse = cOK + + bState = Test_NormalUse_XPropertySet ( aDocumentProperties ) + if ( bState = cError ) then + Test_NormalUse = cError + end if + + bState = Test_NormalUse_XNameContainer ( aDocumentProperties ) + if ( bState = cError ) then + Test_NormalUse = cError + end if + + bState = Test_NormalUse_XPersist ( aDocumentProperties ) + if ( bState = cError ) then + Test_NormalUse = cError + end if + +End Function + +'---------------------------------------------------------------------------- +' Testmethode: Testet den Service unter Randbedingungen und provoziert Fehlerzustaende +' +' Returnwert cOK bedeutet, dass das Objekt damit keine Probleme hat ... +' Returnwert cError bedeutet, dass das Objekt noch nicht robust genug ist ... +'---------------------------------------------------------------------------- +Function Test_ErrorUse ( aDocumentProperties ) as Boolean + + Test_ErrorUse = cOK + +End Function + +'---------------------------------------------------------------------------- +' Testmethode: Testen des unterstuetzten Interfaces "XPropertySet" unter normalen Bedingungen +' +' Returnwert = cOK ; wenn der Test erfolgreich war +' Returnwert = cError ; wenn sich das Objekt nicht korrekt verhalten hat +'---------------------------------------------------------------------------- +Function Test_NormalUse_XPropertySet ( aDocumentProperties ) as Boolean + + ' Einschalten der Fehlerbehandlung, um Exceptions oder aehnliches abzufangen! + on Error goto Test_NormalUse_XPropertySet_Error + + InfoMessage ( "Test_NormalUse_XPropertySet ... [start]" ) + + ' 1) Test der Funktion "getPropertySetInfo()" + ' Da diese Funktion keine Parameter besitzt und zudem eine "get"-Methode + ' darstellt, wird sie durch Basic automatisch als "Property" behandelt! + ' Daher schreibt man nicht "getPropertySetInfo()" sondern nur "PropertySetInfo". + + ' Besorgen der Info + PropertySetInfo = aDocumentProperties.PropertySetInfo + ' Und abtesten auf Gueltigkeit + if ( isnull (PropertySetInfo) ) then + ErrorMessage ( "getPropertySetInfo() ... Error (Keine Info bestimmbar!)" ) + goto Test_NormalUse_XPropertySet_Error + end if + + ' Hier fehlt noch der Test der InfoStruktur! (Laesst sich unter Basic irgendwie NICHT testen!!!???) + ' ... + + InfoMessage ( "getPropertySetInfo() ... OK" ) + + ' 2) getPropertyValue() & setPropertyValue () + ' In diesem Service sind mehrere Properties bereits definiert und vorbelegt. + ' Zum Test werden repraesentativ einige davon verwendet. Naemlich je eine + ' der verschiedenen Datentypen! + ' Das sind im folgenden: OWString, sal_Bool, sal_Int16, sal_uInt16, sal_Int32, DateTime, Sequence< sal_Int8 > + ' Achtung! sal_uInt16 kann in Basic so nicht dargestellt werden. Daher wird ein normaler + ' Integer-Wert angenommen - Bedingung ist, das hier im Test der Wertebereich nicht + ' ueberschritten wird! + ' Es wird versucht den Standardwert dieser zu ermitteln und zu merken; + ' dann einen neuen Wert zu setzen; sowie diesen wiederum zu lesen und mit den + ' vorherigen Werten zu vergleichen! + + ' Zunaechst werden die Standardwerte dieser Properties besorgt ... + sDefaultValue_OWString$ = aDocumentProperties.getPropertyValue ( "Author" ) + bDefaultValue_sal_Bool = aDocumentProperties.getPropertyValue ( "AutoloadEnabled" ) + nDefaultValue_sal_Int16% = aDocumentProperties.getPropertyValue ( "EditingCycles" ) + nDefaultValue_sal_uInt16% = aDocumentProperties.getPropertyValue ( "Priority" ) + nDefaultValue_sal_Int32& = aDocumentProperties.getPropertyValue ( "EditingDuration" ) + aDefaultValue_DateTime = aDocumentProperties.getPropertyValue ( "ModifyDate" ) +' aDefaultValue_ByteSequence = aDocumentProperties.getPropertyValue ( "ExtraData" ) + aDefaultValue_ByteSequence = aDocumentProperties.ExtraData + + ' ... dann die Werte zur Kontrolle ausgeben. + ShowProperties ( aDocumentProperties ) + + InfoMessage ( "getPropertyValue() ... OK" ) + + ' Jetzt werden neue Werte vereinbart ... + ' Diese werden so gewaehlt, das sie garantiert von den Standardwerten verschieden sind! + ' Dazu werden die alten auf Wert abgefragt und entsprechend die neuen gesetzt. + sNewValue_OWString$ = sDefaultValue_OWString$ + "NeuerWert" + bNewValue_sal_Bool = not bDefaultValue_sal_Bool + nNewValue_sal_Int16% = nDefaultValue_sal_Int16% + 1 + if ( nDefaultValue_sal_uInt16% = 1 ) then + nNewValue_sal_uInt16% = 2 + else + nNewValue_sal_uInt16% = 1 + end if + nNewValue_sal_Int32& = nDefaultValue_sal_Int32& + 1 + + aNewValue_DateTime = aDefaultValue_DateTime + aNewValue_DateTime.HundredthSeconds = aDefaultValue_DateTime.HundredthSeconds + 1 + aNewValue_DateTime.Seconds = aDefaultValue_DateTime.Seconds + 1 + aNewValue_DateTime.Minutes = aDefaultValue_DateTime.Minutes + 1 + aNewValue_DateTime.Hours = aDefaultValue_DateTime.Hours + 1 + aNewValue_DateTime.Day = aDefaultValue_DateTime.Day + 1 + aNewValue_DateTime.Month = aDefaultValue_DateTime.Month + 1 + aNewValue_DateTime.Year = aDefaultValue_DateTime.Year + 1 + + aNewValue_ByteSequence = aDefaultValue_ByteSequence + nElementCount% = UBound ( aDefaultValue_ByteSequence ) +' for nCounter%=0 to nElementCount% step 1 +' aNewValue_ByteSequence(nCounter%) = ( aDefaultValue_ByteSequence(nCounter%) + 1 ) +' next nCounter% + + ' Anschliessend muessen diese neuen Werte gesetzt werden. + aDocumentProperties.setPropertyValue ( "Author" , sNewValue_OWString$ ) + aDocumentProperties.setPropertyValue ( "AutoloadEnabled", bNewValue_sal_Bool ) + aDocumentProperties.setPropertyValue ( "EditingCycles" , nNewValue_sal_Int16% ) + aDocumentProperties.setPropertyValue ( "Priority" , nNewValue_sal_uInt16% ) + aDocumentProperties.setPropertyValue ( "EditingDuration", nNewValue_sal_Int32& ) + aDocumentProperties.setPropertyValue ( "ModifyDate" , aNewValue_DateTime ) +' aDocumentProperties.setPropertyValue ( "ExtraData" , aNewValue_ByteSequence ) + aDocumentProperties.ExtraData = aNewValue_ByteSequence + + ' Dann lassen wir sie uns ausgeben, um sie mit den vorherigen vergleichen zu koennen. + ' (Das geht natuerlich nur, wenn "bLOGOn=cOn" ist - also eine LOG-Datei geschrieben wird!) + ShowProperties ( aDocumentProperties ) + + ' Nun werden die Properties wieder gelesen ... + sLastValue_OWString$ = aDocumentProperties.getPropertyValue ( "Author" ) + bLastValue_sal_Bool = aDocumentProperties.getPropertyValue ( "AutoloadEnabled" ) + nLastValue_sal_Int16% = aDocumentProperties.getPropertyValue ( "EditingCycles" ) + nLastValue_sal_uInt16% = aDocumentProperties.getPropertyValue ( "Priority" ) + nLastValue_sal_Int32& = aDocumentProperties.getPropertyValue ( "EditingDuration" ) + aLastValue_DateTime = aDocumentProperties.getPropertyValue ( "ModifyDate" ) + aLastValue_ByteSequence = aDocumentProperties.getPropertyValue ( "ExtraData" ) + + ' ... und mit den vorher als zu setzend bestimmte Werte vergleichen! + ' Es duerfen KEINE Unterschiede auftreten, da sonst "setPropertyValue()" nicht korrekt funktioniert hat! + + if ( CompareOWString ( sNewValue_OWString$, sLastValue_OWString$ ) = cDifferent ) then + ErrorMessage ( "setPropertyValue() ... Fehler [OWString fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareBool ( bNewValue_sal_Bool, bLastValue_sal_Bool ) = cDifferent ) then + ErrorMessage ( "setPropertyValue() ... Fehler [sal_Bool fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareInt16 ( nNewValue_sal_Int16%, nLastValue_sal_Int16% ) = cDifferent ) then + ErrorMessage ( "setPropertyValue() ... Fehler [sal_Int16 fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareInt16 ( nNewValue_sal_uInt16%, nLastValue_sal_uInt16% ) = cDifferent ) then + ErrorMessage ( "setPropertyValue() ... Fehler [sal_uInt16 fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareInt32 ( nNewValue_sal_Int32&, nLastValue_sal_Int32& ) = cDifferent ) then + ErrorMessage ( "setPropertyValue() ... Fehler [sal_Int32 fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareDateTime ( aNewValue_DateTime, aLastValue_DateTime ) = cDifferent ) then + ErrorMessage ( "setPropertyValue() ... Fehler [DateTime fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareByteSequence ( aNewValue_ByteSequence, aLastValue_ByteSequence ) = cDifferent ) then + ErrorMessage ( "setPropertyValue() ... Fehler [ByteSequence fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + end if + + InfoMessage ( "setPropertyValue() ... OK" ) + + ' Nun wird noch mit den zuerst ermittelten Default-Werten verglichen! + ' Hier MUESSEN Unterschiede auftreten, da sonst "get-" UND "setPropertyValue()" nicht korrekt funktioniert haben! + + if ( CompareOWString ( sDefaultValue_OWString$, sLastValue_OWString$ ) = cEqual ) then + ErrorMessage ( "Zusammenspiel set & getPropertyValue() ... Fehler [OWString fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareBool ( bDefaultValue_sal_Bool, bLastValue_sal_Bool ) = cEqual ) then + ErrorMessage ( "Zusammenspiel set & getPropertyValue() ... Fehler [sal_Bool fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareInt16 ( nDefaultValue_sal_Int16%, nLastValue_sal_Int16% ) = cEqual ) then + ErrorMessage ( "Zusammenspiel set & getPropertyValue() ... Fehler [sal_Int16 fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareInt16 ( nDefaultValue_sal_uInt16%, nLastValue_sal_uInt16% ) = cEqual ) then + ErrorMessage ( "Zusammenspiel set & getPropertyValue() ... Fehler [sal_uInt16 fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareInt32 ( nDefaultValue_sal_Int32&, nLastValue_sal_Int32& ) = cEqual ) then + ErrorMessage ( "Zusammenspiel set & getPropertyValue() ... Fehler [sal_Int32 fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error + elseif ( CompareDateTime ( aDefaultValue_DateTime, aLastValue_DateTime ) = cEqual ) then + ErrorMessage ( "Zusammenspiel set & getPropertyValue() ... Fehler [DateTime fehlerhaft]" ) + goto Test_NormalUse_XPropertySet_Error +' elseif ( CompareByteSequence ( aDefaultValue_ByteSequence, aLastValue_ByteSequence ) = cEqual ) then +' ErrorMessage ( "Zusammenspiel set & getPropertyValue() ... Fehler [ByteSequence fehlerhaft]" ) +' goto Test_NormalUse_XPropertySet_Error + end if + + InfoMessage ( "Zusammenspiel set & getPropertyValue() ... OK" ) + + ' Der Test war erfolgreich! Meldung ausgeben und zurueck zm Aufrufer. + ' Ausschalten der Fehlerbehandlung + on Error goto 0 + ' Meldung ausgeben + InfoMessage ( "Test_NormalUse_XPropertySet ... [ende]" ) + ' Status setzen + Test_NormalUse_XPropertySet = cOK + ' Und Funktion beenden + Exit Function + +' Es ist ein unerwartete Fehler aufgetreten! (Exception ...) +' Meldung ausgeben und mit Fehler zurueckkehren. +Test_NormalUse_XPropertySet_Error: + ' Ausschalten der Fehlerbehandlung + on Error goto 0 + ' Meldung ausgeben + ErrorMessage ( "Test_NormalUse_XPropertySet ... [Error]" ) + ' und Fehlerstatus setzen + Test_NormalUse_XPropertySet = cError + ' Abbruch der Funktion erzwingen! + Exit Function + +End Function + +'---------------------------------------------------------------------------- +' Testmethode: Testen des unterstuetzten Interfaces "XNameContainer" unter normalen Bedingungen +' +' Returnwert = cOK ; wenn sich das Objekt korrekt verhalten hat +' Returnwert = cError ; wenn das Objekt noch nicht robust genug ist +'---------------------------------------------------------------------------- +Function Test_NormalUse_XNameContainer ( aDocumentProperties ) as Boolean + + ' Einschalten der Fehlerbehandlung, um Exceptions oder aehnliches abzufangen! + on Error goto Test_NormalUse_XNameContainer_Error + + InfoMessage ( "Test_NormalUse_XNameContainer ... [start]" ) + + ' Da das Initialisieren im Konstruktor des Objektes und das Aufraeumen im Destruktor + ' automatisch geschieht und diese Methode pro Programmablauf nur einmal verwendet wird, + ' darf sich kein Element schon im NameContainer befinden! + ' Wenn doch, ist das ein Fehler! + if ( aDocumentProperties.hasElements () = TRUE ) then + ErrorMessage ( "Der NameConatiner sollte eigentlich leer sein, enthaelt initial aber schon Elemente!?" ) + goto Test_NormalUse_XNameContainer_Error + end if + + ' Zunaechst werden mehrere Elemente in den NameContainer eingefuegt. + sItemName_1$ = "Item 1" + sItemName_2$ = "Item 2" + sItemName_3$ = "Item 3" + sItemName_4$ = "Item 4" + sItemName_5$ = "Item 5" + + sFirstValue_1$ = "Value 1" + sFirstValue_2$ = "Value 2" + sFirstValue_3$ = "Value 3" + sFirstValue_4$ = "Value 4" + sFirstValue_5$ = "Value 5" + + aDocumentProperties.insertByName ( sItemName_1$, sFirstValue_1$ ) + aDocumentProperties.insertByName ( sItemName_2$, sFirstValue_2$ ) + aDocumentProperties.insertByName ( sItemName_3$, sFirstValue_3$ ) + aDocumentProperties.insertByName ( sItemName_4$, sFirstValue_4$ ) + aDocumentProperties.insertByName ( sItemName_5$, sFirstValue_5$ ) + + ' Zur Kontrolle die Werte ausgeben. (Nur wichtig, wenn geloggt wird!) + ' Dabei wird die Methode "getElementNames()" gleich implizit mitgetestet! + ShowNameContainer ( aDocumentProperties ) + + ' Aber auch die Anzahl kontrollieren. + ' (Hier wird eine eigene BASIC-Hilfsfunktion verwendet! keine Interface-Methode) + if ( getNameContainerCount ( aDocumentProperties ) <> 5 ) then + ErrorMessage ( "insertByName() ... Fehler (Der NameConatiner enthaelt nicht die eingefuegten 5 Elemente!)" ) + goto Test_NormalUse_XNameContainer_Error + end if + + ' Nun noch feststellen, ob die 5 denn auch tatsaechlich vorhanden sind. + if ( aDocumentProperties.hasByName ( sItemName_1$ ) = FALSE ) then + ErrorMessage ( "hasByName() ... Fehler [Element 1 nicht vorhanden!?]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( aDocumentProperties.hasByName ( sItemName_2$ ) = FALSE ) then + ErrorMessage ( "hasByName() ... Fehler [Element 2 nicht vorhanden!?]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( aDocumentProperties.hasByName ( sItemName_3$ ) = FALSE ) then + ErrorMessage ( "hasByName() ... Fehler [Element 3 nicht vorhanden!?]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( aDocumentProperties.hasByName ( sItemName_4$ ) = FALSE ) then + ErrorMessage ( "hasByName() ... Fehler [Element 4 nicht vorhanden!?]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( aDocumentProperties.hasByName ( sItemName_5$ ) = FALSE ) then + ErrorMessage ( "hasByName() ... Fehler [Element 5 nicht vorhanden!?]" ) + goto Test_NormalUse_XNameContainer_Error + end if + + ' Dann die Werte wieder auslesen. + sCompareValue_1$ = aDocumentProperties.getByName ( sItemName_1$ ) + sCompareValue_2$ = aDocumentProperties.getByName ( sItemName_2$ ) + sCompareValue_3$ = aDocumentProperties.getByName ( sItemName_3$ ) + sCompareValue_4$ = aDocumentProperties.getByName ( sItemName_4$ ) + sCompareValue_5$ = aDocumentProperties.getByName ( sItemName_5$ ) + + ' Zum Vergleich die Werte ausgeben. (Nur wichtig, wenn geloggt wird!) + ShowNameContainer ( aDocumentProperties ) + + ' Dann die Werte automatisch vergleichen! + if ( CompareOWString ( sFirstValue_1$, sCompareValue_1$ ) = cDifferent ) then + ErrorMessage ( "getByName() ... Fehler [Element 1 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( CompareOWString ( sFirstValue_2$, sCompareValue_2$ ) = cDifferent ) then + ErrorMessage ( "getByName() ... Fehler [Element 2 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( CompareOWString ( sFirstValue_3$, sCompareValue_3$ ) = cDifferent ) then + ErrorMessage ( "getByName() ... Fehler [Element 3 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( CompareOWString ( sFirstValue_4$, sCompareValue_4$ ) = cDifferent ) then + ErrorMessage ( "getByName() ... Fehler [Element 4 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( CompareOWString ( sFirstValue_5$, sCompareValue_5$ ) = cDifferent ) then + ErrorMessage ( "getByName() ... Fehler [Element 5 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + end if + + InfoMessage ( "getByName() ... OK" ) + + ' Jetzt wird versucht einige der Elemente in ihrem Wert zu veraendern. + sNewValue_1$ = "NewValue 1" + sNewValue_2$ = "NewValue 2" + sNewValue_3$ = "NewValue 3" + sNewValue_4$ = "NewValue 4" + sNewValue_5$ = "NewValue 5" + + aDocumentProperties.replaceByName ( sItemName_1$, sNewValue_1$ ) + aDocumentProperties.replaceByName ( sItemName_2$, sNewValue_2$ ) + aDocumentProperties.replaceByName ( sItemName_3$, sNewValue_3$ ) + aDocumentProperties.replaceByName ( sItemName_4$, sNewValue_4$ ) + aDocumentProperties.replaceByName ( sItemName_5$, sNewValue_5$ ) + + ' Zur Kontrolle die Werte ausgeben. (Nur wichtig, wenn geloggt wird!) + ShowNameContainer ( aDocumentProperties ) + + ' Dann die Werte wieder auslesen. + sCompareValue_1$ = aDocumentProperties.getByName ( sItemName_1$ ) + sCompareValue_2$ = aDocumentProperties.getByName ( sItemName_2$ ) + sCompareValue_3$ = aDocumentProperties.getByName ( sItemName_3$ ) + sCompareValue_4$ = aDocumentProperties.getByName ( sItemName_4$ ) + sCompareValue_5$ = aDocumentProperties.getByName ( sItemName_5$ ) + + ' Zum Vergleich die Werte ausgeben. (Nur wichtig, wenn geloggt wird!) + ShowNameContainer ( aDocumentProperties ) + + ' Dann die Werte automatisch vergleichen! + if ( CompareOWString ( sNewValue_1$, sCompareValue_1$ ) = cDifferent ) then + ErrorMessage ( "replaceByName() ... Fehler [Element 1 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( CompareOWString ( sNewValue_2$, sCompareValue_2$ ) = cDifferent ) then + ErrorMessage ( "replaceByName() ... Fehler [Element 2 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( CompareOWString ( sNewValue_3$, sCompareValue_3$ ) = cDifferent ) then + ErrorMessage ( "replaceByName() ... Fehler [Element 3 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( CompareOWString ( sNewValue_4$, sCompareValue_4$ ) = cDifferent ) then + ErrorMessage ( "replaceByName() ... Fehler [Element 4 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( CompareOWString ( sNewValue_5$, sCompareValue_5$ ) = cDifferent ) then + ErrorMessage ( "replaceByName() ... Fehler [Element 5 fehlerhaft]" ) + goto Test_NormalUse_XNameContainer_Error + end if + + InfoMessage ( "replaceByName() ... OK" ) + + ' Hier sollen einige der 5 Eintraege geloescht werden. + aDocumentProperties.removeByName ( sItemName_1$ ) + aDocumentProperties.removeByName ( sItemName_3$ ) + + ' Dann wieder die Anzahl kontrollieren. + ' (Hier wird eine eigene BASIC-Hilfsfunktion verwendet! keine Interface-Methode) + if ( getNameContainerCount ( aDocumentProperties ) <> 3 ) then + ErrorMessage ( "removeByName() ... Fehler (Der NameConatiner enthaelt nicht die erwarteten 3 Elemente!)" ) + goto Test_NormalUse_XNameContainer_Error + end if + + ' Nun noch feststellen, ob die restlichen 3 denn auch tatsaechlich die richtigen sind. + if ( aDocumentProperties.hasByName ( sItemName_2$ ) = FALSE ) then + ErrorMessage ( "removeByName() ... Fehler [Element 2 nicht vorhanden!?]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( aDocumentProperties.hasByName ( sItemName_4$ ) = FALSE ) then + ErrorMessage ( "removeByName() ... Fehler [Element 4 nicht vorhanden!?]" ) + goto Test_NormalUse_XNameContainer_Error + elseif ( aDocumentProperties.hasByName ( sItemName_5$ ) = FALSE ) then + ErrorMessage ( "removeByName() ... Fehler [Element 5 nicht vorhanden!?]" ) + goto Test_NormalUse_XNameContainer_Error + end if + + ' Zur Kontrolle die Werte nochmals ausgeben. (Nur wichtig, wenn geloggt wird!) + ShowNameContainer ( aDocumentProperties ) + + InfoMessage ( "removeByName() ... OK" ) + + ' Der Test war erfolgreich! Meldung ausgeben und zurueck zm Aufrufer. + ' Ausschalten der Fehlerbehandlung + on Error goto 0 + ' Meldung ausgeben + InfoMessage ( "Test_NormalUse_XNameContainer ... [ende]" ) + ' Status setzen + Test_NormalUse_XNameContainer = cOK + ' Und Funktion beenden + Exit Function + +' Es ist ein unerwartete Fehler aufgetreten! (Exception ...) +' Meldung ausgeben und mit Fehler zurueckkehren. +Test_NormalUse_XNameContainer_Error: + ' Ausschalten der Fehlerbehandlung + on Error goto 0 + ' Meldung ausgeben + ErrorMessage ( "Test_NormalUse_XNameContainer ... [Error]" ) + ' und Fehlerstatus setzen + Test_NormalUse_XNameContainer = cError + ' Abbruch der Funktion erzwingen! + Exit Function + +End Function + +'---------------------------------------------------------------------------- +' Testmethode: Testen des unterstuetzten Interfaces "XPersist" unter normalen Bedingungen +' +' Returnwert = cOK ; wenn der Test erfolgreich war +' Returnwert = cError ; wenn sich das Objekt nicht korrekt verhalten hat +'---------------------------------------------------------------------------- +Function Test_NormalUse_XPersist ( aDocumentProperties ) as Boolean + + ' Einschalten der Fehlerbehandlung, um Exceptions oder aehnliches abzufangen! + on Error goto Test_NormalUse_XPersist_Error + + InfoMessage ( "Test_NormalUse_XPersist ... [start]" ) + + ' Laden der Properties aus einer Datei + aDocumentProperties.read ( cTestPath + "TestDebug_in.sdw" ) + + ' Zur Kontrolle anzeigen + ShowProperties ( aDocumentProperties ) + + ' Speichern der Properties in einer neuen Datei + aDocumentProperties.write ( cTestPath + "TestDebug_Out.sdw" ) + aDocumentProperties.read ( cTestPath + "TestDebug_Out.sdw" ) + + ' Zur Kontrolle anzeigen + ShowProperties ( aDocumentProperties ) + + ' Der Test war erfolgreich! Meldung ausgeben und zurueck zm Aufrufer. + ' Ausschalten der Fehlerbehandlung + on Error goto 0 + ' Meldung ausgeben + InfoMessage ( "Test_NormalUse_XPersist ... [ende]" ) + ' Status setzen + Test_NormalUse_XPersist = cOK + ' Und Funktion beenden + Exit Function + +' Es ist ein unerwartete Fehler aufgetreten! (Exception ...) +' Meldung ausgeben und mit Fehler zurueckkehren. +Test_NormalUse_XPersist_Error: + ' Ausschalten der Fehlerbehandlung + on Error goto 0 + ' Meldung ausgeben + ErrorMessage ( "Test_NormalUse_XPersist ... [Error]" ) + ' und Fehlerstatus setzen + Test_NormalUse_XPersist = cError + ' Abbruch der Funktion erzwingen! + Exit Function + +End Function + +'***************************************************************************************************************** +' Hilfsfunktionen und -methoden +'***************************************************************************************************************** + +'---------------------------------------------------------------------------- +' Hilfsmethode: Oeffnet die LOG-Datei. +'---------------------------------------------------------------------------- +Sub OpenLOG ( sFileName$ ) + if ( bLOGOn = cOn ) then + sLOGFileName$ = sFileName$ + nLOGFileHandle% = FreeFile + open sLOGFileName$ for output as nLOGFileHandle% + end if +End Sub + +'---------------------------------------------------------------------------- +' Hilfsmethode: Schliesst die LOG-Datei. +'---------------------------------------------------------------------------- +Sub CloseLOG + if ( bLOGOn = cOn ) then + close #nLOGFileHandle% + end if +End Sub + +'---------------------------------------------------------------------------- +' Hilfsmethode: Gibt einen Text in einer LOG-Datei aus. +'---------------------------------------------------------------------------- +Sub WriteLOG ( sMessage$ ) + if ( bLOGOn = cOn ) then + Write #nLOGFileHandle% sMessage$ + end if +End Sub + +'---------------------------------------------------------------------------- +' Hilfsmethode: Gibt eine MessageBox mit Fehlertext, Zeilennummer und Warnschild aus. +'---------------------------------------------------------------------------- +Sub ErrorMessage ( sMessage$ ) + ' Entweder in die LOG-Datei schreiben oder eine MessageBox anzeigen. + if ( bLOGOn = cOn ) then + WriteLOG ( sMessage$ ) + else + MsgBox ( sMessage$, 16 ) + end if +End Sub + +'---------------------------------------------------------------------------- +' Hilfsmethode: Gibt eine Hinweisbox aus. +'---------------------------------------------------------------------------- +Sub InfoMessage ( sMessage$ ) + ' Nur was anzeigen, wenn Nutzer es wuenscht! + if ( bShowErrorsOnly = cOff ) then + ' Ansonsten wird entweder in die LOG-Datei geschrieben oder eine MessageBox angezeigt. + if ( bLOGOn = cOn ) then + WriteLOG ( sMessage$ ) + else + MsgBox ( sMessage$, 64 ) + end if + end if +End Sub + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Vergleicht zwei OWString-Werte +' +' Returnwert = cEqual ; wenn Werte identisch sind +' Returnwert = cDifferent ; wenn Werte verschieden sind +'---------------------------------------------------------------------------- +Function CompareOWString ( sOWString_1$, sOWString_2$ ) as Boolean + + if ( sOWString_1$ = sOWString_2$ ) then + CompareOWString = cEqual + else + CompareOWString = cDifferent + end if + +End Function + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Vergleicht zwei DateTime-Strukturen +' +' Returnwert = cEqual ; wenn Werte identisch sind +' Returnwert = cDifferent ; wenn Werte verschieden sind +'---------------------------------------------------------------------------- +Function CompareDateTime ( aDateTime_1, aDateTime_2 ) as Boolean + + if ( aDateTime_1.Day = aDateTime_2.Day and aDateTime_1.Month = aDateTime_2.Month and aDateTime_1.Year = aDateTime_2.Year and aDateTime_1.Hours = aDateTime_1.Hours and aDateTime_1.Minutes = aDateTime_1.Minutes and aDateTime_1.Seconds = aDateTime_1.Seconds and aDateTime_1.HundredthSeconds = aDateTime_1.HundredthSeconds ) then + CompareDateTime = cEqual + else + CompareDateTime = cDifferent + end if + +End Function + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Vergleicht zwei ByteSequence's +' +' Returnwert = cEqual ; wenn Werte identisch sind +' Returnwert = cDifferent ; wenn Werte verschieden sind +'---------------------------------------------------------------------------- +Function CompareByteSequence ( seqByteSequence_1, seqByteSequence_2 ) as Boolean + + ' Wenn beide leer sind, sind sie auch identisch ! + ' Dieser Test mit "IsArray" ist noetig, da bei einem leeren Array die + ' Funktion "UBound" einen Fehler produziert! + if ( IsArray ( seqByteSequence_1 ) = FALSE and IsArray ( seqByteSequence_2 ) = FALSE ) then + CompareByteSequence = cEqual + Exit Function + end if + + ' Wenn jedoch nur eine leer ist, dann sind sie nicht identisch. + if ( IsArray ( seqByteSequence_1 ) = FALSE ) or ( IsArray ( seqByteSequence_2 ) = FALSE ) then + CompareByteSequence = cDifferent + Exit Function + end if + + ' Besorgen der Anzahl der Elemente der Sequences + nElementCount_1% = UBound ( seqByteSequence_1 ) + nElementCount_2% = UBound ( seqByteSequence_2 ) + + ' Wenn diese Anzahl schon verschieden ist, dann ... + if ( nElementCount_1% <> nElementCount_2% ) then + ' ... sind die Sequences wohl verschieden. + CompareByteSequence = cDifferent + ' Die Element brauchen dann nicht mehr verglichen zu werden. + Exit Function + end if + + ' Ansonsten werden die Elemente einzeln miteinander verglichen. + for nCounter%=0 to nElementCount_1% step 1 + ' Wenn auch nur ein paar davon verschieden ist, dann ... + if ( nElementCount_1%(nCounter%) <> nElementCount_2%(nCounter%) ) then + ' ... kann der Vergleich abgebrochen werden! + CompareByteSequence = cDifferent + Exit Function + end if + next nCounter% + + ' Wenn man bis hier gekommen ist, dann sind die Sequences identisch. + CompareByteSequence = cEqual + +End Function + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Vergleicht zwei Int16-Werte +' +' Returnwert = cEqual ; wenn Werte identisch sind +' Returnwert = cDifferent ; wenn Werte verschieden sind +'---------------------------------------------------------------------------- +Function CompareInt16 ( nInt16_1%, nInt16_2% ) as Boolean + + if ( nInt16_1% = nInt16_2% ) then + CompareInt16 = cEqual + else + CompareInt16 = cDifferent + end if + +End Function + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Vergleicht zwei Int32-Werte +' +' Returnwert = cEqual ; wenn Werte identisch sind +' Returnwert = cDifferent ; wenn Werte verschieden sind +'---------------------------------------------------------------------------- +Function CompareInt32 ( nInt32_1&, nInt32_2& ) as Boolean + + if ( nInt32_1& = nInt32_2& ) then + CompareInt32 = cEqual + else + CompareInt32 = cDifferent + end if + +End Function + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Vergleicht zwei Bool-Werte +' +' Returnwert = cEqual ; wenn Werte identisch sind +' Returnwert = cDifferent ; wenn Werte verschieden sind +'---------------------------------------------------------------------------- +Function CompareBool ( bBool_1, bBool_2 ) as Boolean + + if ( bBool_1 = bBool_2 ) then + CompareBool = cEqual + else + CompareBool = cDifferent + end if + +End Function + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Vergleicht die Properties zweier Objekte um Unterschiede festzustellen. +' +' Returnwert = cEqual ; wenn Objekte von den Properties her identisch sind +' Returnwert = cDifferent ; wenn Objekte von den Properties her verschieden sind +'---------------------------------------------------------------------------- +Function CompareDocumentProperties ( aDocumentProperties_1, aDocumentProperties_2 ) as Boolean + + ' Besorgen der Werte und zwischenspeichern (bezogen auf Objekt 1) + sAuthor_1$ = aDocumentProperties_1.getPropertyValue ( "Author" ) + bAutoloadEnabled_1 = aDocumentProperties_1.getPropertyValue ( "AutoloadEnabled" ) + nAutoloadSecs_1% = aDocumentProperties_1.getPropertyValue ( "AutoloadSecs" ) + sAutoLoadURL_1$ = aDocumentProperties_1.getPropertyValue ( "AutoloadURL" ) + sBliendCopiesTo_1$ = aDocumentProperties_1.getPropertyValue ( "BlindCopiesTo" ) + sCopiesTo_1$ = aDocumentProperties_1.getPropertyValue ( "CopiesTo" ) + aCreationDate_1 = aDocumentProperties_1.getPropertyValue ( "CreationDate" ) + sDefaultTarget_1$ = aDocumentProperties_1.getPropertyValue ( "DefaultTarget" ) + sDescription_1$ = aDocumentProperties_1.getPropertyValue ( "Description" ) + nEditingCycles_1% = aDocumentProperties_1.getPropertyValue ( "EditingCycles" ) + nEditingDuration_1& = aDocumentProperties_1.getPropertyValue ( "EditingDuration" ) + seqExtraData_1 = aDocumentProperties_1.getPropertyValue ( "ExtraData" ) + sInReplyTo_1$ = aDocumentProperties_1.getPropertyValue ( "InReplyTo" ) + bIsEncrypted_1 = aDocumentProperties_1.getPropertyValue ( "IsEncrypted" ) + sKeywords_1$ = aDocumentProperties_1.getPropertyValue ( "Keywords" ) + sMIMEType_1$ = aDocumentProperties_1.getPropertyValue ( "MIMEType" ) + sModifiedBy_1$ = aDocumentProperties_1.getPropertyValue ( "ModifiedBy" ) + aModifyDate_1 = aDocumentProperties_1.getPropertyValue ( "ModifyDate" ) + sNewsgroups_1$ = aDocumentProperties_1.getPropertyValue ( "Newsgroups" ) + sOriginal_1$ = aDocumentProperties_1.getPropertyValue ( "Original" ) + bPortableGraphics_1 = aDocumentProperties_1.getPropertyValue ( "PortableGraphics" ) + aPrintDate_1 = aDocumentProperties_1.getPropertyValue ( "PrintDate" ) + sPrintedBy_1$ = aDocumentProperties_1.getPropertyValue ( "PrintedBy" ) + nPriority_1% = aDocumentProperties_1.getPropertyValue ( "Priority" ) + bQueryTemplate_1 = aDocumentProperties_1.getPropertyValue ( "QueryTemplate" ) + sRecipient_1$ = aDocumentProperties_1.getPropertyValue ( "Recipient" ) + sReferences_1$ = aDocumentProperties_1.getPropertyValue ( "References" ) + sReplyTo_1$ = aDocumentProperties_1.getPropertyValue ( "ReplyTo" ) + bSaveGraphicsCompressed_1 = aDocumentProperties_1.getPropertyValue ( "SaveGraphicsCompressed" ) + bSaveOriginalGraphics_1 = aDocumentProperties_1.getPropertyValue ( "SaveOriginalGraphics" ) + bSaveVersionOnClose_1 = aDocumentProperties_1.getPropertyValue ( "SaveVersionOnClose" ) + sTemplate_1$ = aDocumentProperties_1.getPropertyValue ( "Template" ) + bTemplateConfig_1 = aDocumentProperties_1.getPropertyValue ( "TemplateConfig" ) + aTemplateDate_1 = aDocumentProperties_1.getPropertyValue ( "TemplateDate" ) + sTemplateFileName_1$ = aDocumentProperties_1.getPropertyValue ( "TemplateFileName" ) + sTheme_1$ = aDocumentProperties_1.getPropertyValue ( "Theme" ) + sTitle_1$ = aDocumentProperties_1.getPropertyValue ( "Title" ) + bUserData_1 = aDocumentProperties_1.getPropertyValue ( "UserData" ) + + ' Besorgen der Werte und zwischenspeichern (bezogen auf Objekt 2) + sAuthor_2$ = aDocumentProperties_2.getPropertyValue ( "Author" ) + bAutoloadEnabled_2 = aDocumentProperties_2.getPropertyValue ( "AutoloadEnabled" ) + nAutoloadSecs_2% = aDocumentProperties_2.getPropertyValue ( "AutoloadSecs" ) + sAutoLoadURL_2$ = aDocumentProperties_2.getPropertyValue ( "AutoloadURL" ) + sBliendCopiesTo_2$ = aDocumentProperties_2.getPropertyValue ( "BlindCopiesTo" ) + sCopiesTo_2$ = aDocumentProperties_2.getPropertyValue ( "CopiesTo" ) + aCreationDate_2 = aDocumentProperties_2.getPropertyValue ( "CreationDate" ) + sDefaultTarget_2$ = aDocumentProperties_2.getPropertyValue ( "DefaultTarget" ) + sDescription_2$ = aDocumentProperties_2.getPropertyValue ( "Description" ) + nEditingCycles_2% = aDocumentProperties_2.getPropertyValue ( "EditingCycles" ) + nEditingDuration_2& = aDocumentProperties_2.getPropertyValue ( "EditingDuration" ) + seqExtraData_2 = aDocumentProperties_2.getPropertyValue ( "ExtraData" ) + sInReplyTo_2$ = aDocumentProperties_2.getPropertyValue ( "InReplyTo" ) + bIsEncrypted_2 = aDocumentProperties_2.getPropertyValue ( "IsEncrypted" ) + sKeywords_2$ = aDocumentProperties_2.getPropertyValue ( "Keywords" ) + sMIMEType_2$ = aDocumentProperties_2.getPropertyValue ( "MIMEType" ) + sModifiedBy_2$ = aDocumentProperties_2.getPropertyValue ( "ModifiedBy" ) + aModifyDate_2 = aDocumentProperties_2.getPropertyValue ( "ModifyDate" ) + sNewsgroups_2$ = aDocumentProperties_2.getPropertyValue ( "Newsgroups" ) + sOriginal_2$ = aDocumentProperties_2.getPropertyValue ( "Original" ) + bPortableGraphics_2 = aDocumentProperties_2.getPropertyValue ( "PortableGraphics" ) + aPrintDate_2 = aDocumentProperties_2.getPropertyValue ( "PrintDate" ) + sPrintedBy_2$ = aDocumentProperties_2.getPropertyValue ( "PrintedBy" ) + nPriority_2% = aDocumentProperties_2.getPropertyValue ( "Priority" ) + bQueryTemplate_2 = aDocumentProperties_2.getPropertyValue ( "QueryTemplate" ) + sRecipient_2$ = aDocumentProperties_2.getPropertyValue ( "Recipient" ) + sReferences_2$ = aDocumentProperties_2.getPropertyValue ( "References" ) + sReplyTo_2$ = aDocumentProperties_2.getPropertyValue ( "ReplyTo" ) + bSaveGraphicsCompressed_2 = aDocumentProperties_2.getPropertyValue ( "SaveGraphicsCompressed" ) + bSaveOriginalGraphics_2 = aDocumentProperties_2.getPropertyValue ( "SaveOriginalGraphics" ) + bSaveVersionOnClose_2 = aDocumentProperties_2.getPropertyValue ( "SaveVersionOnClose" ) + sTemplate_2$ = aDocumentProperties_2.getPropertyValue ( "Template" ) + bTemplateConfig_2 = aDocumentProperties_2.getPropertyValue ( "TemplateConfig" ) + aTemplateDate_2 = aDocumentProperties_2.getPropertyValue ( "TemplateDate" ) + sTemplateFileName_2$ = aDocumentProperties_2.getPropertyValue ( "TemplateFileName" ) + sTheme_2$ = aDocumentProperties_2.getPropertyValue ( "Theme" ) + sTitle_2$ = aDocumentProperties_2.getPropertyValue ( "Title" ) + bUserData_2 = aDocumentProperties_2.getPropertyValue ( "UserData" ) + + ' Als erwarteten Zielwert schon mal "Properties identisch" annehmen!!! + ' Fr den Fall, das nur eine diesen Anspruch nicht erfllt, wird der Wert einfach zurckgesetzt. + ' Von da bleibt der neue Wert bestehen und zeigt an, da sich mindestens eine Property gendert hat! + CompareDocumentProperties = cEqual + + ' Dann die Werte vergleichen + if ( CompareOWString ( sAuthor_1$, sAuthor_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bAutoloadEnabled_1, bAutoloadEnabled_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareInt16 ( nAutoloadSecs_1%, nAutoloadSecs_2% ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sAutoLoadURL_1$, sAutoLoadURL_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sBliendCopiesTo_1$, sBliendCopiesTo_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sCopiesTo_1$, sCopiesTo_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareDateTime ( aCreationDate_1, aCreationDate_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sDefaultTarget_1$, sDefaultTarget_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sDescription_1$, sDescription_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareInt16 ( nEditingCycles_1%, nEditingCycles_2% ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareInt32 ( nEditingDuration_1&, nEditingDuration_2& ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareByteSequence( seqExtraData_1, seqExtraData_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sInReplyTo_1$, sInReplyTo_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bIsEncrypted_1, bIsEncrypted_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sKeywords_1$, sKeywords_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sMIMEType_1$, sMIMEType_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sModifiedBy_1$, sModifiedBy_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareDateTime ( aModifyDate_1, aModifyDate_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sNewsgroups_1$, sNewsgroups_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sOriginal_1$, sOriginal_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bPortableGraphics_1, bPortableGraphics_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareDateTime ( aPrintDate_1, aPrintDate_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sPrintedBy_1$, sPrintedBy_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareInt16 ( nPriority_1%, nPriority_2% ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bQueryTemplate_1, bQueryTemplate_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sRecipient_1$, sRecipient_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sReferences_1$, sReferences_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sReplyTo_1$, sReplyTo_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bSaveGraphicsCompressed_1, bSaveGraphicsCompressed_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bSaveOriginalGraphics_1, bSaveOriginalGraphics_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bSaveVersionOnClose_1, bSaveVersionOnClose_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sTemplate_1$, sTemplate_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bTemplateConfig_1, bTemplateConfig_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareDateTime ( aTemplateDate_1, aTemplateDate_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sTemplateFileName_1$, sTemplateFileName_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sTheme_1$, sTheme_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareOWString ( sTitle_1$, sTitle_2$ ) = cDifferent ) then + CompareDocumentProperties = cDifferent + elseif ( CompareBool ( bUserData_1, bUserData_2 ) = cDifferent ) then + CompareDocumentProperties = cDifferent + end if + +End Function + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Wandelt eine Struktur des Types DateTime in einen formatierten String um +'---------------------------------------------------------------------------- +Function DateTime2String ( aDateTime ) as String + + stempString$ = "" + stempString$ = stempString$ + aDateTime.Day + "." + stempString$ = stempString$ + aDateTime.Month + "." + stempString$ = stempString$ + aDateTime.Year + " - " + stempString$ = stempString$ + aDateTime.Hours + ":" + stempString$ = stempString$ + aDateTime.Minutes + ":" + stempString$ = stempString$ + aDateTime.Seconds + ":" + stempString$ = stempString$ + aDateTime.HundredthSeconds + " Uhr" + + DateTime2String = stempString$ + +End Function + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Wandelt eine Sequence von Bytes in einen formatierten String um +'---------------------------------------------------------------------------- +Function ByteSequence2String ( seqByteSequence ) as String + + nElementCount% = UBound ( seqByteSequence() ) + + if ( nElementCount% < 1 ) then + stempString$ = "leer" + else + stempString$ = "{" + for nCounter%=0 to nElementCount% step 1 + stempString$ = stempString$ + seqByteSequence(nCounter%) + next nCounter% + stempString$ = stempString$ + "}" + end if + + ByteSequence2String = stempString$ + +End Function + +'---------------------------------------------------------------------------- +' Hilfsmethode: Zeigt die aktuellen Werte ALLER Properties an +'---------------------------------------------------------------------------- +Sub ShowProperties ( aDocumentProperties ) + + ' Besorgen der Werte und zwischenspeichern + sAuthor$ = aDocumentProperties.getPropertyValue ( "Author" ) + bAutoloadEnabled = aDocumentProperties.getPropertyValue ( "AutoloadEnabled" ) + nAutoloadSecs% = aDocumentProperties.getPropertyValue ( "AutoloadSecs" ) + sAutoLoadURL$ = aDocumentProperties.getPropertyValue ( "AutoloadURL" ) + sBliendCopiesTo$ = aDocumentProperties.getPropertyValue ( "BlindCopiesTo" ) + sCopiesTo$ = aDocumentProperties.getPropertyValue ( "CopiesTo" ) + dCreationDate = aDocumentProperties.getPropertyValue ( "CreationDate" ) + sDefaultTarget$ = aDocumentProperties.getPropertyValue ( "DefaultTarget" ) + sDescription$ = aDocumentProperties.getPropertyValue ( "Description" ) + nEditingCycles% = aDocumentProperties.getPropertyValue ( "EditingCycles" ) + nEditingDuration& = aDocumentProperties.getPropertyValue ( "EditingDuration" ) + seqExtraData = aDocumentProperties.getPropertyValue ( "ExtraData" ) + sInReplyTo$ = aDocumentProperties.getPropertyValue ( "InReplyTo" ) + bIsEncrypted = aDocumentProperties.getPropertyValue ( "IsEncrypted" ) + sKeywords$ = aDocumentProperties.getPropertyValue ( "Keywords" ) + sMIMEType$ = aDocumentProperties.getPropertyValue ( "MIMEType" ) + sModifiedBy$ = aDocumentProperties.getPropertyValue ( "ModifiedBy" ) + dModifyDate = aDocumentProperties.getPropertyValue ( "ModifyDate" ) + sNewsgroups$ = aDocumentProperties.getPropertyValue ( "Newsgroups" ) + sOriginal$ = aDocumentProperties.getPropertyValue ( "Original" ) + bPortableGraphics = aDocumentProperties.getPropertyValue ( "PortableGraphics" ) + dPrintDate = aDocumentProperties.getPropertyValue ( "PrintDate" ) + sPrintedBy$ = aDocumentProperties.getPropertyValue ( "PrintedBy" ) + nPriority% = aDocumentProperties.getPropertyValue ( "Priority" ) + bQueryTemplate = aDocumentProperties.getPropertyValue ( "QueryTemplate" ) + sRecipient$ = aDocumentProperties.getPropertyValue ( "Recipient" ) + sReferences$ = aDocumentProperties.getPropertyValue ( "References" ) + sReplyTo$ = aDocumentProperties.getPropertyValue ( "ReplyTo" ) + bSaveGraphicsCompressed = aDocumentProperties.getPropertyValue ( "SaveGraphicsCompressed" ) + bSaveOriginalGraphics = aDocumentProperties.getPropertyValue ( "SaveOriginalGraphics" ) + bSaveVersionOnClose = aDocumentProperties.getPropertyValue ( "SaveVersionOnClose" ) + sTemplate$ = aDocumentProperties.getPropertyValue ( "Template" ) + bTemplateConfig = aDocumentProperties.getPropertyValue ( "TemplateConfig" ) + dTemplateDate = aDocumentProperties.getPropertyValue ( "TemplateDate" ) + sTemplateFileName$ = aDocumentProperties.getPropertyValue ( "TemplateFileName" ) + sTheme$ = aDocumentProperties.getPropertyValue ( "Theme" ) + sTitle$ = aDocumentProperties.getPropertyValue ( "Title" ) + bUserData = aDocumentProperties.getPropertyValue ( "UserData" ) + + ' Eine Zeichenkette zusammenbasteln, welche die Werte formatiert darstellt. + sOutLine$ = "[OWString]" + chr$(9) + "Author" + chr$(9) + "= {" + chr$(9) + sAuthor$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "AutoloadEnabled" + chr$(9) + "= {" + chr$(9) + bAutoloadEnabled + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Int16]" + chr$(9) + "AutoloadSecs" + chr$(9) + "= {" + chr$(9) + nAutoloadSecs% + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "AutoLoadURL" + chr$(9) + "= {" + chr$(9) + sAutoLoadURL$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "BliendCopiesTo" + chr$(9) + "= {" + chr$(9) + sBliendCopiesTo$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "CopiesTo" + chr$(9) + "= {" + chr$(9) + sCopiesTo$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[DateTime]" + chr$(9) + "CreationDate" + chr$(9) + "= {" + chr$(9) + DateTime2String(dCreationDate) + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "DefaultTarget" + chr$(9) + "= {" + chr$(9) + sDefaultTarget$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "Description" + chr$(9) + "= {" + chr$(9) + sDescription$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Int16]" + chr$(9) + "EditingCycles" + chr$(9) + "= {" + chr$(9) + nEditingCycles% + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Int32]" + chr$(9) + "EditingDuration" + chr$(9) + "= {" + chr$(9) + nEditingDuration& + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[Sequence<Byte>]" + chr$(9) + "ExtraData" + chr$(9) + "= {" + chr$(9) + ByteSequence2String(seqExtraData) + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "InReplyTo" + chr$(9) + "= {" + chr$(9) + sInReplyTo$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "IsEncrypted" + chr$(9) + "= {" + chr$(9) + bIsEncrypted + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "Keywords" + chr$(9) + "= {" + chr$(9) + sKeywords$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "MIMEType" + chr$(9) + "= {" + chr$(9) + sMIMEType$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "ModifiedBy" + chr$(9) + "= {" + chr$(9) + sModifiedBy$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[DateTime]" + chr$(9) + "ModifyDate" + chr$(9) + "= {" + chr$(9) + DateTime2String(dModifyDate) + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "Newsgroups" + chr$(9) + "= {" + chr$(9) + sNewsgroups$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "Original" + chr$(9) + "= {" + chr$(9) + sOriginal$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "PortableGraphics" + chr$(9) + "= {" + chr$(9) + bPortableGraphics + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[DateTime]" + chr$(9) + "PrintDate" + chr$(9) + "= {" + chr$(9) + DateTime2String(dPrintDate) + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "PrintedBy" + chr$(9) + "= {" + chr$(9) + sPrintedBy$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Int16]" + chr$(9) + "Priority" + chr$(9) + "= {" + chr$(9) + nPriority% + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "QueryTemplate" + chr$(9) + "= {" + chr$(9) + bQueryTemplate + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "Recipient" + chr$(9) + "= {" + chr$(9) + sRecipient$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "References" + chr$(9) + "= {" + chr$(9) + sReferences$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "ReplyTo" + chr$(9) + "= {" + chr$(9) + sReplyTo$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "SaveGraphicsCompressed" + chr$(9) + "= {" + chr$(9) + bSaveGraphicsCompressed + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "SaveOriginalGraphics" + chr$(9) + "= {" + chr$(9) + bSaveOriginalGraphics + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "SaveVersionOnClose" + chr$(9) + "= {" + chr$(9) + bSaveVersionOnClose + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "Template" + chr$(9) + "= {" + chr$(9) + sTemplate$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "TemplateConfig" + chr$(9) + "= {" + chr$(9) + bTemplateConfig + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[DateTime]" + chr$(9) + "TemplateDate" + chr$(9) + "= {" + chr$(9) + DateTime2String(dTemplateDate) + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "TemplateFileName" + chr$(9) + "= {" + chr$(9) + sTemplateFileName$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "Theme" + chr$(9) + "= {" + chr$(9) + sTheme$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[OWString]" + chr$(9) + "Title" + chr$(9) + "= {" + chr$(9) + sTitle$ + "}" + chr$(13) + sOutLine$ = sOutLine$ + "[sal_Bool]" + chr$(9) + "UserData" + chr$(9) + "= {" + chr$(9) + bUserData + "}" + + ' Ausgabe der formatierten Zeichenkette + InfoMessage ( sOutLine$ ) +End Sub + +'---------------------------------------------------------------------------- +' Hilfsmethode: Zeigt die aktuellen Elemente des NameContainers an. +'---------------------------------------------------------------------------- +Sub ShowNameContainer ( aDocumentProperties ) + + if ( aDocumentProperties.hasElements () = FALSE ) then + InfoMessage ( "Keine Elemente im NameContainer enthalten." ) + Exit Sub + end if + + aNameField = aDocumentProperties.getElementNames () + if ( IsArray ( aNameField ) = FALSE ) then + ErrorMessage ( "getElementNames() .... Fehler (Es konnte keine Sequence bestimmt werden!)" ) + Exit Sub + end if + nElementCount% = UBound ( aNameField () ) + + stempString$ = "" + for nCounter%=0 to nElementCount% step 1 + stempString$ = "[" + nCounter% + "]" + stempString$ = stempString$ + chr$(9) + aNameField(nCounter%) + stempString$ = stempString$ + chr$(9) + "=" + stempString$ = stempString$ + chr$(9) + aDocumentProperties.getByName ( aNameField(nCounter%) ) + stempString$ = stempString$ + chr$(13) + next nCounter% + + InfoMessage ( stempString$ ) + +End Sub + +'---------------------------------------------------------------------------- +' Hilfsfunktion: Ermittelt die Anzahl der im NameContainer enthaltenen Elemente. +' +' Returnwert = Anzahl der Elemente +'---------------------------------------------------------------------------- +Function getNameContainerCount ( aDocumentProperties ) as Long + + if ( aDocumentProperties.hasElements () = FALSE ) then + getNameContainerCount = 0 + Exit Function + end if + + aNameField = aDocumentProperties.getElementNames () + nElementCount% = UBound ( aNameField () ) + + ' Da die Zaehlung bei 0 beginnt, und der ermittelte Wert die obere Grenze darstellt, + ' muss hier eine 1 draufgeschlagen werden. + getNameContainerCount = nElementCount% + 1 + +End Function
\ No newline at end of file diff --git a/framework/test/test_filterregistration.bas b/framework/test/test_filterregistration.bas new file mode 100644 index 000000000000..47a19acfc36d --- /dev/null +++ b/framework/test/test_filterregistration.bas @@ -0,0 +1,95 @@ +rem _______________________________________________________________________________________________________________________________________ +rem Test script for registering or changing filter of our configuration. +rem _______________________________________________________________________________________________________________________________________ + +Sub Main + Dim xFiterFactory as object + Dim sFilterName as string + + xFilterFactory = createUNOService("com.sun.star.document.FilterFactory") + + sFilterName = "MeinFilter_5" + +rem AddFilter ( xFilterFactory, sFilterName ) + ReadFilter ( xFilterFactory, sFilterName ) +rem QueryFilters ( xFilterFactory ) + + xFilterFactory.flush() + +End Sub + +rem ************************************************************************************************************* +Sub AddFilter( xFilterFactory, sFilterName ) + Dim lProperties(8) as new com.sun.star.beans.PropertyValue + Dim lUserData (1) as string + + lUserData(1) = "Userdata von TestFilter" + + lProperties(0).Name = "Type" + lProperties(0).Value = "bmp_MS_Windows" + + lProperties(1).Name = "UIName" + lProperties(1).Value = sFilterName + + lProperties(2).Name = "DocumentService" + lProperties(2).Value = "com.sun.star.text.TextDocument" + + lProperties(3).Name = "FilterService" + lProperties(3).Value = "com.sun.star.comp.framework.TestFilter" + + lProperties(4).Name = "Flags" + lProperties(4).Value = 256 + + lProperties(5).Name = "UserData" + lProperties(5).Value = lUserData() + + lProperties(6).Name = "FileFormatVersion" + lProperties(6).Value = 0 + + lProperties(7).Name = "TemplateName" + lProperties(7).Value = "" + + xFilterFactory.insertByName( sFilterName, lProperties() ) +End Sub + +rem ************************************************************************************************************* +Sub ReadFilter( xFilterFactory, sFilterName ) +rem Dim lFilters() as com.sun.star.beans.PropertyValue + Dim sOut as string + Dim nCount as integer + + lProperties = xFilterFactory.getByName( sFilterName ) + + sOut = "" + for nCount=0 to ubound(lProperties()) step 1 + sOut = sOut + lProperties(nCount).Name + sOut = sOut + " = " +rem #85829# Disable follow if statement to produce bug! +rem if( lProperties(nCount).Name <> "UserData" ) then + sOut = sOut + lProperties(nCount).Value +rem endif + sOut = sOut + chr(13) + next nCount + + msgbox sOut +End Sub + +rem ************************************************************************************************************* +Sub QueryFilters( xFilterFactory ) + Dim lFilters() as string + Dim sQuery as string + Dim sOut as string + Dim nCount as integer + + sQuery = "_filterquery_defaultfilter" +rem sQuery = "_filterquery_textdocument_withdefault" + + lFilters() = xFilterFactory.getByName( sQuery ) + + sOut = "" + for nCount=0 to ubound( lFilters() ) + sOut = sOut + lFilters(nCount) + chr(13) + next nCount + + msgbox sOut +End Sub diff --git a/framework/test/test_statusindicatorfactory.bas b/framework/test/test_statusindicatorfactory.bas new file mode 100644 index 000000000000..e82590fb7678 --- /dev/null +++ b/framework/test/test_statusindicatorfactory.bas @@ -0,0 +1,69 @@ +Sub Main + + rem Get reference to current active frame. Most time this will be + rem the basic ide by himself. + xTestFrame = StarDesktop.ActiveFrame + + rem Create more then one indicator objects for this frame. + xIndicator1 = xTestFrame.createStatusIndicator() + xIndicator2 = xTestFrame.createStatusIndicator() + xIndicator3 = xTestFrame.createStatusIndicator() + + rem Check status of creation. No null references should be detected. + if( isNull(xIndicator1)=TRUE ) or ( isNull(xIndicator2)=TRUE ) or ( isNull(xIndicator3)=TRUE ) then + msgbox "Error: Could not create status indicators!" + exit Sub + endif + + rem Start working for indicator 1 and 2. + rem The window should NOT be shown! + xIndicator1.start( "Indicator 1:", 100 ) + xIndicator2.start( "Indicator 2:", 200 ) + msgbox "Indicator 1 and 2 was started ... the window should NOT be shown!" + + rem Start working for indicator 3. + rem The window should be shown! It's the most active one. + xIndicator3.start( "Indicator 3:", 300 ) + msgbox "Indicator 3 was started ... the window should be shown!" + + rem Set different values and texts for indicator 1 and 2. + rem These values are not visible. + xIndicator1.setValue( 25 ) + xIndicator2.setValue( 50 ) + + rem Work with indicator 3. + rem If working finished automaticly indicator 2 is reactivated. + i = 0 + while i<300 + xIndicator3.setText( "Indicator 3: Range=300 Value=" + i ) + xIndicator3.setValue( i ) + i = i+10 + wait( 1 ) + wend + + rem Delete indicator 2 before you deactivate number 3! + rem The next automaticly activated indicator will be the number 1. + xIndicator2.end + msgbox "Indicator 3 will be destroyed. Indicator 2 was deleted ... number 1 must reactivated automaticly!" + xIndicator3.end + + rem Work with indicator 1. + rem If working finished automaticly the window will be destroyed. + i = 25 + while i<100 + xIndicator1.setText( "Indicator 1: Range=100 Value=" + i ) + xIndicator1.setValue( i ) + i = i+10 + wait( 1 ) + wend + xIndicator1.setText( "Indicator 1: ... reset values to defaults" ) + wait( 1000 ) + xIndicator1.reset + xIndicator1.setText( "Indicator 1: ... set 50 % for progress" ) + wait( 1000 ) + xIndicator1.setValue( 50 ) + msgbox "Indicator 1 will be destroyed. Indicator window must destroyed automaticly!" + xIndicator1.end + + msgbox "Test for status indicator finished successful!" +End Sub diff --git a/framework/test/threadtest.cxx b/framework/test/threadtest.cxx new file mode 100644 index 000000000000..78690d265058 --- /dev/null +++ b/framework/test/threadtest.cxx @@ -0,0 +1,805 @@ +/************************************************************************* + * + * $RCSfile: threadtest.cxx,v $ + * + * $Revision: 1.6 $ + * + * last change: $Author: hr $ $Date: 2003-03-25 18:22:03 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ + +#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_ +#include <macros/generic.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_ +#include <macros/debug.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_ +#include <threadhelp/resetableguard.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_ +#include <threadhelp/transactionguard.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_RWLOCKBASE_HXX_ +#include <threadhelp/rwlockbase.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_TRANSACTIONBASE_HXX_ +#include <threadhelp/transactionbase.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_READGUARD_HXX_ +#include <threadhelp/readguard.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_WRITEGUARD_HXX_ +#include <threadhelp/writeguard.hxx> +#endif + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ + +//_________________________________________________________________________________________________________________ +// other includes +//_________________________________________________________________________________________________________________ + +#ifndef _RTL_RANDOM_H_ +#include <rtl/random.h> +#endif + +#ifndef _VOS_PROCESS_HXX_ +#include <vos/process.hxx> +#endif + +#ifndef _VOS_THREAD_HXX_ +#include <vos/thread.hxx> +#endif + +#ifndef _RTL_USTRING_ +#include <rtl/ustring.hxx> +#endif + +#ifndef _RTL_USTRBUF_HXX_ +#include <rtl/ustrbuf.hxx> +#endif + +#ifndef _OSL_TIME_H_ +#include <osl/time.h> +#endif + +#ifndef _OSL_INTERLOCK_H_ +#include <osl/interlock.h> +#endif + +#include <vcl/event.hxx> +#include <vcl/svapp.hxx> +#include <vcl/wrkwin.hxx> +#include <vcl/msgbox.hxx> +#include <stdio.h> + +//_________________________________________________________________________________________________________________ +// const +//_________________________________________________________________________________________________________________ + +#define LOGFILE "threadtest.log" +#define STATISTICS_FILE "threadtest_statistic.csv" + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +using namespace ::rtl ; +using namespace ::osl ; +using namespace ::vos ; +using namespace ::framework ; + +//_________________________________________________________________________________________________________________ +// defines +//_________________________________________________________________________________________________________________ + +/*---------------- Use follow defines to enable/disable some special features of this little test program! -------*/ + +#define ENABLE_LOG +//#define ENABLE_THREADDELAY +#define ENABLE_REQUESTCOUNT + +/*----------------------------------------------------------------------------------------------------------------*/ + +#ifdef ENABLE_LOG + #define LOG_SETA_START( NA, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] call setA( " ); \ + sLog.append( NA ); \ + sLog.append( " )\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_SETA_END( NA, EREASON, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + if( EREASON == E_NOREASON ) \ + sLog.append( " ] finish setA( " ); \ + else \ + sLog.append( " ] was refused at setA( "); \ + sLog.append( NA ); \ + sLog.append( " )\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_GETA_START( NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] call getA()\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_GETA_END( NRETURN, EREASON, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + if( EREASON == E_NOREASON ) \ + sLog.append( " ] finish getA() with " ); \ + else \ + sLog.append( " ] was refused at getA() with " ); \ + sLog.append( NRETURN ); \ + sLog.append( "\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_WORKA_START( NA, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] call workA( " ); \ + sLog.append( NA ); \ + sLog.append( " )\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_WORKA_END( NRETURN, EREASON, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + if( EREASON == E_NOREASON ) \ + sLog.append( " ] finish workA() with " ); \ + else \ + sLog.append( " ] was refused at workA() with " ); \ + sLog.append( NRETURN ); \ + sLog.append( "\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_INITEXCEPTION( SMETHOD, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] get EInitException from \"" ); \ + sLog.append( SMETHOD ); \ + sLog.append( "\"\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_CLOSEEXCEPTION( SMETHOD, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] get ECloseException from \"" ); \ + sLog.append( SMETHOD ); \ + sLog.append( "\"\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_INIT( NA, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] initialize me with " ); \ + sLog.append( NA ); \ + sLog.append( "\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_CLOSE( NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ResetableGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] close me\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } +#else + #define LOG_SETA_START( NA, NID ) + #define LOG_SETA_END( NA, EREASON, NID ) + #define LOG_GETA_START( NID ) + #define LOG_GETA_END( NRETURN, EREASON, NID ) + #define LOG_WORKA_START( NA, NID ) + #define LOG_WORKA_END( NRETURN, EREASON, NID ) + #define LOG_INITEXCEPTION( SMETHOD, NID ) + #define LOG_CLOSEEXCEPTION( SMETHOD, NID ) + #define LOG_INIT( NA, NID ) + #define LOG_CLOSE( NID ) +#endif + +//_________________________________________________________________________________________________________________ +// declarations +//_________________________________________________________________________________________________________________ + +sal_uInt16 getRandomValue() +{ + // Get new random value for thread-sleep! + // See run() for further informations. + // Always calculate a new random number. + sal_uInt16 nValue; + rtlRandomPool aPool = rtl_random_createPool(); + rtl_random_getBytes ( aPool, &nValue, 2 ); + rtl_random_destroyPool ( aPool ); + return nValue; +} + +/*-************************************************************************************************************//** + @descr This class is used from different threads at the same time. + We start working after calling init() first(!) ... + and finish it by calling close(). It exist two methods for reading/writing an + internal variable "A". Another function workA() do both things at the same time. + All public methods log information in a file if DO_LOG is defined. + + @attention Our public base class FaiRWLockBase is a struct with a RWLock as member. + This member can be used by guards to safe access at internal variables + in interface methods. + Another baseclass is the TransactionBase. They support rejection of wrong calls at wrong time. + e.g. calls after closing object! +*//*-*************************************************************************************************************/ + +class ThreadSafeClass : private TransactionBase + , private FairRWLockBase +{ + public: + + ThreadSafeClass (); + ~ThreadSafeClass(); + + // This methods are used from differnt threads + // to test this class. + void init ( sal_Int32 nA , + sal_Int32 nThreadID ); + void close ( sal_Int32 nThreadID ); + void setA ( sal_Int32 nA , + sal_Int32 nThreadID ); + sal_Int32 getA ( sal_Int32 nThreadID ); + sal_Int32 workA ( sal_Int32 nA , + sal_Int32 nThreadID ); + + #ifdef ENABLE_REQUESTCOUNT + // This methods are used for statistics only! + sal_Int32 getReadCount () { return m_nReadCount; } + sal_Int32 getWriteCount() { return m_nWriteCount; } + #endif + + private: + + sal_Int32 m_nA ; /// test member fro reading/writing + + #ifdef ENABLE_LOG + ::osl::Mutex m_aLogMutex ; /// mutex to serialize writing log file! + #endif + + #ifdef ENABLE_REQUESTCOUNT + oslInterlockedCount m_nReadCount ; /// statistic variables to count read/write requests + oslInterlockedCount m_nWriteCount ; + #endif +}; + +//_________________________________________________________________________________________________________________ +ThreadSafeClass::ThreadSafeClass() + : TransactionBase ( ) + , FairRWLockBase ( ) + , m_nA ( 0 ) + #ifdef ENABLE_REQUESTCOUNT + , m_nReadCount ( 0 ) + , m_nWriteCount ( 0 ) + #endif +{ +} + +//_________________________________________________________________________________________________________________ +ThreadSafeClass::~ThreadSafeClass() +{ +} + +//_________________________________________________________________________________________________________________ +void ThreadSafeClass::init( sal_Int32 nA, sal_Int32 nThreadID ) +{ + // Set write lock for setting internal member AND + // protect changing of working mode! + WriteGuard aWriteLock( m_aLock ); + + LOG_INIT( nA, nThreadID ) + + // Look for multiple calls of this method first! + // Use E_SOFTEXCEPTIONS to disable automaticly throwing of exceptions for some working modes. + ERejectReason eReason; + TransactionGuard aTransaction( m_aTransactionManager, E_NOEXCEPTIONS, eReason ); + if( eReason == E_UNINITIALIZED ) + { + // OK, it must be the first call and we are synchronized with all other threads by using the write lock! + // Otherwise (e.g. if working mode == E_WORK) we get a exception and follow lines are never called. + + // We can set our member and change the working mode now. + m_nA = nA; + m_aTransactionManager.setWorkingMode( E_WORK ); + } +} + +//_________________________________________________________________________________________________________________ +void ThreadSafeClass::close( sal_Int32 nThreadID ) +{ + // Make it threadsafe. + // It must be an exclusiv access! => WriteLock! + WriteGuard aWriteLock( m_aLock ); + + LOG_CLOSE( nThreadID ) + + // We must look for multiple calls of this method. + // Try to register this method as a transaction. + // In combination with E_HARDEXCEPTIONS only working mode E_WORK pass this barrier. + ERejectReason eReason; + TransactionGuard aTransaction( m_aTransactionManager, E_NOEXCEPTIONS, eReason ); + if( eReason == E_NOREASON ) + { + // Change working mode to BEFORECLOSE to enable rejection of normal interface calls + // and enable SOFTEXCEPTION mode for some impl- or helper methods! + // Attention: We must stop successful registered transaction first ... + // because setWorkingMode() blocks and wait for all current existing ones! + aTransaction.stop(); + m_aTransactionManager.setWorkingMode( E_BEFORECLOSE ); + + // Now we are alone ... + // All further calls to this object are rejected ... + // (not all ... some special ones can work by using E_SOFTEXCEPTIONS!) + + // Deinitialize all member and set working mode to E_CLOSE. + m_nA = 0; + m_aTransactionManager.setWorkingMode( E_CLOSE ); + } +} + +//_________________________________________________________________________________________________________________ +void ThreadSafeClass::setA( sal_Int32 nA, sal_Int32 nThreadID ) +{ + // Make it threadsafe. + WriteGuard aWriteLock( m_aLock ); + + LOG_SETA_START( nA, nThreadID ) + + // Register this method as a transaction to prevent code against wrong calls + // after close() or before init()! + ERejectReason eReason; + TransactionGuard aTransaction( m_aTransactionManager, E_NOEXCEPTIONS, eReason ); + if( eReason == E_NOREASON ) + { + // This object is ready for working and we have full write access. + // We can work with our member. + m_nA = nA; + #ifdef ENABLE_REQUESTCOUNT + osl_incrementInterlockedCount( &m_nWriteCount ); + #endif + } + LOG_SETA_END( nA, eReason, nThreadID ) +} + +//_________________________________________________________________________________________________________________ +sal_Int32 ThreadSafeClass::getA( sal_Int32 nThreadID ) +{ + // Make it threadsafe. + ReadGuard aReadLock( m_aLock ); + + LOG_GETA_START( nThreadID ) + + // Register this method as a transaction to prevent code against wrong calls + // after close() or before init()! + sal_Int32 nReturn = 0; + ERejectReason eReason; + TransactionGuard aTransaction( m_aTransactionManager, E_NOEXCEPTIONS, eReason ); + if( eReason == E_NOREASON ) + { + // This object is ready for working and we have a read access. + // We can work with our member. + nReturn = m_nA; + #ifdef ENABLE_REQUESTCOUNT + osl_incrementInterlockedCount( &m_nReadCount ); + #endif + } + + LOG_GETA_END( nReturn, eReason, nThreadID ) + return nReturn; +} + +//_________________________________________________________________________________________________________________ +sal_Int32 ThreadSafeClass::workA( sal_Int32 nA , + sal_Int32 nThreadID ) +{ + // This method test the downgrade-mechanism of used lock implementation! + // Make it threadsafe. + WriteGuard aWriteLock( m_aLock ); + + LOG_WORKA_START( nA, nThreadID ) + + // Register this method as a transaction to prevent code against wrong calls + // after close() or before init()! + sal_Int32 nReturn = 0; + ERejectReason eReason; + TransactionGuard aTransaction( m_aTransactionManager, E_NOEXCEPTIONS, eReason ); + if( eReason == E_NOREASON ) + { + // We have write access to our member. + // Set new value. + m_nA = nA; + #ifdef ENABLE_REQUESTCOUNT + osl_incrementInterlockedCount( &m_nWriteCount ); + #endif + + // Downgrade write access to read access and read the set value again. + // This call can't be rejected - but it can fail! + aWriteLock.downgrade(); + nReturn = m_nA; + #ifdef ENABLE_REQUESTCOUNT + osl_incrementInterlockedCount( &m_nReadCount ); + #endif + } + + LOG_WORKA_END( nReturn, eReason, nThreadID ) + return nReturn; +} + +/*-****************************************************************************************************//** + @descr Every thread instance of these class lopp from 0 up to "nLoops". + He sleep for a random time and work with given test class "pClass" then. + We use random values for waiting for better results! + Otherwise all threads are sychron after first 2,3...5 calls - I think! +*//*-*****************************************************************************************************/ + +class TestThread : public OThread +{ + public: + + TestThread( ThreadSafeClass* pClass , + sal_Int32 nLoops , + Condition* pListener , + sal_Bool bOwner = sal_False ); + + private: + + virtual void SAL_CALL run (); + virtual void SAL_CALL onTerminated (); + + private: + + ThreadSafeClass* m_pClass ; + sal_Int32 m_nLoops ; + sal_Int32 m_nThreadID ; + Condition* m_pListener ; + sal_Bool m_bOwner ; +}; + +//_________________________________________________________________________________________________________________ +TestThread::TestThread( ThreadSafeClass* pClass , + sal_Int32 nLoops , + Condition* pListener , + sal_Bool bOwner ) + : m_pClass ( pClass ) + , m_nLoops ( nLoops ) + , m_pListener ( pListener ) + , m_bOwner ( bOwner ) +{ +} + +//_________________________________________________________________________________________________________________ +void SAL_CALL TestThread::run() +{ + // Get ID of this thread. + // Is used for logging information ... + m_nThreadID = getCurrentIdentifier(); + + // If we are the owner of given pClass + // we must initialize ... and close + // it. See at the end of this method too. + if( m_bOwner == sal_True ) + { + m_pClass->init( 0, m_nThreadID ); + } + + #ifdef ENABLE_THREADDELAY + TimeValue nDelay ; + #endif + + sal_Int32 nA ; + + for( sal_Int32 nCount=0; nCount<m_nLoops; ++nCount ) + { + // Work with class. + // Use random to select called method. + nA = (sal_Int32)getRandomValue(); + if( nA % 5 == 0 ) + { + nA = m_pClass->workA( nA, m_nThreadID ); + } + else + if( nA % 3 == 0 ) + { + m_pClass->setA( nA, m_nThreadID ); + } + else + { + nA = m_pClass->getA( m_nThreadID ); + } + #ifdef ENABLE_THREADDELAY + // Sleep - use random value to do that too! + nDelay.Seconds = 0; + nDelay.Nanosec = getRandomValue(); + sleep( nDelay ); + #endif + } + + // Don't forget to "close" teset object if you are the owner! + if( m_bOwner == sal_True ) + { + m_pClass->close( m_nThreadID ); + } +} + +//_________________________________________________________________________________________________________________ +void SAL_CALL TestThread::onTerminated() +{ + // Destroy yourself if you finished. + // But don't forget to call listener before. + m_pListener->set(); + + m_pClass = NULL; + m_pListener = NULL; + + delete this; +} + +/*-****************************************************************************************************//** + @descr This is our test application. + We create one ThreadSafeClass object and a lot of threads + which use it at different times. +*//*-*****************************************************************************************************/ + +struct ThreadInfo +{ + Condition* pCondition ; + TestThread* pThread ; +}; + +class TestApplication : public Application +{ + public: + void Main ( ); + sal_Int32 measureTime ( sal_Int32 nThreadCount , + sal_Int32 nOwner , + sal_Int32 nLoops=0 ); +}; + +//_________________________________________________________________________________________________________________ +// definition +//_________________________________________________________________________________________________________________ + +TestApplication aApplication; + +//_________________________________________________________________________________________________________________ +// This function start "nThreadCount" threads to use same test class. +// You can specify the owner thread of this test class which start/stop it by using "nOwner". [1..nThreadcount]! +// If you specify "nLoops" different from 0 we use it as loop count for every started thread. +// Otherwise we work with random values. +sal_Int32 TestApplication::measureTime( sal_Int32 nThreadCount , + sal_Int32 nOwner , + sal_Int32 nLoops ) +{ + // This is the class which should be tested. + ThreadSafeClass aClass; + + // Create list of threads. + ThreadInfo* pThreads = new ThreadInfo[nThreadCount]; + sal_Int32 nLoopCount = nLoops ; + sal_Bool bOwner = sal_False ; + for( sal_Int32 nI=1; nI<=nThreadCount; ++nI ) + { + // If nLoops==0 => we must use random value; otherwise we must use given count ... + if( nLoops == 0 ) + { + nLoopCount = getRandomValue(); + } + // Search owner of class. + bOwner = sal_False; + if( nOwner == nI ) + { + bOwner = sal_True; + } + // initialize condition. + pThreads[nI].pCondition = new Condition; + // Initialize thread. + pThreads[nI].pThread = new TestThread( &aClass, nLoopCount, pThreads[nI].pCondition, bOwner ); + } + + // Start clock to get information about used time. + sal_uInt32 nStartTime ; + sal_uInt32 nEndTime ; + + nStartTime = osl_getGlobalTimer(); + + // Start threads ... + for( nI=1; nI<=nThreadCount; ++nI ) + { + pThreads[nI].pThread->create(); + } + + // Wait for threads ... + for( nI=1; nI<=nThreadCount; ++nI ) + { + pThreads[nI].pCondition->wait(); + delete pThreads[nI].pCondition; + pThreads[nI].pCondition = NULL; + } + + delete[] pThreads; + pThreads = NULL; + + nEndTime = osl_getGlobalTimer(); + + // Calc used time and return it. [ms] + return( nEndTime-nStartTime ); +} + +//_________________________________________________________________________________________________________________ +void TestApplication::Main() +{ + sal_Int32 nTestCount = 0; /// count of calling "measureTime()" + sal_Int32 nThreadCount = 0; /// count of used threads by "measure..." + sal_Int32 nLoops = 0; /// loop count for every thread + sal_Int32 nOwner = 0; /// number of owner thread + + // Parse command line. + // Attention: All parameter are required and must exist! + // syntax: "threadtest.exe <testcount> <threadcount> <loops> <owner>" + OStartupInfo aInfo ; + OUString sArgument ; + sal_Int32 nArgument ; + sal_Int32 nCount = aInfo.getCommandArgCount(); + + LOG_ASSERT2( nCount!=4 ,"TestApplication::Main()" , "Wrong argument line detected!") + + for( nArgument=0; nArgument<nCount; ++nArgument ) + { + aInfo.getCommandArg( nArgument, sArgument ); + if( nArgument== 0 ) nTestCount =sArgument.toInt32(); + if( nArgument== 1 ) nThreadCount=sArgument.toInt32(); + if( nArgument== 2 ) nLoops =sArgument.toInt32(); + if( nArgument== 3 ) nOwner =sArgument.toInt32(); + } + + // Start test. + OStringBuffer sBuf(256); + sal_Int32 nTime=0; + sBuf.append( "Nr.\tTime\tThreadCount\tLoops\tOwner\n" ); + for( sal_Int32 nI=1; nI<=nTestCount; ++nI ) + { + nTime = measureTime( nThreadCount, nOwner, nLoops ); + sBuf.append( nI ); + sBuf.append( "\t" ); + sBuf.append( nTime ); + sBuf.append( "\t" ); + sBuf.append( nThreadCount ); + sBuf.append( "\t" ); + sBuf.append( nLoops ); + sBuf.append( "\t" ); + sBuf.append( nOwner ); + sBuf.append( "\n" ); + } + + WRITE_LOGFILE( STATISTICS_FILE, sBuf.makeStringAndClear() ); + LOG_ERROR( "TApplication::Main()", "Test finish successful!" ) +} diff --git a/framework/test/threadtest/makefile.mk b/framework/test/threadtest/makefile.mk new file mode 100644 index 000000000000..6260feaed953 --- /dev/null +++ b/framework/test/threadtest/makefile.mk @@ -0,0 +1,115 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.3 $ +# +# last change: $Author: hr $ $Date: 2003-03-25 18:22:04 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* +PRJ=..$/.. + +PRJNAME= framework +TARGET= threadtest +LIBTARGET= NO +ENABLE_EXCEPTIONS= TRUE +USE_DEFFILE= TRUE +NO_BSYMBOLIC= TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +.IF "$(COM)"=="ICC" +LINKFLAGS+=/SEGMENTS:1024 /PACKD:32768 +.ENDIF + +# --- application: "threadtest" -------------------------------------------------- + +APP1TARGET= threadtest + +APP1OBJS= $(SLO)$/threadtest.obj \ + $(SLO)$/lockhelper.obj + +# [ed] 6/16/02 Add the transaction manager library on OS X + +.IF "$(OS)"=="MACOSX" +APP1OBJS+= $(SLO)$/transactionmanager.obj +.ENDIF + +APP1STDLIBS= $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(OSLLIB) \ + $(SALLIB) \ + $(VOSLIB) \ + $(SVLIB) + +APP1DEPN= $(INC)$/threadhelp$/threadhelpbase.hxx \ + $(INC)$/threadhelp$/transactionbase.hxx \ + $(INC)$/threadhelp$/transactionmanager.hxx \ + $(INC)$/threadhelp$/transactionguard.hxx \ + $(INC)$/threadhelp$/resetableguard.hxx \ + $(INC)$/threadhelp$/readguard.hxx \ + $(INC)$/threadhelp$/writeguard.hxx + +.IF "$(GUI)"=="WIN" || "$(GUI)"=="OS2" +APP1DEF= $(MISC)$/threadtest.def +.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/framework/test/threadtest/test.btm b/framework/test/threadtest/test.btm new file mode 100644 index 000000000000..627c756893bf --- /dev/null +++ b/framework/test/threadtest/test.btm @@ -0,0 +1,29 @@ +@echo off +pushd + +rem TESTCOUNT = Anzahl von Test-Durchlaeufen +rem THREADCOUNT = Anzahl konk. Threads +rem LOOPS = Anzahl Durchlaeufe pro Test +rem OWNER = Numer des Threads, welcher Testklasse "besitzt" ... er muss diese initialisieren und deinitialisieren! + +echo "set test parameter ..." +set _TESTCOUNT=100 +set _THREADCOUNT=30 +set _LOOPS=50 +set _OWNER=10 + +cd bin + +echo "delete old log files ..." +*del .\threadtest_statistic.csv +*del .\threadtest.log + +echo "start test ..." +.\threadtest.exe %_TESTCOUNT% %_THREADCOUNT% %_LOOPS% %_OWNER% + +echo "show log files ..." +edit .\threadtest_statistic.csv +edit .\threadtest.log + +popd +echo on diff --git a/framework/test/threadtest/threadtest.cxx b/framework/test/threadtest/threadtest.cxx new file mode 100644 index 000000000000..6fa07edabe16 --- /dev/null +++ b/framework/test/threadtest/threadtest.cxx @@ -0,0 +1,806 @@ +/************************************************************************* + * + * $RCSfile: threadtest.cxx,v $ + * + * $Revision: 1.3 $ + * + * last change: $Author: hr $ $Date: 2003-03-25 18:22:05 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ + +#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_ +#include <threadhelp/threadhelpbase.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_TRANSACTIONBASE_HXX_ +#include <threadhelp/transactionbase.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_ +#include <threadhelp/resetableguard.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_READGUARD_HXX_ +#include <threadhelp/readguard.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_WRITEGUARD_HXX_ +#include <threadhelp/writeguard.hxx> +#endif + +#ifndef __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_ +#include <threadhelp/transactionguard.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_ +#include <macros/generic.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_ +#include <macros/debug.hxx> +#endif + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ + +//_________________________________________________________________________________________________________________ +// other includes +//_________________________________________________________________________________________________________________ + +#ifndef _RTL_RANDOM_H_ +#include <rtl/random.h> +#endif + +#ifndef _VOS_PROCESS_HXX_ +#include <vos/process.hxx> +#endif + +#ifndef _VOS_THREAD_HXX_ +#include <vos/thread.hxx> +#endif + +#ifndef _RTL_USTRING_ +#include <rtl/ustring.hxx> +#endif + +#ifndef _RTL_USTRBUF_HXX_ +#include <rtl/ustrbuf.hxx> +#endif + +#ifndef _OSL_TIME_H_ +#include <osl/time.h> +#endif + +#ifndef _OSL_INTERLOCK_H_ +#include <osl/interlock.h> +#endif + +#include <vcl/event.hxx> +#include <vcl/svapp.hxx> +#include <vcl/wrkwin.hxx> +#include <vcl/msgbox.hxx> +#include <stdio.h> + +//_________________________________________________________________________________________________________________ +// const +//_________________________________________________________________________________________________________________ + +#define LOGFILE "threadtest.log" +#define STATISTICS_FILE "threadtest_statistic.csv" + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +using namespace ::rtl ; +using namespace ::osl ; +using namespace ::vos ; +using namespace ::framework ; + +//_________________________________________________________________________________________________________________ +// defines +//_________________________________________________________________________________________________________________ + +/*---------------- Use follow defines to enable/disable some special features of this little test program! -------*/ + +#define ENABLE_LOG +//#define ENABLE_THREADDELAY +#define ENABLE_REQUESTCOUNT + +/*----------------------------------------------------------------------------------------------------------------*/ + +#ifdef ENABLE_LOG + #define LOG_SETA_START( NA, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] call setA( " ); \ + sLog.append( NA ); \ + sLog.append( " )\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_SETA_END( NA, EREASON, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + if( EREASON == E_NOREASON ) \ + sLog.append( " ] finish setA( " ); \ + else \ + sLog.append( " ] was refused at setA( "); \ + sLog.append( NA ); \ + sLog.append( " )\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_GETA_START( NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] call getA()\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_GETA_END( NRETURN, EREASON, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + if( EREASON == E_NOREASON ) \ + sLog.append( " ] finish getA() with " ); \ + else \ + sLog.append( " ] was refused at getA() with " ); \ + sLog.append( NRETURN ); \ + sLog.append( "\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_WORKA_START( NA, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] call workA( " ); \ + sLog.append( NA ); \ + sLog.append( " )\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_WORKA_END( NRETURN, EREASON, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + if( EREASON == E_NOREASON ) \ + sLog.append( " ] finish workA() with " ); \ + else \ + sLog.append( " ] was refused at workA() with " ); \ + sLog.append( NRETURN ); \ + sLog.append( "\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_INITEXCEPTION( SMETHOD, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] get EInitException from \"" ); \ + sLog.append( SMETHOD ); \ + sLog.append( "\"\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_CLOSEEXCEPTION( SMETHOD, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] get ECloseException from \"" ); \ + sLog.append( SMETHOD ); \ + sLog.append( "\"\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_INIT( NA, NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] initialize me with " ); \ + sLog.append( NA ); \ + sLog.append( "\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } + + #define LOG_CLOSE( NID ) \ + { \ + sal_uInt32 nTimeStamp = osl_getGlobalTimer(); \ + ::osl::MutexGuard aLogGuard( m_aLogMutex ); \ + OStringBuffer sLog(256); \ + sLog.append( (sal_Int32)nTimeStamp ); \ + sLog.append( ": Thread[ " ); \ + sLog.append( NID ); \ + sLog.append( " ] close me\n" ); \ + WRITE_LOGFILE( LOGFILE, sLog.makeStringAndClear() ) \ + } +#else + #define LOG_SETA_START( NA, NID ) + #define LOG_SETA_END( NA, EREASON, NID ) + #define LOG_GETA_START( NID ) + #define LOG_GETA_END( NRETURN, EREASON, NID ) + #define LOG_WORKA_START( NA, NID ) + #define LOG_WORKA_END( NRETURN, EREASON, NID ) + #define LOG_INITEXCEPTION( SMETHOD, NID ) + #define LOG_CLOSEEXCEPTION( SMETHOD, NID ) + #define LOG_INIT( NA, NID ) + #define LOG_CLOSE( NID ) +#endif + +//_________________________________________________________________________________________________________________ +// declarations +//_________________________________________________________________________________________________________________ + +sal_uInt16 getRandomValue() +{ + // Get new random value for thread-sleep! + // See run() for further informations. + // Always calculate a new random number. + sal_uInt16 nValue; + rtlRandomPool aPool = rtl_random_createPool(); + rtl_random_getBytes ( aPool, &nValue, 2 ); + rtl_random_destroyPool ( aPool ); + return nValue; +} + +/*-************************************************************************************************************//** + @descr This class is used from different threads at the same time. + We start working after calling init() first(!) ... + and finish it by calling close(). It exist two methods for reading/writing an + internal variable "A". Another function workA() do both things at the same time. + All public methods log information in a file if DO_LOG is defined. + + @attention Our public base class FaiRWLockBase is a struct with a RWLock as member. + This member can be used by guards to safe access at internal variables + in interface methods. + Another baseclass is the TransactionBase. They support rejection of wrong calls at wrong time. + e.g. calls after closing object! +*//*-*************************************************************************************************************/ + +class ThreadSafeClass : private ThreadHelpBase + , private TransactionBase + +{ + public: + + ThreadSafeClass (); + ~ThreadSafeClass(); + + // This methods are used from differnt threads + // to test this class. + void init ( sal_Int32 nA , + sal_Int32 nThreadID ); + void close ( sal_Int32 nThreadID ); + void setA ( sal_Int32 nA , + sal_Int32 nThreadID ); + sal_Int32 getA ( sal_Int32 nThreadID ); + sal_Int32 workA ( sal_Int32 nA , + sal_Int32 nThreadID ); + + #ifdef ENABLE_REQUESTCOUNT + // This methods are used for statistics only! + sal_Int32 getReadCount () { return m_nReadCount; } + sal_Int32 getWriteCount() { return m_nWriteCount; } + #endif + + private: + + sal_Int32 m_nA ; /// test member fro reading/writing + + #ifdef ENABLE_LOG + ::osl::Mutex m_aLogMutex ; /// mutex to serialize writing log file! + #endif + + #ifdef ENABLE_REQUESTCOUNT + oslInterlockedCount m_nReadCount ; /// statistic variables to count read/write requests + oslInterlockedCount m_nWriteCount ; + #endif +}; + +//_________________________________________________________________________________________________________________ +ThreadSafeClass::ThreadSafeClass() + : ThreadHelpBase ( ) + , TransactionBase ( ) + , m_nA ( 0 ) + #ifdef ENABLE_REQUESTCOUNT + , m_nReadCount ( 0 ) + , m_nWriteCount ( 0 ) + #endif +{ +} + +//_________________________________________________________________________________________________________________ +ThreadSafeClass::~ThreadSafeClass() +{ +} + +//_________________________________________________________________________________________________________________ +void ThreadSafeClass::init( sal_Int32 nA, sal_Int32 nThreadID ) +{ + // Look for multiple calls of this method first! + // Use E_SOFTEXCEPTIONS to disable automaticly throwing of exceptions for some working modes. + TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS ); + + // Set write lock for setting internal member AND + // protect changing of working mode! + WriteGuard aWriteLock( m_aLock ); + LOG_INIT( nA, nThreadID ) + + // OK, it must be the first call and we are synchronized with all other threads by using the write lock! + // Otherwise (e.g. if working mode == E_WORK) we get a exception and follow lines are never called. + + // We can set our member and change the working mode now. + m_nA = nA; + + aWriteLock.unlock(); + + m_aTransactionManager.setWorkingMode( E_WORK ); +} + +//_________________________________________________________________________________________________________________ +void ThreadSafeClass::close( sal_Int32 nThreadID ) +{ + // We must look for multiple calls of this method. + // Try to register this method as a transaction. + // In combination with E_HARDEXCEPTIONS only working mode E_WORK pass this barrier. + TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS ); + aTransaction.stop(); + + // Change working mode to BEFORECLOSE to enable rejection of normal interface calls + // and enable SOFTEXCEPTION mode for some impl- or helper methods! + // Attention: We must stop successful registered transaction first ... + // because setWorkingMode() blocks and wait for all current existing ones! + m_aTransactionManager.setWorkingMode( E_BEFORECLOSE ); + + // Make it threadsafe. + // It must be an exclusiv access! => WriteLock! + WriteGuard aWriteLock( m_aLock ); + + LOG_CLOSE( nThreadID ) + + // Now we are alone ... + // All further calls to this object are rejected ... + // (not all ... some special ones can work by using E_SOFTEXCEPTIONS!) + + // Deinitialize all member and set working mode to E_CLOSE. + m_nA = 0; + + aWriteLock.unlock(); + + m_aTransactionManager.setWorkingMode( E_CLOSE ); +} + +//_________________________________________________________________________________________________________________ +void ThreadSafeClass::setA( sal_Int32 nA, sal_Int32 nThreadID ) +{ + // Register this method as a transaction to prevent code against wrong calls + // after close() or before init()! + ERejectReason eReason; + TransactionGuard aTransaction( m_aTransactionManager, E_NOEXCEPTIONS, &eReason ); + if( eReason == E_NOREASON ) + { + // Make it threadsafe. + WriteGuard aWriteLock( m_aLock ); + + LOG_SETA_START( nA, nThreadID ) + + // This object is ready for working and we have full write access. + // We can work with our member. + m_nA = nA; + #ifdef ENABLE_REQUESTCOUNT + osl_incrementInterlockedCount( &m_nWriteCount ); + #endif + LOG_SETA_END( nA, eReason, nThreadID ) + } +} + +//_________________________________________________________________________________________________________________ +sal_Int32 ThreadSafeClass::getA( sal_Int32 nThreadID ) +{ + // Register this method as a transaction to prevent code against wrong calls + // after close() or before init()! + sal_Int32 nReturn = 0; + ERejectReason eReason; + TransactionGuard aTransaction( m_aTransactionManager, E_NOEXCEPTIONS, &eReason ); + if( eReason == E_NOREASON ) + { + // Make it threadsafe. + ReadGuard aReadLock( m_aLock ); + + LOG_GETA_START( nThreadID ) + + // This object is ready for working and we have a read access. + // We can work with our member. + nReturn = m_nA; + #ifdef ENABLE_REQUESTCOUNT + osl_incrementInterlockedCount( &m_nReadCount ); + #endif + LOG_GETA_END( nReturn, eReason, nThreadID ) + } + return nReturn; +} + +//_________________________________________________________________________________________________________________ +sal_Int32 ThreadSafeClass::workA( sal_Int32 nA , + sal_Int32 nThreadID ) +{ + // Register this method as a transaction to prevent code against wrong calls + // after close() or before init()! + sal_Int32 nReturn = 0; + ERejectReason eReason; + TransactionGuard aTransaction( m_aTransactionManager, E_NOEXCEPTIONS, &eReason ); + if( eReason == E_NOREASON ) + { + // This method test the downgrade-mechanism of used lock implementation! + // Make it threadsafe. + WriteGuard aWriteLock( m_aLock ); + + LOG_WORKA_START( nA, nThreadID ) + // We have write access to our member. + // Set new value. + m_nA = nA; + #ifdef ENABLE_REQUESTCOUNT + osl_incrementInterlockedCount( &m_nWriteCount ); + #endif + + // Downgrade write access to read access and read the set value again. + // This call can't be rejected - but it can fail! + aWriteLock.downgrade(); + nReturn = m_nA; + #ifdef ENABLE_REQUESTCOUNT + osl_incrementInterlockedCount( &m_nReadCount ); + #endif + + LOG_WORKA_END( nReturn, eReason, nThreadID ) + } + return nReturn; +} + +/*-****************************************************************************************************//** + @descr Every thread instance of these class lopp from 0 up to "nLoops". + He sleep for a random time and work with given test class "pClass" then. + We use random values for waiting for better results! + Otherwise all threads are sychron after first 2,3...5 calls - I think! +*//*-*****************************************************************************************************/ + +class TestThread : public OThread +{ + public: + + TestThread( ThreadSafeClass* pClass , + sal_Int32 nLoops , + Condition* pListener , + sal_Bool bOwner = sal_False ); + + private: + + virtual void SAL_CALL run (); + virtual void SAL_CALL onTerminated (); + + private: + + ThreadSafeClass* m_pClass ; + sal_Int32 m_nLoops ; + sal_Int32 m_nThreadID ; + Condition* m_pListener ; + sal_Bool m_bOwner ; +}; + +//_________________________________________________________________________________________________________________ +TestThread::TestThread( ThreadSafeClass* pClass , + sal_Int32 nLoops , + Condition* pListener , + sal_Bool bOwner ) + : m_pClass ( pClass ) + , m_nLoops ( nLoops ) + , m_pListener ( pListener ) + , m_bOwner ( bOwner ) +{ +} + +//_________________________________________________________________________________________________________________ +void SAL_CALL TestThread::run() +{ + // Get ID of this thread. + // Is used for logging information ... + m_nThreadID = getCurrentIdentifier(); + + // If we are the owner of given pClass + // we must initialize ... and close + // it. See at the end of this method too. + if( m_bOwner == sal_True ) + { + m_pClass->init( 0, m_nThreadID ); + } + + #ifdef ENABLE_THREADDELAY + TimeValue nDelay ; + #endif + + sal_Int32 nA ; + + for( sal_Int32 nCount=0; nCount<m_nLoops; ++nCount ) + { + // Work with class. + // Use random to select called method. + nA = (sal_Int32)getRandomValue(); + if( nA % 5 == 0 ) + { + //nA = m_pClass->workA( nA, m_nThreadID ); + } + else + if( nA % 3 == 0 ) + { + m_pClass->setA( nA, m_nThreadID ); + } + else + { + nA = m_pClass->getA( m_nThreadID ); + } + #ifdef ENABLE_THREADDELAY + // Sleep - use random value to do that too! + nDelay.Seconds = 0; + nDelay.Nanosec = getRandomValue(); + sleep( nDelay ); + #endif + } + + // Don't forget to "close" teset object if you are the owner! + if( m_bOwner == sal_True ) + { + m_pClass->close( m_nThreadID ); + } +} + +//_________________________________________________________________________________________________________________ +void SAL_CALL TestThread::onTerminated() +{ + // Destroy yourself if you finished. + // But don't forget to call listener before. + m_pListener->set(); + + m_pClass = NULL; + m_pListener = NULL; + + delete this; +} + +/*-****************************************************************************************************//** + @descr This is our test application. + We create one ThreadSafeClass object and a lot of threads + which use it at different times. +*//*-*****************************************************************************************************/ + +struct ThreadInfo +{ + Condition* pCondition ; + TestThread* pThread ; +}; + +class TestApplication : public Application +{ + public: + void Main ( ); + sal_Int32 measureTime ( sal_Int32 nThreadCount , + sal_Int32 nOwner , + sal_Int32 nLoops=0 ); +}; + +//_________________________________________________________________________________________________________________ +// definition +//_________________________________________________________________________________________________________________ + +TestApplication aApplication; + +//_________________________________________________________________________________________________________________ +// This function start "nThreadCount" threads to use same test class. +// You can specify the owner thread of this test class which start/stop it by using "nOwner". [1..nThreadcount]! +// If you specify "nLoops" different from 0 we use it as loop count for every started thread. +// Otherwise we work with random values. +sal_Int32 TestApplication::measureTime( sal_Int32 nThreadCount , + sal_Int32 nOwner , + sal_Int32 nLoops ) +{ + // This is the class which should be tested. + ThreadSafeClass aClass; + + // Create list of threads. + ThreadInfo* pThreads = new ThreadInfo[nThreadCount]; + sal_Int32 nLoopCount = nLoops ; + sal_Bool bOwner = sal_False ; + for( sal_Int32 nI=0; nI<nThreadCount; ++nI ) + { + // If nLoops==0 => we must use random value; otherwise we must use given count ... + if( nLoops == 0 ) + { + nLoopCount = getRandomValue(); + } + // Search owner of class. + bOwner = sal_False; + if( nOwner == nI ) + { + bOwner = sal_True; + } + // initialize condition. + pThreads[nI].pCondition = new Condition; + // Initialize thread. + pThreads[nI].pThread = new TestThread( &aClass, nLoopCount, pThreads[nI].pCondition, bOwner ); + } + + // Start clock to get information about used time. + sal_uInt32 nStartTime ; + sal_uInt32 nEndTime ; + + nStartTime = osl_getGlobalTimer(); + + // Start threads ... + for( nI=0; nI<nThreadCount; ++nI ) + { + pThreads[nI].pThread->create(); + } + + // Wait for threads ... + for( nI=0; nI<nThreadCount; ++nI ) + { + pThreads[nI].pCondition->wait(); + delete pThreads[nI].pCondition; + pThreads[nI].pCondition = NULL; + pThreads[nI].pThread = NULL; + } + + delete[] pThreads; + pThreads = NULL; + + nEndTime = osl_getGlobalTimer(); + + // Calc used time and return it. [ms] + return( nEndTime-nStartTime ); +} + +//_________________________________________________________________________________________________________________ +void TestApplication::Main() +{ + sal_Int32 nTestCount = 0; /// count of calling "measureTime()" + sal_Int32 nThreadCount = 0; /// count of used threads by "measure..." + sal_Int32 nLoops = 0; /// loop count for every thread + sal_Int32 nOwner = 0; /// number of owner thread + + // Parse command line. + // Attention: All parameter are required and must exist! + // syntax: "threadtest.exe <testcount> <threadcount> <loops> <owner>" + OStartupInfo aInfo ; + OUString sArgument ; + sal_Int32 nArgument ; + sal_Int32 nCount = aInfo.getCommandArgCount(); + + LOG_ASSERT2( nCount!=4 ,"TestApplication::Main()" , "Wrong argument line detected!") + + for( nArgument=0; nArgument<nCount; ++nArgument ) + { + aInfo.getCommandArg( nArgument, sArgument ); + if( nArgument== 0 ) nTestCount =sArgument.toInt32(); + if( nArgument== 1 ) nThreadCount=sArgument.toInt32(); + if( nArgument== 2 ) nLoops =sArgument.toInt32(); + if( nArgument== 3 ) nOwner =sArgument.toInt32(); + } + + LOG_ASSERT2( nTestCount==0||nThreadCount==0||nLoops==0||nOwner==0,"TestApplication::Main()", "Wrong argument value detected!" ) + + // Start test. + OStringBuffer sBuf(256); + sal_Int32 nTime=0; + sBuf.append( "Nr.\tTime\tThreadCount\tLoops\tOwner\n" ); + for( sal_Int32 nI=1; nI<=nTestCount; ++nI ) + { + nTime = measureTime( nThreadCount, nOwner, nLoops ); + sBuf.append( nI ); + sBuf.append( "\t" ); + sBuf.append( nTime ); + sBuf.append( "\t" ); + sBuf.append( nThreadCount ); + sBuf.append( "\t" ); + sBuf.append( nLoops ); + sBuf.append( "\t" ); + sBuf.append( nOwner ); + sBuf.append( "\n" ); + } + + WRITE_LOGFILE( STATISTICS_FILE, sBuf.makeStringAndClear() ); + LOG_ERROR( "TApplication::Main()", "Test finish successful!" ) +} diff --git a/framework/test/typecfg/build.btm b/framework/test/typecfg/build.btm new file mode 100644 index 000000000000..f984a1146296 --- /dev/null +++ b/framework/test/typecfg/build.btm @@ -0,0 +1,26 @@ +@echo off + +pushd + +rem Set flag to enable special mechanism of "FilterCache". +rem This works for windows only! ... this batch too :-) +set ENVCFLAGS=-DENABLE_GENERATEFILTERCACHE + +rem Touch header file ... +cd ..\..\inc\classes +attrib -r .\filtercache.hxx +touch .\filtercache.hxx + +rem ... and start new build of library. +cd ..\.. +call build debug=true + +rem Build command line tool too. +cd test\typecfg +call dmake debug=true + +rem Don't forget to disable build flag! +unset ENVCFLAGS + +popd +echo on diff --git a/framework/test/typecfg/cfgview.cxx b/framework/test/typecfg/cfgview.cxx index 23f2731776dd..6ce96c5dfa45 100644 --- a/framework/test/typecfg/cfgview.cxx +++ b/framework/test/typecfg/cfgview.cxx @@ -2,9 +2,9 @@ * * $RCSfile: cfgview.cxx,v $ * - * $Revision: 1.7 $ + * $Revision: 1.8 $ * - * last change: $Author: as $ $Date: 2001-11-21 10:34:59 $ + * last change: $Author: hr $ $Date: 2003-03-25 18:22:06 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -131,16 +131,10 @@ #include <hash_map> #endif -#ifndef _SAL_MAIN_H_ -#include <sal/main.h> -#endif - -/* #include <vcl/event.hxx> #include <vcl/svapp.hxx> #include <vcl/wrkwin.hxx> #include <vcl/msgbox.hxx> -*/ #include <stdio.h> //_________________________________________________________________________________________________________________ @@ -160,14 +154,12 @@ #define FRAMESET_TYPES_HTML "fs_types.html" #define FRAMESET_FILTERS_HTML "fs_filters.html" #define FRAMESET_MODULFILTERS_HTML "fs_modulfilters.html" -#define FRAMESET_FILTERSUINAMESORT_HTML "fs_filtersuinamesort.html" #define FRAMESET_DETECTORS_HTML "fs_detectors.html" #define FRAMESET_LOADERS_HTML "fs_loaders.html" #define FRAMESET_INVALIDFILTERS_HTML "fs_invalidfilters.html" #define FRAMESET_INVALIDDETECTORS_HTML "fs_invaliddetectors.html" #define FRAMESET_INVALIDLOADERS_HTML "fs_invalidloaders.html" -#define FRAMESET_DOUBLEFILTERNAMES_HTML "fs_doublefilternames.html" -#define FRAMESET_UNUSEDTYPES_HTML "fs_unusedtypes.html" +#define FRAMESET_DOUBLEFILTERUINAMES_HTML "fs_doublefilteruinames.html" #define ALLTYPES_HTML "alltypes.html" #define ALLFILTERS_HTML "allfilters.html" @@ -185,9 +177,7 @@ #define FILTERFLAGS_HTML "filterflags.html" #define MODULFILTERS_HTML "modulfilters.html" -#define FILTERSUINAMESORT_HTML "filtersuinamesort.html" -#define DOUBLEFILTERNAMES_HTML "doublefilternames.html" -#define UNUSEDTYPES_HTML "unusedtypes.html" +#define DOUBLEFILTERUINAMES_HTML "doublefilteruinames.html" #define TARGET_MENU "menu" #define TARGET_VIEW "view" @@ -226,22 +216,24 @@ struct AppMember }; /*-***************************************************************************************************************/ -class CFGView +class CFGView : public Application { //************************************************************************************************************* public: - void start(); + void Main(); //************************************************************************************************************* private: void impl_parseCommandLine ( AppMember& rMember ); + void impl_generateHTMLView (); + + //************************************************************************************************************* + private: void impl_printCopyright (); void impl_printSyntax (); - void impl_generateHTMLView (); void impl_generateTypeListHTML (); void impl_generateFilterListHTML (); void impl_generateFilterModulListHTML (); - void impl_generateFilterUINameSortListHTML (); void impl_generateDetectorListHTML (); void impl_generateLoaderListHTML (); void impl_generateInvalidFiltersHTML (); @@ -250,7 +242,6 @@ class CFGView void impl_generateFilterFlagsHTML (); void impl_generateDefaultFiltersHTML (); void impl_generateDoubleFilterUINamesHTML (); - void impl_generateUnusedTypesHTML (); void impl_writeFile ( const ::rtl::OString& sFile, const ::rtl::OString& sContent ); //************************************************************************************************************* @@ -263,23 +254,16 @@ class CFGView // global variables //_________________________________________________________________________________________________________________ +CFGView gApplication; + //***************************************************************************************************************** -SAL_IMPLEMENT_MAIN() +void CFGView::Main() { // Init global servicemanager and set it. // It's neccessary for other services ... e.g. configuration. ServiceManager aManager; ::comphelper::setProcessServiceFactory( aManager.getGlobalUNOServiceManager() ); - CFGView aGenerator; - aGenerator.start(); - - return 0; -} - -//***************************************************************************************************************** -void CFGView::start() -{ // Get optional commands from command line. impl_parseCommandLine( m_aData ); @@ -434,12 +418,6 @@ void CFGView::impl_generateHTMLView() sMenuHTML.appendAscii( TARGET_VIEW ); sMenuHTML.appendAscii( "\">Filters by Moduls</a></li>\n" ); - sMenuHTML.appendAscii( "\t\t<li><a href=\"" ); // list entry for "All Filters sorted by modules and uinames" - sMenuHTML.appendAscii( FRAMESET_FILTERSUINAMESORT_HTML ); - sMenuHTML.appendAscii( "\" target=\"" ); - sMenuHTML.appendAscii( TARGET_VIEW ); - sMenuHTML.appendAscii( "\">Filters by UINames/Modules</a></li>\n" ); - sMenuHTML.appendAscii( "\t\t<li><a href=\"" ); // list entry for "All Detectors" sMenuHTML.appendAscii( FRAMESET_DETECTORS_HTML ); sMenuHTML.appendAscii( "\" target=\"" ); @@ -465,16 +443,10 @@ void CFGView::impl_generateHTMLView() sMenuHTML.appendAscii( "\">Invalid Detect Services</a></li>\n" ); sMenuHTML.appendAscii( "\t\t<li><a href=\"" ); // list entry for "Double Filter UINames" - sMenuHTML.appendAscii( FRAMESET_DOUBLEFILTERNAMES_HTML ); - sMenuHTML.appendAscii( "\" target=\"" ); - sMenuHTML.appendAscii( TARGET_VIEW ); - sMenuHTML.appendAscii( "\">Double Filter UI/Names</a></li>\n" ); - - sMenuHTML.appendAscii( "\t\t<li><a href=\"" ); // list entry for "Unused Types" - sMenuHTML.appendAscii( FRAMESET_UNUSEDTYPES_HTML ); + sMenuHTML.appendAscii( FRAMESET_DOUBLEFILTERUINAMES_HTML ); sMenuHTML.appendAscii( "\" target=\"" ); sMenuHTML.appendAscii( TARGET_VIEW ); - sMenuHTML.appendAscii( "\">Unused Types</a></li>\n" ); + sMenuHTML.appendAscii( "\">Double Filter UINames</a></li>\n" ); sMenuHTML.appendAscii( "\t\t<li><a href=\"" ); // list entry for "Show Filter Flags" sMenuHTML.appendAscii( FILTERFLAGS_HTML ); @@ -487,18 +459,16 @@ void CFGView::impl_generateHTMLView() impl_writeFile( MENU_HTML, U2B(sMenuHTML.makeStringAndClear()) ); - impl_generateTypeListHTML (); - impl_generateFilterListHTML (); - impl_generateFilterModulListHTML (); - impl_generateDetectorListHTML (); - impl_generateLoaderListHTML (); - impl_generateInvalidFiltersHTML (); - impl_generateInvalidDetectorsHTML (); - impl_generateInvalidLoadersHTML (); - impl_generateFilterFlagsHTML (); - impl_generateDoubleFilterUINamesHTML (); - impl_generateUnusedTypesHTML (); - impl_generateFilterUINameSortListHTML(); + impl_generateTypeListHTML (); + impl_generateFilterListHTML (); + impl_generateFilterModulListHTML (); + impl_generateDetectorListHTML (); + impl_generateLoaderListHTML (); + impl_generateInvalidFiltersHTML (); + impl_generateInvalidDetectorsHTML (); + impl_generateInvalidLoadersHTML (); + impl_generateFilterFlagsHTML (); + impl_generateDoubleFilterUINamesHTML(); } //***************************************************************************************************************** @@ -805,16 +775,19 @@ void CFGView::impl_generateFilterModulListHTML() sFiltersFramesetHTML.appendAscii( "\t\t</frameset>\n" ); // close frameset cols sFiltersFramesetHTML.appendAscii( "</html>\n" ); // close html - impl_writeFile( FRAMESET_MODULFILTERS_HTML, U2B(sFiltersFramesetHTML.makeStringAndClear()) ); + impl_writeFile( FRAMESET_FILTERS_HTML, U2B(sFiltersFramesetHTML.makeStringAndClear()) ); //------------------------------------------------------------------------------------------------------------- // generate filter list (names and links only!) // use same loop to generate filter property list! OUStringBuffer sAllFiltersHTML( 10000 ); + OUStringBuffer sFilterPropHTML( 10000 ); sAllFiltersHTML.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tAll Filters\n\t\t</title>\n\t</head>\n\t<body>\n" ); // open html sAllFiltersHTML.appendAscii( "\t\t<table border=0><tr><td bgcolor=#ff8040><strong>Nr.</strong></td><td bgcolor=#ff8040><strong>Filter</strong></td></tr>\n" ); // open table + sFilterPropHTML.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tFilterProperties\n\t\t</title>\n\t</head>\n\t<body>\n" ); // open html + css::uno::Sequence< ::rtl::OUString > lWriter ; css::uno::Sequence< ::rtl::OUString > lWeb ; css::uno::Sequence< ::rtl::OUString > lGlobal ; @@ -827,23 +800,23 @@ void CFGView::impl_generateFilterModulListHTML() css::uno::Sequence< ::rtl::OUString > lDefault; css::uno::Sequence< ::rtl::OUString > lNames ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_writer:default_first:use_order:sort_prop=name") ) >>= lWriter ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_web:default_first:use_order:sort_prop=name") ) >>= lWeb ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_global:default_first:use_order:sort_prop=name") ) >>= lGlobal ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_chart:default_first:use_order:sort_prop=name") ) >>= lChart ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_calc:default_first:use_order:sort_prop=name") ) >>= lCalc ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_impress:default_first:use_order:sort_prop=name") ) >>= lImpress ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_draw:default_first:use_order:sort_prop=name") ) >>= lDraw ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_math:default_first:use_order:sort_prop=name") ) >>= lMath ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_graphic:default_first:use_order:sort_prop=name") ) >>= lGraphic ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_all:iflags=256") ) >>= lDefault ; - - sal_Int32 nModuls = 0; - sal_Int32 nFilters = 0; - sal_Int32 nModulCount = 10; - sal_Int32 nFilterCount = 0; - Filter aFilter ; - ::rtl::OString sModul ; + m_aData.pCache->queryFilters( FILTERQUERY_TEXTDOCUMENT_WITHDEFAULT ) >>= lWriter ; + m_aData.pCache->queryFilters( FILTERQUERY_WEBDOCUMENT_WITHDEFAULT ) >>= lWeb ; + m_aData.pCache->queryFilters( FILTERQUERY_GLOBALDOCUMENT_WITHDEFAULT ) >>= lGlobal ; + m_aData.pCache->queryFilters( FILTERQUERY_CHARTDOCUMENT_WITHDEFAULT ) >>= lChart ; + m_aData.pCache->queryFilters( FILTERQUERY_SPREADSHEETDOCUMENT_WITHDEFAULT ) >>= lCalc ; + m_aData.pCache->queryFilters( FILTERQUERY_PRESENTATIONDOCUMENT_WITHDEFAULT) >>= lImpress ; + m_aData.pCache->queryFilters( FILTERQUERY_DRAWINGDOCUMENT_WITHDEFAULT ) >>= lDraw ; + m_aData.pCache->queryFilters( FILTERQUERY_FORMULARPROPERTIES_WITHDEFAULT ) >>= lMath ; + m_aData.pCache->queryFilters( FILTERQUERY_GRAPHICFILTERS ) >>= lGraphic ; + m_aData.pCache->queryFilters( FILTERQUERY_DEFAULTFILTERS ) >>= lDefault ; + + sal_Int32 nModuls = 0; + sal_Int32 nFilters = 0; + sal_Int32 nModulCount = 0; + sal_Int32 nFilterCount = 0; + Filter aFilter ; + ::rtl::OString sModul ; for( nModuls=0; nModuls<nModulCount; ++nModuls ) { @@ -902,8 +875,8 @@ void CFGView::impl_generateFilterModulListHTML() } sAllFiltersHTML.appendAscii ( "\t\t\t<tr>\n" ); - sAllFiltersHTML.appendAscii ( "\t\t\t\t<td bgcolor=#00aa00 fgcolor=#ffffff valign=\"top\" align=\"top\">-</td>\n" ); - sAllFiltersHTML.appendAscii ( "\t\t\t\t<td bgcolor=#00aa00 fgcolor=#ffffff valign=\"top\" align=\"top\">" ); + sAllFiltersHTML.appendAscii ( "\t\t\t\t<td bgcolor=#000000 fgcolor=#ffffff valign=\"top\" align=\"top\">-</td>\n" ); + sAllFiltersHTML.appendAscii ( "\t\t\t\t<td bgcolor=#000000 fgcolor=#ffffff valign=\"top\" align=\"top\">" ); sAllFiltersHTML.appendAscii ( sModul ); sAllFiltersHTML.appendAscii ( "</td>\n" ); sAllFiltersHTML.appendAscii ( "\t\t\t</tr>\n" ); @@ -931,192 +904,93 @@ void CFGView::impl_generateFilterModulListHTML() sAllFiltersHTML.appendAscii ( "</a>" ); // close href sAllFiltersHTML.appendAscii ( "</td>\n" ); // close column "name" sAllFiltersHTML.appendAscii ( "\t\t\t</tr>\n" ); // close row - } - } - - sAllFiltersHTML.appendAscii( "</table>\n" ); // close table - sAllFiltersHTML.appendAscii( "</body>\n</html>\n" ); // close html - - impl_writeFile( MODULFILTERS_HTML , U2B(sAllFiltersHTML.makeStringAndClear()) ); -} - -//***************************************************************************************************************** -void CFGView::impl_generateFilterUINameSortListHTML() -{ - //------------------------------------------------------------------------------------------------------------- - // generate frameset for filters sorted by modules - OUStringBuffer sFiltersFramesetHTML( 10000 ); - - sFiltersFramesetHTML.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tFrameset: Filters sorted by modules & UINames\n\t\t</title>\n\t</head>\n" ); // open html - sFiltersFramesetHTML.appendAscii( "\t\t<frameset cols=\"40%,60%\">\n" ); // open frameset for cols - sFiltersFramesetHTML.appendAscii( "\t\t\t<frame name=\"" ); // generate frame "list" - sFiltersFramesetHTML.appendAscii( TARGET_LIST ); - sFiltersFramesetHTML.appendAscii( "\" src=\"" ); - sFiltersFramesetHTML.appendAscii( FILTERSUINAMESORT_HTML ); - sFiltersFramesetHTML.appendAscii( "\" title=\"List\">\n" ); - sFiltersFramesetHTML.appendAscii( "\t\t\t<frame name=\"" ); // generate frame "properties" - sFiltersFramesetHTML.appendAscii( TARGET_PROPERTIES ); - sFiltersFramesetHTML.appendAscii( "\" src=\"" ); - sFiltersFramesetHTML.appendAscii( FILTERPROPERTIES_HTML ); - sFiltersFramesetHTML.appendAscii( "\" title=\"Properties\">\n" ); - sFiltersFramesetHTML.appendAscii( "\t\t</frameset>\n" ); // close frameset cols - sFiltersFramesetHTML.appendAscii( "</html>\n" ); // close html - - impl_writeFile( FRAMESET_FILTERSUINAMESORT_HTML, U2B(sFiltersFramesetHTML.makeStringAndClear()) ); - - //------------------------------------------------------------------------------------------------------------- - // generate filter list (names and links only!) - // use same loop to generate filter property list! - OUStringBuffer sAllFiltersHTML( 10000 ); - - sAllFiltersHTML.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tAll Filters\n\t\t</title>\n\t</head>\n\t<body>\n" ); // open html - sAllFiltersHTML.appendAscii( "\t\t<table border=0><tr><td bgcolor=#ff8040><strong>Nr.</strong></td><td bgcolor=#ff8040><strong>Filter</strong></td></tr>\n" ); // open table - - css::uno::Sequence< ::rtl::OUString > lWriter ; - css::uno::Sequence< ::rtl::OUString > lWeb ; - css::uno::Sequence< ::rtl::OUString > lGlobal ; - css::uno::Sequence< ::rtl::OUString > lChart ; - css::uno::Sequence< ::rtl::OUString > lCalc ; - css::uno::Sequence< ::rtl::OUString > lImpress; - css::uno::Sequence< ::rtl::OUString > lDraw ; - css::uno::Sequence< ::rtl::OUString > lMath ; - css::uno::Sequence< ::rtl::OUString > lGraphic; - css::uno::Sequence< ::rtl::OUString > lDefault; - - css::uno::Sequence< ::rtl::OUString > lNames ; - StringList lUINamesUnsorted ; - StringList lUINamesSorted ; - StringList lNamesSorted ; - - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_writer:default_first:use_order:sort_prop=name") ) >>= lWriter ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_web:default_first:use_order:sort_prop=name") ) >>= lWeb ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_global:default_first:use_order:sort_prop=name") ) >>= lGlobal ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_chart:default_first:use_order:sort_prop=name") ) >>= lChart ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_calc:default_first:use_order:sort_prop=name") ) >>= lCalc ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_impress:default_first:use_order:sort_prop=name") ) >>= lImpress ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_draw:default_first:use_order:sort_prop=name") ) >>= lDraw ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_math:default_first:use_order:sort_prop=name") ) >>= lMath ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_graphic:default_first:use_order:sort_prop=name") ) >>= lGraphic ; - m_aData.pCache->queryFilters( DECLARE_ASCII("_query_all:iflags=256") ) >>= lDefault ; - - sal_Int32 nModuls = 0; - sal_Int32 nFilters = 0; - sal_Int32 nModulCount = 10; - sal_Int32 nFilterCount = 0; - Filter aFilter ; - ::rtl::OString sModul ; - - for( nModuls=0; nModuls<nModulCount; ++nModuls ) - { - switch( nModuls ) - { - case 0: { - lNames = lWriter; - sModul = "Writer"; - } - break; - case 1: { - lNames = lWeb ; - sModul = "Web"; - } - break; - case 2: { - lNames = lGlobal ; - sModul = "GlobalDokument"; - } - break; - case 3: { - lNames = lChart ; - sModul = "Chart"; - } - break; - case 4: { - lNames = lCalc ; - sModul = "Calc"; - } - break; - case 5: { - lNames = lImpress; - sModul = "Impress"; - } - break; - case 6: { - lNames = lDraw ; - sModul = "Draw"; - } - break; - case 7: { - lNames = lMath ; - sModul = "Math"; - } - break; - case 8: { - lNames = lGraphic; - sModul = "Graphic"; - } - break; - case 9: { - lNames = lDefault; - sModul = "Default Filter!"; - } - break; - } - lUINamesUnsorted.free(); - lUINamesSorted.free(); - lNamesSorted.free(); - - sAllFiltersHTML.appendAscii ( "\t\t\t<tr>\n" ); - sAllFiltersHTML.appendAscii ( "\t\t\t\t<td bgcolor=#00aa00 fgcolor=#ffffff valign=\"top\" align=\"top\">-</td>\n" ); - sAllFiltersHTML.appendAscii ( "\t\t\t\t<td bgcolor=#00aa00 fgcolor=#ffffff valign=\"top\" align=\"top\">" ); - sAllFiltersHTML.appendAscii ( sModul ); - sAllFiltersHTML.appendAscii ( "</td>\n" ); - sAllFiltersHTML.appendAscii ( "\t\t\t</tr>\n" ); - - nFilterCount = lNames.getLength(); - for( nFilters=0; nFilters<nFilterCount; ++nFilters ) - { - aFilter = m_aData.pCache->getFilter( lNames[nFilters] ); - lUINamesUnsorted.push_back( DataContainer::getLocalelizedString( aFilter.lUINames, DECLARE_ASCII("de") ) ); - } - - lUINamesSorted = lUINamesUnsorted; - ::std::stable_sort( lUINamesSorted.begin(), lUINamesSorted.end() ); - for( StringListIterator pSortedItem=lUINamesSorted.begin(); pSortedItem!=lUINamesSorted.end(); ++pSortedItem ) - { - StringListIterator pUnsortedItem = ::std::find( lUINamesUnsorted.begin(), lUINamesUnsorted.end(), *pSortedItem ); - sal_Int32 nPosition = pUnsortedItem - lUINamesUnsorted.begin(); - lNamesSorted.push_back( lNames[nPosition] ); - } - - for( nFilters=0; nFilters<nFilterCount; ++nFilters ) - { - aFilter = m_aData.pCache->getFilter( lNamesSorted[nFilters] ); - - // write entry in filter list table - sAllFiltersHTML.appendAscii ( "\t\t\t<tr>\n" ); // open row - sAllFiltersHTML.appendAscii ( "\t\t\t\t<td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">" ); // open column "nr" - sAllFiltersHTML.append ( OUString::valueOf( nFilters ) ); // write nr - sAllFiltersHTML.appendAscii ( "</td>\n" ); // close column "nr" - sAllFiltersHTML.appendAscii ( "\t\t\t\t<td>" ); // open column "name" - sAllFiltersHTML.appendAscii ( "<a href=\"" ); // open href="filterproperties.html#<filtername>" - sAllFiltersHTML.appendAscii ( FILTERPROPERTIES_HTML ); - sAllFiltersHTML.appendAscii ( "#" ); - sAllFiltersHTML.append ( aFilter.sName ); - sAllFiltersHTML.appendAscii ( "\" target=\"" ); - sAllFiltersHTML.appendAscii ( TARGET_PROPERTIES ); - sAllFiltersHTML.appendAscii ( "\">" ); - sAllFiltersHTML.append ( lUINamesSorted[nFilters] ); // write name - sAllFiltersHTML.appendAscii ( "</a>" ); // close href - sAllFiltersHTML.appendAscii ( "</td>\n" ); // close column "name" - sAllFiltersHTML.appendAscii ( "\t\t\t</tr>\n" ); // close row + // write entry in filter property table + sFilterPropHTML.appendAscii ( "\t\t<a name=\"" ); // set target="#<typename>" to follow table + sFilterPropHTML.append ( aFilter.sName ); + sFilterPropHTML.appendAscii ( "\"></a>" ); + sFilterPropHTML.appendAscii ( "\t\t<table border=0>\n" ); // open table + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">Nr.</td><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\"> "); // generate row "Nr <value>" + sFilterPropHTML.append ( OUString::valueOf( nFilters ) ); + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">Name</td><td valign=\"top\" align=\"top\"> " ); // generate row "Name <value>" + sFilterPropHTML.append ( aFilter.sName ); + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">Order</td><td valign=\"top\" align=\"top\"> \"" ); // generate row "Order <value>" + sFilterPropHTML.append ( aFilter.nOrder ); + sFilterPropHTML.appendAscii ( "\"</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">Type</td><td valign=\"top\" align=\"top\"> \"" ); // generate row "Type <value>" + sFilterPropHTML.append ( aFilter.sType ); + sFilterPropHTML.appendAscii ( "\"</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">UIName</td><td valign=\"top\" align=\"top\">" ); // generate row "UIName <value>" + for( ConstStringHashIterator pUIName=aFilter.lUINames.begin() ; + pUIName!=aFilter.lUINames.end() ; + ++pUIName ) + { + sFilterPropHTML.appendAscii ( " [" ); + sFilterPropHTML.append ( pUIName->first ); + sFilterPropHTML.appendAscii ( "] \"" ); + sFilterPropHTML.append ( pUIName->second ); + sFilterPropHTML.appendAscii ( "\"<br>" ); + } + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">DocumentService</td><td valign=\"top\" align=\"top\"> " ); // generate row "DocumentService <value>" + sFilterPropHTML.append ( aFilter.sDocumentService ); + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">FilterService</td><td valign=\"top\" align=\"top\"> " ); // generate row "FilterService <value>" + sFilterPropHTML.append ( aFilter.sFilterService ); + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">Flags</td><td valign=\"top\" align=\"top\"> " ); // generate row "Flags <value>" + if( aFilter.nFlags & FILTERFLAG_IMPORT ) { sFilterPropHTML.append( FILTERFLAGNAME_IMPORT ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_EXPORT ) { sFilterPropHTML.append( FILTERFLAGNAME_EXPORT ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_TEMPLATE ) { sFilterPropHTML.append( FILTERFLAGNAME_TEMPLATE ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_INTERNAL ) { sFilterPropHTML.append( FILTERFLAGNAME_INTERNAL ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_TEMPLATEPATH ) { sFilterPropHTML.append( FILTERFLAGNAME_TEMPLATEPATH ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_OWN ) { sFilterPropHTML.append( FILTERFLAGNAME_OWN ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_ALIEN ) { sFilterPropHTML.append( FILTERFLAGNAME_ALIEN ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_USESOPTIONS ) { sFilterPropHTML.append( FILTERFLAGNAME_USESOPTIONS ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_DEFAULT ) { sFilterPropHTML.append( FILTERFLAGNAME_DEFAULT ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_NOTINFILEDIALOG ) { sFilterPropHTML.append( FILTERFLAGNAME_NOTINFILEDIALOG ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_NOTINCHOOSER ) { sFilterPropHTML.append( FILTERFLAGNAME_NOTINCHOOSER ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_ASYNCHRON ) { sFilterPropHTML.append( FILTERFLAGNAME_ASYNCHRON ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_READONLY ) { sFilterPropHTML.append( FILTERFLAGNAME_READONLY ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_NOTINSTALLED ) { sFilterPropHTML.append( FILTERFLAGNAME_NOTINSTALLED ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_CONSULTSERVICE ) { sFilterPropHTML.append( FILTERFLAGNAME_CONSULTSERVICE ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_3RDPARTYFILTER ) { sFilterPropHTML.append( FILTERFLAGNAME_3RDPARTYFILTER ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_PACKED ) { sFilterPropHTML.append( FILTERFLAGNAME_PACKED ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_SILENTEXPORT ) { sFilterPropHTML.append( FILTERFLAGNAME_SILENTEXPORT ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_BROWSERPREFERED ) { sFilterPropHTML.append( FILTERFLAGNAME_BROWSERPREFERED ); sFilterPropHTML.appendAscii( "<br> " ); }; + if( aFilter.nFlags & FILTERFLAG_PREFERED ) { sFilterPropHTML.append( FILTERFLAGNAME_PREFERED ); sFilterPropHTML.appendAscii( "<br> " ); }; + + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">UserData</td><td valign=\"top\" align=\"top\">" ); // generate row "UserData <value>" + for( ConstStringListIterator pUserData=aFilter.lUserData.begin() ; + pUserData!=aFilter.lUserData.end() ; + ++pUserData ) + { + sFilterPropHTML.appendAscii ( " \"" ); + sFilterPropHTML.append ( *pUserData ); + sFilterPropHTML.appendAscii ( "\"<br>" ); + } + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">FileFormatVersion</td><td valign=\"top\" align=\"top\"> "); // generate row "FileFormatVersion <value>" + sFilterPropHTML.append ( OUString::valueOf( aFilter.nFileFormatVersion ) ); + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t\t<tr><td bgcolor=#f5f9d5 valign=\"top\" align=\"top\">TemplateName</td><td valign=\"top\" align=\"top\"> " ); // generate row "TemplateName <value>" + sFilterPropHTML.append ( aFilter.sTemplateName ); + sFilterPropHTML.appendAscii ( "</td></tr>\n" ); + sFilterPropHTML.appendAscii ( "\t\t</table>\n" ); // close table + sFilterPropHTML.appendAscii ( "\t\t<p>\n" ); // add space between this and following table } } sAllFiltersHTML.appendAscii( "</table>\n" ); // close table sAllFiltersHTML.appendAscii( "</body>\n</html>\n" ); // close html - impl_writeFile( FILTERSUINAMESORT_HTML , U2B(sAllFiltersHTML.makeStringAndClear()) ); + sFilterPropHTML.appendAscii( "</body>\n</html>\n" ); // close html + + impl_writeFile( ALLFILTERS_HTML , U2B(sAllFiltersHTML.makeStringAndClear()) ); + impl_writeFile( FILTERPROPERTIES_HTML, U2B(sFilterPropHTML.makeStringAndClear()) ); } //***************************************************************************************************************** @@ -1611,12 +1485,12 @@ void CFGView::impl_generateDoubleFilterUINamesHTML() // generate frameset for double UINames OUStringBuffer sFrameSet( 10000 ); - sFrameSet.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tFrameset: Search double UINames\n\t\t</title>\n\t</head>\n"); // open html + sFrameSet.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tFrameset: Search doubl UINames\n\t\t</title>\n\t</head>\n" ); // open html sFrameSet.appendAscii( "\t\t<frameset cols=\"40%,60%\">\n" ); // open frameset for cols sFrameSet.appendAscii( "\t\t\t<frame name=\"" ); // generate frame "list" sFrameSet.appendAscii( TARGET_LIST ); sFrameSet.appendAscii( "\" src=\"" ); - sFrameSet.appendAscii( DOUBLEFILTERNAMES_HTML ); + sFrameSet.appendAscii( DOUBLEFILTERUINAMES_HTML ); sFrameSet.appendAscii( "\" title=\"Double UINames\">\n" ); sFrameSet.appendAscii( "\t\t\t<frame name=\"" ); // generate frame "properties" sFrameSet.appendAscii( TARGET_PROPERTIES ); @@ -1626,18 +1500,18 @@ void CFGView::impl_generateDoubleFilterUINamesHTML() sFrameSet.appendAscii( "\t\t</frameset>\n" ); // close frameset cols sFrameSet.appendAscii( "</html>\n" ); // close html - impl_writeFile( FRAMESET_DOUBLEFILTERNAMES_HTML, U2B(sFrameSet.makeStringAndClear()) ); + impl_writeFile( FRAMESET_DOUBLEFILTERUINAMES_HTML, U2B(sFrameSet.makeStringAndClear()) ); //------------------------------------------------------------------------------------------------------------- - // Search double UINames + // Search invalid registered detect services! OUStringBuffer sHTML( 10000 ); sHTML.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tDouble Filter UINames\n\t\t</title>\n\t</head>\n\t<body>\n" ); // open html sHTML.appendAscii( "\t\tPlease check follow filter entries in configuration. Her UINames are registered twice!<p>\n" ); // write "Note" sHTML.appendAscii( "\t\t<table border=0>\n" ); // open table sHTML.appendAscii( "\t<tr><td bgcolor=#ff8040><strong>Nr.</strong></td>\n" ); // generate table header - sHTML.appendAscii( "\t\t<td bgcolor=#ff8040><strong>Filters</strong></td>\n" ); sHTML.appendAscii( "\t\t<td bgcolor=#ff8040><strong>UIName</strong></td>\n" ); + sHTML.appendAscii( "\t\t<td bgcolor=#ff8040><strong>Filters</strong></td>\n" ); sHTML.appendAscii( "\t</tr>\n" ); StringHash lUINames ; @@ -1650,7 +1524,6 @@ void CFGView::impl_generateDoubleFilterUINamesHTML() for( sal_Int32 nFilter=0; nFilter<nFilterCount; ++nFilter ) { aFilter = m_aData.pCache->getFilter( lFilters[nFilter] ); - for( ConstStringHashIterator pUIName=aFilter.lUINames.begin(); pUIName!= aFilter.lUINames.end(); ++pUIName ) { // Build key value by using localized UIName to register filter name @@ -1662,7 +1535,7 @@ void CFGView::impl_generateDoubleFilterUINamesHTML() sUIName = sBuffer.makeStringAndClear(); // insert filter into hash table - sBuffer.append ( lUINames[ sUIName ] ); + sBuffer.append ( lUINames[ sUIName ] ); sBuffer.appendAscii ( "<a href=\"" ); sBuffer.appendAscii ( FILTERPROPERTIES_HTML ); sBuffer.appendAscii ( "#" ); @@ -1679,15 +1552,14 @@ void CFGView::impl_generateDoubleFilterUINamesHTML() nFilter = 1; for( ConstStringHashIterator pIterator=lUINames.begin(); pIterator!=lUINames.end(); ++pIterator ) { - ::rtl::OUString sT = pIterator->second; if( pIterator->second.indexOf( '\n' ) != pIterator->second.lastIndexOf( '\n' ) ) { sHTML.appendAscii ( "\t<tr><td bgcolor=#ff0000 color=#00ffff valign=top>" ); // generate row for uiname->filter entry sHTML.append ( OUString::valueOf( nFilter ) ); sHTML.appendAscii ( "</td><td valign=top>" ); - sHTML.append ( pIterator->second ); - sHTML.appendAscii ( "</td><td bgcolor=#f0f0f0 valign=top>" ); sHTML.append ( pIterator->first ); + sHTML.appendAscii ( "</td><td bgcolor=#f0f0f0 valign=top>" ); + sHTML.append ( pIterator->second ); sHTML.appendAscii ( "</td></tr>\n" ); ++nFilter; @@ -1696,93 +1568,7 @@ void CFGView::impl_generateDoubleFilterUINamesHTML() sHTML.appendAscii( "</table>\n" ); // close table sHTML.appendAscii( "</body>\n</html>\n" ); // close html - impl_writeFile( DOUBLEFILTERNAMES_HTML, U2B(sHTML.makeStringAndClear()) ); -} - -//***************************************************************************************************************** -void CFGView::impl_generateUnusedTypesHTML() -{ - //------------------------------------------------------------------------------------------------------------- - // generate frameset - OUStringBuffer sFrameSet( 10000 ); - - sFrameSet.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tFrameset: Unused Types\n\t\t</title>\n\t</head>\n" ); // open html - sFrameSet.appendAscii( "\t\t<frameset cols=\"40%,60%\">\n" ); // open frameset for cols - sFrameSet.appendAscii( "\t\t\t<frame name=\"" ); // generate frame "list" - sFrameSet.appendAscii( TARGET_LIST ); - sFrameSet.appendAscii( "\" src=\"" ); - sFrameSet.appendAscii( UNUSEDTYPES_HTML ); - sFrameSet.appendAscii( "\" title=\"Unused Types\">\n" ); - sFrameSet.appendAscii( "\t\t\t<frame name=\"" ); // generate frame "properties" - sFrameSet.appendAscii( TARGET_PROPERTIES ); - sFrameSet.appendAscii( "\" src=\"" ); - sFrameSet.appendAscii( TYPEPROPERTIES_HTML ); - sFrameSet.appendAscii( "\" title=\"Properties\">\n" ); - sFrameSet.appendAscii( "\t\t</frameset>\n" ); // close frameset cols - sFrameSet.appendAscii( "</html>\n" ); // close html - - impl_writeFile( FRAMESET_UNUSEDTYPES_HTML, U2B(sFrameSet.makeStringAndClear()) ); - - //------------------------------------------------------------------------------------------------------------- - // Search unused types! - OUStringBuffer sHTML( 10000 ); - - sHTML.appendAscii( "<html>\n\t<head>\n\t\t<title>\n\t\t\tUnused Types\n\t\t</title>\n\t</head>\n\t<body>\n" ); // open html - sHTML.appendAscii( "\t\tPlease check follow type entries in configuration. They are not used any longer!<p>\n" ); // write "Note" - sHTML.appendAscii( "\t\t<table border=0>\n" ); // open table - sHTML.appendAscii( "\t<tr><td bgcolor=#ff8040><strong>Nr.</strong></td>\n" ); // generate table header - sHTML.appendAscii( "\t\t<td bgcolor=#ff8040><strong>UIName</strong></td>\n" ); - sHTML.appendAscii( "\t\t<td bgcolor=#ff8040><strong>TYpes</strong></td>\n" ); - sHTML.appendAscii( "\t</tr>\n" ); - - css::uno::Sequence< ::rtl::OUString > lTypes = m_aData.pCache->getAllTypeNames() ; - sal_Int32 nTypeCount = lTypes.getLength() ; - ::rtl::OUString sDefaultDetector = m_aData.pCache->getDefaultDetector(); - ::rtl::OUString sDefaultLoader = m_aData.pCache->getDefaultLoader() ; - - for( sal_Int32 nType=0; nType<nTypeCount; ++nType ) - { - CheckedStringListIterator pStepperFilter ; - CheckedStringListIterator pStepperDetector ; - CheckedStringListIterator pStepperLoader ; - CheckedStringListIterator pStepperHandler ; - ::rtl::OUString sFilter ; - ::rtl::OUString sDetector ; - ::rtl::OUString sLoader ; - ::rtl::OUString sHandler ; - sal_Bool bFound = sal_False; - - bFound = m_aData.pCache->searchFilterForType( lTypes[nType], pStepperFilter, sFilter ); - if( bFound == sal_False ) - bFound = ( m_aData.pCache->searchLoaderForType( lTypes[nType], pStepperLoader, sLoader ) && sLoader!=sDefaultLoader ); - if( bFound == sal_False ) - bFound = ( m_aData.pCache->searchDetectorForType( lTypes[nType], pStepperDetector, sDetector ) && sDetector!=sDefaultDetector ); - if( bFound == sal_False ) - bFound = m_aData.pCache->searchContentHandlerForType( lTypes[nType], pStepperHandler, sHandler ); - - if( bFound == sal_False ) - { - FileType aType = m_aData.pCache->getType( lTypes[nType] ); - sHTML.appendAscii ( "\t<tr><td bgcolor=#ff0000 color=#00ffff valign=top>" ); // generate row - sHTML.append ( OUString::valueOf( nType ) ); - sHTML.appendAscii ( "</td><td valign=top>" ); - sHTML.append ( aType.lUINames[DECLARE_ASCII("en-US")] ); - sHTML.appendAscii ( "</td><td bgcolor=#f0f0f0 valign=top>" ); - sHTML.appendAscii ( "<a href=\"" ); - sHTML.appendAscii ( TYPEPROPERTIES_HTML ); - sHTML.appendAscii ( "#" ); - sHTML.append ( aType.sName ); - sHTML.appendAscii ( "\" target=\"" ); - sHTML.appendAscii ( TARGET_PROPERTIES ); - sHTML.appendAscii ( "\">" ); - sHTML.append ( aType.sName ); - sHTML.appendAscii ( "\"</a><br>\n</td></tr>\n" ); - } - } - - sHTML.appendAscii( "</table>\n" ); // close table - sHTML.appendAscii( "</body>\n</html>\n" ); // close html - impl_writeFile( UNUSEDTYPES_HTML, U2B(sHTML.makeStringAndClear()) ); + impl_writeFile( DOUBLEFILTERUINAMES_HTML, U2B(sHTML.makeStringAndClear()) ); } //***************************************************************************************************************** diff --git a/framework/test/typecfg/makefile.mk b/framework/test/typecfg/makefile.mk new file mode 100644 index 000000000000..6521c83ef091 --- /dev/null +++ b/framework/test/typecfg/makefile.mk @@ -0,0 +1,128 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.8 $ +# +# last change: $Author: hr $ $Date: 2003-03-25 18:22:06 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* +PRJ=..$/.. + +PRJNAME= framework +TARGET= typecfg +LIBTARGET= NO +ENABLE_EXCEPTIONS= TRUE +USE_DEFFILE= TRUE +NO_BSYMBOLIC= TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +.IF "$(COM)"=="ICC" +LINKFLAGS+=/SEGMENTS:1024 /PACKD:32768 +.ENDIF + +# --- applikation: "xml2xcd" -------------------------------------------------- + +# --- applikation: "cfgview" -------------------------------------------------- + +APP2TARGET= cfgview + +APP2OBJS= $(SLO)$/cfgview.obj \ + $(SLO)$/servicemanager.obj \ + $(SLO)$/filtercachedata.obj \ + $(SLO)$/filtercache.obj \ + $(SLO)$/wildcard.obj \ + $(SLO)$/lockhelper.obj + +# [ed] 6/16/02 Add in the transactionmanager object on OS X +.IF "$(OS)"=="MACOSX" +APP2OBJS+= $(SLO)$/transactionmanager.obj +.ENDIF + +APP2STDLIBS= $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(OSLLIB) \ + $(SALLIB) \ + $(VOSLIB) \ + $(TOOLSLIB) \ + $(SVTOOLLIB) \ + $(TKLIB) \ + $(COMPHELPERLIB) \ + $(UNOTOOLSLIB) \ + $(SVLIB) + +APP2DEPN= $(SLO)$/servicemanager.obj \ + $(SLO)$/filtercachedata.obj \ + $(SLO)$/filtercache.obj \ + $(SLO)$/wildcard.obj \ + $(SLO)$/lockhelper.obj + +# [ed] 6/16/02 Add in the transactionmanager object on OS X +.IF "$(OS)"=="MACOSX" +APP2DEPN+= $(SLO)$/transactionmanager.obj +.ENDIF + +.IF "$(GUI)"=="WIN" || "$(GUI)"=="OS2" +APP2DEF= $(MISC)$/cfgview.def +.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/framework/test/typecfg/typecfg.cxx b/framework/test/typecfg/typecfg.cxx new file mode 100644 index 000000000000..82586f0c4192 --- /dev/null +++ b/framework/test/typecfg/typecfg.cxx @@ -0,0 +1,320 @@ +/************************************************************************* + * + * $RCSfile: typecfg.cxx,v $ + * + * $Revision: 1.4 $ + * + * last change: $Author: hr $ $Date: 2003-03-25 18:22:07 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ + +#ifndef __FRAMEWORK_CLASSES_SERVICEMANAGER_HXX_ +#include <classes/servicemanager.hxx> +#endif + +#ifndef __FRAMEWORK_CLASSES_FILTERCACHE_HXX_ +#include <classes/filtercache.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_ +#include <macros/generic.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_ +#include <macros/debug.hxx> +#endif + +#ifndef __FRAMEWORK_SERVICES_H_ +#include <services.h> +#endif + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ + +#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_ +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#endif + +#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_ +#include <com/sun/star/container/XNameContainer.hpp> +#endif + +#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ +#include <com/sun/star/beans/PropertyValue.hpp> +#endif + +//_________________________________________________________________________________________________________________ +// other includes +//_________________________________________________________________________________________________________________ + +#ifndef _COMPHELPER_PROCESSFACTORY_HXX_ +#include <comphelper/processfactory.hxx> +#endif + +#ifndef _VOS_PROCESS_HXX_ +#include <vos/process.hxx> +#endif + +#ifndef _RTL_USTRING_ +#include <rtl/ustring.hxx> +#endif + +#ifndef _RTL_USTRBUF_HXX_ +#include <rtl/ustrbuf.hxx> +#endif + +#ifndef __SGI_STL_HASH_MAP +#include <hash_map> +#endif + +#include <vcl/event.hxx> +#include <vcl/svapp.hxx> +#include <vcl/wrkwin.hxx> +#include <vcl/msgbox.hxx> +#include <stdio.h> + +//_________________________________________________________________________________________________________________ +// const +//_________________________________________________________________________________________________________________ + +#define RDBFILE DECLARE_ASCII("typecfg.rdb" ) +#define ARGUMENT_GENERATE_CFGVIEW DECLARE_ASCII("-cfgview" ) +#define ARGUMENT_CHECK_FILTERREGISTRATION DECLARE_ASCII("-registerfilter" ) +#define ARGUMENT_GENERATE_TYPEDETECTION_XCD DECLARE_ASCII("-generatexcd" ) + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +using namespace ::std ; +using namespace ::vos ; +using namespace ::rtl ; +using namespace ::framework ; +using namespace ::comphelper ; +using namespace ::com::sun::star::uno ; +using namespace ::com::sun::star::lang ; +using namespace ::com::sun::star::container ; +using namespace ::com::sun::star::beans ; + +//_________________________________________________________________________________________________________________ +// defines +//_________________________________________________________________________________________________________________ + +//_________________________________________________________________________________________________________________ +// declarations +//_________________________________________________________________________________________________________________ + +enum EMode +{ + E_GENERATE_CFGVIEW , + E_CHECK_FILTERREGISTRATION , + E_GENERATE_TYPEDETECTION_XCD +}; + +/*-***************************************************************************************************************/ +class TypeApplication : public Application +{ + //************************************************************************************************************* + public: + + void Main(); + + //************************************************************************************************************* + private: + + void impl_parseCommandLine (); + void impl_generateCFGView (); + void impl_checkFilterRegistration (); + void impl_generateTypeDetectionXCD (); + + //************************************************************************************************************* + private: + + EMode m_eMode ; + Reference< XMultiServiceFactory > m_xServiceManager ; + + FilterCache* m_pCache ; + +}; // class FilterApplication + +//_________________________________________________________________________________________________________________ +// global variables +//_________________________________________________________________________________________________________________ + +TypeApplication gApplication; + +//***************************************************************************************************************** +void TypeApplication::Main() +{ + // Init global servicemanager and set it. + ServiceManager aManager; + m_xServiceManager = aManager.getSharedUNOServiceManager( RDBFILE ); + setProcessServiceFactory( m_xServiceManager ); + + m_pCache = new FilterCache; + + impl_parseCommandLine(); + + switch( m_eMode ) + { + case E_GENERATE_CFGVIEW : impl_generateCFGView(); + break; + case E_CHECK_FILTERREGISTRATION : impl_checkFilterRegistration(); + break; + case E_GENERATE_TYPEDETECTION_XCD : impl_generateTypeDetectionXCD(); + break; + } + + delete m_pCache; + m_pCache = NULL; +} + +//***************************************************************************************************************** +void TypeApplication::impl_parseCommandLine() +{ + OStartupInfo aInfo ; + OUString sArgument ; + sal_Int32 nArgument = 0 ; + sal_Int32 nCount = aInfo.getCommandArgCount(); + + while( nArgument<nCount ) + { + aInfo.getCommandArg( nArgument, sArgument ); + + if( sArgument == ARGUMENT_GENERATE_CFGVIEW ) + { + m_eMode = E_GENERATE_CFGVIEW; + break; + } + else + if( sArgument == ARGUMENT_CHECK_FILTERREGISTRATION ) + { + m_eMode = E_CHECK_FILTERREGISTRATION; + break; + } + else + if( sArgument == ARGUMENT_GENERATE_TYPEDETECTION_XCD ) + { + m_eMode = E_GENERATE_TYPEDETECTION_XCD; + break; + } + + ++nArgument; + } +} + +//***************************************************************************************************************** +void TypeApplication::impl_generateCFGView() +{ + #ifdef ENABLE_FILTERCACHEDEBUG + // Cache use ref count! + FilterCache aCache; + aCache.impldbg_generateHTMLView(); + #endif //ENABLE_FILTERCACHEDEBUG +} + +//***************************************************************************************************************** +void TypeApplication::impl_checkFilterRegistration() +{ + Reference< XNameContainer > xFilterContainer( m_xServiceManager->createInstance( SERVICENAME_FILTERFACTORY ), UNO_QUERY ); + LOG_ASSERT2( xFilterContainer.is()==sal_False, "TypeApplication::impl_checkFilterRegistration()", "Couldn't create filter factory!" ) + if( xFilterContainer.is() == sal_True ) + { + Sequence< PropertyValue > lProperties( 8 ); + + lProperties[0].Name = DECLARE_ASCII("Type") ; + lProperties[0].Value <<= DECLARE_ASCII("MeinType") ; + + lProperties[1].Name = DECLARE_ASCII("UIName") ; + lProperties[1].Value <<= DECLARE_ASCII("MeinUIName") ; + + lProperties[2].Name = DECLARE_ASCII("UINames") ; + lProperties[2].Value <<= Sequence< PropertyValue >() ; + + lProperties[3].Name = DECLARE_ASCII("DocumentService") ; + lProperties[3].Value <<= DECLARE_ASCII("MeinDocService") ; + + lProperties[4].Name = DECLARE_ASCII("FilterService") ; + lProperties[4].Value <<= DECLARE_ASCII("MeinFilterService") ; + + lProperties[5].Name = DECLARE_ASCII("Flags") ; + lProperties[5].Value <<= (sal_Int32)256 ; + + lProperties[6].Name = DECLARE_ASCII("UserData") ; + lProperties[6].Value <<= Sequence< OUString >() ; + + lProperties[7].Name = DECLARE_ASCII("FileFormatVersion") ; + lProperties[7].Value <<= (sal_Int32)0 ; + + lProperties[8].Name = DECLARE_ASCII("TemplateName") ; + lProperties[8].Value <<= DECLARE_ASCII("MeinTemplate") ; + } +} + +//***************************************************************************************************************** +void TypeApplication::impl_generateTypeDetectionXCD() +{ + #ifdef ENABLE_GENERATEFILTERCACHE + // Cache use ref count! + FilterCache aCache ; + sal_Bool bWriteable = sal_True; + sal_Unicode cSeparator = ',' ; + aCache.impldbg_generateXCD( "org.openoffice.Office.TypeDetection.xcd", bWriteable, cSeparator ); + #endif //ENABLE_GENERATEFILTERCACHE +} diff --git a/framework/test/typecfg/xml2xcd.cxx b/framework/test/typecfg/xml2xcd.cxx new file mode 100644 index 000000000000..e6a6f2fbd23a --- /dev/null +++ b/framework/test/typecfg/xml2xcd.cxx @@ -0,0 +1,2474 @@ +/************************************************************************* + * + * $RCSfile: xml2xcd.cxx,v $ + * + * $Revision: 1.9 $ + * + * last change: $Author: hr $ $Date: 2003-03-25 18:22:07 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ + +#define VCL_NEED_BASETSD +#include <tools/presys.h> +#include <windows.h> +#include <tools/postsys.h> + +#ifndef __FRAMEWORK_CLASSES_SERVICEMANAGER_HXX_ +#include <classes/servicemanager.hxx> +#endif + +#ifndef __FRAMEWORK_CLASSES_FILTERCACHE_HXX_ +#include <classes/filtercache.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_GENERIC_HXX_ +#include <macros/generic.hxx> +#endif + +#ifndef __FRAMEWORK_MACROS_DEBUG_HXX_ +#include <macros/debug.hxx> +#endif + +#ifndef __FRAMEWORK_SERVICES_H_ +#include <services.h> +#endif + +#ifndef __FRAMEWORK_FILTERFLAGS_H_ +#include <filterflags.h> +#endif + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ + +#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_ +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#endif + +//_________________________________________________________________________________________________________________ +// other includes +//_________________________________________________________________________________________________________________ + +#ifndef _COMPHELPER_PROCESSFACTORY_HXX_ +#include <comphelper/processfactory.hxx> +#endif + +#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_ +#include <unotools/processfactory.hxx> +#endif + +#ifndef _VOS_PROCESS_HXX_ +#include <vos/process.hxx> +#endif + +#ifndef _RTL_USTRING_ +#include <rtl/ustring.hxx> +#endif + +#ifndef _RTL_USTRBUF_HXX_ +#include <rtl/ustrbuf.hxx> +#endif + +#include <vcl/event.hxx> +#include <vcl/svapp.hxx> +#include <vcl/wrkwin.hxx> +#include <vcl/msgbox.hxx> + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +using namespace ::framework ; + +//_________________________________________________________________________________________________________________ +// const +//_________________________________________________________________________________________________________________ + +//_________________________________________________________________________________________________________________ +// defines +//_________________________________________________________________________________________________________________ + +/* + Versions: 1) first revision + - one entry for every property + - full loclized values + 2) new property "Order" for filters ... but not right set! + all values are 0 + 3) decrease size of xml file + - don't write full localized values + - use own formated string for all non localized values + - seperate "Installed" flag for filters + 4) set right values for "Order" property of filters + 5) support for ContentHandler + draft 6) reactivate old filter names + ??? draft 7) split xml into standard/optional => use DRAFT_SPLIT_VERSION till this version is well known! + */ +#define DRAFT_SPLIT_VERSION 7 + +#define ARGUMENT_PACKAGE_STANDARD DECLARE_ASCII("-pas=") // argument for package name of standard filters +#define ARGUMENT_PACKAGE_ADDITIONAL DECLARE_ASCII("-paa=") // argument for package name of additional filters +#define ARGUMENT_WRITEABLE DECLARE_ASCII("-wri=") // argument for "writeable" [true|false] +#define ARGUMENT_VERSION_INPUT DECLARE_ASCII("-vin=") // argument for file version to read [1|2|3] +#define ARGUMENT_VERSION_OUTPUT DECLARE_ASCII("-vou=") // argument for file version to write [1|2|3] + +#define ARGUMENTLENGTH 5 // All arguments should have the same lenght ... it's better to detect it! +#define ARGUMENTFOUND 0 // OUString::compareTo returns 0 if searched string match given one + +#define WRITEABLE_ON DECLARE_ASCII("true" ) +#define WRITEABLE_OFF DECLARE_ASCII("false") + +#define MINARGUMENTCOUNT 5 // no optional arguments allowed yet! + +#define LISTFILE_STANDARDTYPES "typelist_standard.txt" +#define LISTFILE_ADDITIONALTYPES "typelist_additional.txt" +#define LISTFILE_STANDARDFILTER "filterlist_standard.txt" +#define LISTFILE_ADDITIONALFILTER "filterlist_additional.txt" +#define SCPFILE_STANDARD "scp_standard.txt" +#define SCPFILE_ADDITIONAL "scp_additional.txt" + +//_________________________________________________________________________________________________________________ +// declarations +//_________________________________________________________________________________________________________________ + +/*-***************************************************************************************************************/ +struct AppMember +{ + FilterCache* pFilterCache ; // pointer to configuration + StringHash aOldFilterNamesHash ; // converter tabel to restaurate old filter names + EFilterPackage ePackage ; // specify which package should be used => specify using of file name and buffer too! +// ::rtl::OUString sFileNameStandard ; // file name of our standard filter cfg +// ::rtl::OUString sFileNameAdditional ; // file name of our additional filter cfg + ::rtl::OUString sPackageStandard ; // package name of our standard filter cfg + ::rtl::OUString sPackageAdditional ; // package name of our additional filter cfg + ::rtl::OUStringBuffer sBufferStandard ; // buffer of our standard filter cfg + ::rtl::OUStringBuffer sBufferAdditional ; // buffer of our standard filter cfg + ::rtl::OUStringBuffer sNew2OldSCPStandard ; // setup script to convert new to old filternames (standard filter) + ::rtl::OUStringBuffer sNew2OldSCPAdditional ; // setup script to convert new to old filternames (additional filter) + ::rtl::OUStringBuffer sStandardFilterList ; + ::rtl::OUStringBuffer sAdditionalFilterList ; + ::rtl::OUStringBuffer sStandardTypeList ; + ::rtl::OUStringBuffer sAdditionalTypeList ; + sal_Bool bWriteable ; // enable/disable writable configuration items + sal_Int32 nVersionInput ; // format version of input xml file + sal_Int32 nVersionOutput ; // format version of output xcd file + + sal_Int32 nOriginalTypes ; + sal_Int32 nOriginalFilters ; + sal_Int32 nOriginalDetectors ; + sal_Int32 nOriginalLoaders ; + sal_Int32 nOriginalContentHandlers ; + + sal_Int32 nWrittenTypes ; + sal_Int32 nWrittenFilters ; + sal_Int32 nWrittenDetectors ; + sal_Int32 nWrittenLoaders ; + sal_Int32 nWrittenContentHandlers ; +}; + +/*-***************************************************************************************************************/ +class XCDGenerator : public Application +{ + //************************************************************************************************************* + public: + void Main(); + + //************************************************************************************************************* + private: + void impl_printCopyright ( ); // print copyright to stdout :-) + void impl_printSyntax ( ); // print help to stout for user + void impl_parseCommandLine ( AppMember& rMember ); // parse command line arguments and fill given struct + + void impl_generateXCD ( ); // generate all xcd files by using current configuration + void impl_generateCopyright ( ); // generate copyrights + void impl_generateTypeTemplate ( ); // generate templates ... + void impl_generateFilterTemplate ( ); + void impl_generateDetectorTemplate ( ); + void impl_generateLoaderTemplate ( ); + void impl_generateTypeSet ( ); // generate sets + void impl_generateFilterSet ( ); + void impl_generateDetectorSet ( ); + void impl_generateLoaderSet ( ); + void impl_generateDefaults ( ); // generate defaults + void impl_generateContentHandlerTemplate ( ); + void impl_generateContentHandlerSet ( ); + void impl_generateFilterFlagTemplate ( const ::rtl::OUString& sName , // helper to write atomic elements + sal_Int32 nValue , + const ::rtl::OString& sDescription = ::rtl::OString() ); + void impl_generateIntProperty ( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + sal_Int32 nValue ); + void impl_generateBoolProperty ( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + sal_Bool bValue ); + void impl_generateStringProperty ( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + const ::rtl::OUString& sValue ); + void impl_generateStringListProperty ( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + const ::framework::StringList& lValue ); + void impl_generateUINamesProperty ( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + const StringHash& lUINames ); + ::rtl::OUString impl_getOldFilterName ( const ::rtl::OUString& sNewName ); // convert filter names to old format + + static void impl_classifyType ( const AppMember& rData , + const ::rtl::OUString& sTypeName , + EFilterPackage& ePackage ); // classify type as STANDARD or ADDITIONAL one + static void impl_classifyFilter ( const AppMember& rData , + const ::rtl::OUString& sFilterName , + EFilterPackage& ePackage , + sal_Int32& nOrder ); // classify filter as STANDARD or ADDITIONAL filter, set order of standard filter too + static ::rtl::OUString impl_encodeSpecialSigns ( const ::rtl::OUString& sValue ); // encode strings for xml + static sal_Unicode impl_defineSeperator ( const ::framework::StringList& lList ); // search seperator for lists + static void impl_initFilterHashNew2Old ( StringHash& aHash ); // initialize converter table to restaurate old filter names + static void impl_orderAlphabetical ( css::uno::Sequence< ::rtl::OUString >& lList ); // sort stringlist of internal type-, filter- ... names in alphabetical order to generate xcd files everytime in the same way + static sal_Bool impl_isUsAsciiAlphaDigit ( sal_Unicode c , + sal_Bool bDigitAllowed = sal_True ); + static ::rtl::OUString impl_encodeSetName ( const ::rtl::OUString& rSource ); + + //************************************************************************************************************* + private: + AppMember m_aData; + +}; // class XCDGenerator + +//_________________________________________________________________________________________________________________ +// global variables +//_________________________________________________________________________________________________________________ + +XCDGenerator gGenerator; + +//***************************************************************************************************************** +void XCDGenerator::Main() +{ + // Must be :-) +// impl_printCopyright(); + + // Init global servicemanager and set it. + // It's neccessary for other services ... e.g. configuration. + ServiceManager aManager; + ::comphelper::setProcessServiceFactory( aManager.getGlobalUNOServiceManager() ); + ::utl::setProcessServiceFactory ( aManager.getGlobalUNOServiceManager() ); + + // Get optional commands from command line. + impl_parseCommandLine( m_aData ); + + // initialize converter table to match new to old filter names! + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + XCDGenerator::impl_initFilterHashNew2Old( m_aData.aOldFilterNamesHash ); + } + + // Create access to current set filter configuration. + // Attention: Please use it for a full fat office installation only!! + // We need an installation with ALL filters. + // Member m_pData is used in some impl-methods directly ... + m_aData.pFilterCache = new FilterCache( m_aData.nVersionInput, CONFIG_MODE_ALL_LOCALES ); + + // Get some statistic informations of current filled filter cache ... (e.g. count of current activae filters) + // because we need it to check if all filters are converted and written to disk. + // May be it's possible to lose some of them during convertion!!! + m_aData.nOriginalTypes = m_aData.pFilterCache->getAllTypeNames().getLength() ; + m_aData.nOriginalFilters = m_aData.pFilterCache->getAllFilterNames().getLength() ; + m_aData.nOriginalDetectors = m_aData.pFilterCache->getAllDetectorNames().getLength() ; + m_aData.nOriginalLoaders = m_aData.pFilterCache->getAllLoaderNames().getLength() ; + if( m_aData.nVersionInput >= 5 ) + { + m_aData.nOriginalContentHandlers = m_aData.pFilterCache->getAllContentHandlerNames().getLength() ; + } + + // Start generation of xcd file(s). + impl_generateXCD(); + + // Warn programmer if some items couldn't written to file! + LOG_ASSERT2( m_aData.nOriginalTypes != m_aData.nWrittenTypes , "XCDGenerator::Main()", "Generated xcd file could be invalid ... because I miss some types!" ) + LOG_ASSERT2( m_aData.nOriginalFilters != m_aData.nWrittenFilters , "XCDGenerator::Main()", "Generated xcd file could be invalid ... because I miss some filters!" ) + LOG_ASSERT2( m_aData.nOriginalDetectors!= m_aData.nWrittenDetectors, "XCDGenerator::Main()", "Generated xcd file could be invalid ... because I miss some detectors!" ) + LOG_ASSERT2( m_aData.nOriginalLoaders != m_aData.nWrittenLoaders , "XCDGenerator::Main()", "Generated xcd file could be invalid ... because I miss some loaders!" ) + + // Free memory. + delete m_aData.pFilterCache; + m_aData.pFilterCache = NULL; +} + +/*-************************************************************************************************************//** + @short print some info messages to stderr + @descr We must show an copyright or help for using this file. + This two methods do that. + + @seealso - + + @param - + @return - + + @onerror - +*//*-*************************************************************************************************************/ +void XCDGenerator::impl_printCopyright() +{ + fprintf( stderr, "\n(c) Copyright by Sun microsystems, 2001\n" ); +} + +//***************************************************************************************************************** +void XCDGenerator::impl_printSyntax() +{ + // It's not possible to print it out to stdout in a svdem binary :-( + // So we show an assert. + ::rtl::OStringBuffer sBuffer( 500 ); + sBuffer.append( "\nusing: xml2xcd -fis=<file standard filter> -fia=<file additional filter> -pas=<package standard filter> -paa=<package additional filter> -vin=<version input> -vou=<version output> [-wri=<true|false>]\n\n" ); + sBuffer.append( "\tneccessary parameters:\n" ); + sBuffer.append( "\t\t-fis\tname of output file in system notation\n" ); + sBuffer.append( "\t\t-fia\tname of output file in system notation\n" ); + sBuffer.append( "\t\t-pas\tpackage of standard filters\n" ); + sBuffer.append( "\t\t-paa\tpackage of additional filters\n" ); + sBuffer.append( "\t\t-vin\tformat version of input xml file\n" ); + sBuffer.append( "\t\t-vou\tformat version of generated xcd file\n\n" ); + sBuffer.append( "\toptional parameters:\n" ); + sBuffer.append( "\t\t-wri\tconfig items should be writeable ... [true|false]\n" ); + LOG_ERROR( "", sBuffer.makeStringAndClear() ) +} + +/*-************************************************************************************************************//** + @short analyze command line arguments + @descr Created binary accept different command line arguments. These parameters + regulate creation of xcd file. Follow arguments are supported: + "-fis=<filename of standard xcd>" + "-fia=<filename of additional xcd>" + "-wri=<writeable>[true|false]" + "-vin=<version of input file>[1|2|3]" + "-vou=<version of output file>[1|2|3]" + + @seealso - + + @param "rMember", reference to struct of global application member to fill arguments in it + @return right filled member struct or unchanged struct if an error occure! + + @onerror We do nothing - or warn programmer! +*//*-*************************************************************************************************************/ +void XCDGenerator::impl_parseCommandLine( AppMember& rMember ) +{ + ::vos::OStartupInfo aInfo ; + ::rtl::OUString sArgument ; + sal_Int32 nArgument = 0 ; + sal_Int32 nCount = aInfo.getCommandArgCount(); + sal_Int32 nMinCount = 0 ; + + while( nArgument<nCount ) + { + aInfo.getCommandArg( nArgument, sArgument ); +/*OBSOLETE + //_____________________________________________________________________________________________________ + // look for "-fis=..." + if( sArgument.compareTo( ARGUMENT_FILENAME_STANDARD, ARGUMENTLENGTH ) == ARGUMENTFOUND ) + { + rMember.sFileNameStandard = sArgument.copy( ARGUMENTLENGTH, sArgument.getLength()-ARGUMENTLENGTH ); + ++nMinCount; + } + else + //_____________________________________________________________________________________________________ + // look for "-fia=..." + if( sArgument.compareTo( ARGUMENT_FILENAME_ADDITIONAL, ARGUMENTLENGTH ) == ARGUMENTFOUND ) + { + rMember.sFileNameAdditional = sArgument.copy( ARGUMENTLENGTH, sArgument.getLength()-ARGUMENTLENGTH ); + ++nMinCount; + } + else +*/ + //_____________________________________________________________________________________________________ + // look for "-pas=..." + if( sArgument.compareTo( ARGUMENT_PACKAGE_STANDARD, ARGUMENTLENGTH ) == ARGUMENTFOUND ) + { + rMember.sPackageStandard = sArgument.copy( ARGUMENTLENGTH, sArgument.getLength()-ARGUMENTLENGTH ); + ++nMinCount; + } + else + //_____________________________________________________________________________________________________ + // look for "-paa=..." + if( sArgument.compareTo( ARGUMENT_PACKAGE_ADDITIONAL, ARGUMENTLENGTH ) == ARGUMENTFOUND ) + { + rMember.sPackageAdditional = sArgument.copy( ARGUMENTLENGTH, sArgument.getLength()-ARGUMENTLENGTH ); + ++nMinCount; + } + else + //_____________________________________________________________________________________________________ + // look for "-wri=..." + if( sArgument.compareTo( ARGUMENT_WRITEABLE, ARGUMENTLENGTH ) == ARGUMENTFOUND ) + { + ::rtl::OUString sWriteable = sArgument.copy( ARGUMENTLENGTH, sArgument.getLength()-ARGUMENTLENGTH ); + if( sWriteable == WRITEABLE_ON ) + { + rMember.bWriteable = sal_True; + } + else + { + rMember.bWriteable = sal_False; + } + ++nMinCount; + } + //_____________________________________________________________________________________________________ + // look for "-vin=..." + if( sArgument.compareTo( ARGUMENT_VERSION_INPUT, ARGUMENTLENGTH ) == ARGUMENTFOUND ) + { + ::rtl::OUString sVersion = sArgument.copy( ARGUMENTLENGTH, sArgument.getLength()-ARGUMENTLENGTH ); + rMember.nVersionInput = sVersion.toInt32(); + ++nMinCount; + } + //_____________________________________________________________________________________________________ + // look for "-vou=..." + if( sArgument.compareTo( ARGUMENT_VERSION_OUTPUT, ARGUMENTLENGTH ) == ARGUMENTFOUND ) + { + ::rtl::OUString sVersion = sArgument.copy( ARGUMENTLENGTH, sArgument.getLength()-ARGUMENTLENGTH ); + rMember.nVersionOutput = sVersion.toInt32(); + ++nMinCount; + } + + ++nArgument; + } + + // Show help if user don't call us right! + if( nMinCount != MINARGUMENTCOUNT ) + { + impl_printSyntax(); + exit(-1); + } +} + +/*-************************************************************************************************************//** + @short regulate generation of complete xcd file(s) + @descr This method is the toppest one and implement the global structure of generated xcd file(s). + We create a unicode string buffer for complete xcd file in memory ... + use different helper methods to fill it ... + and write it to disk at the end of this method! + + @seealso struct AppMember + + @param - + @return - + + @onerror - +*//*-*************************************************************************************************************/ +void XCDGenerator::impl_generateXCD() +{ + impl_generateCopyright(); + + // Write header + m_aData.sBufferStandard.appendAscii ( "\n<!-- PLEASE DON'T CHANGE TEMPLATES OR FILE FORMAT BY HAND! USE \"XML2XCD.EXE\" TO DO THAT. THANKS. -->\n\n" ); + m_aData.sBufferStandard.appendAscii ( "<!DOCTYPE schema:component SYSTEM \"../../../../schema/schema.description.dtd\">\n" ); + m_aData.sBufferStandard.appendAscii ( "<schema:component cfg:name=\"" ); + m_aData.sBufferStandard.append ( m_aData.sPackageStandard ); + m_aData.sBufferStandard.appendAscii ( "\" cfg:package=\"org.openoffice.Office\" xml:lang=\"en-US\" xmlns:schema=\"http://openoffice.org/2000/registry/schema/description\" xmlns:default=\"http://openoffice.org/2000/registry/schema/default\" xmlns:cfg=\"http://openoffice.org/2000/registry/instance\">\n" ); + m_aData.sBufferStandard.appendAscii ( "\t<schema:templates>\n" ); + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii ( "\n<!-- PLEASE DON'T CHANGE TEMPLATES OR FILE FORMAT BY HAND! USE \"XML2XCD.EXE\" TO DO THAT. THANKS. -->\n\n" ); + m_aData.sBufferAdditional.appendAscii ( "<!DOCTYPE schema:component SYSTEM \"../../../../schema/schema.description.dtd\">\n" ); + m_aData.sBufferAdditional.appendAscii ( "<schema:component cfg:name=\"" ); + m_aData.sBufferAdditional.append ( m_aData.sPackageAdditional ); + m_aData.sBufferAdditional.appendAscii ( "\" cfg:package=\"org.openoffice.Office\" xml:lang=\"en-US\" xmlns:schema=\"http://openoffice.org/2000/registry/schema/description\" xmlns:default=\"http://openoffice.org/2000/registry/schema/default\" xmlns:cfg=\"http://openoffice.org/2000/registry/instance\">\n" ); + m_aData.sBufferAdditional.appendAscii ( "\t<schema:import cfg:name=\"" ); + m_aData.sBufferAdditional.append ( m_aData.sPackageStandard ); + m_aData.sBufferAdditional.appendAscii ( "\"/>\n" ); + } + + // Follow ...generate... methods to nothing for additional filters! + impl_generateTypeTemplate (); + impl_generateFilterTemplate (); + impl_generateDetectorTemplate(); + if( m_aData.nVersionOutput >= 5 ) + { + impl_generateContentHandlerTemplate (); + } + impl_generateLoaderTemplate (); + + m_aData.sBufferStandard.appendAscii ( "\t</schema:templates>\n" ); + m_aData.sBufferStandard.appendAscii ( "<schema:schema cfg:localized=\"false\">\n" ); + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii( "\t<schema:schema cfg:localized=\"false\">\n" ); + } + + impl_generateTypeSet (); + impl_generateFilterSet (); + impl_generateDetectorSet (); + if( m_aData.nVersionInput >= 5 ) + { + impl_generateContentHandlerSet (); + } + impl_generateLoaderSet (); + impl_generateDefaults (); + + m_aData.sBufferStandard.appendAscii ( "\t</schema:schema>\n" ); + m_aData.sBufferStandard.appendAscii ( "</schema:component>\n" ); + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii ( "\t</schema:schema>\n" ); + m_aData.sBufferAdditional.appendAscii ( "</schema:component>\n" ); + } + + ::rtl::OUString sFileName = m_aData.sPackageStandard ; + sFileName += DECLARE_ASCII(".xcd") ; + + WRITE_LOGFILE( U2B( sFileName ) , U2B(m_aData.sBufferStandard.makeStringAndClear() )) + WRITE_LOGFILE( LISTFILE_STANDARDFILTER , U2B(m_aData.sStandardFilterList.makeStringAndClear() )) + WRITE_LOGFILE( LISTFILE_STANDARDTYPES , U2B(m_aData.sStandardTypeList.makeStringAndClear() )) + WRITE_LOGFILE( SCPFILE_STANDARD , U2B(m_aData.sNew2OldSCPStandard.makeStringAndClear() )) + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + sFileName = m_aData.sPackageAdditional ; + sFileName += DECLARE_ASCII(".xcd") ; + + WRITE_LOGFILE( U2B(sFileName) , U2B(m_aData.sBufferAdditional.makeStringAndClear() )) + WRITE_LOGFILE( LISTFILE_ADDITIONALFILTER, U2B(m_aData.sAdditionalFilterList.makeStringAndClear() )) + WRITE_LOGFILE( LISTFILE_ADDITIONALTYPES , U2B(m_aData.sAdditionalTypeList.makeStringAndClear() )) + WRITE_LOGFILE( SCPFILE_ADDITIONAL , U2B(m_aData.sNew2OldSCPAdditional.makeStringAndClear() )) + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateCopyright() +{ + m_aData.sBufferStandard.appendAscii( "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" ); + m_aData.sBufferStandard.appendAscii( "<!-- The Contents of this file are made available subject to the terms of\n" ); + m_aData.sBufferStandard.appendAscii( " either of the following licenses\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " - GNU Lesser General Public License Version 2.1\n" ); + m_aData.sBufferStandard.appendAscii( " - Sun Industry Standards Source License Version 1.1\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " Sun Microsystems Inc., October, 2000\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " GNU Lesser General Public License Version 2.1\n" ); + m_aData.sBufferStandard.appendAscii( " =============================================\n" ); + m_aData.sBufferStandard.appendAscii( " Copyright 2000 by Sun Microsystems, Inc.\n" ); + m_aData.sBufferStandard.appendAscii( " 901 San Antonio Road, Palo Alto, CA 94303, USA\n" ); + m_aData.sBufferStandard.appendAscii( " This library is free software; you can redistribute it and/or\n" ); + m_aData.sBufferStandard.appendAscii( " modify it under the terms of the GNU Lesser General Public\n" ); + m_aData.sBufferStandard.appendAscii( " License version 2.1, as published by the Free Software Foundation.\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " This library is distributed in the hope that it will be useful,\n" ); + m_aData.sBufferStandard.appendAscii( " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" ); + m_aData.sBufferStandard.appendAscii( " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" ); + m_aData.sBufferStandard.appendAscii( " Lesser General Public License for more details.\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " You should have received a copy of the GNU Lesser General Public\n" ); + m_aData.sBufferStandard.appendAscii( " License along with this library; if not, write to the Free Software\n" ); + m_aData.sBufferStandard.appendAscii( " Foundation, Inc., 59 Temple Place, Suite 330, Boston,\n" ); + m_aData.sBufferStandard.appendAscii( " MA 02111-1307 USA\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " Sun Industry Standards Source License Version 1.1\n" ); + m_aData.sBufferStandard.appendAscii( " =================================================\n" ); + m_aData.sBufferStandard.appendAscii( " The contents of this file are subject to the Sun Industry Standards\n" ); + m_aData.sBufferStandard.appendAscii( " Source License Version 1.1 (the \"License\"); You may not use this file\n"); + m_aData.sBufferStandard.appendAscii( " except in compliance with the License. You may obtain a copy of the\n" ); + m_aData.sBufferStandard.appendAscii( " License at http://www.openoffice.org/license.html.\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " Software provided under this License is provided on an \"AS IS\" basis,\n"); + m_aData.sBufferStandard.appendAscii( " WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,\n" ); + m_aData.sBufferStandard.appendAscii( " WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,\n" ); + m_aData.sBufferStandard.appendAscii( " MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.\n" ); + m_aData.sBufferStandard.appendAscii( " See the License for the specific provisions governing your rights and\n" ); + m_aData.sBufferStandard.appendAscii( " obligations concerning the Software.\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " The Initial Developer of the Original Code is: Sun Microsystems, Inc.\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " Copyright: 2000 by Sun Microsystems, Inc.\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " All Rights Reserved.\n" ); + m_aData.sBufferStandard.appendAscii( "\n" ); + m_aData.sBufferStandard.appendAscii( " Contributor(s): _______________________________________\n" ); + m_aData.sBufferStandard.appendAscii( "-->\n" ); + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii( "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" ); + m_aData.sBufferAdditional.appendAscii( "<!-- The Contents of this file are made available subject to the terms of\n" ); + m_aData.sBufferAdditional.appendAscii( " either of the following licenses\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " - GNU Lesser General Public License Version 2.1\n" ); + m_aData.sBufferAdditional.appendAscii( " - Sun Industry Standards Source License Version 1.1\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " Sun Microsystems Inc., October, 2000\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " GNU Lesser General Public License Version 2.1\n" ); + m_aData.sBufferAdditional.appendAscii( " =============================================\n" ); + m_aData.sBufferAdditional.appendAscii( " Copyright 2000 by Sun Microsystems, Inc.\n" ); + m_aData.sBufferAdditional.appendAscii( " 901 San Antonio Road, Palo Alto, CA 94303, USA\n" ); + m_aData.sBufferAdditional.appendAscii( " This library is free software; you can redistribute it and/or\n" ); + m_aData.sBufferAdditional.appendAscii( " modify it under the terms of the GNU Lesser General Public\n" ); + m_aData.sBufferAdditional.appendAscii( " License version 2.1, as published by the Free Software Foundation.\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " This library is distributed in the hope that it will be useful,\n" ); + m_aData.sBufferAdditional.appendAscii( " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" ); + m_aData.sBufferAdditional.appendAscii( " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" ); + m_aData.sBufferAdditional.appendAscii( " Lesser General Public License for more details.\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " You should have received a copy of the GNU Lesser General Public\n" ); + m_aData.sBufferAdditional.appendAscii( " License along with this library; if not, write to the Free Software\n" ); + m_aData.sBufferAdditional.appendAscii( " Foundation, Inc., 59 Temple Place, Suite 330, Boston,\n" ); + m_aData.sBufferAdditional.appendAscii( " MA 02111-1307 USA\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " Sun Industry Standards Source License Version 1.1\n" ); + m_aData.sBufferAdditional.appendAscii( " =================================================\n" ); + m_aData.sBufferAdditional.appendAscii( " The contents of this file are subject to the Sun Industry Standards\n" ); + m_aData.sBufferAdditional.appendAscii( " Source License Version 1.1 (the \"License\"); You may not use this file\n"); + m_aData.sBufferAdditional.appendAscii( " except in compliance with the License. You may obtain a copy of the\n" ); + m_aData.sBufferAdditional.appendAscii( " License at http://www.openoffice.org/license.html.\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " Software provided under this License is provided on an \"AS IS\" basis,\n"); + m_aData.sBufferAdditional.appendAscii( " WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,\n" ); + m_aData.sBufferAdditional.appendAscii( " WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,\n" ); + m_aData.sBufferAdditional.appendAscii( " MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.\n" ); + m_aData.sBufferAdditional.appendAscii( " See the License for the specific provisions governing your rights and\n" ); + m_aData.sBufferAdditional.appendAscii( " obligations concerning the Software.\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " The Initial Developer of the Original Code is: Sun Microsystems, Inc.\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " Copyright: 2000 by Sun Microsystems, Inc.\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " All Rights Reserved.\n" ); + m_aData.sBufferAdditional.appendAscii( "\n" ); + m_aData.sBufferAdditional.appendAscii( " Contributor(s): _______________________________________\n" ); + m_aData.sBufferAdditional.appendAscii( "-->\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateTypeTemplate() +{ + //_________________________________________________________________________________________________________________ + if( m_aData.nVersionOutput==1 || m_aData.nVersionOutput==2 ) + { + m_aData.sBufferStandard.appendAscii( "\t\t<schema:group cfg:name=\"Type\">\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Preferred\" cfg:type=\"boolean\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii("\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the preferred type for an extension if more then one match given URL</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data>false</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"UIName\" cfg:type=\"string\" cfg:localized=\"true\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the external name of this type</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"MediaType\" cfg:type=\"string\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the mime type </schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"ClipboardFormat\" cfg:type=\"string\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the clipboard format name</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"URLPattern\" cfg:type=\"string\" cfg:derivedBy=\"list\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the patterns used for URLs. This type is only relevant for HTTP, FTP etc. and is used for internal URL formats like private:factory etc.</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Extensions\" cfg:type=\"string\" cfg:derivedBy=\"list\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the possible file extensions.</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"DocumentIconID\" cfg:type=\"int\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the document icon ID of this type</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data>0</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t</schema:group>\n" ); + } + //_________________________________________________________________________________________________________________ + else if( m_aData.nVersionOutput>=3 ) + { + m_aData.sBufferStandard.appendAscii( "\t\t<schema:group cfg:name=\"Type\">\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"UIName\" cfg:type=\"string\" cfg:localized=\"true\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the external name of this type</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Data\" cfg:type=\"string\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii("\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Containes all data of a type as an own formated string.{Preferred, MediaType, ClipboardFormat, URLPattern, Extensions, DocumentIconID}</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data>false</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t</schema:group>\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateFilterTemplate() +{ + //_________________________________________________________________________________________________________________ + if( m_aData.nVersionOutput==1 || m_aData.nVersionOutput==2 ) + { + m_aData.sBufferStandard.appendAscii( "\t\t<schema:group cfg:name=\"Filter\">\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Installed\" cfg:type=\"boolean\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Make it possible to enable or disable filter by setup!</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data>false</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + if( m_aData.nVersionOutput==2 ) + { + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Order\" cfg:type=\"int\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies order of filters for relevant module; don't used for default filter!</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data>0</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + } + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"UIName\" cfg:type=\"string\" cfg:localized=\"true\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the external name of the filter which is displayed at the user interface (dialog).</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Type\" cfg:type=\"string\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the relative type key name of the filter, e.g. Type/T1</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"DocumentService\" cfg:type=\"string\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the name of the UNO service to implement the document.</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"FilterService\" cfg:type=\"string\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the name of the UNO service for importing the document.</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Flags\" cfg:type=\"int\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the properties of the filter</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:type-info>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:value-names>\n" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_IMPORT , FILTERFLAG_IMPORT , "mark filter for import" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_EXPORT , FILTERFLAG_EXPORT , "mark filter for export" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_TEMPLATE , FILTERFLAG_TEMPLATE ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_INTERNAL , FILTERFLAG_INTERNAL ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_TEMPLATEPATH , FILTERFLAG_TEMPLATEPATH ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_OWN , FILTERFLAG_OWN ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_ALIEN , FILTERFLAG_ALIEN ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_USESOPTIONS , FILTERFLAG_USESOPTIONS ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_DEFAULT , FILTERFLAG_DEFAULT , "most important filter, if more then ones available" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_NOTINFILEDIALOG , FILTERFLAG_NOTINFILEDIALOG, "don't show it in file dialogs!" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_NOTINCHOOSER , FILTERFLAG_NOTINCHOOSER , "don't show it in chooser!" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_ASYNCHRON , FILTERFLAG_ASYNCHRON ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_NOTINSTALLED , FILTERFLAG_NOTINSTALLED , "set, if the filter is not installed, but available on CD" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_CONSULTSERVICE , FILTERFLAG_CONSULTSERVICE , "set, if the filter is not installed and not available an CD" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_3RDPARTYFILTER , FILTERFLAG_3RDPARTYFILTER , "must set, if the filter is an external one" ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_PACKED , FILTERFLAG_PACKED ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_SILENTEXPORT , FILTERFLAG_SILENTEXPORT ); + impl_generateFilterFlagTemplate( FILTERFLAGNAME_PREFERED , FILTERFLAG_PREFERED ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t</schema:value-names>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:constraints xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\"/>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:type-info>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data>0</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"UserData\" cfg:type=\"string\" cfg:derivedBy=\"list\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the user-defined data</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data/>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"FileFormatVersion\" cfg:type=\"int\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<!--This should be removed to UserData later-->\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the file format version of the filter</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data>0</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"TemplateName\" cfg:type=\"string\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<!--This should be removed to UserData later-->\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the template used for importing the file with the specified filter.</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t</schema:group>\n" ); + //_________________________________________________________________________________________________________________ + } + else if( m_aData.nVersionOutput>=3 ) + { + m_aData.sBufferStandard.appendAscii( "\t\t<schema:group cfg:name=\"Filter\">\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Installed\" cfg:type=\"boolean\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Make it possible to enable or disable filter by setup!</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<default:data>false</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"UIName\" cfg:type=\"string\" cfg:localized=\"true\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the external name of the filter which is displayed at the user interface (dialog).</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Data\" cfg:type=\"string\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>All data of filter written in own format. {Order, OldName, Type, DocumentService, FilterService, Flags, UserData, FilteFormatVersion, TemplateName}</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + + m_aData.sBufferStandard.appendAscii( "\t\t</schema:group>\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateFilterFlagTemplate( const ::rtl::OUString& sName, sal_Int32 nValue, const ::rtl::OString& sDescription ) +{ + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t\t<schema:named-value name=\"" ); + m_aData.sBufferStandard.append ( sName ); + m_aData.sBufferStandard.appendAscii( "\" value=\"" ); + m_aData.sBufferStandard.append ( nValue ); + m_aData.sBufferStandard.appendAscii( "\"" ); + + if( sDescription.getLength() > 0 ) + { + m_aData.sBufferStandard.appendAscii( ">\n\t\t\t\t\t\t\t<schema:description>" ); + m_aData.sBufferStandard.appendAscii( sDescription ); + m_aData.sBufferStandard.appendAscii( "</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t\t</schema:named-value>\n" ); + } + else + { + m_aData.sBufferStandard.appendAscii( "/>\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateDetectorTemplate() +{ + m_aData.sBufferStandard.appendAscii( "\t\t<schema:group cfg:name=\"DetectService\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Types\" cfg:type=\"string\" cfg:derivedBy=\"list\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>List of types which the service has registered for.</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t</schema:group>\n" ); +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateLoaderTemplate() +{ + m_aData.sBufferStandard.appendAscii( "\t\t<schema:group cfg:name=\"FrameLoader\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"UIName\" cfg:type=\"string\" cfg:localized=\"true\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>Specifies the external name of the filter which is displayed at the user interface (dialog).</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Types\" cfg:type=\"string\" cfg:derivedBy=\"list\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>List of types which the service has registered for.</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t</schema:group>\n" ); +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateContentHandlerTemplate() +{ + m_aData.sBufferStandard.appendAscii( "\t\t<schema:group cfg:name=\"ContentHandler\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t<schema:value cfg:name=\"Types\" cfg:type=\"string\" cfg:derivedBy=\"list\" cfg:writable=\"" ); + m_aData.sBufferStandard.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t<schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t\t<schema:description>List of types which could be handled by this service.</schema:description>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t\t</schema:documentation>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t</schema:value>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t</schema:group>\n" ); +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateTypeSet() +{ + if( m_aData.pFilterCache->hasTypes() == sal_False ) + { + // generate empty set! + m_aData.sBufferStandard.appendAscii ( "\t<schema:set cfg:name=\"Types\" cfg:element-type=\"Type\"/>\n" ); + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii( "\t<schema:set cfg:name=\"Types\" cfg:element-type=\"Type\" cfg:component=\"" ); + m_aData.sBufferAdditional.append ( m_aData.sPackageStandard ); + m_aData.sBufferAdditional.appendAscii( "\"/>\n" ); + } + } + else + { + // generate filled set + // open set + m_aData.sBufferStandard.appendAscii ( "\t<schema:set cfg:name=\"Types\" cfg:element-type=\"Type\">\n" ); + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii( "\t<schema:set cfg:name=\"Types\" cfg:element-type=\"Type\" cfg:component=\"" ); + m_aData.sBufferAdditional.append ( m_aData.sPackageStandard ); + m_aData.sBufferAdditional.appendAscii( "\">\n" ); + } + + css::uno::Sequence< ::rtl::OUString > lNames = m_aData.pFilterCache->getAllTypeNames(); + css::uno::Sequence< ::rtl::OUString > lEncNames ( lNames ) ; + sal_Int32 nCount = lNames.getLength() ; + sal_Int32 nItem = 0 ; + + XCDGenerator::impl_orderAlphabetical( lNames ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + ::rtl::OUString sName ; + ::rtl::OUString sEncName; + for( nItem=0; nItem<nCount; ++nItem ) + { + sName = lNames[nItem] ; + lEncNames[nItem] = impl_encodeSetName( sName ); + } + } + + for( nItem=0; nItem<nCount; ++nItem ) + { + ::rtl::OUString sName = lNames[nItem] ; + FileType aItem = m_aData.pFilterCache->getType( sName ); + EFilterPackage ePackage ; + + ++m_aData.nWrittenTypes; + + if( m_aData.nVersionOutput==1 || m_aData.nVersionOutput==2 ) + { + // open set entry by using name + m_aData.sBufferStandard.appendAscii( "\t\t<default:group cfg:name=\"" ); + m_aData.sBufferStandard.append ( sName ); + m_aData.sBufferStandard.appendAscii( "\">\n" ); + + // write properties + impl_generateBoolProperty ( m_aData.sBufferStandard, SUBKEY_PREFERRED , aItem.bPreferred ); + impl_generateUINamesProperty ( m_aData.sBufferStandard, SUBKEY_UINAME , aItem.lUINames ); + impl_generateStringProperty ( m_aData.sBufferStandard, SUBKEY_MEDIATYPE , aItem.sMediaType ); + impl_generateStringProperty ( m_aData.sBufferStandard, SUBKEY_CLIPBOARDFORMAT , aItem.sClipboardFormat ); + impl_generateStringListProperty ( m_aData.sBufferStandard, SUBKEY_URLPATTERN , aItem.lURLPattern ); + impl_generateStringListProperty ( m_aData.sBufferStandard, SUBKEY_EXTENSIONS , aItem.lExtensions ); + impl_generateIntProperty ( m_aData.sBufferStandard, SUBKEY_DOCUMENTICONID , aItem.nDocumentIconID ); + + // close set node + m_aData.sBufferStandard.appendAscii( "\t\t</default:group>\n" ); + } + else if( m_aData.nVersionOutput >= 3 ) + { + ::rtl::OUString sPath = DECLARE_ASCII("org.openoffice.Office."); + ::rtl::OUStringBuffer* pXCDBuffer = &(m_aData.sBufferStandard ); + ::rtl::OUStringBuffer* pSCPBuffer = &(m_aData.sNew2OldSCPStandard ); + ::rtl::OUStringBuffer* pListBuffer = &(m_aData.sStandardTypeList ); + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + XCDGenerator::impl_classifyType( m_aData, sName, ePackage ); + switch( ePackage ) + { + case E_ADDITIONAL : { + sPath += m_aData.sPackageAdditional ; + pXCDBuffer = &(m_aData.sBufferAdditional ); + pSCPBuffer = &(m_aData.sNew2OldSCPAdditional); + pListBuffer = &(m_aData.sAdditionalTypeList ); + } + } + } + else + { + sPath += m_aData.sPackageStandard; + } + + sPath += CFG_PATH_SEPERATOR ; + sPath += DECLARE_ASCII( "Types" ); + sPath += CFG_PATH_SEPERATOR ; + + pListBuffer->append ( sName ); + pListBuffer->appendAscii( "\n" ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + pSCPBuffer->appendAscii( "\"" ); + pSCPBuffer->append ( sPath ); + pSCPBuffer->append ( lNames[nItem] ); + pSCPBuffer->appendAscii( "\"\t\"" ); + pSCPBuffer->append ( sPath ); + pSCPBuffer->appendAscii( "Type" ); + pSCPBuffer->append ( CFG_ENCODING_OPEN ); + pSCPBuffer->append ( lNames[nItem] ); + pSCPBuffer->append ( CFG_ENCODING_CLOSE ); + pSCPBuffer->appendAscii( "\"\n" ); + + sName = lEncNames[nItem]; + aItem.sName = sName; + } + + // open set entry by using name + pXCDBuffer->appendAscii( "\t\t<default:group cfg:name=\"" ); + pXCDBuffer->append ( sName ); + pXCDBuffer->appendAscii( "\">\n" ); + + // write properties + impl_generateUINamesProperty( *pXCDBuffer, SUBKEY_UINAME, aItem.lUINames ); + impl_generateStringProperty ( *pXCDBuffer, SUBKEY_DATA , FilterCFGAccess::encodeTypeData( aItem ) ); + + // close set node + pXCDBuffer->appendAscii( "\t\t</default:group>\n" ); + } + } + + // close set + m_aData.sBufferStandard.appendAscii( "\t</schema:set>\n" ); + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii( "\t</schema:set>\n" ); + } + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateFilterSet() +{ + if( m_aData.pFilterCache->hasFilters() == sal_False ) + { + // write empty filter set. + m_aData.sBufferStandard.appendAscii( "\t<schema:set cfg:name=\"Filters\" cfg:element-type=\"Filter\"/>\n" ); + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii( "\t<schema:set cfg:name=\"Filters\" cfg:element-type=\"Filter\" cfg:component=\"" ); + m_aData.sBufferAdditional.append ( m_aData.sPackageStandard ); + m_aData.sBufferAdditional.appendAscii( "\"/>\n" ); + } + } + else + { + // open set + m_aData.sBufferStandard.appendAscii( "\t<schema:set cfg:name=\"Filters\" cfg:element-type=\"Filter\">\n" ); + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii( "\t<schema:set cfg:name=\"Filters\" cfg:element-type=\"Filter\" cfg:component=\"" ); + m_aData.sBufferAdditional.append ( m_aData.sPackageStandard ); + m_aData.sBufferAdditional.appendAscii( "\">\n" ); + } + + css::uno::Sequence< ::rtl::OUString > lNewNames = m_aData.pFilterCache->getAllFilterNames(); + css::uno::Sequence< ::rtl::OUString > lOldNames ( lNewNames ) ; + css::uno::Sequence< ::rtl::OUString > lEncNames ( lNewNames ) ; + sal_Int32 nCount = lNewNames.getLength() ; + sal_Int32 nItem = 0 ; + + XCDGenerator::impl_orderAlphabetical( lNewNames ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + ::rtl::OUString sNewName; + ::rtl::OUString sOldName; + for( nItem=0; nItem<nCount; ++nItem ) + { + sNewName = lNewNames[nItem] ; + sOldName = impl_getOldFilterName ( sNewName ); + lOldNames[nItem] = sOldName ; + lEncNames[nItem] = impl_encodeSetName ( sOldName ); + } + } + + for( nItem=0; nItem<nCount; ++nItem ) + { + ::rtl::OUString sName = lNewNames[nItem] ; + Filter aItem = m_aData.pFilterCache->getFilter( lNewNames[nItem] ) ; + EFilterPackage ePackage ; + + ++m_aData.nWrittenFilters; + + if( m_aData.nVersionOutput==1 || m_aData.nVersionOutput==2 ) + { + // open set node by using name + m_aData.sBufferStandard.appendAscii( "\t\t<default:group cfg:name=\"" ); + m_aData.sBufferStandard.append ( sName ); + m_aData.sBufferStandard.appendAscii( "\">\n" ); + + // write properties + // Attention: + // We generate "Installed=false" for all entries ... because it's the default for all filters. + // You must work with a full office installation and change this to "true" in generated XML file!!! + impl_generateBoolProperty ( m_aData.sBufferStandard, SUBKEY_INSTALLED , sal_False ); + impl_generateIntProperty ( m_aData.sBufferStandard, SUBKEY_ORDER , aItem.nOrder ); + impl_generateStringProperty ( m_aData.sBufferStandard, SUBKEY_TYPE , aItem.sType ); + impl_generateUINamesProperty ( m_aData.sBufferStandard, SUBKEY_UINAME , aItem.lUINames ); + impl_generateStringProperty ( m_aData.sBufferStandard, SUBKEY_DOCUMENTSERVICE , aItem.sDocumentService ); + impl_generateStringProperty ( m_aData.sBufferStandard, SUBKEY_FILTERSERVICE , aItem.sFilterService ); + impl_generateIntProperty ( m_aData.sBufferStandard, SUBKEY_FLAGS , aItem.nFlags ); + impl_generateStringListProperty ( m_aData.sBufferStandard, SUBKEY_USERDATA , aItem.lUserData ); + impl_generateIntProperty ( m_aData.sBufferStandard, SUBKEY_FILEFORMATVERSION, aItem.nFileFormatVersion ); + impl_generateStringProperty ( m_aData.sBufferStandard, SUBKEY_TEMPLATENAME , aItem.sTemplateName ); + + // close set node + m_aData.sBufferStandard.appendAscii( "\t\t</default:group>\n" ); + } + else if( m_aData.nVersionOutput>=3 ) + { + ::rtl::OUString sPath = DECLARE_ASCII("org.openoffice.Office."); + ::rtl::OUStringBuffer* pXCDBuffer = &(m_aData.sBufferStandard ); + ::rtl::OUStringBuffer* pSCPBuffer = &(m_aData.sNew2OldSCPStandard ); + ::rtl::OUStringBuffer* pListBuffer = &(m_aData.sStandardFilterList ); + + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + XCDGenerator::impl_classifyFilter( m_aData, sName, ePackage, aItem.nOrder ); + switch( ePackage ) + { + case E_ADDITIONAL : { + sPath += m_aData.sPackageAdditional ; + pXCDBuffer = &(m_aData.sBufferAdditional ); + pSCPBuffer = &(m_aData.sNew2OldSCPAdditional); + pListBuffer = &(m_aData.sAdditionalFilterList); + } + } + } + else + { + sPath += m_aData.sPackageStandard; + } + + sPath += CFG_PATH_SEPERATOR ; + sPath += DECLARE_ASCII( "Filters" ); + sPath += CFG_PATH_SEPERATOR ; + + pListBuffer->append ( sName ); + pListBuffer->appendAscii( "\n" ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + pSCPBuffer->appendAscii( "\"" ); + pSCPBuffer->append ( sPath ); + pSCPBuffer->append ( lNewNames[nItem] ); + pSCPBuffer->appendAscii( "\"\t\"" ); + pSCPBuffer->append ( sPath ); + pSCPBuffer->appendAscii( "Filter" ); + pSCPBuffer->append ( CFG_ENCODING_OPEN ); + pSCPBuffer->append ( lOldNames[nItem] ); + pSCPBuffer->append ( CFG_ENCODING_CLOSE ); + pSCPBuffer->appendAscii( "\"\n" ); + + sName = lEncNames[nItem]; + aItem.sName = sName; + } + + // open set node by using name + pXCDBuffer->appendAscii( "\t\t<default:group cfg:name=\"" ); + pXCDBuffer->append ( sName ); + pXCDBuffer->appendAscii( "\">\n" ); + + // write properties + // Attention: + // We generate "Installed=false" for all entries ... because it's the default for all filters. + // You must work with a full office installation and change this to "true" in generated XML file!!! + impl_generateBoolProperty ( *pXCDBuffer, SUBKEY_INSTALLED, sal_False ); + impl_generateUINamesProperty( *pXCDBuffer, SUBKEY_UINAME , aItem.lUINames ); + impl_generateStringProperty ( *pXCDBuffer, SUBKEY_DATA , FilterCFGAccess::encodeFilterData( aItem ) ); + + // close set node + pXCDBuffer->appendAscii( "\t\t</default:group>\n" ); + } + } + + // close set + m_aData.sBufferStandard.appendAscii( "\t</schema:set>\n" ); + if( m_aData.nVersionOutput >= DRAFT_SPLIT_VERSION ) + { + m_aData.sBufferAdditional.appendAscii( "\t</schema:set>\n" ); + } + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateDetectorSet() +{ + if( m_aData.pFilterCache->hasDetectors() == sal_False ) + { + // write empty detector set! + m_aData.sBufferStandard.appendAscii( "\t<schema:set cfg:name=\"DetectServices\" cfg:element-type=\"DetectService\"/>\n" ); + } + else + { + // open set + m_aData.sBufferStandard.appendAscii( "\t<schema:set cfg:name=\"DetectServices\" cfg:element-type=\"DetectService\">\n" ); + + css::uno::Sequence< ::rtl::OUString > lNames = m_aData.pFilterCache->getAllDetectorNames(); + css::uno::Sequence< ::rtl::OUString > lEncNames ( lNames ) ; + sal_Int32 nCount = lNames.getLength() ; + sal_Int32 nItem = 0 ; + + XCDGenerator::impl_orderAlphabetical( lNames ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + ::rtl::OUString sName ; + ::rtl::OUString sEncName; + for( nItem=0; nItem<nCount; ++nItem ) + { + sName = lNames[nItem] ; + lEncNames[nItem] = impl_encodeSetName( sName ); + + m_aData.sNew2OldSCPStandard.appendAscii ( "org.openoffice.Office." ); + m_aData.sNew2OldSCPStandard.append ( m_aData.sPackageStandard ); + m_aData.sNew2OldSCPStandard.append ( CFG_PATH_SEPERATOR ); + m_aData.sNew2OldSCPStandard.append ( sName ); + m_aData.sNew2OldSCPStandard.appendAscii ( "\torg.openoffice.Office."); + m_aData.sNew2OldSCPStandard.append ( m_aData.sPackageStandard ); + m_aData.sNew2OldSCPStandard.append ( CFG_PATH_SEPERATOR ); + m_aData.sNew2OldSCPStandard.appendAscii ( "DetectService" ); + m_aData.sNew2OldSCPStandard.append ( CFG_ENCODING_OPEN ); + m_aData.sNew2OldSCPStandard.append ( sName ); + m_aData.sNew2OldSCPStandard.append ( CFG_ENCODING_CLOSE ); + m_aData.sNew2OldSCPStandard.appendAscii ( "\n" ); + } + } + + for( nItem=0; nItem<nCount; ++nItem ) + { + ::rtl::OUString sName = lNames[nItem] ; + Detector aItem = m_aData.pFilterCache->getDetector( sName ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + sName = lEncNames[nItem]; + } + + ++m_aData.nWrittenDetectors; + + // open set node by using name + m_aData.sBufferStandard.appendAscii( "\t\t<default:group cfg:name=\"" ); + m_aData.sBufferStandard.append ( sName ); + m_aData.sBufferStandard.appendAscii( "\">\n" ); + + // write properties + impl_generateStringListProperty ( m_aData.sBufferStandard, SUBKEY_TYPES, aItem.lTypes ); + + // close set node + m_aData.sBufferStandard.appendAscii( "\t\t</default:group>\n" ); + } + + // close set + m_aData.sBufferStandard.appendAscii( "\t</schema:set>\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateLoaderSet() +{ + if( m_aData.pFilterCache->hasLoaders() == sal_False ) + { + // write empty loader set! + m_aData.sBufferStandard.appendAscii( "\t<schema:set cfg:name=\"FrameLoaders\" cfg:element-type=\"FrameLoader\"/>\n" ); + } + else + { + // open set + m_aData.sBufferStandard.appendAscii( "\t<schema:set cfg:name=\"FrameLoaders\" cfg:element-type=\"FrameLoader\">\n" ); + + css::uno::Sequence< ::rtl::OUString > lNames = m_aData.pFilterCache->getAllLoaderNames(); + css::uno::Sequence< ::rtl::OUString > lEncNames ( lNames ) ; + sal_Int32 nCount = lNames.getLength() ; + sal_Int32 nItem = 0 ; + + XCDGenerator::impl_orderAlphabetical( lNames ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + ::rtl::OUString sName ; + ::rtl::OUString sEncName; + for( nItem=0; nItem<nCount; ++nItem ) + { + sName = lNames[nItem] ; + lEncNames[nItem] = impl_encodeSetName( sName ); + + m_aData.sNew2OldSCPStandard.appendAscii ( "org.openoffice.Office." ); + m_aData.sNew2OldSCPStandard.append ( m_aData.sPackageStandard ); + m_aData.sNew2OldSCPStandard.append ( CFG_PATH_SEPERATOR ); + m_aData.sNew2OldSCPStandard.append ( sName ); + m_aData.sNew2OldSCPStandard.appendAscii ( "\torg.openoffice.Office."); + m_aData.sNew2OldSCPStandard.append ( m_aData.sPackageStandard ); + m_aData.sNew2OldSCPStandard.append ( CFG_PATH_SEPERATOR ); + m_aData.sNew2OldSCPStandard.appendAscii ( "FrameLoader" ); + m_aData.sNew2OldSCPStandard.append ( CFG_ENCODING_OPEN ); + m_aData.sNew2OldSCPStandard.append ( sName ); + m_aData.sNew2OldSCPStandard.append ( CFG_ENCODING_CLOSE ); + m_aData.sNew2OldSCPStandard.appendAscii ( "\n" ); + } + } + + for( nItem=0; nItem<nCount; ++nItem ) + { + ::rtl::OUString sName = lNames[nItem] ; + Loader aItem = m_aData.pFilterCache->getLoader( sName ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + sName = lEncNames[nItem]; + } + + ++m_aData.nWrittenLoaders; + + // open set node by using name + m_aData.sBufferStandard.appendAscii( "\t\t<default:group cfg:name=\"" ); + m_aData.sBufferStandard.append ( sName ); + m_aData.sBufferStandard.appendAscii( "\">\n" ); + + // write properties + impl_generateUINamesProperty ( m_aData.sBufferStandard, SUBKEY_UINAME, aItem.lUINames ); + impl_generateStringListProperty ( m_aData.sBufferStandard, SUBKEY_TYPES , aItem.lTypes ); + + // close set node + m_aData.sBufferStandard.appendAscii( "\t\t</default:group>\n" ); + } + + // close set + m_aData.sBufferStandard.appendAscii( "\t</schema:set>\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateDefaults() +{ + // open group + m_aData.sBufferStandard.appendAscii( "\t<schema:group cfg:name=\"Defaults\">\n" ); + + // write generic loader + m_aData.sBufferStandard.appendAscii( "\t\t<schema:value cfg:name=\"FrameLoader\" cfg:type=\"string\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t<default:data>" ); + m_aData.sBufferStandard.append ( m_aData.pFilterCache->getDefaultLoader() ); + m_aData.sBufferStandard.appendAscii( "</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t</schema:value>\n" ); + + // write default detector + m_aData.sBufferStandard.appendAscii( "\t\t<schema:value cfg:name=\"DetectService\" cfg:type=\"string\">\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t\t<default:data>" ); + m_aData.sBufferStandard.append ( m_aData.pFilterCache->getDefaultDetector() ); + m_aData.sBufferStandard.appendAscii( "</default:data>\n" ); + m_aData.sBufferStandard.appendAscii( "\t\t</schema:value>\n" ); + + // close group + m_aData.sBufferStandard.appendAscii( "\t</schema:group>\n" ); +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateContentHandlerSet() +{ + if( m_aData.pFilterCache->hasContentHandlers() == sal_False ) + { + // write empty handler set! + m_aData.sBufferStandard.appendAscii( "\t<schema:set cfg:name=\"ContentHandlers\" cfg:element-type=\"ContentHandler\"/>\n" ); + } + else + { + // open set + m_aData.sBufferStandard.appendAscii( "\t<schema:set cfg:name=\"ContentHandlers\" cfg:element-type=\"ContentHandler\">\n" ); + + css::uno::Sequence< ::rtl::OUString > lNames = m_aData.pFilterCache->getAllContentHandlerNames(); + css::uno::Sequence< ::rtl::OUString > lEncNames ( lNames ) ; + sal_Int32 nCount = lNames.getLength() ; + sal_Int32 nItem = 0 ; + + XCDGenerator::impl_orderAlphabetical( lNames ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + ::rtl::OUString sName ; + ::rtl::OUString sEncName; + for( nItem=0; nItem<nCount; ++nItem ) + { + sName = lNames[nItem] ; + lEncNames[nItem] = impl_encodeSetName( sName ); + + m_aData.sNew2OldSCPStandard.appendAscii ( "org.openoffice.Office." ); + m_aData.sNew2OldSCPStandard.append ( m_aData.sPackageStandard ); + m_aData.sNew2OldSCPStandard.append ( CFG_PATH_SEPERATOR ); + m_aData.sNew2OldSCPStandard.append ( sName ); + m_aData.sNew2OldSCPStandard.appendAscii ( "\torg.openoffice.Office."); + m_aData.sNew2OldSCPStandard.append ( m_aData.sPackageStandard ); + m_aData.sNew2OldSCPStandard.append ( CFG_PATH_SEPERATOR ); + m_aData.sNew2OldSCPStandard.appendAscii ( "ContentHandler" ); + m_aData.sNew2OldSCPStandard.append ( CFG_ENCODING_OPEN ); + m_aData.sNew2OldSCPStandard.append ( sName ); + m_aData.sNew2OldSCPStandard.append ( CFG_ENCODING_CLOSE ); + m_aData.sNew2OldSCPStandard.appendAscii ( "\n" ); + } + } + + for( nItem=0; nItem<nCount; ++nItem ) + { + ::rtl::OUString sName = lNames[nItem] ; + ContentHandler aItem = m_aData.pFilterCache->getContentHandler( sName ); + + if( m_aData.nVersionOutput == 6 && m_aData.nVersionInput < 6 ) + { + sName = lEncNames[nItem]; + } + + ++m_aData.nWrittenContentHandlers; + + // open set node by using name + m_aData.sBufferStandard.appendAscii( "\t\t<default:group cfg:name=\"" ); + m_aData.sBufferStandard.append ( sName ); + m_aData.sBufferStandard.appendAscii( "\">\n" ); + + // write properties + impl_generateStringListProperty( m_aData.sBufferStandard, SUBKEY_TYPES, aItem.lTypes ); + + // close set node + m_aData.sBufferStandard.appendAscii( "\t\t</default:group>\n" ); + } + + // close set + m_aData.sBufferStandard.appendAscii( "\t</schema:set>\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateIntProperty( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + sal_Int32 nValue ) +{ + sXCD.appendAscii( "\t\t\t<default:value cfg:name=\"" ); + sXCD.append ( sName ); + sXCD.appendAscii( "\" cfg:type=\"int\" cfg:writable=\"" ); + sXCD.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + sXCD.appendAscii( "\t\t\t\t<default:data>" ); + sXCD.append ( (sal_Int32)(nValue) ); + sXCD.appendAscii( "</default:data>\n\t\t\t</default:value>\n" ); +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateBoolProperty( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + sal_Bool bValue ) +{ + sXCD.appendAscii( "\t\t\t<default:value cfg:name=\"" ); + sXCD.append ( sName ); + sXCD.appendAscii( "\" cfg:type=\"boolean\" cfg:writable=\"" ); + sXCD.appendAscii( m_aData.bWriteable==sal_True ? "true\">\n" : "false\">\n" ); + sXCD.appendAscii( "\t\t\t\t<default:data>" ); + sXCD.appendAscii( bValue==sal_True ? "true" : "false" ); + sXCD.appendAscii( "</default:data>\n\t\t\t</default:value>\n" ); +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateStringProperty( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + const ::rtl::OUString& sValue ) +{ + sXCD.appendAscii( "\t\t\t<default:value cfg:name=\"" ); + sXCD.append ( sName ); + sXCD.appendAscii( "\" cfg:type=\"string\" cfg:writable=\"" ); + sXCD.appendAscii( m_aData.bWriteable==sal_True ? "true\"" : "false\"" ); + if( sValue.getLength() > 0 ) + { + sXCD.appendAscii( ">\n\t\t\t\t<default:data>" ); + sXCD.append ( XCDGenerator::impl_encodeSpecialSigns( sValue ) ); + sXCD.appendAscii( "</default:data>\n\t\t\t</default:value>\n" ); + } + else + { + sXCD.appendAscii( "/>\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateStringListProperty( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + const ::framework::StringList& lValue ) +{ + sXCD.appendAscii( "\t\t\t<default:value cfg:name=\"" ); + sXCD.append ( sName ); + sXCD.appendAscii( "\" cfg:type=\"string\" cfg:derivedBy=\"list\"" ); + + sal_Unicode cSeperator = XCDGenerator::impl_defineSeperator( lValue ); + if( cSeperator != ' ' ) + { + sXCD.appendAscii( " cfg:separator=\"" ); + sXCD.append ( cSeperator ); + sXCD.appendAscii( "\"" ); + } + + sXCD.appendAscii( " cfg:writable=\"" ); + sXCD.appendAscii( m_aData.bWriteable==sal_True ? "true\"" : "false\"" ); + + sal_Int32 nCount = (sal_Int32)(lValue.size()); + sal_Int32 nPosition = 1; + + if( nCount > 0 ) + { + sXCD.appendAscii( ">\n\t\t\t\t<default:data>" ); + for( ConstStringListIterator pEntry=lValue.begin(); pEntry!=lValue.end(); ++pEntry ) + { + sXCD.append( *pEntry ); + if( nPosition < nCount ) + { + // Seperator for lists allowed only between two values! + // Don't write leading or leaving seperators ... + sXCD.append( cSeperator ); + } + ++nPosition; + } + sXCD.appendAscii( "</default:data>\n\t\t\t</default:value>\n" ); + } + else + { + sXCD.appendAscii( "/>\n" ); + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_generateUINamesProperty( ::rtl::OUStringBuffer& sXCD , + const ::rtl::OUString& sName , + const StringHash& lUINames ) +{ + sXCD.appendAscii( "\t\t\t<default:value cfg:name=\"" ); + sXCD.append ( sName ); + sXCD.appendAscii( "\" cfg:type=\"string\" cfg:localized=\"true\" cfg:writable=\"" ); + sXCD.appendAscii( m_aData.bWriteable==sal_True ? "true\"" : "false\"" ); + + if( lUINames.size() > 0 ) + { + sXCD.appendAscii( ">\n" ); + + // Search for localized values, which doesn't need full localized set ... + // because all values for all locales are the same! + sal_Bool bDifferent = sal_False ; + ConstStringHashIterator pUIName = lUINames.begin(); + ::rtl::OUString sUIName = pUIName->second ; + while( pUIName!=lUINames.end() ) + { + if( sUIName != pUIName->second ) + { + bDifferent = sal_True; + break; + } + ++pUIName; + } + + // Generate full localized set, if some values are realy loclaized. + if( bDifferent == sal_True ) + { + for( ConstStringHashIterator pUIName=lUINames.begin(); pUIName!=lUINames.end(); ++pUIName ) + { + sXCD.appendAscii( "\t\t\t\t<default:data xml:lang=\"" ); + sXCD.append ( pUIName->first ); + sXCD.appendAscii( "\">" ); + sXCD.append ( XCDGenerator::impl_encodeSpecialSigns( pUIName->second ) ); + sXCD.appendAscii( "</default:data>\n" ); + } + } + // Generate ONE entry as default for our configuration if all localized values are equal! + else + { + sXCD.appendAscii( "\t\t\t\t<default:data xml:lang=\"" ); + sXCD.appendAscii( "en-US" ); + sXCD.appendAscii( "\">" ); + sXCD.append ( XCDGenerator::impl_encodeSpecialSigns( lUINames.find(DECLARE_ASCII("en-US"))->second )); + sXCD.appendAscii( "</default:data>\n" ); + } + sXCD.appendAscii( "\t\t\t</default:value>\n" ); + } + else + { + sXCD.appendAscii( "/>\n" ); + } +} + +//***************************************************************************************************************** +::rtl::OUString XCDGenerator::impl_encodeSpecialSigns( const ::rtl::OUString& sValue ) +{ + ::rtl::OUStringBuffer sSource ( sValue ); + ::rtl::OUStringBuffer sDestination( 10000 ); + sal_Int32 nCount = sValue.getLength(); + sal_Int32 i = 0; + + for( i=0; i<nCount; ++i ) + { + sal_Unicode cSign = sSource.charAt(i); + switch( cSign ) + { + // code &, ", ', <, > ... + case '&' : sDestination.appendAscii( "&" ); + break; + case '<' : sDestination.appendAscii( "<" ); + break; + case '>' : sDestination.appendAscii( ">" ); + break; + case '\'': sDestination.appendAscii( "’" ); + break; + case '\"': sDestination.appendAscii( """ ); + break; + // copy all other letters + default : sDestination.append( cSign ); + break; + } + } + + return sDestination.makeStringAndClear(); +} + +//***************************************************************************************************************** +// Step over all elements of list to find one seperator, which isn't used for any value in list. +// We return an empty string if list contains no elements - because we must disable writing of +// "... cfg:seperator="<seperatorvalue> ..." +// => Otherwise we get a Sequence< OUString > with one empty element from configuration!!! +sal_Unicode XCDGenerator::impl_defineSeperator( const ::framework::StringList& lList ) +{ + static cSeperator1 = ' '; + static cSeperator2 = ';'; + static cSeperator3 = '+'; + static cSeperator4 = '-'; + static cSeperator5 = '*'; + + // Start with first seperator. + // Step over all list items. + // If one item contains this seperator - try next one! + // If no new one avaliable (5 tests failed!) - show an error message for user. + // => File will be wrong then! + // If seperator was changed start search during list again ... because + // new seperator could exist at already compared elements! + + sal_Unicode cSeperator = cSeperator1 ; + sal_Bool bOK = sal_False ; + ConstStringListIterator pItem = lList.begin(); + + while( bOK == sal_False ) + { + if( pItem == lList.end() ) + { + bOK = sal_True; + } + else + { + while( pItem!=lList.end() ) + { + if( pItem->indexOf( cSeperator, 0 ) != -1 ) + { + if( cSeperator == cSeperator1 ) + { + cSeperator = cSeperator2; + pItem = lList.begin(); + break; + } + else + if( cSeperator == cSeperator2 ) + { + cSeperator = cSeperator3; + pItem = lList.begin(); + break; + } + else + if( cSeperator == cSeperator3 ) + { + cSeperator = cSeperator4; + pItem = lList.begin(); + break; + } + else + if( cSeperator == cSeperator4 ) + { + cSeperator = cSeperator5; + pItem = lList.begin(); + break; + } + else + if( cSeperator == cSeperator5 ) + { + LOG_ERROR( "XCDGenerator::impl_defineSeperator()", "Can't find seperator for given list! Generated XCD file will be wrong!" ) + exit(-1); + } + } + else + { + ++pItem; + } + } + } + } + + return cSeperator; +} + +//***************************************************************************************************************** +void XCDGenerator::impl_initFilterHashNew2Old( StringHash& aHash ) +{ + // key = new filter name, value = old name + aHash[DECLARE_ASCII("writer_StarOffice_XML_Writer" )] = DECLARE_ASCII("swriter: StarOffice XML (Writer)" ); + aHash[DECLARE_ASCII("writer_StarWriter_50" )] = DECLARE_ASCII("swriter: StarWriter 5.0" ); + aHash[DECLARE_ASCII("writer_StarWriter_50_VorlageTemplate" )] = DECLARE_ASCII("swriter: StarWriter 5.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("writer_StarWriter_40" )] = DECLARE_ASCII("swriter: StarWriter 4.0" ); + aHash[DECLARE_ASCII("writer_StarWriter_40_VorlageTemplate" )] = DECLARE_ASCII("swriter: StarWriter 4.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("writer_StarWriter_30" )] = DECLARE_ASCII("swriter: StarWriter 3.0" ); + aHash[DECLARE_ASCII("writer_StarWriter_30_VorlageTemplate" )] = DECLARE_ASCII("swriter: StarWriter 3.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("writer_StarWriter_20" )] = DECLARE_ASCII("swriter: StarWriter 2.0" ); + aHash[DECLARE_ASCII("writer_StarWriter_10" )] = DECLARE_ASCII("swriter: StarWriter 1.0" ); + aHash[DECLARE_ASCII("writer_StarWriter_DOS" )] = DECLARE_ASCII("swriter: StarWriter DOS" ); + aHash[DECLARE_ASCII("writer_HTML_StarWriter" )] = DECLARE_ASCII("swriter: HTML (StarWriter)" ); + aHash[DECLARE_ASCII("writer_Text" )] = DECLARE_ASCII("swriter: Text" ); + aHash[DECLARE_ASCII("writer_Text_Unix" )] = DECLARE_ASCII("swriter: Text Unix" ); + aHash[DECLARE_ASCII("writer_Text_Mac" )] = DECLARE_ASCII("swriter: Text Mac" ); + aHash[DECLARE_ASCII("writer_Text_DOS" )] = DECLARE_ASCII("swriter: Text DOS" ); + aHash[DECLARE_ASCII("writer_Rich_Text_Format" )] = DECLARE_ASCII("swriter: Rich Text Format" ); + aHash[DECLARE_ASCII("writer_MS_Word_97" )] = DECLARE_ASCII("swriter: MS Word 97" ); + aHash[DECLARE_ASCII("writer_MS_Word_95" )] = DECLARE_ASCII("swriter: MS Word 95" ); + aHash[DECLARE_ASCII("writer_MS_Word_97_Vorlage" )] = DECLARE_ASCII("swriter: MS Word 97 Vorlage" ); + aHash[DECLARE_ASCII("writer_MS_Word_95_Vorlage" )] = DECLARE_ASCII("swriter: MS Word 95 Vorlage" ); + aHash[DECLARE_ASCII("writer_MS_WinWord_60" )] = DECLARE_ASCII("swriter: MS WinWord 6.0" ); + aHash[DECLARE_ASCII("writer_MS_Word_6x_W4W" )] = DECLARE_ASCII("swriter: MS Word 6.x (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_WinWord_5" )] = DECLARE_ASCII("swriter: MS WinWord 5" ); + aHash[DECLARE_ASCII("writer_MS_WinWord_2x_W4W" )] = DECLARE_ASCII("swriter: MS WinWord 2.x (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_MacWord_5x_W4W" )] = DECLARE_ASCII("swriter: MS MacWord 5.x (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_Win_61_W4W" )] = DECLARE_ASCII("swriter: WordPerfect (Win) 6.1 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_Win_70_W4W" )] = DECLARE_ASCII("swriter: WordPerfect (Win) 7.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_Win_1x_20_W4W" )] = DECLARE_ASCII("swriter: WordStar (Win) 1.x-2.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_70_W4W" )] = DECLARE_ASCII("swriter: WordStar 7.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Ami_Pro_11_12_W4W" )] = DECLARE_ASCII("swriter: Ami Pro 1.1-1.2 (W4W)" ); + aHash[DECLARE_ASCII("writer_Ami_Pro_20_31_W4W" )] = DECLARE_ASCII("swriter: Ami Pro 2.0-3.1 (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_Excel_40_StarWriter" )] = DECLARE_ASCII("swriter: MS Excel 4.0 (StarWriter)" ); + aHash[DECLARE_ASCII("writer_MS_Excel_50_StarWriter" )] = DECLARE_ASCII("swriter: MS Excel 5.0 (StarWriter)" ); + aHash[DECLARE_ASCII("writer_MS_Excel_95_StarWriter" )] = DECLARE_ASCII("swriter: MS Excel 95 (StarWriter)" ); + aHash[DECLARE_ASCII("writer_MS_Works_20_DOS_W4W" )] = DECLARE_ASCII("swriter: MS Works 2.0 DOS (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_Works_30_Win_W4W" )] = DECLARE_ASCII("swriter: MS Works 3.0 Win (W4W)" ); + aHash[DECLARE_ASCII("writer_Lotus_1_2_3_10_DOS_StarWriter" )] = DECLARE_ASCII("swriter: Lotus 1-2-3 1.0 (DOS) (StarWriter)" ); + aHash[DECLARE_ASCII("writer_Lotus_1_2_3_10_WIN_StarWriter" )] = DECLARE_ASCII("swriter: Lotus 1-2-3 1.0 (WIN) (StarWriter)" ); + aHash[DECLARE_ASCII("writer_Frame_Maker_MIF_50_W4W" )] = DECLARE_ASCII("swriter: Frame Maker MIF 5.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Win_Write_3x_W4W" )] = DECLARE_ASCII("swriter: Win Write 3.x (W4W)" ); + aHash[DECLARE_ASCII("writer_Text_encoded" )] = DECLARE_ASCII("swriter: Text (encoded)" ); + aHash[DECLARE_ASCII("writer_MS_WinWord_1x_W4W" )] = DECLARE_ASCII("swriter: MS WinWord 1.x (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_Word_5x_W4W" )] = DECLARE_ASCII("swriter: MS Word 5.x (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_Word_4x_W4W" )] = DECLARE_ASCII("swriter: MS Word 4.x (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_Word_3x_W4W" )] = DECLARE_ASCII("swriter: MS Word 3.x (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_MacWord_40_W4W" )] = DECLARE_ASCII("swriter: MS MacWord 4.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_MacWord_30_W4W" )] = DECLARE_ASCII("swriter: MS MacWord 3.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_Mac_1_W4W" )] = DECLARE_ASCII("swriter: WordPerfect Mac 1 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_Mac_2_W4W" )] = DECLARE_ASCII("swriter: WordPerfect Mac 2 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_Mac_3_W4W" )] = DECLARE_ASCII("swriter: WordPerfect Mac 3 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_Win_51_52_W4W" )] = DECLARE_ASCII("swriter: WordPerfect (Win) 5.1-5.2 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_Win_60_W4W" )] = DECLARE_ASCII("swriter: WordPerfect (Win) 6.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_41_W4W" )] = DECLARE_ASCII("swriter: WordPerfect 4.1 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_42_W4W" )] = DECLARE_ASCII("swriter: WordPerfect 4.2 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_50_W4W" )] = DECLARE_ASCII("swriter: WordPerfect 5.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_51_W4W" )] = DECLARE_ASCII("swriter: WordPerfect 5.1 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_60_W4W" )] = DECLARE_ASCII("swriter: WordPerfect 6.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordPerfect_61_W4W" )] = DECLARE_ASCII("swriter: WordPerfect 6.1 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_2000_Rel_30_W4W" )] = DECLARE_ASCII("swriter: WordStar 2000 Rel. 3.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_2000_Rel_35_W4W" )] = DECLARE_ASCII("swriter: WordStar 2000 Rel. 3.5 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_33x_W4W" )] = DECLARE_ASCII("swriter: WordStar 3.3x (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_345_W4W" )] = DECLARE_ASCII("swriter: WordStar 3.45 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_40_W4W" )] = DECLARE_ASCII("swriter: WordStar 4.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_50_W4W" )] = DECLARE_ASCII("swriter: WordStar 5.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_55_W4W" )] = DECLARE_ASCII("swriter: WordStar 5.5 (W4W)" ); + aHash[DECLARE_ASCII("writer_WordStar_60_W4W" )] = DECLARE_ASCII("swriter: WordStar 6.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_MS_Works_40_Mac_W4W" )] = DECLARE_ASCII("swriter: MS Works 4.0 Mac (W4W)" ); + aHash[DECLARE_ASCII("writer_Mac_Write_4x_50_W4W" )] = DECLARE_ASCII("swriter: Mac Write 4.x 5.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Mac_Write_II_W4W" )] = DECLARE_ASCII("swriter: Mac Write II (W4W)" ); + aHash[DECLARE_ASCII("writer_Mac_Write_Pro_W4W" )] = DECLARE_ASCII("swriter: Mac Write Pro (W4W)" ); + aHash[DECLARE_ASCII("writer_Lotus_Manuscript_W4W" )] = DECLARE_ASCII("swriter: Lotus Manuscript (W4W)" ); + aHash[DECLARE_ASCII("writer_MASS_11_Rel_80_83_W4W" )] = DECLARE_ASCII("swriter: MASS 11 Rel. 8.0-8.3 (W4W)" ); + aHash[DECLARE_ASCII("writer_MASS_11_Rel_85_90_W4W" )] = DECLARE_ASCII("swriter: MASS 11 Rel. 8.5-9.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Claris_Works_W4W" )] = DECLARE_ASCII("swriter: Claris Works (W4W)" ); + aHash[DECLARE_ASCII("writer_CTOS_DEF_W4W" )] = DECLARE_ASCII("swriter: CTOS DEF (W4W)" ); + aHash[DECLARE_ASCII("writer_OfficeWriter_40_W4W" )] = DECLARE_ASCII("swriter: OfficeWriter 4.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_OfficeWriter_50_W4W" )] = DECLARE_ASCII("swriter: OfficeWriter 5.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_OfficeWriter_6x_W4W" )] = DECLARE_ASCII("swriter: OfficeWriter 6.x (W4W)" ); + aHash[DECLARE_ASCII("writer_XyWrite_III_W4W" )] = DECLARE_ASCII("swriter: XyWrite III ( W4W)" ); + aHash[DECLARE_ASCII("writer_XyWrite_IIIP_W4W" )] = DECLARE_ASCII("swriter: XyWrite III+ ( W4W)" ); + aHash[DECLARE_ASCII("writer_XyWrite_Signature_W4W" )] = DECLARE_ASCII("swriter: XyWrite Signature (W4W)" ); + aHash[DECLARE_ASCII("writer_XyWrite_Sig_Win_W4W" )] = DECLARE_ASCII("swriter: XyWrite Sig. (Win) (W4W)" ); + aHash[DECLARE_ASCII("writer_XyWrite_IV_W4W" )] = DECLARE_ASCII("swriter: XyWrite IV (W4W)" ); + aHash[DECLARE_ASCII("writer_XyWrite_Win_10_W4W" )] = DECLARE_ASCII("swriter: XyWrite (Win) 1.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_XEROX_XIF_50_W4W" )] = DECLARE_ASCII("swriter: XEROX XIF 5.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_XEROX_XIF_50_Illustrator_W4W" )] = DECLARE_ASCII("swriter: XEROX XIF 5.0 (Illustrator) (W4W)" ); + aHash[DECLARE_ASCII("writer_XEROX_XIF_60_Color_Bitmap_W4W" )] = DECLARE_ASCII("swriter: XEROX XIF 6.0 (Color Bitmap) (W4W)" ); + aHash[DECLARE_ASCII("writer_XEROX_XIF_60_Res_Graphic_W4W" )] = DECLARE_ASCII("swriter: XEROX XIF 6.0 (Res Graphic) (W4W)" ); + aHash[DECLARE_ASCII("writer_WriteNow_30_Macintosh_W4W" )] = DECLARE_ASCII("swriter: WriteNow 3.0 (Macintosh) (W4W)" ); + aHash[DECLARE_ASCII("writer_Writing_Assistant_W4W" )] = DECLARE_ASCII("swriter: Writing Assistant (W4W)" ); + aHash[DECLARE_ASCII("writer_VolksWriter_Deluxe_W4W" )] = DECLARE_ASCII("swriter: VolksWriter Deluxe (W4W)" ); + aHash[DECLARE_ASCII("writer_VolksWriter_3_and_4_W4W" )] = DECLARE_ASCII("swriter: VolksWriter 3 and 4 (W4W)" ); + aHash[DECLARE_ASCII("writer_MultiMate_33_W4W" )] = DECLARE_ASCII("swriter: MultiMate 3.3 (W4W)" ); + aHash[DECLARE_ASCII("writer_MultiMate_Adv_36_W4W" )] = DECLARE_ASCII("swriter: MultiMate Adv. 3.6 (W4W)" ); + aHash[DECLARE_ASCII("writer_MultiMate_Adv_II_37_W4W" )] = DECLARE_ASCII("swriter: MultiMate Adv. II 3.7 (W4W)" ); + aHash[DECLARE_ASCII("writer_MultiMate_4_W4W" )] = DECLARE_ASCII("swriter: MultiMate 4 (W4W)" ); + aHash[DECLARE_ASCII("writer_NAVY_DIF_W4W" )] = DECLARE_ASCII("swriter: NAVY DIF (W4W)" ); + aHash[DECLARE_ASCII("writer_PFS_Write_W4W" )] = DECLARE_ASCII("swriter: PFS Write (W4W)" ); + aHash[DECLARE_ASCII("writer_PFS_First_Choice_10_W4W" )] = DECLARE_ASCII("swriter: PFS First Choice 1.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_PFS_First_Choice_20_W4W" )] = DECLARE_ASCII("swriter: PFS First Choice 2.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_PFS_First_Choice_30_W4W" )] = DECLARE_ASCII("swriter: PFS First Choice 3.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Professional_Write_10_W4W" )] = DECLARE_ASCII("swriter: Professional Write 1.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Professional_Write_2x_W4W" )] = DECLARE_ASCII("swriter: Professional Write 2.x (W4W)" ); + aHash[DECLARE_ASCII("writer_Professional_Write_Plus_W4W" )] = DECLARE_ASCII("swriter: Professional Write Plus (W4W)" ); + aHash[DECLARE_ASCII("writer_Peach_Text_W4W" )] = DECLARE_ASCII("swriter: Peach Text (W4W)" ); + aHash[DECLARE_ASCII("writer_DCA_Revisable_Form_Text_W4W" )] = DECLARE_ASCII("swriter: DCA Revisable Form Text (W4W)" ); + aHash[DECLARE_ASCII("writer_DCA_with_Display_Write_5_W4W" )] = DECLARE_ASCII("swriter: DCA with Display Write 5 (W4W)" ); + aHash[DECLARE_ASCII("writer_DCAFFT_Final_Form_Text_W4W" )] = DECLARE_ASCII("swriter: DCA/FFT-Final Form Text (W4W)" ); + aHash[DECLARE_ASCII("writer_DEC_DX_W4W" )] = DECLARE_ASCII("swriter: DEC DX (W4W)" ); + aHash[DECLARE_ASCII("writer_DEC_WPS_PLUS_W4W" )] = DECLARE_ASCII("swriter: DEC WPS-PLUS (W4W)" ); + aHash[DECLARE_ASCII("writer_DisplayWrite_20_4x_W4W" )] = DECLARE_ASCII("swriter: DisplayWrite 2.0-4.x (W4W)" ); + aHash[DECLARE_ASCII("writer_DisplayWrite_5x_W4W" )] = DECLARE_ASCII("swriter: DisplayWrite 5.x (W4W)" ); + aHash[DECLARE_ASCII("writer_DataGeneral_CEO_Write_W4W" )] = DECLARE_ASCII("swriter: DataGeneral CEO Write (W4W)" ); + aHash[DECLARE_ASCII("writer_EBCDIC_W4W" )] = DECLARE_ASCII("swriter: EBCDIC (W4W)" ); + aHash[DECLARE_ASCII("writer_Enable_W4W" )] = DECLARE_ASCII("swriter: Enable (W4W)" ); + aHash[DECLARE_ASCII("writer_Frame_Maker_MIF_30_W4W" )] = DECLARE_ASCII("swriter: Frame Maker MIF 3.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Frame_Maker_MIF_40_W4W" )] = DECLARE_ASCII("swriter: Frame Maker MIF 4.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Frame_Work_III_W4W" )] = DECLARE_ASCII("swriter: Frame Work III (W4W)" ); + aHash[DECLARE_ASCII("writer_Frame_Work_IV_W4W" )] = DECLARE_ASCII("swriter: Frame Work IV (W4W)" ); + aHash[DECLARE_ASCII("writer_HP_AdvanceWrite_Plus_W4W" )] = DECLARE_ASCII("swriter: HP AdvanceWrite Plus (W4W)" ); + aHash[DECLARE_ASCII("writer_ICL_Office_Power_6_W4W" )] = DECLARE_ASCII("swriter: ICL Office Power 6 (W4W)" ); + aHash[DECLARE_ASCII("writer_ICL_Office_Power_7_W4W" )] = DECLARE_ASCII("swriter: ICL Office Power 7 (W4W)" ); + aHash[DECLARE_ASCII("writer_Interleaf_W4W" )] = DECLARE_ASCII("swriter: Interleaf (W4W)" ); + aHash[DECLARE_ASCII("writer_Interleaf_5_6_W4W" )] = DECLARE_ASCII("swriter: Interleaf 5 - 6 (W4W)" ); + aHash[DECLARE_ASCII("writer_Legacy_Winstar_onGO_W4W" )] = DECLARE_ASCII("swriter: Legacy Winstar onGO (W4W)" ); + aHash[DECLARE_ASCII("writer_QA_Write_10_30_W4W" )] = DECLARE_ASCII("swriter: Q&A Write 1.0-3.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_QA_Write_40_W4W" )] = DECLARE_ASCII("swriter: Q&A Write 4.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Rapid_File_10_W4W" )] = DECLARE_ASCII("swriter: Rapid File 1.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_Rapid_File_12_W4W" )] = DECLARE_ASCII("swriter: Rapid File 1.2 (W4W)" ); + aHash[DECLARE_ASCII("writer_Samna_Word_IV_IV_Plus_W4W" )] = DECLARE_ASCII("swriter: Samna Word IV-IV Plus (W4W)" ); + aHash[DECLARE_ASCII("writer_Total_Word_W4W" )] = DECLARE_ASCII("swriter: Total Word (W4W)" ); + aHash[DECLARE_ASCII("writer_Uniplex_onGO_W4W" )] = DECLARE_ASCII("swriter: Uniplex onGO (W4W)" ); + aHash[DECLARE_ASCII("writer_Uniplex_V7_V8_W4W" )] = DECLARE_ASCII("swriter: Uniplex V7-V8 (W4W)" ); + aHash[DECLARE_ASCII("writer_Wang_PC_W4W" )] = DECLARE_ASCII("swriter: Wang PC (W4W)" ); + aHash[DECLARE_ASCII("writer_Wang_II_SWP_W4W" )] = DECLARE_ASCII("swriter: Wang II SWP (W4W)" ); + aHash[DECLARE_ASCII("writer_Wang_WP_Plus_W4W" )] = DECLARE_ASCII("swriter: Wang WP Plus (W4W)" ); + aHash[DECLARE_ASCII("writer_WITA_W4W" )] = DECLARE_ASCII("swriter: WITA (W4W)" ); + aHash[DECLARE_ASCII("writer_WiziWord_30_W4W" )] = DECLARE_ASCII("swriter: WiziWord 3.0 (W4W)" ); + aHash[DECLARE_ASCII("writer_web_HTML" )] = DECLARE_ASCII("swriter/web: HTML" ); + aHash[DECLARE_ASCII("writer_web_StarWriterWeb_50_VorlageTemplate" )] = DECLARE_ASCII("swriter/web: StarWriter/Web 5.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("writer_web_StarWriterWeb_40_VorlageTemplate" )] = DECLARE_ASCII("swriter/web: StarWriter/Web 4.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("writer_web_Text_StarWriterWeb" )] = DECLARE_ASCII("swriter/web: Text (StarWriter/Web)" ); + aHash[DECLARE_ASCII("writer_web_Text_DOS_StarWriterWeb" )] = DECLARE_ASCII("swriter/web: Text DOS (StarWriter/Web)" ); + aHash[DECLARE_ASCII("writer_web_Text_Mac_StarWriterWeb" )] = DECLARE_ASCII("swriter/web: Text Mac (StarWriter/Web)" ); + aHash[DECLARE_ASCII("writer_web_Text_Unix_StarWriterWeb" )] = DECLARE_ASCII("swriter/web: Text Unix (StarWriter/Web)" ); + aHash[DECLARE_ASCII("writer_web_StarWriter_50" )] = DECLARE_ASCII("swriter/web: StarWriter 5.0" ); + aHash[DECLARE_ASCII("writer_web_StarWriter_40" )] = DECLARE_ASCII("swriter/web: StarWriter 4.0" ); + aHash[DECLARE_ASCII("writer_web_StarWriter_30" )] = DECLARE_ASCII("swriter/web: StarWriter 3.0" ); + aHash[DECLARE_ASCII("writer_web_Text_encoded" )] = DECLARE_ASCII("swriter/web: Text (encoded)" ); + aHash[DECLARE_ASCII("writer_globaldocument_StarWriter_60GlobalDocument" )] = DECLARE_ASCII("swriter/GlobalDocument: StarOffice XML (GlobalDocument)" ); + aHash[DECLARE_ASCII("writer_globaldocument_StarWriter_50GlobalDocument" )] = DECLARE_ASCII("swriter/GlobalDocument: StarWriter 5.0/GlobalDocument" ); + aHash[DECLARE_ASCII("writer_globaldocument_StarWriter_40GlobalDocument" )] = DECLARE_ASCII("swriter/GlobalDocument: StarWriter 4.0/GlobalDocument" ); + aHash[DECLARE_ASCII("writer_globaldocument_StarWriter_50" )] = DECLARE_ASCII("swriter/GlobalDocument: StarWriter 5.0" ); + aHash[DECLARE_ASCII("writer_globaldocument_StarWriter_40" )] = DECLARE_ASCII("swriter/GlobalDocument: StarWriter 4.0" ); + aHash[DECLARE_ASCII("writer_globaldocument_StarWriter_30" )] = DECLARE_ASCII("swriter/GlobalDocument: StarWriter 3.0" ); + aHash[DECLARE_ASCII("writer_globaldocument_Text_encoded" )] = DECLARE_ASCII("swriter/GlobalDocument: Text (encoded)" ); + aHash[DECLARE_ASCII("chart_StarOffice_XML_Chart" )] = DECLARE_ASCII("schart: StarOffice XML (Chart)" ); + aHash[DECLARE_ASCII("chart_StarChart_50" )] = DECLARE_ASCII("schart: StarChart 5.0" ); + aHash[DECLARE_ASCII("chart_StarChart_40" )] = DECLARE_ASCII("schart: StarChart 4.0" ); + aHash[DECLARE_ASCII("chart_StarChart_30" )] = DECLARE_ASCII("schart: StarChart 3.0" ); + aHash[DECLARE_ASCII("calc_StarOffice_XML_Calc" )] = DECLARE_ASCII("scalc: StarOffice XML (Calc)" ); + aHash[DECLARE_ASCII("calc_StarCalc_50" )] = DECLARE_ASCII("scalc: StarCalc 5.0" ); + aHash[DECLARE_ASCII("calc_StarCalc_50_VorlageTemplate" )] = DECLARE_ASCII("scalc: StarCalc 5.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("calc_StarCalc_40" )] = DECLARE_ASCII("scalc: StarCalc 4.0" ); + aHash[DECLARE_ASCII("calc_StarCalc_40_VorlageTemplate" )] = DECLARE_ASCII("scalc: StarCalc 4.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("calc_StarCalc_30" )] = DECLARE_ASCII("scalc: StarCalc 3.0" ); + aHash[DECLARE_ASCII("calc_StarCalc_30_VorlageTemplate" )] = DECLARE_ASCII("scalc: StarCalc 3.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("calc_MS_Excel_97" )] = DECLARE_ASCII("scalc: MS Excel 97" ); + aHash[DECLARE_ASCII("calc_MS_Excel_97_VorlageTemplate" )] = DECLARE_ASCII("scalc: MS Excel 97 Vorlage/Template" ); + aHash[DECLARE_ASCII("calc_MS_Excel_95" )] = DECLARE_ASCII("scalc: MS Excel 95" ); + aHash[DECLARE_ASCII("calc_MS_Excel_95_VorlageTemplate" )] = DECLARE_ASCII("scalc: MS Excel 95 Vorlage/Template" ); + aHash[DECLARE_ASCII("calc_MS_Excel_5095" )] = DECLARE_ASCII("scalc: MS Excel 5.0/95" ); + aHash[DECLARE_ASCII("calc_MS_Excel_5095_VorlageTemplate" )] = DECLARE_ASCII("scalc: MS Excel 5.0/95 Vorlage/Template" ); + aHash[DECLARE_ASCII("calc_MS_Excel_40" )] = DECLARE_ASCII("scalc: MS Excel 4.0" ); + aHash[DECLARE_ASCII("calc_MS_Excel_40_VorlageTemplate" )] = DECLARE_ASCII("scalc: MS Excel 4.0 Vorlage/Template" ); + aHash[DECLARE_ASCII("calc_Rich_Text_Format_StarCalc" )] = DECLARE_ASCII("scalc: Rich Text Format (StarCalc)" ); + aHash[DECLARE_ASCII("calc_SYLK" )] = DECLARE_ASCII("scalc: SYLK" ); + aHash[DECLARE_ASCII("calc_DIF" )] = DECLARE_ASCII("scalc: DIF" ); + aHash[DECLARE_ASCII("calc_HTML_StarCalc" )] = DECLARE_ASCII("scalc: HTML (StarCalc)" ); + aHash[DECLARE_ASCII("calc_dBase" )] = DECLARE_ASCII("scalc: dBase" ); + aHash[DECLARE_ASCII("calc_Lotus" )] = DECLARE_ASCII("scalc: Lotus" ); + aHash[DECLARE_ASCII("calc_StarCalc_10" )] = DECLARE_ASCII("scalc: StarCalc 1.0" ); + aHash[DECLARE_ASCII("calc_Text_txt_csv_StarCalc" )] = DECLARE_ASCII("scalc: Text - txt - csv (StarCalc)" ); + aHash[DECLARE_ASCII("impress_StarOffice_XML_Impress" )] = DECLARE_ASCII("simpress: StarOffice XML (Impress)" ); + aHash[DECLARE_ASCII("impress_StarImpress_50" )] = DECLARE_ASCII("simpress: StarImpress 5.0" ); + aHash[DECLARE_ASCII("impress_StarImpress_50_Vorlage" )] = DECLARE_ASCII("simpress: StarImpress 5.0 Vorlage" ); + aHash[DECLARE_ASCII("impress_StarImpress_40" )] = DECLARE_ASCII("simpress: StarImpress 4.0" ); + aHash[DECLARE_ASCII("impress_StarImpress_40_Vorlage" )] = DECLARE_ASCII("simpress: StarImpress 4.0 Vorlage" ); + aHash[DECLARE_ASCII("impress_StarDraw_50_StarImpress" )] = DECLARE_ASCII("simpress: StarDraw 5.0 (StarImpress)" ); + aHash[DECLARE_ASCII("impress_StarDraw_50_Vorlage_StarImpress" )] = DECLARE_ASCII("simpress: StarDraw 5.0 Vorlage (StarImpress)" ); + aHash[DECLARE_ASCII("impress_StarDraw_30_StarImpress" )] = DECLARE_ASCII("simpress: StarDraw 3.0 (StarImpress)" ); + aHash[DECLARE_ASCII("impress_StarDraw_30_Vorlage_StarImpress" )] = DECLARE_ASCII("simpress: StarDraw 3.0 Vorlage (StarImpress)" ); + aHash[DECLARE_ASCII("impress_MS_PowerPoint_97" )] = DECLARE_ASCII("simpress: MS PowerPoint 97" ); + aHash[DECLARE_ASCII("impress_MS_PowerPoint_97_Vorlage" )] = DECLARE_ASCII("simpress: MS PowerPoint 97 Vorlage" ); + aHash[DECLARE_ASCII("impress_CGM_Computer_Graphics_Metafile" )] = DECLARE_ASCII("simpress: CGM - Computer Graphics Metafile" ); + aHash[DECLARE_ASCII("impress_StarImpress_50_packed" )] = DECLARE_ASCII("simpress: StarImpress 5.0 (packed)" ); + aHash[DECLARE_ASCII("draw_StarOffice_XML_Draw" )] = DECLARE_ASCII("sdraw: StarOffice XML (Draw)" ); + aHash[DECLARE_ASCII("draw_GIF_Graphics_Interchange" )] = DECLARE_ASCII("sdraw: GIF - Graphics Interchange" ); + aHash[DECLARE_ASCII("draw_PCD_Photo_CD" )] = DECLARE_ASCII("sdraw: PCD - Photo CD" ); + aHash[DECLARE_ASCII("draw_PCX_Zsoft_Paintbrush" )] = DECLARE_ASCII("sdraw: PCX - Zsoft Paintbrush" ); + aHash[DECLARE_ASCII("draw_PSD_Adobe_Photoshop" )] = DECLARE_ASCII("sdraw: PSD - Adobe Photoshop" ); + aHash[DECLARE_ASCII("draw_PNG_Portable_Network_Graphic" )] = DECLARE_ASCII("sdraw: PNG - Portable Network Graphic" ); + aHash[DECLARE_ASCII("draw_StarDraw_50" )] = DECLARE_ASCII("sdraw: StarDraw 5.0" ); + aHash[DECLARE_ASCII("draw_PBM_Portable_Bitmap" )] = DECLARE_ASCII("sdraw: PBM - Portable Bitmap" ); + aHash[DECLARE_ASCII("draw_PGM_Portable_Graymap" )] = DECLARE_ASCII("sdraw: PGM - Portable Graymap" ); + aHash[DECLARE_ASCII("draw_PPM_Portable_Pixelmap" )] = DECLARE_ASCII("sdraw: PPM - Portable Pixelmap" ); + aHash[DECLARE_ASCII("draw_RAS_Sun_Rasterfile" )] = DECLARE_ASCII("sdraw: RAS - Sun Rasterfile" ); + aHash[DECLARE_ASCII("draw_TGA_Truevision_TARGA" )] = DECLARE_ASCII("sdraw: TGA - Truevision TARGA" ); + aHash[DECLARE_ASCII("draw_SGV_StarDraw_20" )] = DECLARE_ASCII("sdraw: SGV - StarDraw 2.0" ); + aHash[DECLARE_ASCII("draw_TIF_Tag_Image_File" )] = DECLARE_ASCII("sdraw: TIF - Tag Image File" ); + aHash[DECLARE_ASCII("draw_SGF_StarOffice_Writer_SGF" )] = DECLARE_ASCII("sdraw: SGF - StarOffice Writer SGF" ); + aHash[DECLARE_ASCII("draw_XPM" )] = DECLARE_ASCII("sdraw: XPM" ); + aHash[DECLARE_ASCII("gif_Graphics_Interchange" )] = DECLARE_ASCII("sdraw: GIF - Graphics Interchange" ); + aHash[DECLARE_ASCII("pcd_Photo_CD" )] = DECLARE_ASCII("sdraw: PCD - Photo CD" ); + aHash[DECLARE_ASCII("pcx_Zsoft_Paintbrush" )] = DECLARE_ASCII("sdraw: PCX - Zsoft Paintbrush" ); + aHash[DECLARE_ASCII("psd_Adobe_Photoshop" )] = DECLARE_ASCII("sdraw: PSD - Adobe Photoshop" ); + aHash[DECLARE_ASCII("png_Portable_Network_Graphic" )] = DECLARE_ASCII("sdraw: PNG - Portable Network Graphic" ); + aHash[DECLARE_ASCII("pbm_Portable_Bitmap" )] = DECLARE_ASCII("sdraw: PBM - Portable Bitmap" ); + aHash[DECLARE_ASCII("pgm_Portable_Graymap" )] = DECLARE_ASCII("sdraw: PGM - Portable Graymap" ); + aHash[DECLARE_ASCII("ppm_Portable_Pixelmap" )] = DECLARE_ASCII("sdraw: PPM - Portable Pixelmap" ); + aHash[DECLARE_ASCII("ras_Sun_Rasterfile" )] = DECLARE_ASCII("sdraw: RAS - Sun Rasterfile" ); + aHash[DECLARE_ASCII("tga_Truevision_TARGA" )] = DECLARE_ASCII("sdraw: TGA - Truevision TARGA" ); + aHash[DECLARE_ASCII("sgv_StarDraw_20" )] = DECLARE_ASCII("sdraw: SGV - StarDraw 2.0" ); + aHash[DECLARE_ASCII("tif_Tag_Image_File" )] = DECLARE_ASCII("sdraw: TIF - Tag Image File" ); + aHash[DECLARE_ASCII("sgf_StarOffice_Writer_SGF" )] = DECLARE_ASCII("sdraw: SGF - StarOffice Writer SGF" ); + aHash[DECLARE_ASCII("xpm_XPM" )] = DECLARE_ASCII("sdraw: XPM" ); + aHash[DECLARE_ASCII("draw_StarDraw_50_Vorlage" )] = DECLARE_ASCII("sdraw: StarDraw 5.0 Vorlage" ); + aHash[DECLARE_ASCII("draw_StarImpress_50_StarDraw" )] = DECLARE_ASCII("sdraw: StarImpress 5.0 (StarDraw)" ); + aHash[DECLARE_ASCII("draw_StarImpress_50_Vorlage_StarDraw" )] = DECLARE_ASCII("sdraw: StarImpress 5.0 Vorlage (StarDraw)" ); + aHash[DECLARE_ASCII("draw_StarImpress_40_StarDraw" )] = DECLARE_ASCII("sdraw: StarImpress 4.0 (StarDraw)" ); + aHash[DECLARE_ASCII("draw_StarImpress_40_Vorlage_StarDraw" )] = DECLARE_ASCII("sdraw: StarImpress 4.0 Vorlage (StarDraw)" ); + aHash[DECLARE_ASCII("draw_StarDraw_30" )] = DECLARE_ASCII("sdraw: StarDraw 3.0" ); + aHash[DECLARE_ASCII("draw_StarDraw_30_Vorlage" )] = DECLARE_ASCII("sdraw: StarDraw 3.0 Vorlage" ); + aHash[DECLARE_ASCII("draw_EMF_MS_Windows_Metafile" )] = DECLARE_ASCII("sdraw: EMF - MS Windows Metafile" ); + aHash[DECLARE_ASCII("draw_MET_OS2_Metafile" )] = DECLARE_ASCII("sdraw: MET - OS/2 Metafile" ); + aHash[DECLARE_ASCII("draw_DXF_AutoCAD_Interchange" )] = DECLARE_ASCII("sdraw: DXF - AutoCAD Interchange" ); + aHash[DECLARE_ASCII("draw_EPS_Encapsulated_PostScript" )] = DECLARE_ASCII("sdraw: EPS - Encapsulated PostScript" ); + aHash[DECLARE_ASCII("draw_WMF_MS_Windows_Metafile" )] = DECLARE_ASCII("sdraw: WMF - MS Windows Metafile" ); + aHash[DECLARE_ASCII("draw_PCT_Mac_Pict" )] = DECLARE_ASCII("sdraw: PCT - Mac Pict" ); + aHash[DECLARE_ASCII("draw_SVM_StarView_Metafile" )] = DECLARE_ASCII("sdraw: SVM - StarView Metafile" ); + aHash[DECLARE_ASCII("draw_BMP_MS_Windows" )] = DECLARE_ASCII("sdraw: BMP - MS Windows" ); + aHash[DECLARE_ASCII("draw_JPG_JPEG" )] = DECLARE_ASCII("sdraw: JPG - JPEG" ); + aHash[DECLARE_ASCII("draw_XBM_X_Consortium" )] = DECLARE_ASCII("sdraw: XBM - X-Consortium" ); + aHash[DECLARE_ASCII("emf_MS_Windows_Metafile" )] = DECLARE_ASCII("sdraw: EMF - MS Windows Metafile" ); + aHash[DECLARE_ASCII("met_OS2_Metafile" )] = DECLARE_ASCII("sdraw: MET - OS/2 Metafile" ); + aHash[DECLARE_ASCII("dxf_AutoCAD_Interchange" )] = DECLARE_ASCII("sdraw: DXF - AutoCAD Interchange" ); + aHash[DECLARE_ASCII("eps_Encapsulated_PostScript" )] = DECLARE_ASCII("sdraw: EPS - Encapsulated PostScript" ); + aHash[DECLARE_ASCII("wmf_MS_Windows_Metafile" )] = DECLARE_ASCII("sdraw: WMF - MS Windows Metafile" ); + aHash[DECLARE_ASCII("pct_Mac_Pict" )] = DECLARE_ASCII("sdraw: PCT - Mac Pict" ); + aHash[DECLARE_ASCII("svm_StarView_Metafile" )] = DECLARE_ASCII("sdraw: SVM - StarView Metafile" ); + aHash[DECLARE_ASCII("bmp_MS_Windows" )] = DECLARE_ASCII("sdraw: BMP - MS Windows" ); + aHash[DECLARE_ASCII("jpg_JPEG" )] = DECLARE_ASCII("sdraw: JPG - JPEG" ); + aHash[DECLARE_ASCII("xbm_X_Consortium" )] = DECLARE_ASCII("sdraw: XBM - X-Consortium" ); + aHash[DECLARE_ASCII("math_StarOffice_XML_Math" )] = DECLARE_ASCII("smath: StarOffice XML (Math)" ); + aHash[DECLARE_ASCII("math_MathML_XML_Math" )] = DECLARE_ASCII("smath: MathML XML (Math)" ); + aHash[DECLARE_ASCII("math_StarMath_50" )] = DECLARE_ASCII("smath: StarMath 5.0" ); + aHash[DECLARE_ASCII("math_StarMath_40" )] = DECLARE_ASCII("smath: StarMath 4.0" ); + aHash[DECLARE_ASCII("math_StarMath_30" )] = DECLARE_ASCII("smath: StarMath 3.0" ); + aHash[DECLARE_ASCII("math_StarMath_20" )] = DECLARE_ASCII("smath: StarMath 2.0" ); + aHash[DECLARE_ASCII("math_MathType_3x" )] = DECLARE_ASCII("smath: MathType 3.x" ); +} + +//***************************************************************************************************************** +::rtl::OUString XCDGenerator::impl_getOldFilterName( const ::rtl::OUString& sNewName ) +{ + ::rtl::OUString sOldName; + ConstStringHashIterator pEntry = m_aData.aOldFilterNamesHash.find(sNewName); + if( pEntry==m_aData.aOldFilterNamesHash.end() ) + { + sOldName = sNewName; + } + else + { + sOldName = m_aData.aOldFilterNamesHash[sNewName]; + } + return sOldName; +} + +//***************************************************************************************************************** +void XCDGenerator::impl_classifyType( const AppMember& rData, const ::rtl::OUString& sTypeName, EFilterPackage& ePackage ) +{ + ePackage = E_STANDARD; + + // Step over all registered filters for this type ... + // Classify all of these filters. If one of them a standard filter ... + // type must be a standard type too - otherwise not! + + CheckedStringListIterator pIterator ; + ::rtl::OUString sFilterName ; + sal_Int32 nOrder ; + while( rData.pFilterCache->searchFilterForType( sTypeName, pIterator, sFilterName ) == sal_True ) + { + EFilterPackage eFilterPackage; + XCDGenerator::impl_classifyFilter( rData, sFilterName, eFilterPackage, nOrder ); + if( eFilterPackage == E_STANDARD ) + { + ePackage = E_STANDARD; + break; + } + } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_classifyFilter( const AppMember& rData, const ::rtl::OUString& sFilterName, EFilterPackage& ePackage, sal_Int32& nOrder ) +{ + // a) For versions less then 4 => use hard coded list of filter names to differ between standard or additional filters. + // Why? This version don't support the order flag or hasn't set it right! + // b) For version greater then 3 => use order of currently cached types in FilterCache! + + ePackage = E_STANDARD; + nOrder = 0; + + // writer + if( sFilterName == DECLARE_ASCII("writer_StarOffice_XML_Writer" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("writer_StarOffice_XML_Writer_Template" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("writer_StarWriter_50" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("writer_StarWriter_50_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 4; } else + if( sFilterName == DECLARE_ASCII("writer_StarWriter_40" ) ) { ePackage = E_STANDARD; nOrder = 5; } else + if( sFilterName == DECLARE_ASCII("writer_StarWriter_40_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 6; } else + if( sFilterName == DECLARE_ASCII("writer_StarWriter_30" ) ) { ePackage = E_STANDARD; nOrder = 7; } else + if( sFilterName == DECLARE_ASCII("writer_StarWriter_30_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 8; } else + if( sFilterName == DECLARE_ASCII("writer_StarWriter_20" ) ) { ePackage = E_STANDARD; nOrder = 9; } else + if( sFilterName == DECLARE_ASCII("writer_MS_Word_97" ) ) { ePackage = E_STANDARD; nOrder = 10; } else + if( sFilterName == DECLARE_ASCII("writer_MS_Word_97_Vorlage" ) ) { ePackage = E_STANDARD; nOrder = 11; } else + if( sFilterName == DECLARE_ASCII("writer_MS_Word_95" ) ) { ePackage = E_STANDARD; nOrder = 12; } else + if( sFilterName == DECLARE_ASCII("writer_MS_Word_95_Vorlage" ) ) { ePackage = E_STANDARD; nOrder = 13; } else + if( sFilterName == DECLARE_ASCII("writer_MS_WinWord_2x_W4W" ) ) { ePackage = E_STANDARD; nOrder = 14; } else + if( sFilterName == DECLARE_ASCII("writer_MS_WinWord_1x_W4W" ) ) { ePackage = E_STANDARD; nOrder = 15; } else + if( sFilterName == DECLARE_ASCII("writer_MS_Word_6x_W4W" ) ) { ePackage = E_STANDARD; nOrder = 16; } else + if( sFilterName == DECLARE_ASCII("writer_MS_Word_5x_W4W" ) ) { ePackage = E_STANDARD; nOrder = 17; } else + if( sFilterName == DECLARE_ASCII("writer_MS_Word_4x_W4W" ) ) { ePackage = E_STANDARD; nOrder = 18; } else + if( sFilterName == DECLARE_ASCII("writer_MS_Word_3x_W4W" ) ) { ePackage = E_STANDARD; nOrder = 19; } else + if( sFilterName == DECLARE_ASCII("writer_WordPerfect_Win_70_W4W" ) ) { ePackage = E_STANDARD; nOrder = 20; } else + if( sFilterName == DECLARE_ASCII("writer_WordPerfect_Win_61_W4W" ) ) { ePackage = E_STANDARD; nOrder = 21; } else + if( sFilterName == DECLARE_ASCII("writer_WordPerfect_Win_60_W4W" ) ) { ePackage = E_STANDARD; nOrder = 22; } else + if( sFilterName == DECLARE_ASCII("writer_WordPerfect_Win_51_52_W4W" ) ) { ePackage = E_STANDARD; nOrder = 23; } else + if( sFilterName == DECLARE_ASCII("writer_HTML_StarWriter" ) ) { ePackage = E_STANDARD; nOrder = 24; } else + if( sFilterName == DECLARE_ASCII("writer_Text" ) ) { ePackage = E_STANDARD; nOrder = 25; } else + if( sFilterName == DECLARE_ASCII("writer_Text_encoded" ) ) { ePackage = E_STANDARD; nOrder = 26; } else + if( sFilterName == DECLARE_ASCII("writer_Text_DOS" ) ) { ePackage = E_STANDARD; nOrder = 27; } else + if( sFilterName == DECLARE_ASCII("writer_Text_Unix" ) ) { ePackage = E_STANDARD; nOrder = 28; } else + if( sFilterName == DECLARE_ASCII("writer_Text_Mac" ) ) { ePackage = E_STANDARD; nOrder = 29; } else + if( sFilterName == DECLARE_ASCII("writer_Rich_Text_Format" ) ) { ePackage = E_STANDARD; nOrder = 30; } + + // writer web + if( sFilterName == DECLARE_ASCII("writer_web_HTML" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("writer_web_StarOffice_XML_Writer" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("writer_web_StarOffice_XML_Writer_Web_Template" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("writer_web_StarWriter_50" ) ) { ePackage = E_STANDARD; nOrder = 4; } else + if( sFilterName == DECLARE_ASCII("writer_web_StarWriterWeb_50_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 5; } else + if( sFilterName == DECLARE_ASCII("writer_web_StarWriter_40" ) ) { ePackage = E_STANDARD; nOrder = 6; } else + if( sFilterName == DECLARE_ASCII("writer_web_StarWriterWeb_40_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 7; } else + if( sFilterName == DECLARE_ASCII("writer_web_StarWriter_30" ) ) { ePackage = E_STANDARD; nOrder = 8; } else + if( sFilterName == DECLARE_ASCII("writer_web_Text_StarWriterWeb" ) ) { ePackage = E_STANDARD; nOrder = 9; } else + if( sFilterName == DECLARE_ASCII("writer_web_Text_encoded" ) ) { ePackage = E_STANDARD; nOrder = 10; } else + if( sFilterName == DECLARE_ASCII("writer_web_Text_DOS_StarWriterWeb" ) ) { ePackage = E_STANDARD; nOrder = 11; } else + if( sFilterName == DECLARE_ASCII("writer_web_Text_Unix_StarWriterWeb" ) ) { ePackage = E_STANDARD; nOrder = 12; } else + if( sFilterName == DECLARE_ASCII("writer_web_Text_Mac_StarWriterWeb" ) ) { ePackage = E_STANDARD; nOrder = 13; } + + // global document + if( sFilterName == DECLARE_ASCII("writer_globaldocument_StarOffice_XML_Writer_GlobalDocument" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("writer_globaldocument_StarOffice_XML_Writer" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("writer_globaldocument_StarWriter_50" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("writer_globaldocument_StarWriter_50GlobalDocument" ) ) { ePackage = E_STANDARD; nOrder = 4; } else + if( sFilterName == DECLARE_ASCII("writer_globaldocument_StarWriter_40" ) ) { ePackage = E_STANDARD; nOrder = 5; } else + if( sFilterName == DECLARE_ASCII("writer_globaldocument_StarWriter_40GlobalDocument" ) ) { ePackage = E_STANDARD; nOrder = 6; } else + if( sFilterName == DECLARE_ASCII("writer_globaldocument_StarWriter_30" ) ) { ePackage = E_STANDARD; nOrder = 7; } else + if( sFilterName == DECLARE_ASCII("writer_globaldocument_Text_encoded" ) ) { ePackage = E_STANDARD; nOrder = 8; } + + // calc + if( sFilterName == DECLARE_ASCII("calc_StarOffice_XML_Calc" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("calc_StarOffice_XML_Calc_Template" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("calc_StarCalc_50" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("calc_StarCalc_50_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 4; } else + if( sFilterName == DECLARE_ASCII("calc_StarCalc_40" ) ) { ePackage = E_STANDARD; nOrder = 5; } else + if( sFilterName == DECLARE_ASCII("calc_StarCalc_40_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 6; } else + if( sFilterName == DECLARE_ASCII("calc_StarCalc_30" ) ) { ePackage = E_STANDARD; nOrder = 7; } else + if( sFilterName == DECLARE_ASCII("calc_StarCalc_30_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 8; } else + if( sFilterName == DECLARE_ASCII("calc_StarCalc_10" ) ) { ePackage = E_STANDARD; nOrder = 9; } else + if( sFilterName == DECLARE_ASCII("calc_MS_Excel_97" ) ) { ePackage = E_STANDARD; nOrder = 10; } else + if( sFilterName == DECLARE_ASCII("calc_MS_Excel_97_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 11; } else + if( sFilterName == DECLARE_ASCII("calc_MS_Excel_95" ) ) { ePackage = E_STANDARD; nOrder = 12; } else + if( sFilterName == DECLARE_ASCII("calc_MS_Excel_95_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 13; } else + if( sFilterName == DECLARE_ASCII("calc_MS_Excel_5095" ) ) { ePackage = E_STANDARD; nOrder = 14; } else + if( sFilterName == DECLARE_ASCII("calc_MS_Excel_5095_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 15; } else + if( sFilterName == DECLARE_ASCII("calc_MS_Excel_40" ) ) { ePackage = E_STANDARD; nOrder = 16; } else + if( sFilterName == DECLARE_ASCII("calc_MS_Excel_40_VorlageTemplate" ) ) { ePackage = E_STANDARD; nOrder = 17; } else + if( sFilterName == DECLARE_ASCII("calc_HTML_StarCalc" ) ) { ePackage = E_STANDARD; nOrder = 18; } else + if( sFilterName == DECLARE_ASCII("calc_HTML_WebQuery" ) ) { ePackage = E_STANDARD; nOrder = 19; } else + if( sFilterName == DECLARE_ASCII("calc_Rich_Text_Format_StarCalc" ) ) { ePackage = E_STANDARD; nOrder = 20; } else + if( sFilterName == DECLARE_ASCII("calc_Text_txt_csv_StarCalc" ) ) { ePackage = E_STANDARD; nOrder = 21; } else + if( sFilterName == DECLARE_ASCII("calc_dBase" ) ) { ePackage = E_STANDARD; nOrder = 22; } else + if( sFilterName == DECLARE_ASCII("calc_Lotus" ) ) { ePackage = E_STANDARD; nOrder = 23; } else + if( sFilterName == DECLARE_ASCII("calc_SYLK" ) ) { ePackage = E_STANDARD; nOrder = 24; } else + if( sFilterName == DECLARE_ASCII("calc_DIF" ) ) { ePackage = E_STANDARD; nOrder = 25; } + + // impress + if( sFilterName == DECLARE_ASCII("impress_StarOffice_XML_Impress" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("impress_StarOffice_XML_Impress_Template" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("impress_StarImpress_50" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("impress_StarImpress_50_Vorlage" ) ) { ePackage = E_STANDARD; nOrder = 4; } else + if( sFilterName == DECLARE_ASCII("impress_StarImpress_50_packed" ) ) { ePackage = E_STANDARD; nOrder = 5; } else + if( sFilterName == DECLARE_ASCII("impress_StarImpress_40" ) ) { ePackage = E_STANDARD; nOrder = 6; } else + if( sFilterName == DECLARE_ASCII("impress_StarImpress_40_Vorlage" ) ) { ePackage = E_STANDARD; nOrder = 7; } else + if( sFilterName == DECLARE_ASCII("impress_MS_PowerPoint_97" ) ) { ePackage = E_STANDARD; nOrder = 8; } else + if( sFilterName == DECLARE_ASCII("impress_MS_PowerPoint_97_Vorlage" ) ) { ePackage = E_STANDARD; nOrder = 9; } else + if( sFilterName == DECLARE_ASCII("impress_StarOffice_XML_Draw" ) ) { ePackage = E_STANDARD; nOrder = 10; } else + if( sFilterName == DECLARE_ASCII("impress_StarDraw_50_StarImpress" ) ) { ePackage = E_STANDARD; nOrder = 11; } else + if( sFilterName == DECLARE_ASCII("impress_StarDraw_50_Vorlage_StarImpress" ) ) { ePackage = E_STANDARD; nOrder = 12; } else + if( sFilterName == DECLARE_ASCII("impress_StarDraw_30_StarImpress" ) ) { ePackage = E_STANDARD; nOrder = 13; } else + if( sFilterName == DECLARE_ASCII("impress_StarDraw_30_Vorlage_StarImpress" ) ) { ePackage = E_STANDARD; nOrder = 14; } else + if( sFilterName == DECLARE_ASCII("impress_CGM_Computer_Graphics_Metafile" ) ) { ePackage = E_STANDARD; nOrder = 15; } + + // draw + if( sFilterName == DECLARE_ASCII("draw_StarOffice_XML_Draw" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("draw_StarOffice_XML_Draw_Template" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("draw_StarDraw_50" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("draw_StarDraw_50_Vorlage" ) ) { ePackage = E_STANDARD; nOrder = 4; } else + if( sFilterName == DECLARE_ASCII("draw_StarDraw_30" ) ) { ePackage = E_STANDARD; nOrder = 5; } else + if( sFilterName == DECLARE_ASCII("draw_StarDraw_30_Vorlage" ) ) { ePackage = E_STANDARD; nOrder = 6; } else + if( sFilterName == DECLARE_ASCII("draw_StarOffice_XML_Impress" ) ) { ePackage = E_STANDARD; nOrder = 7; } else + if( sFilterName == DECLARE_ASCII("draw_StarImpress_50_StarDraw" ) ) { ePackage = E_STANDARD; nOrder = 8; } else + if( sFilterName == DECLARE_ASCII("draw_StarImpress_50_Vorlage_StarDraw" ) ) { ePackage = E_STANDARD; nOrder = 9; } else + if( sFilterName == DECLARE_ASCII("draw_StarImpress_40_StarDraw" ) ) { ePackage = E_STANDARD; nOrder = 10; } else + if( sFilterName == DECLARE_ASCII("draw_StarImpress_40_Vorlage_StarDraw" ) ) { ePackage = E_STANDARD; nOrder = 11; } else + if( sFilterName == DECLARE_ASCII("draw_SGV_StarDraw_20" ) ) { ePackage = E_STANDARD; nOrder = 12; } else + if( sFilterName == DECLARE_ASCII("draw_SGF_StarOffice_Writer_SGF" ) ) { ePackage = E_STANDARD; nOrder = 13; } else + if( sFilterName == DECLARE_ASCII("draw_SVM_StarView_Metafile" ) ) { ePackage = E_STANDARD; nOrder = 14; } else + if( sFilterName == DECLARE_ASCII("draw_WMF_MS_Windows_Metafile" ) ) { ePackage = E_STANDARD; nOrder = 15; } else + if( sFilterName == DECLARE_ASCII("draw_EMF_MS_Windows_Metafile" ) ) { ePackage = E_STANDARD; nOrder = 16; } else + if( sFilterName == DECLARE_ASCII("draw_EPS_Encapsulated_PostScript" ) ) { ePackage = E_STANDARD; nOrder = 17; } else + if( sFilterName == DECLARE_ASCII("draw_DXF_AutoCAD_Interchange" ) ) { ePackage = E_STANDARD; nOrder = 18; } else + if( sFilterName == DECLARE_ASCII("draw_BMP_MS_Windows" ) ) { ePackage = E_STANDARD; nOrder = 19; } else + if( sFilterName == DECLARE_ASCII("draw_GIF_Graphics_Interchange" ) ) { ePackage = E_STANDARD; nOrder = 20; } else + if( sFilterName == DECLARE_ASCII("draw_JPG_JPEG" ) ) { ePackage = E_STANDARD; nOrder = 21; } else + if( sFilterName == DECLARE_ASCII("draw_MET_OS2_Metafile" ) ) { ePackage = E_STANDARD; nOrder = 22; } else + if( sFilterName == DECLARE_ASCII("draw_PBM_Portable_Bitmap" ) ) { ePackage = E_STANDARD; nOrder = 23; } else + if( sFilterName == DECLARE_ASCII("draw_PCD_Photo_CD_Base" ) ) { ePackage = E_STANDARD; nOrder = 24; } else + if( sFilterName == DECLARE_ASCII("draw_PCD_Photo_CD_Base4" ) ) { ePackage = E_STANDARD; nOrder = 25; } else + if( sFilterName == DECLARE_ASCII("draw_PCD_Photo_CD_Base16" ) ) { ePackage = E_STANDARD; nOrder = 26; } else + if( sFilterName == DECLARE_ASCII("draw_PCT_Mac_Pict" ) ) { ePackage = E_STANDARD; nOrder = 27; } else + if( sFilterName == DECLARE_ASCII("draw_PCX_Zsoft_Paintbrush" ) ) { ePackage = E_STANDARD; nOrder = 28; } else + if( sFilterName == DECLARE_ASCII("draw_PGM_Portable_Graymap" ) ) { ePackage = E_STANDARD; nOrder = 29; } else + if( sFilterName == DECLARE_ASCII("draw_PNG_Portable_Network_Graphic" ) ) { ePackage = E_STANDARD; nOrder = 30; } else + if( sFilterName == DECLARE_ASCII("draw_PPM_Portable_Pixelmap" ) ) { ePackage = E_STANDARD; nOrder = 31; } else + if( sFilterName == DECLARE_ASCII("draw_PSD_Adobe_Photoshop" ) ) { ePackage = E_STANDARD; nOrder = 32; } else + if( sFilterName == DECLARE_ASCII("draw_RAS_Sun_Rasterfile" ) ) { ePackage = E_STANDARD; nOrder = 33; } else + if( sFilterName == DECLARE_ASCII("draw_TGA_Truevision_TARGA" ) ) { ePackage = E_STANDARD; nOrder = 34; } else + if( sFilterName == DECLARE_ASCII("draw_TIF_Tag_Image_File" ) ) { ePackage = E_STANDARD; nOrder = 35; } else + if( sFilterName == DECLARE_ASCII("draw_XBM_X_Consortium" ) ) { ePackage = E_STANDARD; nOrder = 36; } else + if( sFilterName == DECLARE_ASCII("draw_XPM" ) ) { ePackage = E_STANDARD; nOrder = 37; } + + // chart + if( sFilterName == DECLARE_ASCII("chart_StarOffice_XML_Chart" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("chart_StarChart_50" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("chart_StarChart_40" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("chart_StarChart_30" ) ) { ePackage = E_STANDARD; nOrder = 4; } + + // math + if( sFilterName == DECLARE_ASCII("math_StarOffice_XML_Math" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("math_StarMath_50" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("math_StarMath_40" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("math_StarMath_30" ) ) { ePackage = E_STANDARD; nOrder = 4; } else + if( sFilterName == DECLARE_ASCII("math_StarMath_20" ) ) { ePackage = E_STANDARD; nOrder = 5; } else + if( sFilterName == DECLARE_ASCII("math_MathML_XML_Math" ) ) { ePackage = E_STANDARD; nOrder = 6; } else + if( sFilterName == DECLARE_ASCII("math_MathType_3x" ) ) { ePackage = E_STANDARD; nOrder = 7; } + + // graphics + if( sFilterName == DECLARE_ASCII("bmp_Import" ) ) { ePackage = E_STANDARD; nOrder = 1; } else + if( sFilterName == DECLARE_ASCII("bmp_Export" ) ) { ePackage = E_STANDARD; nOrder = 2; } else + if( sFilterName == DECLARE_ASCII("dxf_Import" ) ) { ePackage = E_STANDARD; nOrder = 3; } else + if( sFilterName == DECLARE_ASCII("emf_Import" ) ) { ePackage = E_STANDARD; nOrder = 4; } else + if( sFilterName == DECLARE_ASCII("emf_Export" ) ) { ePackage = E_STANDARD; nOrder = 5; } else + if( sFilterName == DECLARE_ASCII("eps_Import" ) ) { ePackage = E_STANDARD; nOrder = 6; } else + if( sFilterName == DECLARE_ASCII("eps_Export" ) ) { ePackage = E_STANDARD; nOrder = 7; } else + if( sFilterName == DECLARE_ASCII("gif_Import" ) ) { ePackage = E_STANDARD; nOrder = 8; } else + if( sFilterName == DECLARE_ASCII("gif_Export" ) ) { ePackage = E_STANDARD; nOrder = 9; } else + if( sFilterName == DECLARE_ASCII("jpg_Import" ) ) { ePackage = E_STANDARD; nOrder = 10; } else + if( sFilterName == DECLARE_ASCII("jpg_Export" ) ) { ePackage = E_STANDARD; nOrder = 11; } else + if( sFilterName == DECLARE_ASCII("met_Import" ) ) { ePackage = E_STANDARD; nOrder = 12; } else + if( sFilterName == DECLARE_ASCII("met_Export" ) ) { ePackage = E_STANDARD; nOrder = 13; } else + if( sFilterName == DECLARE_ASCII("pbm_Import" ) ) { ePackage = E_STANDARD; nOrder = 14; } else + if( sFilterName == DECLARE_ASCII("pbm_Export" ) ) { ePackage = E_STANDARD; nOrder = 15; } else + if( sFilterName == DECLARE_ASCII("pcd_Import_Base16" ) ) { ePackage = E_STANDARD; nOrder = 16; } else + if( sFilterName == DECLARE_ASCII("pcd_Import_Base4" ) ) { ePackage = E_STANDARD; nOrder = 17; } else + if( sFilterName == DECLARE_ASCII("pcd_Import_Base" ) ) { ePackage = E_STANDARD; nOrder = 18; } else + if( sFilterName == DECLARE_ASCII("pct_Import" ) ) { ePackage = E_STANDARD; nOrder = 19; } else + if( sFilterName == DECLARE_ASCII("pct_Export" ) ) { ePackage = E_STANDARD; nOrder = 20; } else + if( sFilterName == DECLARE_ASCII("pcx_Import" ) ) { ePackage = E_STANDARD; nOrder = 21; } else + if( sFilterName == DECLARE_ASCII("pgm_Import" ) ) { ePackage = E_STANDARD; nOrder = 22; } else + if( sFilterName == DECLARE_ASCII("pgm_Export" ) ) { ePackage = E_STANDARD; nOrder = 23; } else + if( sFilterName == DECLARE_ASCII("png_Import" ) ) { ePackage = E_STANDARD; nOrder = 24; } else + if( sFilterName == DECLARE_ASCII("png_Export" ) ) { ePackage = E_STANDARD; nOrder = 25; } else + if( sFilterName == DECLARE_ASCII("ppm_Import" ) ) { ePackage = E_STANDARD; nOrder = 26; } else + if( sFilterName == DECLARE_ASCII("ppm_Export" ) ) { ePackage = E_STANDARD; nOrder = 27; } else + if( sFilterName == DECLARE_ASCII("psd_Import" ) ) { ePackage = E_STANDARD; nOrder = 28; } else + if( sFilterName == DECLARE_ASCII("ras_Import" ) ) { ePackage = E_STANDARD; nOrder = 29; } else + if( sFilterName == DECLARE_ASCII("ras_Export" ) ) { ePackage = E_STANDARD; nOrder = 30; } else + if( sFilterName == DECLARE_ASCII("sgf_Import" ) ) { ePackage = E_STANDARD; nOrder = 31; } else + if( sFilterName == DECLARE_ASCII("sgv_Import" ) ) { ePackage = E_STANDARD; nOrder = 32; } else + if( sFilterName == DECLARE_ASCII("svg_Export" ) ) { ePackage = E_STANDARD; nOrder = 33; } else + if( sFilterName == DECLARE_ASCII("svm_Import" ) ) { ePackage = E_STANDARD; nOrder = 34; } else + if( sFilterName == DECLARE_ASCII("svm_Export" ) ) { ePackage = E_STANDARD; nOrder = 35; } else + if( sFilterName == DECLARE_ASCII("tga_Import" ) ) { ePackage = E_STANDARD; nOrder = 36; } else + if( sFilterName == DECLARE_ASCII("tif_Import" ) ) { ePackage = E_STANDARD; nOrder = 37; } else + if( sFilterName == DECLARE_ASCII("tif_Export" ) ) { ePackage = E_STANDARD; nOrder = 38; } else + if( sFilterName == DECLARE_ASCII("wmf_Import" ) ) { ePackage = E_STANDARD; nOrder = 39; } else + if( sFilterName == DECLARE_ASCII("wmf_Export" ) ) { ePackage = E_STANDARD; nOrder = 40; } else + if( sFilterName == DECLARE_ASCII("xbm_Import" ) ) { ePackage = E_STANDARD; nOrder = 41; } else + if( sFilterName == DECLARE_ASCII("xpm_Import" ) ) { ePackage = E_STANDARD; nOrder = 42; } else + if( sFilterName == DECLARE_ASCII("xpm_Export" ) ) { ePackage = E_STANDARD; nOrder = 43; } +} + +//***************************************************************************************************************** +void XCDGenerator::impl_orderAlphabetical( css::uno::Sequence< ::rtl::OUString >& lList ) +{ + ::std::vector< ::rtl::OUString > lSortedList; + sal_Int32 nCount ; + sal_Int32 nItem ; + + // Copy sequence to vector + nCount = lList.getLength(); + for( nItem=0; nItem<nCount; ++nItem ) + { + lSortedList.push_back( lList[nItem] ); + } + + // sort in a alphabetical order + ::std::sort( lSortedList.begin(), lSortedList.end() ); + + // copy sorted list back to sequence + nItem = 0; + for( ::std::vector< ::rtl::OUString >::iterator pIterator=lSortedList.begin(); pIterator!=lSortedList.end(); ++pIterator ) + { + lList[nItem] = *pIterator; + ++nItem; + } +} + +//***************************************************************************************************************** +class ModifiedUTF7Buffer +{ + rtl::OUStringBuffer & m_rBuffer; + sal_uInt32 m_nValue; + int m_nFilled; + +public: + ModifiedUTF7Buffer(rtl::OUStringBuffer * pTheBuffer): + m_rBuffer(*pTheBuffer), m_nFilled(0) {} + + inline void write(sal_Unicode c); + + void flush(); +}; + +inline void ModifiedUTF7Buffer::write(sal_Unicode c) +{ + switch (m_nFilled) + { + case 0: + m_nValue = sal_uInt32(c) << 8; + m_nFilled = 2; + break; + + case 1: + m_nValue |= sal_uInt32(c); + m_nFilled = 3; + flush(); + break; + + case 2: + m_nValue |= sal_uInt32(c) >> 8; + m_nFilled = 3; + flush(); + m_nValue = (sal_uInt32(c) & 0xFF) << 16; + m_nFilled = 1; + break; + } +} + +void ModifiedUTF7Buffer::flush() +{ + static sal_Unicode const aModifiedBase64[64] + = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '.' }; + switch (m_nFilled) + { + case 1: + m_rBuffer.append(aModifiedBase64[m_nValue >> 18]); + m_rBuffer.append(aModifiedBase64[m_nValue >> 12 & 63]); + break; + + case 2: + m_rBuffer.append(aModifiedBase64[m_nValue >> 18]); + m_rBuffer.append(aModifiedBase64[m_nValue >> 12 & 63]); + m_rBuffer.append(aModifiedBase64[m_nValue >> 6 & 63]); + break; + + case 3: + m_rBuffer.append(aModifiedBase64[m_nValue >> 18]); + m_rBuffer.append(aModifiedBase64[m_nValue >> 12 & 63]); + m_rBuffer.append(aModifiedBase64[m_nValue >> 6 & 63]); + m_rBuffer.append(aModifiedBase64[m_nValue & 63]); + break; + } + m_nFilled = 0; + m_nValue = 0; +} + + +sal_Bool XCDGenerator::impl_isUsAsciiAlphaDigit(sal_Unicode c, sal_Bool bDigitAllowed) +{ + return c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' + || bDigitAllowed && c >= '0' && c <= '9'; +} + +::rtl::OUString XCDGenerator::impl_encodeSetName( const ::rtl::OUString& rSource ) +{ + return impl_encodeSpecialSigns( rSource ); +/* + rtl::OUStringBuffer aTarget; + + sal_Unicode const * pBegin = rSource.getStr(); + sal_Unicode const * pEnd = pBegin + rSource.getLength(); + sal_Unicode const * pCopyEnd = pBegin; + sal_Unicode const * p = pBegin; + while (p != pEnd) + { + sal_Unicode c = *p; + if (!impl_isUsAsciiAlphaDigit(c,p != pBegin)) + switch (c) + { + case '-': + case '.': + if (p != pBegin) + break; + default: + aTarget.append(pCopyEnd, p - pCopyEnd); + aTarget.append(sal_Unicode('_')); + ModifiedUTF7Buffer aBuffer(&aTarget); + for (;;) + { + aBuffer.write(c); + ++p; + if (p == pEnd) + break; + c = *p; + if (impl_isUsAsciiAlphaDigit(c) || c == '-' || c == '.') + break; + } + aBuffer.flush(); + aTarget.append(sal_Unicode('_')); + pCopyEnd = p; + continue; + } + ++p; + } + + if (pCopyEnd == pBegin) + return rSource; + else + { + aTarget.append(pCopyEnd, pEnd - pCopyEnd); + return aTarget.makeStringAndClear(); + } +*/ +} |