1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 /*****************************************************************************
25 *****************************************************************************
26 *
27 * Simple client application using the UnoUrlResolver service.
28 *
29 *****************************************************************************
30 *****************************************************************************/
31 #include <stdio.h>
32 #include <wchar.h>
33
34 #include <sal/main.h>
35
36 #include <cppuhelper/bootstrap.hxx>
37
38 #include <osl/file.hxx>
39 #include <osl/process.h>
40 #include <rtl/process.h>
41
42 #include <com/sun/star/beans/XPropertySet.hpp>
43 #include <com/sun/star/bridge/XUnoUrlResolver.hpp>
44 #include <com/sun/star/frame/XComponentLoader.hpp>
45 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
46 #include <com/sun/star/registry/XSimpleRegistry.hpp>
47
48 #include <string.h>
49
50 using namespace rtl;
51 using namespace com::sun::star::uno;
52 using namespace com::sun::star::lang;
53 using namespace com::sun::star::beans;
54 using namespace com::sun::star::bridge;
55 using namespace com::sun::star::frame;
56 using namespace com::sun::star::registry;
57
58
59
60 //============================================================================
SAL_IMPLEMENT_MAIN_WITH_ARGS(argc,argv)61 SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
62 {
63 OUString sConnectionString(RTL_CONSTASCII_USTRINGPARAM("uno:socket,host=localhost,port=2083;urp;StarOffice.ServiceManager"));
64
65 sal_Int32 nCount = (sal_Int32)rtl_getAppCommandArgCount();
66
67 if (nCount < 1)
68 {
69 printf("using: DocumentLoader -env:URE_MORE_TYPES=<office_types_rdb_url> <file_url> [<uno_connection_url>]\n\n"
70 "example: DocumentLoader -env:URE_MORE_TYPES=\"file:///.../OpenOffice%204/program/types.rdb\" \"file:///e:/temp/test.odt\" \"uno:socket,host=localhost,port=2083;urp;StarOffice.ServiceManager\"\n");
71 exit(1);
72 }
73 if (nCount == 2)
74 {
75 rtl_getAppCommandArg(1, &sConnectionString.pData);
76 }
77
78 Reference< XComponentContext > xComponentContext(::cppu::defaultBootstrap_InitialComponentContext());
79
80 /* Gets the service manager instance to be used (or null). This method has
81 been added for convenience, because the service manager is a often used
82 object.
83 */
84 Reference< XMultiComponentFactory > xMultiComponentFactoryClient(
85 xComponentContext->getServiceManager() );
86
87 /* Creates an instance of a component which supports the services specified
88 by the factory.
89 */
90 Reference< XInterface > xInterface =
91 xMultiComponentFactoryClient->createInstanceWithContext(
92 OUString::createFromAscii( "com.sun.star.bridge.UnoUrlResolver" ),
93 xComponentContext );
94
95 Reference< XUnoUrlResolver > resolver( xInterface, UNO_QUERY );
96
97 // Resolves the component context from the office, on the uno URL given by argv[1].
98 try
99 {
100 xInterface = Reference< XInterface >(
101 resolver->resolve( sConnectionString ), UNO_QUERY );
102 }
103 catch ( Exception& e )
104 {
105 printf("Error: cannot establish a connection using '%s':\n %s\n",
106 OUStringToOString(sConnectionString, RTL_TEXTENCODING_ASCII_US).getStr(),
107 OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US).getStr());
108 exit(1);
109 }
110
111 // gets the server component context as property of the office component factory
112 Reference< XPropertySet > xPropSet( xInterface, UNO_QUERY );
113 xPropSet->getPropertyValue( OUString::createFromAscii("DefaultContext") ) >>= xComponentContext;
114
115 // gets the service manager from the office
116 Reference< XMultiComponentFactory > xMultiComponentFactoryServer(
117 xComponentContext->getServiceManager() );
118
119 /* Creates an instance of a component which supports the services specified
120 by the factory. Important: using the office component context.
121 */
122 Reference < XComponentLoader > xComponentLoader(
123 xMultiComponentFactoryServer->createInstanceWithContext(
124 OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop" ) ),
125 xComponentContext ), UNO_QUERY );
126
127 /* Loads a component specified by an URL into the specified new or existing
128 frame.
129 */
130 OUString sAbsoluteDocUrl, sWorkingDir, sDocPathUrl, sArgDocUrl;
131 rtl_getAppCommandArg(0, &sArgDocUrl.pData);
132
133 osl_getProcessWorkingDir(&sWorkingDir.pData);
134 osl::FileBase::getFileURLFromSystemPath( sArgDocUrl, sDocPathUrl);
135 osl::FileBase::getAbsoluteFileURL( sWorkingDir, sDocPathUrl, sAbsoluteDocUrl);
136
137 Reference< XComponent > xComponent = xComponentLoader->loadComponentFromURL(
138 sAbsoluteDocUrl, OUString( RTL_CONSTASCII_USTRINGPARAM("_blank") ), 0,
139 Sequence < ::com::sun::star::beans::PropertyValue >() );
140
141 // dispose the local service manager
142 Reference< XComponent >::query( xMultiComponentFactoryClient )->dispose();
143
144 return 0;
145 }
146