/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ using System; using System.Collections; using uno; using uno.util; using unoidl.com.sun.star.uno; using unoidl.com.sun.star.lang; using unoidl.com.sun.star.container; //============================================================================== internal class Factory : WeakComponentBase, XSingleComponentFactory, XServiceInfo { private String m_service; private Type m_type; private System.Reflection.ConstructorInfo m_ctor; public Factory( Type type, String service ) { m_service = service; m_type = type; m_ctor = type.GetConstructor( new Type [] { typeof (XComponentContext) } ); } public Object createInstanceWithContext( XComponentContext xContext ) { return m_ctor.Invoke( new Object [] { xContext } ); } public Object createInstanceWithArgumentsAndContext( uno.Any [] args, XComponentContext xContext ) { return m_ctor.Invoke( new Object [] { xContext } ); } public bool supportsService( String name ) { return m_service.Equals( name ); } public String [] getSupportedServiceNames() { return new String [] { m_service }; } public String getImplementationName() { return m_type.ToString(); } } /** This executable does the same as the batch file starting via uno.exe, but via bootstrapping native UNO. */ public class BridgeTest { public static int Main( String [] args ) { // System.Diagnostics.Debugger.Launch(); try { string bootstrap_ini = "cli_bridgetest_inprocess.ini"; if (args.Length > 0) { if (args[0] == "/?") { Console.WriteLine( "\n\ncli_bridgetest_inprocess [bootstrap file] \n\n" + "bootstrap file \n" + "\t contains the entries UNO_TYPES and UNO_SERVICES.\n" + "\t If a file is not provided than it is assumed that a\n" + "\t cli_bridgetest_inprocess.ini file can be found in the\n " + "\t current working directory.\n" ); return 0; } else { bootstrap_ini = args[0]; } } // bootstrap native UNO XComponentContext xContext = Bootstrap.defaultBootstrap_InitialComponentContext( bootstrap_ini, null ); using (new uno.util.DisposeGuard( (XComponent) xContext )) { XSet xSet = (XSet) xContext.getServiceManager(); xSet.insert( new uno.Any( typeof (XSingleComponentFactory), new Factory( typeof (cs_testobj.BridgeTestObject), "com.sun.star.test.bridge.cli_uno.CsTestObject" ) ) ); xSet.insert( new uno.Any( typeof (XSingleComponentFactory), new Factory( typeof (vb_testobj.VBBridgeTestObject), "com.sun.star.test.bridge.cli_uno.VbTestObject" ) ) ); xSet.insert( new uno.Any( typeof (XSingleComponentFactory), new Factory( typeof (cpp_bridgetest.BridgeTest), "com.sun.star.test.bridge.cli_uno.CppBridgeTest" ) ) ); xSet.insert( new uno.Any( typeof (XSingleComponentFactory), new Factory( typeof (cs_testobj.BridgeTest), "com.sun.star.test.bridge.cli_uno.CsBridgeTest" ) ) ); xSet.insert( new uno.Any( typeof (XSingleComponentFactory), new Factory( typeof (vb_bridetest.BridgeTest), "com.sun.star.test.bridge.cli_uno.VbBridgeTest" ) ) ); // I. // direct unbridged test // get client object via singleton entry Object test_client; XMain xClient; test_client = new cs_testobj.BridgeTest( xContext ); xClient = (XMain) test_client; Console.WriteLine( "\n[cli bridgetest] 1. C# client calls C# object"); // run with CLI target object xClient.run( new String [] { "com.sun.star.test.bridge.cli_uno.CsTestObject" } ); // II: // uno -ro uno_services.rdb -ro uno_types.rdb // -s com.sun.star.test.bridge.BridgeTest // -- com.sun.star.test.bridge.cli_uno.TestObject // get native client test_client = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.test.bridge.BridgeTest", xContext ); xClient = (XMain) test_client; Console.WriteLine( "\n[cli bridgetest] 2. C++ client (native) calls C# object"); // run with CLI target object xClient.run( new String [] { "com.sun.star.test.bridge.cli_uno.CsTestObject", "noCurrentContext"} ); // III: // uno -ro uno_services.rdb -ro uno_types.rdb // -s com.sun.star.test.bridge.cli_uno.BridgeTest // -- com.sun.star.test.bridge.CppTestObject // get CLI client test_client = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.test.bridge.cli_uno.CsBridgeTest", xContext ); xClient = (XMain) test_client; Console.WriteLine( "\n[cli bridgetest] 3. C# client calls C++ object (native)"); // run with native target object xClient.run( new String [] { "com.sun.star.test.bridge.CppTestObject" } ); // IV: // uno -ro uno_services.rdb -ro uno_types.rdb // -s com.sun.star.test.bridge.cli_uno.VbBridgeTest // -- com.sun.star.test.bridge.CppTestObject // get CLI client test_client = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.test.bridge.cli_uno.VbBridgeTest", xContext ); xClient = (XMain) test_client; Console.WriteLine( "\n[cli bridgetest] 4. Visual Basic client calls C++ (native) object" ); // run with native target object xClient.run( new String [] { "com.sun.star.test.bridge.CppTestObject" } ); // V: // uno -ro uno_services.rdb -ro uno_types.rdb // -s com.sun.star.test.bridge.BridgeTest // -- com.sun.star.test.bridge.cli_uno.VbTestObject // get CLI client // test_client = // xContext.getServiceManager().createInstanceWithContext( // "com.sun.star.test.bridge.BridgeTest", xContext ); // xClient = (XMain) test_client; // Console.WriteLine( // "[cli bridgetest] Visual Basic client: {0}", // xClient.ToString() ); // // run with native target object // xClient.run( // new String [] { // "com.sun.star.test.bridge.cli_uno.VbTestObject" } ); // VI: // uno -ro uno_services.rdb -ro uno_types.rdb // -s com.sun.star.test.bridge.cli_uno.CppBridgeTest // -- com.sun.star.test.bridge.CppTestObject test_client = xContext.getServiceManager().createInstanceWithContext( "com.sun.star.test.bridge.cli_uno.CppBridgeTest", xContext ); xClient = (XMain) test_client; Console.WriteLine( "\n[cli bridgetest] 6. CLI C++ client calls C++ object (native)"); // run with native target object xClient.run( new String [] { "com.sun.star.test.bridge.CppTestObject" } ); } } catch (System.Exception exc) { GC.WaitForPendingFinalizers(); System.Console.WriteLine( exc ); return -1; } GC.WaitForPendingFinalizers(); System.Console.WriteLine( "====> all tests ok." ); return 0; } }