1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski using System; 25*b1cdbd2cSJim Jagielski using System.Collections; 26*b1cdbd2cSJim Jagielski using uno; 27*b1cdbd2cSJim Jagielski using uno.util; 28*b1cdbd2cSJim Jagielski using unoidl.com.sun.star.uno; 29*b1cdbd2cSJim Jagielski using unoidl.com.sun.star.lang; 30*b1cdbd2cSJim Jagielski using unoidl.com.sun.star.container; 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski //============================================================================== 34*b1cdbd2cSJim Jagielski internal class Factory : 35*b1cdbd2cSJim Jagielski WeakComponentBase, XSingleComponentFactory, XServiceInfo 36*b1cdbd2cSJim Jagielski { 37*b1cdbd2cSJim Jagielski private String m_service; 38*b1cdbd2cSJim Jagielski private Type m_type; 39*b1cdbd2cSJim Jagielski private System.Reflection.ConstructorInfo m_ctor; 40*b1cdbd2cSJim Jagielski Factory( Type type, String service )41*b1cdbd2cSJim Jagielski public Factory( Type type, String service ) 42*b1cdbd2cSJim Jagielski { 43*b1cdbd2cSJim Jagielski m_service = service; 44*b1cdbd2cSJim Jagielski m_type = type; 45*b1cdbd2cSJim Jagielski m_ctor = type.GetConstructor( 46*b1cdbd2cSJim Jagielski new Type [] { typeof (XComponentContext) } ); 47*b1cdbd2cSJim Jagielski } 48*b1cdbd2cSJim Jagielski createInstanceWithContext( XComponentContext xContext )49*b1cdbd2cSJim Jagielski public Object createInstanceWithContext( XComponentContext xContext ) 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski return m_ctor.Invoke( new Object [] { xContext } ); 52*b1cdbd2cSJim Jagielski } 53*b1cdbd2cSJim Jagielski createInstanceWithArgumentsAndContext( uno.Any [] args, XComponentContext xContext )54*b1cdbd2cSJim Jagielski public Object createInstanceWithArgumentsAndContext( 55*b1cdbd2cSJim Jagielski uno.Any [] args, XComponentContext xContext ) 56*b1cdbd2cSJim Jagielski { 57*b1cdbd2cSJim Jagielski return m_ctor.Invoke( new Object [] { xContext } ); 58*b1cdbd2cSJim Jagielski } 59*b1cdbd2cSJim Jagielski supportsService( String name )60*b1cdbd2cSJim Jagielski public bool supportsService( String name ) 61*b1cdbd2cSJim Jagielski { 62*b1cdbd2cSJim Jagielski return m_service.Equals( name ); 63*b1cdbd2cSJim Jagielski } 64*b1cdbd2cSJim Jagielski getSupportedServiceNames()65*b1cdbd2cSJim Jagielski public String [] getSupportedServiceNames() 66*b1cdbd2cSJim Jagielski { 67*b1cdbd2cSJim Jagielski return new String [] { m_service }; 68*b1cdbd2cSJim Jagielski } 69*b1cdbd2cSJim Jagielski getImplementationName()70*b1cdbd2cSJim Jagielski public String getImplementationName() 71*b1cdbd2cSJim Jagielski { 72*b1cdbd2cSJim Jagielski return m_type.ToString(); 73*b1cdbd2cSJim Jagielski } 74*b1cdbd2cSJim Jagielski } 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski /** This executable does the same as the batch file starting via uno.exe, 78*b1cdbd2cSJim Jagielski but via bootstrapping native UNO. 79*b1cdbd2cSJim Jagielski */ 80*b1cdbd2cSJim Jagielski public class BridgeTest 81*b1cdbd2cSJim Jagielski { Main( String [] args )82*b1cdbd2cSJim Jagielski public static int Main( String [] args ) 83*b1cdbd2cSJim Jagielski { 84*b1cdbd2cSJim Jagielski // System.Diagnostics.Debugger.Launch(); 85*b1cdbd2cSJim Jagielski try 86*b1cdbd2cSJim Jagielski { 87*b1cdbd2cSJim Jagielski string bootstrap_ini = "cli_bridgetest_inprocess.ini"; 88*b1cdbd2cSJim Jagielski if (args.Length > 0) 89*b1cdbd2cSJim Jagielski { 90*b1cdbd2cSJim Jagielski if (args[0] == "/?") 91*b1cdbd2cSJim Jagielski { 92*b1cdbd2cSJim Jagielski Console.WriteLine( 93*b1cdbd2cSJim Jagielski "\n\ncli_bridgetest_inprocess [bootstrap file] \n\n" 94*b1cdbd2cSJim Jagielski + "bootstrap file \n" 95*b1cdbd2cSJim Jagielski + "\t contains the entries UNO_TYPES and UNO_SERVICES.\n" 96*b1cdbd2cSJim Jagielski + "\t If a file is not provided than it is assumed that a\n" 97*b1cdbd2cSJim Jagielski + "\t cli_bridgetest_inprocess.ini file can be found in the\n " 98*b1cdbd2cSJim Jagielski + "\t current working directory.\n" 99*b1cdbd2cSJim Jagielski ); 100*b1cdbd2cSJim Jagielski return 0; 101*b1cdbd2cSJim Jagielski } 102*b1cdbd2cSJim Jagielski else 103*b1cdbd2cSJim Jagielski { 104*b1cdbd2cSJim Jagielski bootstrap_ini = args[0]; 105*b1cdbd2cSJim Jagielski } 106*b1cdbd2cSJim Jagielski } 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski // bootstrap native UNO 109*b1cdbd2cSJim Jagielski XComponentContext xContext = 110*b1cdbd2cSJim Jagielski Bootstrap.defaultBootstrap_InitialComponentContext( 111*b1cdbd2cSJim Jagielski bootstrap_ini, null ); 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski using (new uno.util.DisposeGuard( (XComponent) xContext )) 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski XSet xSet = (XSet) xContext.getServiceManager(); 116*b1cdbd2cSJim Jagielski xSet.insert( 117*b1cdbd2cSJim Jagielski new uno.Any( 118*b1cdbd2cSJim Jagielski typeof (XSingleComponentFactory), 119*b1cdbd2cSJim Jagielski new Factory( 120*b1cdbd2cSJim Jagielski typeof (cs_testobj.BridgeTestObject), 121*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.CsTestObject" ) ) ); 122*b1cdbd2cSJim Jagielski xSet.insert( 123*b1cdbd2cSJim Jagielski new uno.Any( 124*b1cdbd2cSJim Jagielski typeof (XSingleComponentFactory), 125*b1cdbd2cSJim Jagielski new Factory( 126*b1cdbd2cSJim Jagielski typeof (vb_testobj.VBBridgeTestObject), 127*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.VbTestObject" ) ) ); 128*b1cdbd2cSJim Jagielski xSet.insert( 129*b1cdbd2cSJim Jagielski new uno.Any( 130*b1cdbd2cSJim Jagielski typeof (XSingleComponentFactory), 131*b1cdbd2cSJim Jagielski new Factory( 132*b1cdbd2cSJim Jagielski typeof (cpp_bridgetest.BridgeTest), 133*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.CppBridgeTest" ) ) ); 134*b1cdbd2cSJim Jagielski xSet.insert( 135*b1cdbd2cSJim Jagielski new uno.Any( 136*b1cdbd2cSJim Jagielski typeof (XSingleComponentFactory), 137*b1cdbd2cSJim Jagielski new Factory( 138*b1cdbd2cSJim Jagielski typeof (cs_testobj.BridgeTest), 139*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.CsBridgeTest" ) ) ); 140*b1cdbd2cSJim Jagielski xSet.insert( 141*b1cdbd2cSJim Jagielski new uno.Any( 142*b1cdbd2cSJim Jagielski typeof (XSingleComponentFactory), 143*b1cdbd2cSJim Jagielski new Factory( 144*b1cdbd2cSJim Jagielski typeof (vb_bridetest.BridgeTest), 145*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.VbBridgeTest" ) ) ); 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski // I. 148*b1cdbd2cSJim Jagielski // direct unbridged test 149*b1cdbd2cSJim Jagielski // get client object via singleton entry 150*b1cdbd2cSJim Jagielski Object test_client; 151*b1cdbd2cSJim Jagielski XMain xClient; 152*b1cdbd2cSJim Jagielski test_client = new cs_testobj.BridgeTest( xContext ); 153*b1cdbd2cSJim Jagielski xClient = (XMain) test_client; 154*b1cdbd2cSJim Jagielski Console.WriteLine( 155*b1cdbd2cSJim Jagielski "\n[cli bridgetest] 1. C# client calls C# object"); 156*b1cdbd2cSJim Jagielski // run with CLI target object 157*b1cdbd2cSJim Jagielski xClient.run( 158*b1cdbd2cSJim Jagielski new String [] { 159*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.CsTestObject" } ); 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski // II: 162*b1cdbd2cSJim Jagielski // uno -ro uno_services.rdb -ro uno_types.rdb 163*b1cdbd2cSJim Jagielski // -s com.sun.star.test.bridge.BridgeTest 164*b1cdbd2cSJim Jagielski // -- com.sun.star.test.bridge.cli_uno.TestObject 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski // get native client 167*b1cdbd2cSJim Jagielski test_client = 168*b1cdbd2cSJim Jagielski xContext.getServiceManager().createInstanceWithContext( 169*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.BridgeTest", xContext ); 170*b1cdbd2cSJim Jagielski xClient = (XMain) test_client; 171*b1cdbd2cSJim Jagielski Console.WriteLine( 172*b1cdbd2cSJim Jagielski "\n[cli bridgetest] 2. C++ client (native) calls C# object"); 173*b1cdbd2cSJim Jagielski // run with CLI target object 174*b1cdbd2cSJim Jagielski xClient.run( 175*b1cdbd2cSJim Jagielski new String [] { 176*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.CsTestObject", 177*b1cdbd2cSJim Jagielski "noCurrentContext"} ); 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski // III: 180*b1cdbd2cSJim Jagielski // uno -ro uno_services.rdb -ro uno_types.rdb 181*b1cdbd2cSJim Jagielski // -s com.sun.star.test.bridge.cli_uno.BridgeTest 182*b1cdbd2cSJim Jagielski // -- com.sun.star.test.bridge.CppTestObject 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski // get CLI client 185*b1cdbd2cSJim Jagielski test_client = 186*b1cdbd2cSJim Jagielski xContext.getServiceManager().createInstanceWithContext( 187*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.CsBridgeTest", 188*b1cdbd2cSJim Jagielski xContext ); 189*b1cdbd2cSJim Jagielski xClient = (XMain) test_client; 190*b1cdbd2cSJim Jagielski Console.WriteLine( 191*b1cdbd2cSJim Jagielski "\n[cli bridgetest] 3. C# client calls C++ object (native)"); 192*b1cdbd2cSJim Jagielski // run with native target object 193*b1cdbd2cSJim Jagielski xClient.run( 194*b1cdbd2cSJim Jagielski new String [] { "com.sun.star.test.bridge.CppTestObject" } ); 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski // IV: 197*b1cdbd2cSJim Jagielski // uno -ro uno_services.rdb -ro uno_types.rdb 198*b1cdbd2cSJim Jagielski // -s com.sun.star.test.bridge.cli_uno.VbBridgeTest 199*b1cdbd2cSJim Jagielski // -- com.sun.star.test.bridge.CppTestObject 200*b1cdbd2cSJim Jagielski // get CLI client 201*b1cdbd2cSJim Jagielski test_client = 202*b1cdbd2cSJim Jagielski xContext.getServiceManager().createInstanceWithContext( 203*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.VbBridgeTest", 204*b1cdbd2cSJim Jagielski xContext ); 205*b1cdbd2cSJim Jagielski xClient = (XMain) test_client; 206*b1cdbd2cSJim Jagielski Console.WriteLine( 207*b1cdbd2cSJim Jagielski "\n[cli bridgetest] 4. Visual Basic client calls C++ (native) object" ); 208*b1cdbd2cSJim Jagielski // run with native target object 209*b1cdbd2cSJim Jagielski xClient.run( 210*b1cdbd2cSJim Jagielski new String [] { "com.sun.star.test.bridge.CppTestObject" } ); 211*b1cdbd2cSJim Jagielski 212*b1cdbd2cSJim Jagielski // V: 213*b1cdbd2cSJim Jagielski // uno -ro uno_services.rdb -ro uno_types.rdb 214*b1cdbd2cSJim Jagielski // -s com.sun.star.test.bridge.BridgeTest 215*b1cdbd2cSJim Jagielski // -- com.sun.star.test.bridge.cli_uno.VbTestObject 216*b1cdbd2cSJim Jagielski // get CLI client 217*b1cdbd2cSJim Jagielski // test_client = 218*b1cdbd2cSJim Jagielski // xContext.getServiceManager().createInstanceWithContext( 219*b1cdbd2cSJim Jagielski // "com.sun.star.test.bridge.BridgeTest", xContext ); 220*b1cdbd2cSJim Jagielski // xClient = (XMain) test_client; 221*b1cdbd2cSJim Jagielski // Console.WriteLine( 222*b1cdbd2cSJim Jagielski // "[cli bridgetest] Visual Basic client: {0}", 223*b1cdbd2cSJim Jagielski // xClient.ToString() ); 224*b1cdbd2cSJim Jagielski // // run with native target object 225*b1cdbd2cSJim Jagielski // xClient.run( 226*b1cdbd2cSJim Jagielski // new String [] { 227*b1cdbd2cSJim Jagielski // "com.sun.star.test.bridge.cli_uno.VbTestObject" } ); 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski // VI: 230*b1cdbd2cSJim Jagielski // uno -ro uno_services.rdb -ro uno_types.rdb 231*b1cdbd2cSJim Jagielski // -s com.sun.star.test.bridge.cli_uno.CppBridgeTest 232*b1cdbd2cSJim Jagielski // -- com.sun.star.test.bridge.CppTestObject 233*b1cdbd2cSJim Jagielski test_client = 234*b1cdbd2cSJim Jagielski xContext.getServiceManager().createInstanceWithContext( 235*b1cdbd2cSJim Jagielski "com.sun.star.test.bridge.cli_uno.CppBridgeTest", 236*b1cdbd2cSJim Jagielski xContext ); 237*b1cdbd2cSJim Jagielski xClient = (XMain) test_client; 238*b1cdbd2cSJim Jagielski Console.WriteLine( 239*b1cdbd2cSJim Jagielski "\n[cli bridgetest] 6. CLI C++ client calls C++ object (native)"); 240*b1cdbd2cSJim Jagielski // run with native target object 241*b1cdbd2cSJim Jagielski xClient.run( 242*b1cdbd2cSJim Jagielski new String [] { "com.sun.star.test.bridge.CppTestObject" } ); 243*b1cdbd2cSJim Jagielski } 244*b1cdbd2cSJim Jagielski } 245*b1cdbd2cSJim Jagielski catch (System.Exception exc) 246*b1cdbd2cSJim Jagielski { 247*b1cdbd2cSJim Jagielski GC.WaitForPendingFinalizers(); 248*b1cdbd2cSJim Jagielski System.Console.WriteLine( exc ); 249*b1cdbd2cSJim Jagielski return -1; 250*b1cdbd2cSJim Jagielski } 251*b1cdbd2cSJim Jagielski 252*b1cdbd2cSJim Jagielski GC.WaitForPendingFinalizers(); 253*b1cdbd2cSJim Jagielski System.Console.WriteLine( "====> all tests ok." ); 254*b1cdbd2cSJim Jagielski return 0; 255*b1cdbd2cSJim Jagielski } 256*b1cdbd2cSJim Jagielski } 257