xref: /trunk/main/bridges/test/testcomp.cxx (revision d8dff77764cb74143fabc617dc8ee25d946bae78)
161dff127SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
361dff127SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
461dff127SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
561dff127SAndrew Rist  * distributed with this work for additional information
661dff127SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
761dff127SAndrew Rist  * to you under the Apache License, Version 2.0 (the
861dff127SAndrew Rist  * "License"); you may not use this file except in compliance
961dff127SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
1161dff127SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
1361dff127SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1461dff127SAndrew Rist  * software distributed under the License is distributed on an
1561dff127SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1661dff127SAndrew Rist  * KIND, either express or implied.  See the License for the
1761dff127SAndrew Rist  * specific language governing permissions and limitations
1861dff127SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
2061dff127SAndrew Rist  *************************************************************/
2161dff127SAndrew Rist 
2261dff127SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_bridges.hxx"
26cdf0e10cSrcweir #include <string.h>
27cdf0e10cSrcweir #include <stdlib.h>
28cdf0e10cSrcweir #include <osl/time.h>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <uno/threadpool.h>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <osl/mutex.hxx>
33cdf0e10cSrcweir #include <osl/diagnose.h>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <test/XTestFactory.hpp>
36cdf0e10cSrcweir #include <cppuhelper/servicefactory.hxx>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir #include <com/sun/star/bridge/XInstanceProvider.hpp>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include <com/sun/star/registry/XImplementationRegistration.hpp>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <com/sun/star/test/performance/XPerformanceTest.hpp>
43cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #include <cppuhelper/weak.hxx>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir using namespace ::test;
48cdf0e10cSrcweir using namespace ::rtl;
49cdf0e10cSrcweir using namespace ::test;
50cdf0e10cSrcweir using namespace ::com::sun::star::uno;
51cdf0e10cSrcweir using namespace ::com::sun::star::bridge;
52cdf0e10cSrcweir using namespace ::com::sun::star::lang;
53cdf0e10cSrcweir using namespace ::com::sun::star::registry;
54cdf0e10cSrcweir using namespace ::com::sun::star::test::performance;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir #include "testcomp.h"
57cdf0e10cSrcweir 
58cdf0e10cSrcweir 
parseCommandLine(char * argv[],::rtl::OUString * pConnection,::rtl::OUString * pProtocol,sal_Bool * pbLatency,sal_Bool * pbReverse)59cdf0e10cSrcweir void parseCommandLine( char *argv[] ,
60cdf0e10cSrcweir                        ::rtl::OUString *pConnection , ::rtl::OUString *pProtocol ,
61cdf0e10cSrcweir                        sal_Bool *pbLatency , sal_Bool *pbReverse)
62cdf0e10cSrcweir {
63cdf0e10cSrcweir     sal_Int32 nArgIndex = 1;
64cdf0e10cSrcweir     if( ! strcmp( argv[1] , "-r" ) )
65cdf0e10cSrcweir     {
66cdf0e10cSrcweir         nArgIndex = 2;
67cdf0e10cSrcweir         *pbReverse = sal_True;
68cdf0e10cSrcweir     }
69cdf0e10cSrcweir     else if( ! strcmp( argv[1] , "-latency" ) )
70cdf0e10cSrcweir     {
71cdf0e10cSrcweir         *pbLatency = sal_True;
72cdf0e10cSrcweir         nArgIndex = 2;
73cdf0e10cSrcweir     }
74cdf0e10cSrcweir 
75cdf0e10cSrcweir     OUString sTemp = OUString::createFromAscii( argv[nArgIndex] );
76cdf0e10cSrcweir     sal_Int32 nIndex = sTemp.indexOf( ';' );
77cdf0e10cSrcweir     if( -1 == nIndex )
78cdf0e10cSrcweir     {
79cdf0e10cSrcweir         *pConnection = sTemp;
80cdf0e10cSrcweir         *pProtocol = OUString( RTL_CONSTASCII_USTRINGPARAM( "iiop" ) );
81cdf0e10cSrcweir     }
82cdf0e10cSrcweir     else
83cdf0e10cSrcweir     {
84cdf0e10cSrcweir         *pConnection = sTemp.copy( 0 , nIndex );
85cdf0e10cSrcweir         *pProtocol = sTemp.copy( nIndex+1, sTemp.getLength() - (nIndex+1) );
86cdf0e10cSrcweir     }
87cdf0e10cSrcweir }
88cdf0e10cSrcweir 
queryInterface(const Type & aType)89cdf0e10cSrcweir Any OInstanceProvider::queryInterface( const Type & aType ) throw ( RuntimeException )
90cdf0e10cSrcweir {
91cdf0e10cSrcweir     Any a = ::cppu::queryInterface( aType ,
92cdf0e10cSrcweir             SAL_STATIC_CAST( XInstanceProvider * , this ) );
93cdf0e10cSrcweir     if( a.hasValue() )
94cdf0e10cSrcweir     {
95cdf0e10cSrcweir         return a;
96cdf0e10cSrcweir     }
97cdf0e10cSrcweir     return OWeakObject::queryInterface( aType );
98cdf0e10cSrcweir }
99cdf0e10cSrcweir 
100cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
getInstance(const::rtl::OUString & sObjectName)101cdf0e10cSrcweir     OInstanceProvider::getInstance( const ::rtl::OUString& sObjectName )
102cdf0e10cSrcweir         throw(::com::sun::star::container::NoSuchElementException,
103cdf0e10cSrcweir               ::com::sun::star::uno::RuntimeException)
104cdf0e10cSrcweir {
105cdf0e10cSrcweir     // Tries to get the PerformanceTestObject
106cdf0e10cSrcweir     if( sObjectName == OUString( RTL_CONSTASCII_USTRINGPARAM( "TestRemoteObject" ) ) )
107cdf0e10cSrcweir     {
108cdf0e10cSrcweir         return m_rSMgr->createInstance(
109cdf0e10cSrcweir             OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.test.performance.PerformanceTestObject") ) );
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir     return Reference < XInterface > ( (::cppu::OWeakObject * ) new OTestFactory() );
112cdf0e10cSrcweir }
113cdf0e10cSrcweir 
114cdf0e10cSrcweir class ServiceImpl
115cdf0e10cSrcweir     : public XServiceInfo
116cdf0e10cSrcweir     , public XPerformanceTest
117cdf0e10cSrcweir {
118cdf0e10cSrcweir     OUString _aDummyString;
119cdf0e10cSrcweir     Any _aDummyAny;
120cdf0e10cSrcweir     Sequence< Reference< XInterface > > _aDummySequence;
121cdf0e10cSrcweir     ComplexTypes _aDummyStruct;
122cdf0e10cSrcweir     RuntimeException _aDummyRE;
123cdf0e10cSrcweir 
124cdf0e10cSrcweir     sal_Int32 _nRef;
125cdf0e10cSrcweir 
126cdf0e10cSrcweir public:
ServiceImpl()127cdf0e10cSrcweir     ServiceImpl()
128cdf0e10cSrcweir         : _nRef( 0 )
129cdf0e10cSrcweir         {}
ServiceImpl(const Reference<XMultiServiceFactory> &)130cdf0e10cSrcweir     ServiceImpl( const Reference< XMultiServiceFactory > & /* xMgr */)
131cdf0e10cSrcweir         : _nRef( 0 )
132cdf0e10cSrcweir         {}
133cdf0e10cSrcweir 
134cdf0e10cSrcweir     // XInterface
queryInterface(const::com::sun::star::uno::Type & aType)135cdf0e10cSrcweir     virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException)
136cdf0e10cSrcweir     {
137cdf0e10cSrcweir         // execution time remains appr. constant any time
138cdf0e10cSrcweir         Any aRet;
139cdf0e10cSrcweir         if (aType == ::getCppuType( (const Reference< XInterface > *)0 ))
140cdf0e10cSrcweir         {
141cdf0e10cSrcweir             void * p = (XInterface *)(XPerformanceTest *)this;
142cdf0e10cSrcweir             aRet.setValue( &p, ::getCppuType( (const Reference< XInterface > *)0 ) );
143cdf0e10cSrcweir         }
144cdf0e10cSrcweir         if (aType == ::getCppuType( (const Reference< XPerformanceTest > *)0 ))
145cdf0e10cSrcweir         {
146cdf0e10cSrcweir             void * p = (XPerformanceTest *)this;
147cdf0e10cSrcweir             aRet.setValue( &p, ::getCppuType( (const Reference< XPerformanceTest > *)0 ) );
148cdf0e10cSrcweir         }
149cdf0e10cSrcweir         if (! aRet.hasValue())
150cdf0e10cSrcweir         {
151cdf0e10cSrcweir             void * p = (XPerformanceTest *)this;
152cdf0e10cSrcweir             Any aDummy( &p, ::getCppuType( (const Reference< XPerformanceTest > *)0 ) );
153cdf0e10cSrcweir         }
154cdf0e10cSrcweir         return aRet;
155cdf0e10cSrcweir     }
acquire()156cdf0e10cSrcweir     virtual void SAL_CALL acquire() throw()
157cdf0e10cSrcweir         { osl_incrementInterlockedCount( &_nRef ); }
release()158cdf0e10cSrcweir     virtual void SAL_CALL release() throw()
159cdf0e10cSrcweir         { if (! osl_decrementInterlockedCount( &_nRef )) delete this; }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     // XServiceInfo
162cdf0e10cSrcweir     virtual OUString SAL_CALL getImplementationName() throw (RuntimeException);
163cdf0e10cSrcweir     virtual sal_Bool SAL_CALL supportsService( const OUString & rServiceName ) throw (RuntimeException);
164cdf0e10cSrcweir     virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException);
165cdf0e10cSrcweir 
166cdf0e10cSrcweir     // Attributes
getLong_attr()167cdf0e10cSrcweir     virtual sal_Int32 SAL_CALL getLong_attr() throw(::com::sun::star::uno::RuntimeException)
168cdf0e10cSrcweir         { return 0; }
setLong_attr(sal_Int32)169cdf0e10cSrcweir     virtual void SAL_CALL setLong_attr( sal_Int32 /* _attributelong */) throw(::com::sun::star::uno::RuntimeException)
170cdf0e10cSrcweir         {}
getHyper_attr()171cdf0e10cSrcweir     virtual sal_Int64 SAL_CALL getHyper_attr() throw(::com::sun::star::uno::RuntimeException)
172cdf0e10cSrcweir         { return 0; }
setHyper_attr(sal_Int64)173cdf0e10cSrcweir     virtual void SAL_CALL setHyper_attr( sal_Int64 /* _attributehyper */) throw(::com::sun::star::uno::RuntimeException)
174cdf0e10cSrcweir         {}
getFloat_attr()175cdf0e10cSrcweir     virtual float SAL_CALL getFloat_attr() throw(::com::sun::star::uno::RuntimeException)
176cdf0e10cSrcweir         { return 0.0; }
setFloat_attr(float)177cdf0e10cSrcweir     virtual void SAL_CALL setFloat_attr( float /* _attributefloat */) throw(::com::sun::star::uno::RuntimeException)
178cdf0e10cSrcweir         {}
getDouble_attr()179cdf0e10cSrcweir     virtual double SAL_CALL getDouble_attr() throw(::com::sun::star::uno::RuntimeException)
180cdf0e10cSrcweir         { return 0.0; }
setDouble_attr(double)181cdf0e10cSrcweir     virtual void SAL_CALL setDouble_attr( double /* _attributedouble */) throw(::com::sun::star::uno::RuntimeException)
182cdf0e10cSrcweir         {}
getString_attr()183cdf0e10cSrcweir     virtual OUString SAL_CALL getString_attr() throw(::com::sun::star::uno::RuntimeException)
184cdf0e10cSrcweir         { return _aDummyString; }
setString_attr(const::rtl::OUString &)185cdf0e10cSrcweir     virtual void SAL_CALL setString_attr( const ::rtl::OUString& /* _attributestring */) throw(::com::sun::star::uno::RuntimeException)
186cdf0e10cSrcweir         {}
getInterface_attr()187cdf0e10cSrcweir     virtual Reference< XInterface > SAL_CALL getInterface_attr() throw(::com::sun::star::uno::RuntimeException)
188cdf0e10cSrcweir         { return Reference< XInterface >(); }
setInterface_attr(const Reference<XInterface> &)189cdf0e10cSrcweir     virtual void SAL_CALL setInterface_attr( const Reference< XInterface >& /* _attributeinterface */) throw(::com::sun::star::uno::RuntimeException)
190cdf0e10cSrcweir         {}
getAny_attr()191cdf0e10cSrcweir     virtual Any SAL_CALL getAny_attr() throw(::com::sun::star::uno::RuntimeException)
192cdf0e10cSrcweir         { return _aDummyAny; }
setAny_attr(const Any &)193cdf0e10cSrcweir     virtual void SAL_CALL setAny_attr( const Any& /* _attributeany */) throw(::com::sun::star::uno::RuntimeException)
194cdf0e10cSrcweir         {}
getSequence_attr()195cdf0e10cSrcweir     virtual Sequence< Reference< XInterface > > SAL_CALL getSequence_attr() throw(::com::sun::star::uno::RuntimeException)
196cdf0e10cSrcweir         { return _aDummySequence; }
setSequence_attr(const Sequence<Reference<XInterface>> &)197cdf0e10cSrcweir     virtual void SAL_CALL setSequence_attr( const Sequence< Reference< XInterface > >& /* _attributesequence */) throw(::com::sun::star::uno::RuntimeException)
198cdf0e10cSrcweir         {}
getStruct_attr()199cdf0e10cSrcweir     virtual ComplexTypes SAL_CALL getStruct_attr() throw(::com::sun::star::uno::RuntimeException)
200cdf0e10cSrcweir         { return _aDummyStruct; }
setStruct_attr(const::com::sun::star::test::performance::ComplexTypes &)201cdf0e10cSrcweir     virtual void SAL_CALL setStruct_attr( const ::com::sun::star::test::performance::ComplexTypes& /* _attributestruct */) throw(::com::sun::star::uno::RuntimeException)
202cdf0e10cSrcweir         {}
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     // Methods
getLong()205cdf0e10cSrcweir     virtual sal_Int32 SAL_CALL getLong() throw(::com::sun::star::uno::RuntimeException)
206cdf0e10cSrcweir         { return 0; }
setLong(sal_Int32)207cdf0e10cSrcweir     virtual void SAL_CALL setLong( sal_Int32 /* _long */) throw(::com::sun::star::uno::RuntimeException)
208cdf0e10cSrcweir         {}
getHyper()209cdf0e10cSrcweir     virtual sal_Int64 SAL_CALL getHyper() throw(::com::sun::star::uno::RuntimeException)
210cdf0e10cSrcweir         { return 0; }
setHyper(sal_Int64)211cdf0e10cSrcweir     virtual void SAL_CALL setHyper( sal_Int64 /* _hyper */) throw(::com::sun::star::uno::RuntimeException)
212cdf0e10cSrcweir         {}
getFloat()213cdf0e10cSrcweir     virtual float SAL_CALL getFloat() throw(::com::sun::star::uno::RuntimeException)
214cdf0e10cSrcweir         { return 0; }
setFloat(float)215cdf0e10cSrcweir     virtual void SAL_CALL setFloat( float /* _float */) throw(::com::sun::star::uno::RuntimeException)
216cdf0e10cSrcweir         {}
getDouble()217cdf0e10cSrcweir     virtual double SAL_CALL getDouble() throw(::com::sun::star::uno::RuntimeException)
218cdf0e10cSrcweir         { return 0; }
setDouble(double)219cdf0e10cSrcweir     virtual void SAL_CALL setDouble( double /* _double */) throw(::com::sun::star::uno::RuntimeException)
220cdf0e10cSrcweir         {}
getString()221cdf0e10cSrcweir     virtual OUString SAL_CALL getString() throw(::com::sun::star::uno::RuntimeException)
222cdf0e10cSrcweir         { return _aDummyString; }
setString(const::rtl::OUString &)223cdf0e10cSrcweir     virtual void SAL_CALL setString( const ::rtl::OUString& /* _string */) throw(::com::sun::star::uno::RuntimeException)
224cdf0e10cSrcweir         {}
getInterface()225cdf0e10cSrcweir     virtual Reference< XInterface > SAL_CALL getInterface() throw(::com::sun::star::uno::RuntimeException)
226cdf0e10cSrcweir         { return Reference< XInterface >(); }
setInterface(const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> &)227cdf0e10cSrcweir     virtual void SAL_CALL setInterface( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& /* _interface */) throw(::com::sun::star::uno::RuntimeException)
228cdf0e10cSrcweir         {}
getAny()229cdf0e10cSrcweir     virtual Any SAL_CALL getAny() throw(::com::sun::star::uno::RuntimeException)
230cdf0e10cSrcweir         { return _aDummyAny; }
setAny(const::com::sun::star::uno::Any &)231cdf0e10cSrcweir     virtual void SAL_CALL setAny( const ::com::sun::star::uno::Any& /* _any */) throw(::com::sun::star::uno::RuntimeException)
232cdf0e10cSrcweir         {}
getSequence()233cdf0e10cSrcweir     virtual Sequence< Reference< XInterface > > SAL_CALL getSequence() throw(::com::sun::star::uno::RuntimeException)
234cdf0e10cSrcweir         { return _aDummySequence; }
setSequence(const Sequence<Reference<XInterface>> &)235cdf0e10cSrcweir     virtual void SAL_CALL setSequence( const Sequence< Reference< XInterface > >& /*_sequence */) throw(::com::sun::star::uno::RuntimeException)
236cdf0e10cSrcweir         {}
getStruct()237cdf0e10cSrcweir     virtual ComplexTypes SAL_CALL getStruct() throw(::com::sun::star::uno::RuntimeException)
238cdf0e10cSrcweir         { return _aDummyStruct; }
setStruct(const::com::sun::star::test::performance::ComplexTypes &)239cdf0e10cSrcweir     virtual void SAL_CALL setStruct( const ::com::sun::star::test::performance::ComplexTypes& /* c */) throw(::com::sun::star::uno::RuntimeException)
240cdf0e10cSrcweir         {}
241cdf0e10cSrcweir 
242cdf0e10cSrcweir     virtual void SAL_CALL async() throw(::com::sun::star::uno::RuntimeException);
243cdf0e10cSrcweir 
sync()244cdf0e10cSrcweir     virtual void SAL_CALL sync() throw(::com::sun::star::uno::RuntimeException)
245cdf0e10cSrcweir         {}
complex_in(const::com::sun::star::test::performance::ComplexTypes & aVal)246cdf0e10cSrcweir     virtual ComplexTypes SAL_CALL complex_in( const ::com::sun::star::test::performance::ComplexTypes& aVal ) throw(::com::sun::star::uno::RuntimeException)
247cdf0e10cSrcweir         { return aVal; }
complex_inout(::com::sun::star::test::performance::ComplexTypes & aVal)248cdf0e10cSrcweir     virtual ComplexTypes SAL_CALL complex_inout( ::com::sun::star::test::performance::ComplexTypes& aVal ) throw(::com::sun::star::uno::RuntimeException)
249cdf0e10cSrcweir         { return aVal; }
complex_oneway(const::com::sun::star::test::performance::ComplexTypes &)250cdf0e10cSrcweir     virtual void SAL_CALL complex_oneway( const ::com::sun::star::test::performance::ComplexTypes& /* aVal */) throw(::com::sun::star::uno::RuntimeException)
251cdf0e10cSrcweir         {}
complex_noreturn(const::com::sun::star::test::performance::ComplexTypes &)252cdf0e10cSrcweir     virtual void SAL_CALL complex_noreturn( const ::com::sun::star::test::performance::ComplexTypes& /* aVal */) throw(::com::sun::star::uno::RuntimeException)
253cdf0e10cSrcweir         {}
createObject()254cdf0e10cSrcweir     virtual Reference< XPerformanceTest > SAL_CALL createObject() throw(::com::sun::star::uno::RuntimeException)
255cdf0e10cSrcweir         { return new ServiceImpl(); }
raiseRuntimeException()256cdf0e10cSrcweir     virtual void SAL_CALL raiseRuntimeException(  ) throw(::com::sun::star::uno::RuntimeException)
257cdf0e10cSrcweir         { throw _aDummyRE; }
258cdf0e10cSrcweir };
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 
async()261cdf0e10cSrcweir void ServiceImpl::async() throw(::com::sun::star::uno::RuntimeException)
262cdf0e10cSrcweir {}
263cdf0e10cSrcweir 
264cdf0e10cSrcweir // XServiceInfo
265cdf0e10cSrcweir //__________________________________________________________________________________________________
getImplementationName()266cdf0e10cSrcweir OUString ServiceImpl::getImplementationName()
267cdf0e10cSrcweir     throw (RuntimeException)
268cdf0e10cSrcweir {
269cdf0e10cSrcweir     return OUString( );
270cdf0e10cSrcweir }
271cdf0e10cSrcweir //__________________________________________________________________________________________________
supportsService(const OUString &)272cdf0e10cSrcweir sal_Bool ServiceImpl::supportsService( const OUString & /* rServiceName */)
273cdf0e10cSrcweir     throw (RuntimeException)
274cdf0e10cSrcweir {
275cdf0e10cSrcweir     return sal_False;
276cdf0e10cSrcweir }
277cdf0e10cSrcweir //__________________________________________________________________________________________________
getSupportedServiceNames()278cdf0e10cSrcweir Sequence< OUString > ServiceImpl::getSupportedServiceNames()
279cdf0e10cSrcweir     throw (RuntimeException)
280cdf0e10cSrcweir {
281cdf0e10cSrcweir     return Sequence< OUString > ();
282cdf0e10cSrcweir }
283cdf0e10cSrcweir 
284cdf0e10cSrcweir /******************
285cdf0e10cSrcweir  * OCallMe
286cdf0e10cSrcweir  *
287cdf0e10cSrcweir  *****************/
288cdf0e10cSrcweir 
queryInterface(const Type & aType)289cdf0e10cSrcweir Any OCallMe::queryInterface( const Type & aType ) throw ( RuntimeException )
290cdf0e10cSrcweir {
291cdf0e10cSrcweir     Any a = ::cppu::queryInterface( aType,
292cdf0e10cSrcweir             SAL_STATIC_CAST( XCallMe * , this ) );
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     if( a.hasValue() )
295cdf0e10cSrcweir     {
296cdf0e10cSrcweir         return a;
297cdf0e10cSrcweir     }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir     return OWeakObject::queryInterface( aType );
300cdf0e10cSrcweir }
301cdf0e10cSrcweir 
call(const::rtl::OUString & s,sal_Int32 nToDo)302cdf0e10cSrcweir void OCallMe::call( const ::rtl::OUString& s, sal_Int32 nToDo )
303cdf0e10cSrcweir     throw( RuntimeException, ::test::TestBridgeException)
304cdf0e10cSrcweir {
305cdf0e10cSrcweir     if( nToDo < 0 )
306cdf0e10cSrcweir     {
307cdf0e10cSrcweir         throw TestBridgeException();
308cdf0e10cSrcweir     }
309cdf0e10cSrcweir 
310cdf0e10cSrcweir     OUString sDummy;
311cdf0e10cSrcweir     if( ! nToDo ) {
312cdf0e10cSrcweir         OString o = OUStringToOString( s,RTL_TEXTENCODING_ASCII_US);
313cdf0e10cSrcweir         printf( "%s\n" , o.pData->buffer );
314cdf0e10cSrcweir     }
315cdf0e10cSrcweir     for( sal_Int32 i = 0 ; i < nToDo ; i ++ )
316cdf0e10cSrcweir     {
317cdf0e10cSrcweir         sDummy += s;
318cdf0e10cSrcweir     }
319cdf0e10cSrcweir }
320cdf0e10cSrcweir 
drawLine(sal_Int32,sal_Int32,sal_Int32,sal_Int32)321cdf0e10cSrcweir void SAL_CALL OCallMe::drawLine( sal_Int32 /* x1 */, sal_Int32 /* y1 */, sal_Int32 /* x2 */, sal_Int32 /* y2 */)
322cdf0e10cSrcweir         throw(::com::sun::star::uno::RuntimeException)
323cdf0e10cSrcweir {
324cdf0e10cSrcweir     // do nothings
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
callOneway(const::rtl::OUString &,sal_Int32 nToDo)327cdf0e10cSrcweir void OCallMe::callOneway( const ::rtl::OUString& /* s */, sal_Int32 nToDo )
328cdf0e10cSrcweir     throw(RuntimeException)
329cdf0e10cSrcweir {
330cdf0e10cSrcweir     OUString sDummy;
331cdf0e10cSrcweir     m_nLastToDos = nToDo;
332cdf0e10cSrcweir 
333cdf0e10cSrcweir 
334cdf0e10cSrcweir     if( nToDo )
335cdf0e10cSrcweir     {
336cdf0e10cSrcweir         printf( "+" );
337cdf0e10cSrcweir         fflush( stdout );
338cdf0e10cSrcweir 
339cdf0e10cSrcweir         TimeValue val = { nToDo , 0 };
340cdf0e10cSrcweir         osl_waitThread( &val );
341cdf0e10cSrcweir         printf( "-\n" );
342cdf0e10cSrcweir     }
343cdf0e10cSrcweir 
344cdf0e10cSrcweir }
345cdf0e10cSrcweir 
transport(const::test::TestTypes & types)346cdf0e10cSrcweir ::test::TestTypes SAL_CALL OCallMe::transport( const ::test::TestTypes& types )
347cdf0e10cSrcweir         throw(::com::sun::star::uno::RuntimeException)
348cdf0e10cSrcweir {
349cdf0e10cSrcweir     return types;
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
getsAttribute()352cdf0e10cSrcweir ::rtl::OUString OCallMe::getsAttribute() throw(RuntimeException)
353cdf0e10cSrcweir {
354cdf0e10cSrcweir     return m_sAttribute;
355cdf0e10cSrcweir }
setsAttribute(const::rtl::OUString & _sattribute)356cdf0e10cSrcweir void OCallMe::setsAttribute( const ::rtl::OUString& _sattribute )
357cdf0e10cSrcweir      throw(RuntimeException)
358cdf0e10cSrcweir {
359cdf0e10cSrcweir     m_sAttribute = _sattribute;
360cdf0e10cSrcweir }
callAgain(const Reference<::test::XCallMe> & callAgainArg,sal_Int32 nToCall)361cdf0e10cSrcweir void OCallMe::callAgain( const Reference< ::test::XCallMe >& callAgainArg,
362cdf0e10cSrcweir                          sal_Int32 nToCall ) throw(RuntimeException)
363cdf0e10cSrcweir {
364cdf0e10cSrcweir     ::osl::MutexGuard guard( m_mutex );
365cdf0e10cSrcweir     if( nToCall %2 )
366cdf0e10cSrcweir     {
367cdf0e10cSrcweir         printf( "Deadlocktest pong %" SAL_PRIdINT32 "\n", nToCall );
368cdf0e10cSrcweir     }
369cdf0e10cSrcweir     else
370cdf0e10cSrcweir     {
371cdf0e10cSrcweir         printf( "Deadlocktest ping %" SAL_PRIdINT32 "\n", nToCall );
372cdf0e10cSrcweir     }
373cdf0e10cSrcweir     if( nToCall )
374cdf0e10cSrcweir     {
375cdf0e10cSrcweir         callAgainArg->callAgain( Reference< XCallMe > ( (XCallMe *) this ) , nToCall -1 );
376cdf0e10cSrcweir     }
377cdf0e10cSrcweir }
378cdf0e10cSrcweir 
379cdf0e10cSrcweir /********************
380cdf0e10cSrcweir  * OInterfaceTest
381cdf0e10cSrcweir  *
382cdf0e10cSrcweir  *******************/
queryInterface(const Type & aType)383cdf0e10cSrcweir Any OInterfaceTest::queryInterface( const Type & aType ) throw ( RuntimeException )
384cdf0e10cSrcweir {
385cdf0e10cSrcweir     Any a = ::cppu::queryInterface( aType,
386cdf0e10cSrcweir             SAL_STATIC_CAST( XInterfaceTest * , this ) );
387cdf0e10cSrcweir     if( a.hasValue() )
388cdf0e10cSrcweir     {
389cdf0e10cSrcweir         return a;
390cdf0e10cSrcweir     }
391cdf0e10cSrcweir     return OWeakObject::queryInterface( aType );
392cdf0e10cSrcweir }
393cdf0e10cSrcweir 
394cdf0e10cSrcweir 
setIn(const Reference<::test::XCallMe> & callback)395cdf0e10cSrcweir void OInterfaceTest::setIn(
396cdf0e10cSrcweir     const Reference< ::test::XCallMe >& callback )
397cdf0e10cSrcweir             throw(RuntimeException)
398cdf0e10cSrcweir {
399cdf0e10cSrcweir     m_rCallMe = callback;
400cdf0e10cSrcweir     call();
401cdf0e10cSrcweir }
402cdf0e10cSrcweir 
setInOut(Reference<::test::XCallMe> & callback)403cdf0e10cSrcweir void OInterfaceTest::setInOut( Reference< ::test::XCallMe >& callback )
404cdf0e10cSrcweir     throw(RuntimeException)
405cdf0e10cSrcweir {
406cdf0e10cSrcweir     Reference< XCallMe > r = m_rCallMe;
407cdf0e10cSrcweir     m_rCallMe = callback;
408cdf0e10cSrcweir     callback = r;
409cdf0e10cSrcweir     call();
410cdf0e10cSrcweir }
411cdf0e10cSrcweir 
412cdf0e10cSrcweir 
getOut(Reference<::test::XCallMe> & callback)413cdf0e10cSrcweir void OInterfaceTest::getOut( Reference< ::test::XCallMe >& callback )
414cdf0e10cSrcweir     throw(RuntimeException)
415cdf0e10cSrcweir {
416cdf0e10cSrcweir     callback = m_rCallMe;
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
get()419cdf0e10cSrcweir Reference< ::test::XCallMe > OInterfaceTest::get(  )
420cdf0e10cSrcweir     throw(RuntimeException)
421cdf0e10cSrcweir {
422cdf0e10cSrcweir     call();
423cdf0e10cSrcweir     return m_rCallMe;
424cdf0e10cSrcweir }
425cdf0e10cSrcweir 
call()426cdf0e10cSrcweir void OInterfaceTest::call()
427cdf0e10cSrcweir {
428cdf0e10cSrcweir     if( m_rCallMe.is() )
429cdf0e10cSrcweir     {
430cdf0e10cSrcweir         m_rCallMe->call( OUString( RTL_CONSTASCII_USTRINGPARAM("This is my String during a callback!")) , 5);
431cdf0e10cSrcweir     }
432cdf0e10cSrcweir }
433cdf0e10cSrcweir 
434cdf0e10cSrcweir 
queryInterface(const Type & aType)435cdf0e10cSrcweir Any OTestFactory::queryInterface( const Type & aType ) throw ( RuntimeException )
436cdf0e10cSrcweir {
437cdf0e10cSrcweir     Any a = ::cppu::queryInterface( aType,
438cdf0e10cSrcweir             SAL_STATIC_CAST( XTestFactory * , this ) );
439cdf0e10cSrcweir 
440cdf0e10cSrcweir     if( a.hasValue() )
441cdf0e10cSrcweir     {
442cdf0e10cSrcweir         return a;
443cdf0e10cSrcweir     }
444cdf0e10cSrcweir 
445cdf0e10cSrcweir     return OWeakObject::queryInterface( aType );
446cdf0e10cSrcweir }
447cdf0e10cSrcweir 
createCallMe()448cdf0e10cSrcweir Reference< ::test::XCallMe > OTestFactory::createCallMe(  )
449cdf0e10cSrcweir         throw(RuntimeException)
450cdf0e10cSrcweir {
451cdf0e10cSrcweir     return Reference< XCallMe > ( (XCallMe * ) new OCallMe() );
452cdf0e10cSrcweir }
453cdf0e10cSrcweir 
createInterfaceTest()454cdf0e10cSrcweir Reference< ::test::XInterfaceTest > SAL_CALL OTestFactory::createInterfaceTest(  )
455cdf0e10cSrcweir         throw(RuntimeException)
456cdf0e10cSrcweir {
457cdf0e10cSrcweir     return Reference < XInterfaceTest > ( (XInterfaceTest * ) new OInterfaceTest() );
458cdf0e10cSrcweir }
459cdf0e10cSrcweir 
460cdf0e10cSrcweir 
461cdf0e10cSrcweir 
462cdf0e10cSrcweir 
463cdf0e10cSrcweir //  class OInstanceProvider :
464cdf0e10cSrcweir //      public ::cppu::OWeakObject,
465cdf0e10cSrcweir //      public XInstanceProvider
466cdf0e10cSrcweir //  {
467cdf0e10cSrcweir //  public:
468cdf0e10cSrcweir //      OInstanceProvider( ){}
469cdf0e10cSrcweir //      ~OInstanceProvider(){ printf( "instance provider dies\n" );}
470cdf0e10cSrcweir //  public:
471cdf0e10cSrcweir //      // XInterface
472cdf0e10cSrcweir //      Any         SAL_CALL queryInterface( const Type & aType);
473cdf0e10cSrcweir //      void        SAL_CALL acquire()                       { OWeakObject::acquire(); }
474cdf0e10cSrcweir //      void        SAL_CALL release()                       { OWeakObject::release(); }
475cdf0e10cSrcweir 
476cdf0e10cSrcweir //  public:
477cdf0e10cSrcweir //      virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL
478cdf0e10cSrcweir //             getInstance( const ::rtl::OUString& sObjectName )
479cdf0e10cSrcweir //                   throw( ::com::sun::star::container::NoSuchElementException,
480cdf0e10cSrcweir //                          ::com::sun::star::uno::RuntimeException);
481cdf0e10cSrcweir //  };
482cdf0e10cSrcweir 
483cdf0e10cSrcweir 
484cdf0e10cSrcweir 
485cdf0e10cSrcweir 
486cdf0e10cSrcweir 
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 
489cdf0e10cSrcweir 
getCallsPerSec(const Reference<XCallMe> & rCall,int nLoops,int nToDo)490cdf0e10cSrcweir double getCallsPerSec( const Reference < XCallMe > &rCall , int nLoops, int nToDo )
491cdf0e10cSrcweir {
492cdf0e10cSrcweir     TimeValue aStartTime, aEndTime;
493cdf0e10cSrcweir     osl_getSystemTime( &aStartTime );
494cdf0e10cSrcweir     for( sal_Int32 i = 0; i < nLoops; i ++ )
495cdf0e10cSrcweir     {
496cdf0e10cSrcweir         rCall->call( OUString( RTL_CONSTASCII_USTRINGPARAM("Performance test string")) , nToDo );
497cdf0e10cSrcweir     }
498cdf0e10cSrcweir     osl_getSystemTime( &aEndTime );
499cdf0e10cSrcweir 
500cdf0e10cSrcweir     double fStart = (double)aStartTime.Seconds + ((double)aStartTime.Nanosec / 1000000000.0);
501cdf0e10cSrcweir     double fEnd = (double)aEndTime.Seconds + ((double)aEndTime.Nanosec / 1000000000.0);
502cdf0e10cSrcweir     return fEnd-fStart;
503cdf0e10cSrcweir }
504cdf0e10cSrcweir 
getCallsPerSecOneway(const Reference<XCallMe> & rCall,int nLoops,int nToDo,double * pdAfterExecution)505cdf0e10cSrcweir double getCallsPerSecOneway( const Reference < XCallMe > &rCall ,
506cdf0e10cSrcweir                              int nLoops,
507cdf0e10cSrcweir                              int nToDo,
508cdf0e10cSrcweir                              double *pdAfterExecution
509cdf0e10cSrcweir                              )
510cdf0e10cSrcweir {
511cdf0e10cSrcweir     TimeValue aStartTime, aEndTime, aAfterExecution;
512cdf0e10cSrcweir     osl_getSystemTime( &aStartTime );
513cdf0e10cSrcweir     for( sal_Int32 i = 0; i < nLoops; i ++ )
514cdf0e10cSrcweir     {
515cdf0e10cSrcweir //      rCall->callOneway( OUString( RTL_CONSTASCII_USTRINGPARAM("Performance test string" )), 0 );
516cdf0e10cSrcweir         rCall->drawLine( 0 , 0 , 500 , 123 );
517cdf0e10cSrcweir     }
518cdf0e10cSrcweir     osl_getSystemTime( &aEndTime );
519cdf0e10cSrcweir 
520cdf0e10cSrcweir     rCall->call( OUString( RTL_CONSTASCII_USTRINGPARAM("Performance test string")) , nToDo );
521cdf0e10cSrcweir     osl_getSystemTime( &aAfterExecution );
522cdf0e10cSrcweir 
523cdf0e10cSrcweir     double fStart = (double)aStartTime.Seconds + ((double)aStartTime.Nanosec / 1000000000.0);
524cdf0e10cSrcweir     double fEnd = (double)aEndTime.Seconds + ((double)aEndTime.Nanosec / 1000000000.0);
525cdf0e10cSrcweir     *pdAfterExecution = (double)aAfterExecution.Seconds +
526cdf0e10cSrcweir                         ((double)aAfterExecution.Nanosec / 1000000000.0) - fStart;
527cdf0e10cSrcweir     return fEnd-fStart;
528cdf0e10cSrcweir }
529cdf0e10cSrcweir 
testOnewayPerformanceOnTwoInterfaces(const Reference<XCallMe> & rRemote1,const Reference<XCallMe> & rRemote2)530cdf0e10cSrcweir void testOnewayPerformanceOnTwoInterfaces(
531cdf0e10cSrcweir     const Reference < XCallMe > &rRemote1, const Reference < XCallMe > &rRemote2 )
532cdf0e10cSrcweir {
533cdf0e10cSrcweir     printf( "Doing one way performance test on two interfaces ...\n" );
534cdf0e10cSrcweir     const sal_Int32 nLoops = 10000;
535cdf0e10cSrcweir     TimeValue aStartTime, aEndTime;
536cdf0e10cSrcweir     osl_getSystemTime( &aStartTime );
537cdf0e10cSrcweir     for( sal_Int32 i = 0; i < nLoops ; i ++ )
538cdf0e10cSrcweir     {
539cdf0e10cSrcweir         rRemote1->drawLine( 0 , 0 , 500 , 123 );
540cdf0e10cSrcweir         rRemote2->drawLine( 0 , 0 , 500 , 123 );
541cdf0e10cSrcweir     }
542cdf0e10cSrcweir     osl_getSystemTime( &aEndTime );
543cdf0e10cSrcweir     double fStart = (double)aStartTime.Seconds + ((double)aStartTime.Nanosec / 1000000000.0);
544cdf0e10cSrcweir     double fEnd = (double)aEndTime.Seconds + ((double)aEndTime.Nanosec / 1000000000.0);
545cdf0e10cSrcweir 
546cdf0e10cSrcweir     printf( "Overhead per Call [ms] %g\n" , ((fEnd-fStart)/((double)nLoops/1000 ))/2. );
547cdf0e10cSrcweir }
548cdf0e10cSrcweir 
testPerformance(const Reference<XCallMe> & rRemote,const Reference<XCallMe> & rLocal)549cdf0e10cSrcweir void testPerformance( const Reference < XCallMe > &rRemote,
550cdf0e10cSrcweir                       const Reference < XCallMe > &rLocal )
551cdf0e10cSrcweir {
552cdf0e10cSrcweir     OUString aTestString;
553cdf0e10cSrcweir 
554cdf0e10cSrcweir     sal_Int32 nDoSomething = 1;
555cdf0e10cSrcweir     sal_Int32 nCalls = 80000;
556cdf0e10cSrcweir     double dRemote, dLocal,dAfterExecution;
557cdf0e10cSrcweir 
558cdf0e10cSrcweir     printf( "performance test oneway...\n" );
559cdf0e10cSrcweir     dLocal  = getCallsPerSecOneway( rLocal  , nCalls , nDoSomething , &dAfterExecution);
560cdf0e10cSrcweir     dRemote = getCallsPerSecOneway( rRemote , nCalls , nDoSomething , &dAfterExecution);
561cdf0e10cSrcweir     printf( "Local=%g s,"
562cdf0e10cSrcweir             "Remote : %g s\n" , dLocal, dRemote );
563cdf0e10cSrcweir     if( dLocal > 0. )
564cdf0e10cSrcweir     {
565cdf0e10cSrcweir         printf( "Remote/Local : %g\n", dRemote/dLocal );
566cdf0e10cSrcweir     }
567cdf0e10cSrcweir 
568cdf0e10cSrcweir     printf( "Overhead per Call [ms] %g\n" , (dRemote - dLocal)/((double)nCalls/1000 ) );
569cdf0e10cSrcweir     printf( "Overhead per Call after completion [ms] %g\n" , (dAfterExecution - dLocal)/((double)nCalls/1000 ) );
570cdf0e10cSrcweir 
571cdf0e10cSrcweir     nCalls = 2000;
572cdf0e10cSrcweir 
573cdf0e10cSrcweir     printf( "Doing performance test ...\n" );
574cdf0e10cSrcweir     dRemote = getCallsPerSec( rRemote , nCalls , nDoSomething );
575cdf0e10cSrcweir     dLocal  = getCallsPerSec( rLocal  , nCalls , nDoSomething );
576cdf0e10cSrcweir     printf( "Local=%g s,\n"
577cdf0e10cSrcweir             "Remote=%g s\n" , dLocal, dRemote );
578cdf0e10cSrcweir     if( dLocal > 0. )
579cdf0e10cSrcweir     {
580cdf0e10cSrcweir         printf( "Remote/Local : %g\n", dRemote/dLocal );
581cdf0e10cSrcweir     }
582cdf0e10cSrcweir     printf( "Overhead per synchron Call [ms] %g\n" , ((dRemote - dLocal)/((double)nCalls/1000 )) );
583cdf0e10cSrcweir }
584cdf0e10cSrcweir 
testException(const Reference<XCallMe> & r)585cdf0e10cSrcweir void testException( const Reference < XCallMe > &r )
586cdf0e10cSrcweir {
587cdf0e10cSrcweir     try {
588cdf0e10cSrcweir         r->call( OUString( RTL_CONSTASCII_USTRINGPARAM("dummy")) , -1 );
589cdf0e10cSrcweir         OSL_ASSERT( ! "no exception flown!" );
590cdf0e10cSrcweir     }
591cdf0e10cSrcweir     catch( TestBridgeException & e )
592cdf0e10cSrcweir     {
593cdf0e10cSrcweir         // Exception flew successfully !
594cdf0e10cSrcweir     }
595cdf0e10cSrcweir     catch( Exception & e )
596cdf0e10cSrcweir     {
597*a79a404bSmseidel         OSL_ASSERT( ! "only base class of exception could be caught!" );
598cdf0e10cSrcweir     }
599cdf0e10cSrcweir     catch(...)
600cdf0e10cSrcweir     {
601cdf0e10cSrcweir         OSL_ASSERT(! "wrong unknown exception!" );
602cdf0e10cSrcweir     }
603cdf0e10cSrcweir }
604cdf0e10cSrcweir 
testSequenceOfCalls(const Reference<XCallMe> & rRCallMe)605cdf0e10cSrcweir void testSequenceOfCalls( const Reference< XCallMe > & rRCallMe )
606cdf0e10cSrcweir {
607cdf0e10cSrcweir     printf( "Testing sequence of calls\n" );
608cdf0e10cSrcweir     for( sal_Int32 i = 0 ; i < 800 ; i ++ )
609cdf0e10cSrcweir     {
610cdf0e10cSrcweir         rRCallMe->callOneway( OUString( RTL_CONSTASCII_USTRINGPARAM("hifuj" )), 0 );
611cdf0e10cSrcweir     }
612cdf0e10cSrcweir }
613cdf0e10cSrcweir 
testAllTypes(const Reference<XCallMe> & rRCallMe)614cdf0e10cSrcweir void testAllTypes( const Reference < XCallMe > & rRCallMe )
615cdf0e10cSrcweir {
616cdf0e10cSrcweir     printf( "Testing all types\n" );
617cdf0e10cSrcweir 
618cdf0e10cSrcweir     for( sal_Int32 i = 0; i < 32 ; i ++ )
619cdf0e10cSrcweir     {
620cdf0e10cSrcweir 
621cdf0e10cSrcweir         TestTypes types;
622cdf0e10cSrcweir         types.Bool = sal_True;
623cdf0e10cSrcweir         types.Char = L'i';
624cdf0e10cSrcweir         types.Byte = -12;
625cdf0e10cSrcweir         types.Short = -32000;
626cdf0e10cSrcweir         types.UShort = (sal_uInt16 ) (1 << i);
627cdf0e10cSrcweir         types.Long = -123;
628cdf0e10cSrcweir         types.ULong = 1 << i;
629cdf0e10cSrcweir         types.Hyper = 50;
630cdf0e10cSrcweir         types.UHyper = 1 << i*2;
631cdf0e10cSrcweir         types.Float = (float)123.239;
632cdf0e10cSrcweir         types.Double = 1279.12490012;
633cdf0e10cSrcweir         types.String = OUString( RTL_CONSTASCII_USTRINGPARAM("abcdefghijklmnopqrstuvwxyz"));
634cdf0e10cSrcweir         types.Interface = Reference< XInterface >( rRCallMe , UNO_QUERY);
635cdf0e10cSrcweir         types.Any <<= types.Double;
636cdf0e10cSrcweir 
637cdf0e10cSrcweir         TestTypes retTypes = rRCallMe->transport( types );
638cdf0e10cSrcweir 
639cdf0e10cSrcweir         OSL_ASSERT( ( types.Bool && retTypes.Bool ) || ( ! types.Bool && ! retTypes.Bool ) );
640cdf0e10cSrcweir         OSL_ASSERT( types.Char == retTypes.Char );
641cdf0e10cSrcweir         OSL_ASSERT( types.Byte == retTypes.Byte );
642cdf0e10cSrcweir         OSL_ASSERT( types.Short == retTypes.Short );
643cdf0e10cSrcweir         OSL_ASSERT( types.UShort == retTypes.UShort );
644cdf0e10cSrcweir         OSL_ASSERT( types.Long == retTypes.Long );
645cdf0e10cSrcweir         OSL_ASSERT( types.ULong == retTypes.ULong );
646cdf0e10cSrcweir         OSL_ASSERT( types.Hyper == retTypes.Hyper );
647cdf0e10cSrcweir         OSL_ASSERT( types.UHyper == retTypes.UHyper );
648cdf0e10cSrcweir         OSL_ASSERT( types.Float == retTypes.Float );
649cdf0e10cSrcweir         OSL_ASSERT( types.Double == retTypes.Double );
650cdf0e10cSrcweir         OSL_ASSERT( types.String == retTypes.String );
651cdf0e10cSrcweir         OSL_ASSERT( types.Interface == retTypes.Interface );
652cdf0e10cSrcweir         OSL_ASSERT( types.Any == retTypes.Any );
653cdf0e10cSrcweir     }
654cdf0e10cSrcweir 
655cdf0e10cSrcweir }
656cdf0e10cSrcweir 
testRemote(const Reference<XInterface> & rRemote)657cdf0e10cSrcweir void testRemote( const Reference< XInterface > &rRemote )
658cdf0e10cSrcweir {
659cdf0e10cSrcweir     char a;
660cdf0e10cSrcweir     getCppuType( (sal_Int8*)&a );
661cdf0e10cSrcweir 
662cdf0e10cSrcweir     Reference< XTestFactory > rRFact( rRemote , UNO_QUERY );
663cdf0e10cSrcweir     if( ! rRFact.is() )
664cdf0e10cSrcweir     {
665cdf0e10cSrcweir         printf( "remote object doesn't support XTestFactory\n" );
666cdf0e10cSrcweir         return;
667cdf0e10cSrcweir     }
668cdf0e10cSrcweir     OSL_ASSERT( rRFact.is() );
669cdf0e10cSrcweir     Reference< XCallMe > rLCallMe = (XCallMe * ) new OCallMe();
670cdf0e10cSrcweir     Reference< XCallMe > rRCallMe = rRFact->createCallMe();
671cdf0e10cSrcweir 
672cdf0e10cSrcweir     testAllTypes( rLCallMe );
673cdf0e10cSrcweir     testAllTypes( rRCallMe );
674cdf0e10cSrcweir 
675cdf0e10cSrcweir     printf( "Testing exception local ...\n" );
676cdf0e10cSrcweir     testException( rLCallMe );
677cdf0e10cSrcweir     printf( "Testing exception remote ...\n" );
678cdf0e10cSrcweir     testException( rRCallMe );
679cdf0e10cSrcweir 
680cdf0e10cSrcweir     //--------------------
681cdf0e10cSrcweir     // Test attributes
682cdf0e10cSrcweir     //----------------------
683cdf0e10cSrcweir     OUString ow = OUString::createFromAscii( "dum didel dum dideldei" );
684cdf0e10cSrcweir     rLCallMe->setsAttribute( ow );
685cdf0e10cSrcweir     OSL_ASSERT( rLCallMe->getsAttribute() == ow );
686cdf0e10cSrcweir 
687cdf0e10cSrcweir         rRCallMe->setsAttribute( ow );
688cdf0e10cSrcweir         OSL_ASSERT( rRCallMe->getsAttribute() == ow );
689cdf0e10cSrcweir 
690cdf0e10cSrcweir     //-------------------
691cdf0e10cSrcweir     // Performance test
692cdf0e10cSrcweir     //-------------------
693cdf0e10cSrcweir     testPerformance( rRCallMe , rLCallMe );
694cdf0e10cSrcweir     testOnewayPerformanceOnTwoInterfaces( rRFact->createCallMe(), rRCallMe );
695cdf0e10cSrcweir 
696cdf0e10cSrcweir     //----------------
697cdf0e10cSrcweir     // Test sequence
698cdf0e10cSrcweir     //----------------
699cdf0e10cSrcweir     testSequenceOfCalls( rRCallMe );
700cdf0e10cSrcweir 
701cdf0e10cSrcweir 
702cdf0e10cSrcweir     // test triple to check if transporting the same interface multiple
703cdf0e10cSrcweir     // times causes any problems
704cdf0e10cSrcweir     Reference< XInterfaceTest > rRTest = rRFact->createInterfaceTest();
705cdf0e10cSrcweir     Reference< XInterfaceTest > rRTest2 = rRFact->createInterfaceTest();
706cdf0e10cSrcweir     Reference< XInterfaceTest > rRTest3 = rRFact->createInterfaceTest();
707cdf0e10cSrcweir 
708cdf0e10cSrcweir     rRTest->setIn( rRCallMe );
709cdf0e10cSrcweir     rRTest2->setIn( rRCallMe );
710cdf0e10cSrcweir     rRTest3->setIn( rRCallMe );
711cdf0e10cSrcweir 
712cdf0e10cSrcweir     OSL_ASSERT( rRTest->get() == rRCallMe );
713cdf0e10cSrcweir     OSL_ASSERT( rRTest2->get() == rRCallMe );
714cdf0e10cSrcweir     OSL_ASSERT( rRTest3->get() == rRCallMe );
715cdf0e10cSrcweir 
716cdf0e10cSrcweir     rRTest->setIn( rLCallMe );
717cdf0e10cSrcweir     rRTest2->setIn( rLCallMe );
718cdf0e10cSrcweir     rRTest3->setIn( rLCallMe );
719cdf0e10cSrcweir 
720cdf0e10cSrcweir     {
721cdf0e10cSrcweir         Reference< XCallMe > rLCallMe1 = (XCallMe * ) new OCallMe();
722cdf0e10cSrcweir         Reference< XCallMe > rLCallMe2 = (XCallMe * ) new OCallMe();
723cdf0e10cSrcweir         Reference< XCallMe > rLCallMe3 = (XCallMe * ) new OCallMe();
724cdf0e10cSrcweir         rRTest->setIn( rLCallMe1 );
725cdf0e10cSrcweir         rRTest2->setIn( rLCallMe2 );
726cdf0e10cSrcweir         rRTest3->setIn( rLCallMe3 );
727cdf0e10cSrcweir         OSL_ASSERT( rRTest->get() == rLCallMe1 );
728cdf0e10cSrcweir         OSL_ASSERT( rRTest2->get() == rLCallMe2 );
729cdf0e10cSrcweir         OSL_ASSERT( rRTest3->get() == rLCallMe3 );
730cdf0e10cSrcweir 
731cdf0e10cSrcweir         rRTest->setIn( rLCallMe );
732cdf0e10cSrcweir         rRTest2->setIn( rLCallMe );
733cdf0e10cSrcweir         rRTest3->setIn( rLCallMe );
734cdf0e10cSrcweir 
735cdf0e10cSrcweir         OSL_ASSERT( rRTest->get() == rLCallMe );
736cdf0e10cSrcweir         OSL_ASSERT( rRTest2->get() == rLCallMe );
737cdf0e10cSrcweir         OSL_ASSERT( rRTest3->get() == rLCallMe );
738cdf0e10cSrcweir     }
739cdf0e10cSrcweir 
740cdf0e10cSrcweir     Reference < XCallMe > r = rRCallMe;
741cdf0e10cSrcweir     rRTest->setInOut( r );
742cdf0e10cSrcweir     OSL_ASSERT( r == rLCallMe );
743cdf0e10cSrcweir     OSL_ASSERT( ! ( r == rRCallMe ) );
744cdf0e10cSrcweir 
745cdf0e10cSrcweir     // test empty references
746cdf0e10cSrcweir     rRTest->setIn( Reference < XCallMe > () );
747cdf0e10cSrcweir 
748cdf0e10cSrcweir     //--------------------------------
749cdf0e10cSrcweir     // test thread deadlocking
750cdf0e10cSrcweir     //--------------------------------
751cdf0e10cSrcweir     rLCallMe->callAgain( rRCallMe, 20 );
752cdf0e10cSrcweir 
753cdf0e10cSrcweir }
754cdf0e10cSrcweir 
755cdf0e10cSrcweir 
756cdf0e10cSrcweir 
757cdf0e10cSrcweir 
758cdf0e10cSrcweir 
759cdf0e10cSrcweir 
createComponent(const::rtl::OUString & sService,const::rtl::OUString & sDllName,const Reference<XMultiServiceFactory> & rSMgr)760cdf0e10cSrcweir Reference <XInterface > createComponent( const ::rtl::OUString &sService ,
761cdf0e10cSrcweir                                          const ::rtl::OUString &sDllName,
762cdf0e10cSrcweir                                          const Reference < XMultiServiceFactory > &rSMgr )
763cdf0e10cSrcweir {
764cdf0e10cSrcweir     Reference< XInterface > rInterface;
765cdf0e10cSrcweir     rInterface = rSMgr->createInstance( sService );
766cdf0e10cSrcweir 
767cdf0e10cSrcweir     if( ! rInterface.is() )
768cdf0e10cSrcweir     {
769*a79a404bSmseidel         // register first
770cdf0e10cSrcweir         Reference < XImplementationRegistration > rReg (
771cdf0e10cSrcweir             rSMgr->createInstance(
772cdf0e10cSrcweir                 OUString::createFromAscii( "com.sun.star.registry.ImplementationRegistration" )),
773cdf0e10cSrcweir             UNO_QUERY );
774cdf0e10cSrcweir 
775cdf0e10cSrcweir         OSL_ASSERT( rReg.is() );
776cdf0e10cSrcweir         OUString aDllName = sDllName;
777cdf0e10cSrcweir 
778cdf0e10cSrcweir         try
779cdf0e10cSrcweir         {
780cdf0e10cSrcweir             rReg->registerImplementation(
781cdf0e10cSrcweir                 OUString::createFromAscii( "com.sun.star.loader.SharedLibrary" ),
782cdf0e10cSrcweir                 aDllName,
783cdf0e10cSrcweir                 Reference< XSimpleRegistry > () );
784cdf0e10cSrcweir             rInterface = rSMgr->createInstance( sService );
785cdf0e10cSrcweir         }
786cdf0e10cSrcweir         catch( Exception & )
787cdf0e10cSrcweir         {
788cdf0e10cSrcweir             printf( "couldn't register dll %s\n" ,
789cdf0e10cSrcweir                     OUStringToOString( aDllName, RTL_TEXTENCODING_ASCII_US ).getStr() );
790cdf0e10cSrcweir         }
791cdf0e10cSrcweir     }
792cdf0e10cSrcweir     return rInterface;
793cdf0e10cSrcweir }
794