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 #include <vcl/svapp.hxx>
25
26 // This works and was used before for standalone test, not sure why
27 // we'd want it.
28 #define LAYOUT_WEAK 1
29 #include "uno.hxx"
30
31 #include <cstdio>
32 #include <cstdlib>
33 #include <sys/stat.h>
34
35 #include <com/sun/star/xml/sax/SAXException.hpp>
36 #include <comphelper/processfactory.hxx>
37 #include <cppuhelper/bootstrap.hxx>
38 #include <rtl/ustring.hxx>
39 #include <ucbhelper/configurationkeys.hxx>
40 #include <ucbhelper/contentbroker.hxx>
41
42 #define SORT_DLG 1 /* requires sfx2, svx to be compiled */
43 #if SORT_DLG
44 #include "scitems.hxx"
45 #include "uiitems.hxx"
46 #endif /* SORT_DLG */
47
48 #include "editor.hxx"
49
50 #include "plugin.hxx"
51 #undef _LAYOUT_POST_HXX
52
53 #include "recover.hxx"
54 #undef _LAYOUT_POST_HXX
55
56 #if SORT_DLG
57 #include "sortdlg.hxx"
58 #undef _LAYOUT_POST_HXX
59 #endif /* SORT_DLG */
60
61 #include "wordcountdialog.hxx"
62 #undef _LAYOUT_POST_HXX
63
64 #include "zoom.hxx"
65 #undef _LAYOUT_POST_HXX
66
67 #include <layout/layout-pre.hxx>
68
69 using namespace ::rtl;
70 using namespace ::cppu;
71 using namespace ::com::sun::star;
72 using namespace ::com::sun::star::uno;
73
74 class LayoutTest : public Application
75 {
76 Reference< XComponentContext > mxContext;
77 Reference< lang::XMultiServiceFactory > mxMSF;
78 OUString mInstallDir;
79 OUString mTestDialog;
80 bool mEditMode;
81 std::list< OUString > mFiles;
82
83 public:
84 LayoutTest( char const* installDir );
85
86 void RunEditor();
87 void RunFiles();
88 void ExceptionalMain();
89 void Init();
90 void InitUCB();
91 void LoadFile( OUString const &aName );
92 void Main();
93 void ParseCommandLine();
94 };
95
usage()96 static void usage()
97 {
98 fprintf (stderr, "usage: test [--inst OOO_INSTALL_PREFIX] [DIALOG.XML]... | --test [DIALOG.XML]\n" );
99 exit( 2 );
100 }
101
get_factory(char const * service)102 static uno::Reference< lang::XSingleServiceFactory > get_factory( char const *service )
103 {
104 uno::Reference< lang::XSingleServiceFactory > xFactory(
105 comphelper::createProcessComponent(
106 rtl::OUString::createFromAscii( service ) ), uno::UNO_QUERY );
107
108 if ( !xFactory.is() )
109 fprintf( stderr, "error loading: %s\n", service );
110 return xFactory;
111 }
112
113 #define GET_FACTORY(x) get_factory( #x )
114
LoadFile(const OUString & aTestFile)115 void LayoutTest::LoadFile( const OUString &aTestFile )
116 {
117 fprintf( stderr, "TEST: layout instance\n" );
118
119 uno::Reference< lang::XSingleServiceFactory > xFactory
120 = GET_FACTORY( com.sun.star.awt.Layout );
121 if ( !xFactory.is() )
122 {
123 fprintf( stderr, "Layout engine not installed\n" );
124 throw uno::RuntimeException(
125 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Layout engine not installed" ) ),
126 uno::Reference< uno::XInterface >() );
127 }
128 fprintf( stderr, "TEST: initing root\n" );
129
130 uno::Sequence< uno::Any > aParams( 1 );
131 aParams[0] <<= aTestFile;
132
133 uno::Reference< awt::XLayoutRoot > xRoot (
134 xFactory->createInstanceWithArguments( aParams ),
135 uno::UNO_QUERY );
136
137 fprintf( stderr, "TEST: file loaded\n" );
138 }
139
InitUCB()140 void LayoutTest::InitUCB()
141 {
142 OUString aEmpty;
143 Sequence< Any > aArgs( 6 );
144 aArgs[0]
145 <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL );
146 aArgs[1]
147 <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE );
148 aArgs[2] <<= OUString::createFromAscii( "PIPE" );
149 aArgs[3] <<= aEmpty;
150 aArgs[4] <<= OUString::createFromAscii( "PORTAL" );
151 aArgs[5] <<= aEmpty;
152
153 if ( !::ucbhelper::ContentBroker::initialize( mxMSF, aArgs ) )
154 {
155 fprintf( stderr, "Failed to init content broker\n" );
156 fprintf( stderr, "arg[0]: %s\n", UCB_CONFIGURATION_KEY1_LOCAL );
157 fprintf( stderr, "arg[1]: %s\n", UCB_CONFIGURATION_KEY2_OFFICE );
158 }
159 }
160
support_upstream_brand_prefix()161 static void support_upstream_brand_prefix ()
162 {
163 if ( char const* inst = getenv( "OOO_INSTALL_PREFIX" ) )
164 {
165 char const *brand_prefix = "/openoffice.org3";
166 OUString brand_dir = OUString::createFromAscii( inst )
167 + OUString::createFromAscii( brand_prefix );
168 struct stat stat_info;
169 if ( !stat ( OUSTRING_CSTR( brand_dir ), &stat_info ) )
170 {
171 OSL_TRACE( "Appending %s to OOO_INSTALL_PREFIX", brand_prefix );
172 setenv( "OOO_INSTALL_PREFIX", OUSTRING_CSTR( brand_dir ), 1 );
173 }
174 }
175 }
176
Init()177 void LayoutTest::Init()
178 {
179 ParseCommandLine();
180 setenv( "OOO_INSTALL_PREFIX", OUSTRING_CSTR( mInstallDir ), 0 );
181 support_upstream_brand_prefix ();
182 OSL_TRACE( "OOO_INSTALL_PREFIX=%s", getenv( "OOO_INSTALL_PREFIX" ) );
183
184 mxContext = defaultBootstrap_InitialComponentContext();
185 mxMSF = new UnoBootstrapLayout( Reference< lang::XMultiServiceFactory >( mxContext->getServiceManager(), UNO_QUERY ) );
186 ::comphelper::setProcessServiceFactory( mxMSF );
187 InitUCB();
188 }
189
ParseCommandLine()190 void LayoutTest::ParseCommandLine()
191 {
192 printf ("%s\n", __PRETTY_FUNCTION__);
193 for ( sal_uInt16 i = 0; i < GetCommandLineParamCount(); i++ )
194 {
195 OUString aParam = OUString( GetCommandLineParam( i ) );
196 if ( aParam.equalsAscii( "-h" ) || aParam.equalsAscii( "--help" ) )
197 usage();
198 if ( aParam.equalsAscii( "--inst" ) )
199 {
200 if ( i >= GetCommandLineParamCount() - 1)
201 usage();
202 mInstallDir = GetCommandLineParam( ++i );
203 setenv( "OOO_INSTALL_PREFIX", OUSTRING_CSTR( mInstallDir ), 1 );
204 }
205 else if ( aParam.equalsAscii( "--test" ) )
206 {
207 mTestDialog = OUString::createFromAscii( "zoom" );
208 if (i + 1 < GetCommandLineParamCount())
209 mTestDialog = GetCommandLineParam( ++i );
210 }
211 else if ( aParam.equalsAscii( "--editor" ) )
212 mEditMode = true;
213 else
214 mFiles.push_back( aParam );
215 }
216
217 if ( mFiles.size() <= 0 )
218 mFiles.push_back( OUString::createFromAscii( "layout.xml" ) );
219 }
220
RunEditor()221 void LayoutTest::RunEditor()
222 {
223 OUString aFile;
224 if ( !mFiles.empty()
225 && mFiles.front().compareToAscii( "layout.xml" ) != 0 )
226 aFile = mFiles.front();
227 Editor editor( mxMSF, aFile );
228 editor.Show();
229 editor.Execute();
230 }
231
RunDialog(Dialog & dialog)232 short RunDialog( Dialog& dialog )
233 {
234 dialog.Show();
235 short result = dialog.Execute();
236 fprintf( stderr, "Done: dialog execute exited:%d\n", result);
237 return result;
238 }
239
240 #undef Dialog
RunDialog(::Dialog & dialog)241 short RunDialog( ::Dialog& dialog )
242 {
243 dialog.Show();
244 short result = dialog.Execute();
245 fprintf( stderr, "Done: dialog execute exited:%d\n", result);
246 return result;
247 }
248
249 #if SORT_DLG
LoadSC()250 static void LoadSC()
251 {
252 get_factory( "com.sun.star.comp.sfx2.DocumentTemplates" );
253 get_factory( "com.sun.star.comp.Calc.SpreadsheetDocument" );
254 GET_FACTORY( com.sun.star.i18n.Transliteration.l10n );
255 }
256 #endif /* SORT_DLG */
257
TestDialog(OUString const & name)258 void TestDialog( OUString const& name )
259 {
260 if ( 0 )
261 ;
262 else if ( name.equalsAscii( "plugin" ) )
263 {
264 PluginDialog plugin ( 0 );
265 RunDialog( plugin );
266 }
267 else if ( name.equalsAscii( "query" ) )
268 {
269 QueryBox query ( 0, "Do you want to do?", "do");
270 RunDialog( query );
271 }
272 else if ( name.equalsAscii( "query-compat" ) )
273 {
274 QueryBox query ( 0,
275 WinBits( WB_YES_NO | WB_DEF_YES ),
276 // WinBits( WB_ABORT_RETRY_IGNORE ),
277 OUString::createFromAscii ("Do you want to do?"));
278 RunDialog( query );
279 }
280 else if ( name.equalsAscii( "recover" ) )
281 {
282 SvxRecoverDialog recover ( 0 );
283 RunDialog( recover );
284 }
285 #if SORT_DLG
286 else if ( name.equalsAscii( "sort" ) )
287 {
288 LoadSC();
289 ScSortDlg sort (0, 0);
290 RunDialog( sort );
291 }
292 #endif /* SORT_DLG */
293 else if ( name.equalsAscii( "wordcount" ) )
294 {
295 SwWordCountDialog words ( 0 );
296 RunDialog( words );
297 }
298 else if ( name.equalsAscii( "zoom" ) )
299 {
300 SvxZoomDialog zoom( 0 );
301 RunDialog( zoom );
302 }
303 }
304
RunFiles()305 void LayoutTest::RunFiles()
306 {
307 fprintf( stderr, "TEST: loading files\n" );
308 for ( std::list< OUString >::iterator i = mFiles.begin(); i != mFiles.end(); i++ )
309 LoadFile( *i );
310 fprintf( stderr, "TEST: executing\n" );
311 Execute();
312 fprintf( stderr, "TEST: done executing\n" );
313 }
314
ExceptionalMain()315 void LayoutTest::ExceptionalMain()
316 {
317 if ( mTestDialog.getLength() )
318 TestDialog( mTestDialog );
319 else if ( mEditMode )
320 RunEditor();
321 else
322 RunFiles();
323 }
324
Main()325 void LayoutTest::Main()
326 {
327 try
328 {
329 ExceptionalMain();
330 }
331 catch (xml::sax::SAXException & rExc)
332 {
333 OString aStr( OUStringToOString( rExc.Message,
334 RTL_TEXTENCODING_ASCII_US ) );
335 uno::Exception exc;
336 if (rExc.WrappedException >>= exc)
337 {
338 aStr += OString( " >>> " );
339 aStr += OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US );
340 }
341 fprintf (stderr, "Parsing error: '%s'\n", aStr.getStr());
342 OSL_ENSURE( 0, aStr.getStr() );
343 }
344 catch ( uno::Exception & rExc )
345 {
346 OString aStr( OUStringToOString( rExc.Message,
347 RTL_TEXTENCODING_ASCII_US ) );
348 fprintf (stderr, "UNO error: '%s'\n", aStr.getStr());
349 OSL_ENSURE( 0, aStr.getStr() );
350 }
351
352 Reference< lang::XComponent > xComp( mxContext, UNO_QUERY );
353 if ( xComp.is() )
354 xComp->dispose();
355 }
356
LayoutTest(char const * installDir)357 LayoutTest::LayoutTest( char const* installDir )
358 : mInstallDir( OUString::createFromAscii ( installDir ) )
359 {
360 }
361
362 LayoutTest layout_test( "/usr/local/lib/ooo" );
363