Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <stdio.h>
21 :
22 : #include "sal/main.h"
23 : #include <osl/diagnose.h>
24 : #include <osl/mutex.hxx>
25 : #include <osl/conditn.hxx>
26 :
27 : #include <rtl/process.h>
28 : #include <rtl/string.h>
29 : #include <rtl/strbuf.hxx>
30 : #include <rtl/ustrbuf.hxx>
31 :
32 : #include <cppuhelper/bootstrap.hxx>
33 : #include <cppuhelper/shlib.hxx>
34 : #include <cppuhelper/implbase1.hxx>
35 :
36 : #include <com/sun/star/lang/XMain.hpp>
37 : #include <com/sun/star/lang/XInitialization.hpp>
38 : #include <com/sun/star/lang/XComponent.hpp>
39 : #include <com/sun/star/lang/XSingleComponentFactory.hpp>
40 : #include <com/sun/star/lang/XSingleServiceFactory.hpp>
41 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
42 : #include <com/sun/star/lang/XEventListener.hpp>
43 : #include <com/sun/star/container/XSet.hpp>
44 : #include <com/sun/star/loader/XImplementationLoader.hpp>
45 : #include <com/sun/star/registry/XRegistryKey.hpp>
46 : #include <com/sun/star/connection/XAcceptor.hpp>
47 : #include <com/sun/star/connection/XConnection.hpp>
48 : #include <com/sun/star/bridge/XBridgeFactory.hpp>
49 : #include <com/sun/star/bridge/XBridge.hpp>
50 :
51 : using namespace std;
52 : using namespace osl;
53 : using namespace cppu;
54 : using namespace com::sun::star::uno;
55 : using namespace com::sun::star::lang;
56 : using namespace com::sun::star::loader;
57 : using namespace com::sun::star::registry;
58 : using namespace com::sun::star::connection;
59 : using namespace com::sun::star::bridge;
60 : using namespace com::sun::star::container;
61 :
62 : using ::rtl::OUString;
63 : using ::rtl::OString;
64 : using ::rtl::OUStringToOString;
65 : using ::rtl::OUStringBuffer;
66 :
67 : namespace unoexe
68 : {
69 :
70 : static sal_Bool s_quiet = false;
71 :
72 : //--------------------------------------------------------------------------------------------------
73 1 : static inline void out( const sal_Char * pText )
74 : {
75 1 : if (! s_quiet)
76 1 : fprintf( stderr, "%s", pText );
77 1 : }
78 : //--------------------------------------------------------------------------------------------------
79 0 : static inline void out( const OUString & rText )
80 : {
81 0 : if (! s_quiet)
82 : {
83 0 : OString aText( OUStringToOString( rText, RTL_TEXTENCODING_ASCII_US ) );
84 0 : fprintf( stderr, "%s", aText.getStr() );
85 : }
86 0 : }
87 :
88 : //--------------------------------------------------------------------------------------------------
89 : static const char arUsingText[] =
90 : "\nusing:\n\n"
91 : "uno [-c ComponentImplementationName -l LocationUrl | -s ServiceName]\n"
92 : " [-u uno:(socket[,host=HostName][,port=nnn]|pipe[,name=PipeName]);<protocol>;Name\n"
93 : " [--singleaccept] [--singleinstance]]\n"
94 : " [--quiet]\n"
95 : " [-- Argument1 Argument2 ...]\n";
96 :
97 : //--------------------------------------------------------------------------------------------------
98 3 : static sal_Bool readOption( OUString * pValue, const sal_Char * pOpt,
99 : sal_uInt32 * pnIndex, const OUString & aArg)
100 : throw (RuntimeException)
101 : {
102 3 : const OUString dash(RTL_CONSTASCII_USTRINGPARAM("-"));
103 3 : if(aArg.indexOf(dash) != 0)
104 0 : return sal_False;
105 :
106 3 : OUString aOpt = OUString::createFromAscii( pOpt );
107 :
108 3 : if (aArg.getLength() < aOpt.getLength())
109 0 : return sal_False;
110 :
111 3 : if (aOpt.equalsIgnoreAsciiCase( aArg.copy(1) ))
112 : {
113 : // take next argument
114 1 : ++(*pnIndex);
115 :
116 1 : rtl_getAppCommandArg(*pnIndex, &pValue->pData);
117 1 : if (*pnIndex >= rtl_getAppCommandArgCount() || pValue->copy(1).equals(dash))
118 : {
119 0 : OUStringBuffer buf( 32 );
120 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("incomplete option \"-") );
121 0 : buf.appendAscii( pOpt );
122 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" given!") );
123 0 : throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
124 : }
125 : else
126 : {
127 : #if OSL_DEBUG_LEVEL > 1
128 : out( "\n> identified option -" );
129 : out( pOpt );
130 : out( " = " );
131 : OString tmp = OUStringToOString(aArg, RTL_TEXTENCODING_ASCII_US);
132 : out( tmp.getStr() );
133 : #endif
134 1 : ++(*pnIndex);
135 1 : return sal_True;
136 : }
137 : }
138 2 : else if (aArg.indexOf(aOpt) == 1)
139 : {
140 0 : *pValue = aArg.copy(1 + aOpt.getLength());
141 : #if OSL_DEBUG_LEVEL > 1
142 : out( "\n> identified option -" );
143 : out( pOpt );
144 : out( " = " );
145 : OString tmp = OUStringToOString(aArg.copy(aOpt.getLength()), RTL_TEXTENCODING_ASCII_US);
146 : out( tmp.getStr() );
147 : #endif
148 0 : ++(*pnIndex);
149 :
150 0 : return sal_True;
151 : }
152 2 : return sal_False;
153 : }
154 : //--------------------------------------------------------------------------------------------------
155 0 : static sal_Bool readOption( sal_Bool * pbOpt, const sal_Char * pOpt,
156 : sal_uInt32 * pnIndex, const OUString & aArg)
157 : {
158 0 : const OUString dashdash(RTL_CONSTASCII_USTRINGPARAM("--"));
159 0 : OUString aOpt = OUString::createFromAscii(pOpt);
160 :
161 0 : if(aArg.indexOf(dashdash) == 0 && aOpt.equals(aArg.copy(2)))
162 : {
163 0 : ++(*pnIndex);
164 0 : *pbOpt = sal_True;
165 : #if OSL_DEBUG_LEVEL > 1
166 : out( "\n> identified option --" );
167 : out( pOpt );
168 : #endif
169 0 : return sal_True;
170 : }
171 0 : return sal_False;
172 : }
173 :
174 :
175 : //##################################################################################################
176 : //##################################################################################################
177 : //##################################################################################################
178 :
179 :
180 : //--------------------------------------------------------------------------------------------------
181 : template< class T >
182 1 : void createInstance(
183 : Reference< T > & rxOut,
184 : const Reference< XComponentContext > & xContext,
185 : const OUString & rServiceName )
186 : throw (Exception)
187 : {
188 1 : Reference< XMultiComponentFactory > xMgr( xContext->getServiceManager() );
189 1 : Reference< XInterface > x( xMgr->createInstanceWithContext( rServiceName, xContext ) );
190 :
191 1 : if (! x.is())
192 : {
193 : static sal_Bool s_bSet = sal_False;
194 0 : if (! s_bSet)
195 : {
196 0 : MutexGuard aGuard( Mutex::getGlobalMutex() );
197 0 : if (! s_bSet)
198 : {
199 0 : Reference< XSet > xSet( xMgr, UNO_QUERY );
200 0 : if (xSet.is())
201 : {
202 0 : Reference< XMultiServiceFactory > xSF( xMgr, UNO_QUERY );
203 : // acceptor
204 0 : xSet->insert( makeAny( loadSharedLibComponentFactory(
205 : OUString( "acceptor.uno" SAL_DLLEXTENSION ),
206 : OUString(),
207 : OUString( "com.sun.star.comp.io.Acceptor" ),
208 : xSF, Reference< XRegistryKey >(),
209 : "acceptor_" ) ) );
210 : // connector
211 0 : xSet->insert( makeAny( loadSharedLibComponentFactory(
212 : OUString( "connector.uno" SAL_DLLEXTENSION ),
213 : OUString(),
214 : OUString( "com.sun.star.comp.io.Connector" ),
215 : xSF, Reference< XRegistryKey >(),
216 : "connector_" ) ) );
217 : // bridge factory
218 0 : xSet->insert( makeAny( loadSharedLibComponentFactory(
219 : OUString( "binaryurp.uno" SAL_DLLEXTENSION ),
220 : OUString(),
221 : OUString( "com.sun.star.comp.bridge.BridgeFactory" ),
222 : xSF, Reference< XRegistryKey >(),
223 : "binaryurp_" ) ) );
224 : }
225 0 : s_bSet = sal_True;
226 : }
227 : }
228 0 : x = xMgr->createInstanceWithContext( rServiceName, xContext );
229 : }
230 :
231 1 : if (! x.is())
232 : {
233 0 : OUStringBuffer buf( 64 );
234 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("cannot get service instance \"") );
235 0 : buf.append( rServiceName );
236 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") );
237 0 : throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
238 : }
239 :
240 1 : rxOut = Reference< T >::query( x );
241 1 : if (! rxOut.is())
242 : {
243 0 : OUStringBuffer buf( 64 );
244 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("service instance \"") );
245 0 : buf.append( rServiceName );
246 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" does not support demanded interface \"") );
247 0 : const Type & rType = ::getCppuType( (const Reference< T > *)0 );
248 0 : buf.append( rType.getTypeName() );
249 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") );
250 0 : throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
251 : }
252 1 : }
253 : //--------------------------------------------------------------------------------------------------
254 0 : static Reference< XInterface > loadComponent(
255 : const Reference< XComponentContext > & xContext,
256 : const OUString & rImplName, const OUString & rLocation )
257 : throw (Exception)
258 : {
259 : // determine loader to be used
260 0 : sal_Int32 nDot = rLocation.lastIndexOf( '.' );
261 0 : if (nDot > 0 && nDot < rLocation.getLength())
262 : {
263 0 : Reference< XImplementationLoader > xLoader;
264 :
265 0 : OUString aExt( rLocation.copy( nDot +1 ) );
266 :
267 0 : if (aExt.compareToAscii( "dll" ) == 0 ||
268 0 : aExt.compareToAscii( "exe" ) == 0 ||
269 0 : aExt.compareToAscii( "dylib" ) == 0 ||
270 0 : aExt.compareToAscii( "so" ) == 0)
271 : {
272 : createInstance(
273 0 : xLoader, xContext, OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.loader.SharedLibrary") ) );
274 : }
275 0 : else if (aExt.compareToAscii( "jar" ) == 0 ||
276 0 : aExt.compareToAscii( "class" ) == 0)
277 : {
278 : createInstance(
279 0 : xLoader, xContext, OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.loader.Java") ) );
280 : }
281 : else
282 : {
283 0 : OUStringBuffer buf( 64 );
284 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("unknown extension of \"") );
285 0 : buf.append( rLocation );
286 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"! No loader available!") );
287 0 : throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
288 : }
289 :
290 0 : Reference< XInterface > xInstance;
291 :
292 : // activate
293 0 : Reference< XInterface > xFactory( xLoader->activate(
294 0 : rImplName, OUString(), rLocation, Reference< XRegistryKey >() ) );
295 0 : if (xFactory.is())
296 : {
297 0 : Reference< XSingleComponentFactory > xCFac( xFactory, UNO_QUERY );
298 0 : if (xCFac.is())
299 : {
300 0 : xInstance = xCFac->createInstanceWithContext( xContext );
301 : }
302 : else
303 : {
304 0 : Reference< XSingleServiceFactory > xSFac( xFactory, UNO_QUERY );
305 0 : if (xSFac.is())
306 : {
307 0 : out( "\n> warning: ignroing context for implementation \"" );
308 0 : out( rImplName );
309 0 : out( "\"!" );
310 0 : xInstance = xSFac->createInstance();
311 0 : }
312 0 : }
313 : }
314 :
315 0 : if (! xInstance.is())
316 : {
317 0 : OUStringBuffer buf( 64 );
318 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("activating component \"") );
319 0 : buf.append( rImplName );
320 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" from location \"") );
321 0 : buf.append( rLocation );
322 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" failed!") );
323 0 : throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
324 : }
325 :
326 0 : return xInstance;
327 : }
328 : else
329 : {
330 0 : OUStringBuffer buf( 64 );
331 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("location \"") );
332 0 : buf.append( rLocation );
333 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" has no extension! Cannot determine loader to be used!") );
334 0 : throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() );
335 : }
336 : }
337 :
338 :
339 : //##################################################################################################
340 : //##################################################################################################
341 : //##################################################################################################
342 :
343 :
344 : //==================================================================================================
345 0 : class OInstanceProvider
346 : : public WeakImplHelper1< XInstanceProvider >
347 : {
348 : Reference< XComponentContext > _xContext;
349 :
350 : Mutex _aSingleInstanceMutex;
351 : Reference< XInterface > _xSingleInstance;
352 : sal_Bool _bSingleInstance;
353 :
354 : OUString _aImplName;
355 : OUString _aLocation;
356 : OUString _aServiceName;
357 : Sequence< Any > _aInitParams;
358 :
359 : OUString _aInstanceName;
360 :
361 : inline Reference< XInterface > createInstance() throw (Exception);
362 :
363 : public:
364 0 : OInstanceProvider( const Reference< XComponentContext > & xContext,
365 : const OUString & rImplName, const OUString & rLocation,
366 : const OUString & rServiceName, const Sequence< Any > & rInitParams,
367 : sal_Bool bSingleInstance, const OUString & rInstanceName )
368 : : _xContext( xContext )
369 : , _bSingleInstance( bSingleInstance )
370 : , _aImplName( rImplName )
371 : , _aLocation( rLocation )
372 : , _aServiceName( rServiceName )
373 : , _aInitParams( rInitParams )
374 0 : , _aInstanceName( rInstanceName )
375 0 : {}
376 :
377 : // XInstanceProvider
378 : virtual Reference< XInterface > SAL_CALL getInstance( const OUString & rName )
379 : throw (NoSuchElementException, RuntimeException);
380 : };
381 : //__________________________________________________________________________________________________
382 0 : inline Reference< XInterface > OInstanceProvider::createInstance()
383 : throw (Exception)
384 : {
385 0 : Reference< XInterface > xRet;
386 0 : if (!_aImplName.isEmpty()) // manually via loader
387 0 : xRet = loadComponent( _xContext, _aImplName, _aLocation );
388 : else // via service manager
389 0 : unoexe::createInstance( xRet, _xContext, _aServiceName );
390 :
391 : // opt XInit
392 0 : Reference< XInitialization > xInit( xRet, UNO_QUERY );
393 0 : if (xInit.is())
394 0 : xInit->initialize( _aInitParams );
395 :
396 0 : return xRet;
397 : }
398 : //__________________________________________________________________________________________________
399 0 : Reference< XInterface > OInstanceProvider::getInstance( const OUString & rName )
400 : throw (NoSuchElementException, RuntimeException)
401 : {
402 : try
403 : {
404 0 : if (_aInstanceName == rName)
405 : {
406 0 : Reference< XInterface > xRet;
407 :
408 0 : if (_aImplName.isEmpty() && _aServiceName.isEmpty())
409 : {
410 : OSL_ASSERT( rName == "uno.ComponentContext" );
411 0 : xRet = _xContext;
412 : }
413 0 : else if (_bSingleInstance)
414 : {
415 0 : if (! _xSingleInstance.is())
416 : {
417 0 : MutexGuard aGuard( _aSingleInstanceMutex );
418 0 : if (! _xSingleInstance.is())
419 : {
420 0 : _xSingleInstance = createInstance();
421 0 : }
422 : }
423 0 : xRet = _xSingleInstance;
424 : }
425 : else
426 : {
427 0 : xRet = createInstance();
428 : }
429 :
430 0 : return xRet;
431 : }
432 : }
433 0 : catch (Exception & rExc)
434 : {
435 0 : out( "\n> error: " );
436 0 : out( rExc.Message );
437 : }
438 0 : OUStringBuffer buf( 64 );
439 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("no such element \"") );
440 0 : buf.append( rName );
441 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") );
442 0 : throw NoSuchElementException( buf.makeStringAndClear(), Reference< XInterface >() );
443 : }
444 :
445 : //==================================================================================================
446 0 : struct ODisposingListener : public WeakImplHelper1< XEventListener >
447 : {
448 : Condition cDisposed;
449 :
450 : // XEventListener
451 : virtual void SAL_CALL disposing( const EventObject & rEvt )
452 : throw (RuntimeException);
453 :
454 : //----------------------------------------------------------------------------------------------
455 : static void waitFor( const Reference< XComponent > & xComp );
456 : };
457 : //__________________________________________________________________________________________________
458 0 : void ODisposingListener::disposing( const EventObject & )
459 : throw (RuntimeException)
460 : {
461 0 : cDisposed.set();
462 0 : }
463 : //--------------------------------------------------------------------------------------------------
464 0 : void ODisposingListener::waitFor( const Reference< XComponent > & xComp )
465 : {
466 0 : ODisposingListener * pListener = new ODisposingListener();
467 0 : Reference< XEventListener > xListener( pListener );
468 :
469 0 : xComp->addEventListener( xListener );
470 0 : pListener->cDisposed.wait();
471 0 : }
472 :
473 :
474 : //##################################################################################################
475 : //##################################################################################################
476 : //##################################################################################################
477 :
478 :
479 : //##################################################################################################
480 : } // namespace unoexe
481 :
482 : using namespace unoexe;
483 :
484 2 : SAL_IMPLEMENT_MAIN()
485 : {
486 1 : sal_uInt32 nCount = rtl_getAppCommandArgCount();
487 1 : if (nCount == 0)
488 : {
489 0 : out( arUsingText );
490 0 : return 0;
491 : }
492 :
493 1 : sal_Int32 nRet = 0;
494 1 : Reference< XComponentContext > xContext;
495 :
496 :
497 : try
498 : {
499 1 : OUString aImplName, aLocation, aServiceName, aUnoUrl;
500 1 : Sequence< OUString > aParams;
501 1 : sal_Bool bSingleAccept = sal_False;
502 1 : sal_Bool bSingleInstance = sal_False;
503 :
504 : //#### read command line arguments #########################################################
505 :
506 1 : sal_uInt32 nPos = 0;
507 : // read up to arguments
508 3 : while (nPos < nCount)
509 : {
510 2 : OUString arg;
511 :
512 2 : rtl_getAppCommandArg(nPos, &arg.pData);
513 :
514 2 : const OUString dashdash(RTL_CONSTASCII_USTRINGPARAM("--"));
515 2 : if (dashdash == arg)
516 : {
517 1 : ++nPos;
518 : break;
519 : }
520 :
521 2 : if (!(readOption( &aImplName, "c", &nPos, arg) ||
522 1 : readOption( &aLocation, "l", &nPos, arg) ||
523 1 : readOption( &aServiceName, "s", &nPos, arg) ||
524 0 : readOption( &aUnoUrl, "u", &nPos, arg) ||
525 0 : readOption( &s_quiet, "quiet", &nPos, arg) ||
526 0 : readOption( &bSingleAccept, "singleaccept", &nPos, arg) ||
527 3 : readOption( &bSingleInstance, "singleinstance", &nPos, arg)))
528 : {
529 : throw RuntimeException(
530 0 : "unexpected argument \"" + arg + "\"",
531 0 : Reference< XInterface >() );
532 : }
533 2 : }
534 :
535 1 : if (!(aImplName.isEmpty() || aServiceName.isEmpty()))
536 0 : throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("give component exOR service name!" ) ), Reference< XInterface >() );
537 1 : if (aImplName.isEmpty() && aServiceName.isEmpty())
538 : {
539 0 : if (! aUnoUrl.endsWithIgnoreAsciiCaseAsciiL(
540 0 : RTL_CONSTASCII_STRINGPARAM(";uno.ComponentContext") ))
541 : throw RuntimeException(
542 : OUString( RTL_CONSTASCII_USTRINGPARAM(
543 : "expected UNO-URL with instance name "
544 : "uno.ComponentContext!") ),
545 0 : Reference<XInterface>() );
546 0 : if (bSingleInstance)
547 : throw RuntimeException(
548 : OUString( RTL_CONSTASCII_USTRINGPARAM(
549 : "unexpected option --singleinstance!") ),
550 0 : Reference<XInterface>() );
551 : }
552 1 : if (!aImplName.isEmpty() && aLocation.isEmpty())
553 0 : throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("give component location!" ) ), Reference< XInterface >() );
554 1 : if (!aServiceName.isEmpty() && !aLocation.isEmpty())
555 0 : out( "\n> warning: service name given, will ignore location!" );
556 :
557 : // read component params
558 1 : aParams.realloc( nCount - nPos );
559 1 : OUString * pParams = aParams.getArray();
560 :
561 1 : sal_uInt32 nOffset = nPos;
562 2 : for ( ; nPos < nCount; ++nPos )
563 : {
564 1 : rtl_getAppCommandArg( nPos, &pParams[nPos -nOffset].pData );
565 : }
566 :
567 1 : xContext = defaultBootstrap_InitialComponentContext();
568 :
569 : //#### accept, instanciate, etc. ###########################################################
570 :
571 1 : if (!aUnoUrl.isEmpty()) // accepting connections
572 : {
573 0 : sal_Int32 nIndex = 0, nTokens = 0;
574 0 : do { aUnoUrl.getToken( 0, ';', nIndex ); nTokens++; } while( nIndex != -1 );
575 0 : if (nTokens != 3 || aUnoUrl.getLength() < 10 ||
576 0 : !aUnoUrl.copy( 0, 4 ).equalsIgnoreAsciiCase( OUString( RTL_CONSTASCII_USTRINGPARAM("uno:") ) ))
577 : {
578 0 : throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("illegal uno url given!" ) ), Reference< XInterface >() );
579 : }
580 0 : nIndex = 0;
581 0 : OUString aConnectDescr( aUnoUrl.getToken( 0, ';', nIndex ).copy( 4 ) ); // uno:CONNECTDESCR;iiop;InstanceName
582 0 : OUString aInstanceName( aUnoUrl.getToken( 1, ';', nIndex ) );
583 :
584 0 : Reference< XAcceptor > xAcceptor;
585 : createInstance(
586 : xAcceptor, xContext,
587 0 : OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.connection.Acceptor") ) );
588 :
589 : // init params
590 0 : Sequence< Any > aInitParams( aParams.getLength() );
591 0 : const OUString * p = aParams.getConstArray();
592 0 : Any * pInitParams = aInitParams.getArray();
593 0 : for ( sal_Int32 i = aParams.getLength(); i--; )
594 : {
595 0 : pInitParams[i] = makeAny( p[i] );
596 : }
597 :
598 : // instance provider
599 : Reference< XInstanceProvider > xInstanceProvider( new OInstanceProvider(
600 : xContext, aImplName, aLocation, aServiceName, aInitParams,
601 0 : bSingleInstance, aInstanceName ) );
602 :
603 0 : nIndex = 0;
604 0 : OUString aUnoUrlToken( aUnoUrl.getToken( 1, ';', nIndex ) );
605 0 : for (;;)
606 : {
607 : // accepting
608 0 : out( "\n> accepting " );
609 0 : out( aConnectDescr );
610 0 : out( "..." );
611 0 : Reference< XConnection > xConnection( xAcceptor->accept( aConnectDescr ) );
612 0 : out( "connection established." );
613 :
614 0 : Reference< XBridgeFactory > xBridgeFactory;
615 : createInstance(
616 : xBridgeFactory, xContext,
617 0 : OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.BridgeFactory") ) );
618 :
619 : // bridge
620 0 : Reference< XBridge > xBridge( xBridgeFactory->createBridge(
621 : OUString(), aUnoUrlToken,
622 0 : xConnection, xInstanceProvider ) );
623 :
624 0 : if (bSingleAccept)
625 : {
626 0 : Reference< XComponent > xComp( xBridge, UNO_QUERY );
627 0 : if (! xComp.is())
628 0 : throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("bridge factory does not export interface \"com.sun.star.lang.XComponent\"!" ) ), Reference< XInterface >() );
629 0 : ODisposingListener::waitFor( xComp );
630 0 : xComp->dispose();
631 : // explicitly dispose the remote bridge so that it joins
632 : // on all spawned threads before process exit (see
633 : // binaryurp/source/bridge.cxx for details)
634 0 : break;
635 : }
636 0 : }
637 : }
638 : else // no uno url
639 : {
640 1 : Reference< XInterface > xInstance;
641 1 : if (!aImplName.isEmpty()) // manually via loader
642 0 : xInstance = loadComponent( xContext, aImplName, aLocation );
643 : else // via service manager
644 1 : createInstance( xInstance, xContext, aServiceName );
645 :
646 : // execution
647 1 : Reference< XMain > xMain( xInstance, UNO_QUERY );
648 1 : if (xMain.is())
649 : {
650 1 : nRet = xMain->run( aParams );
651 : }
652 : else
653 : {
654 0 : Reference< XComponent > xComp( xInstance, UNO_QUERY );
655 0 : if (xComp.is())
656 0 : xComp->dispose();
657 0 : throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("component does not export interface interface \"com.sun.star.lang.XMain\"!" ) ), Reference< XInterface >() );
658 2 : }
659 1 : }
660 : }
661 0 : catch (Exception & rExc)
662 : {
663 0 : out( "\n> error: " );
664 0 : out( rExc.Message );
665 0 : out( "\n> dying..." );
666 0 : nRet = 1;
667 : }
668 :
669 : // cleanup
670 1 : Reference< XComponent > xComp( xContext, UNO_QUERY );
671 1 : if (xComp.is())
672 1 : xComp->dispose();
673 :
674 1 : out( "\n" );
675 1 : return nRet;
676 : }
677 :
678 :
679 :
680 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|