blob: e08e08aa7f561c1a1c9ff624850149206fe4a704 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#include <vcl/svapp.hxx>
// This works and was used before for standalone test, not sure why
// we'd want it.
#define LAYOUT_WEAK 1
#include "uno.hxx"
#include <cstdio>
#include <cstdlib>
#include <sys/stat.h>
#include <com/sun/star/xml/sax/SAXException.hpp>
#include <comphelper/processfactory.hxx>
#include <cppuhelper/bootstrap.hxx>
#include <rtl/ustring.hxx>
#include <ucbhelper/configurationkeys.hxx>
#include <ucbhelper/contentbroker.hxx>
#define SORT_DLG 1 /* requires sfx2, svx to be compiled */
#if SORT_DLG
#include "scitems.hxx"
#include "uiitems.hxx"
#endif /* SORT_DLG */
#include "editor.hxx"
#include "plugin.hxx"
#undef _LAYOUT_POST_HXX
#include "recover.hxx"
#undef _LAYOUT_POST_HXX
#if SORT_DLG
#include "sortdlg.hxx"
#undef _LAYOUT_POST_HXX
#endif /* SORT_DLG */
#include "wordcountdialog.hxx"
#undef _LAYOUT_POST_HXX
#include "zoom.hxx"
#undef _LAYOUT_POST_HXX
#include <layout/layout-pre.hxx>
using namespace ::rtl;
using namespace ::cppu;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
class LayoutTest : public Application
{
Reference< XComponentContext > mxContext;
Reference< lang::XMultiServiceFactory > mxMSF;
OUString mInstallDir;
OUString mTestDialog;
bool mEditMode;
std::list< OUString > mFiles;
public:
LayoutTest( char const* installDir );
void RunEditor();
void RunFiles();
void ExceptionalMain();
void Init();
void InitUCB();
void LoadFile( OUString const &aName );
void Main();
void ParseCommandLine();
};
static void usage()
{
fprintf (stderr, "usage: test [--inst OOO_INSTALL_PREFIX] [DIALOG.XML]... | --test [DIALOG.XML]\n" );
exit( 2 );
}
static uno::Reference< lang::XSingleServiceFactory > get_factory( char const *service )
{
uno::Reference< lang::XSingleServiceFactory > xFactory(
comphelper::createProcessComponent(
rtl::OUString::createFromAscii( service ) ), uno::UNO_QUERY );
if ( !xFactory.is() )
fprintf( stderr, "error loading: %s\n", service );
return xFactory;
}
#define GET_FACTORY(x) get_factory( #x )
void LayoutTest::LoadFile( const OUString &aTestFile )
{
fprintf( stderr, "TEST: layout instance\n" );
uno::Reference< lang::XSingleServiceFactory > xFactory
= GET_FACTORY( com.sun.star.awt.Layout );
if ( !xFactory.is() )
{
fprintf( stderr, "Layout engine not installed\n" );
throw uno::RuntimeException(
rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Layout engine not installed" ) ),
uno::Reference< uno::XInterface >() );
}
fprintf( stderr, "TEST: initing root\n" );
uno::Sequence< uno::Any > aParams( 1 );
aParams[0] <<= aTestFile;
uno::Reference< awt::XLayoutRoot > xRoot (
xFactory->createInstanceWithArguments( aParams ),
uno::UNO_QUERY );
fprintf( stderr, "TEST: file loaded\n" );
}
void LayoutTest::InitUCB()
{
OUString aEmpty;
Sequence< Any > aArgs( 6 );
aArgs[0]
<<= OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL );
aArgs[1]
<<= OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE );
aArgs[2] <<= OUString::createFromAscii( "PIPE" );
aArgs[3] <<= aEmpty;
aArgs[4] <<= OUString::createFromAscii( "PORTAL" );
aArgs[5] <<= aEmpty;
if ( !::ucbhelper::ContentBroker::initialize( mxMSF, aArgs ) )
{
fprintf( stderr, "Failed to init content broker\n" );
fprintf( stderr, "arg[0]: %s\n", UCB_CONFIGURATION_KEY1_LOCAL );
fprintf( stderr, "arg[1]: %s\n", UCB_CONFIGURATION_KEY2_OFFICE );
}
}
static void support_upstream_brand_prefix ()
{
if ( char const* inst = getenv( "OOO_INSTALL_PREFIX" ) )
{
char const *brand_prefix = "/openoffice.org3";
OUString brand_dir = OUString::createFromAscii( inst )
+ OUString::createFromAscii( brand_prefix );
struct stat stat_info;
if ( !stat ( OUSTRING_CSTR( brand_dir ), &stat_info ) )
{
OSL_TRACE( "Appending %s to OOO_INSTALL_PREFIX", brand_prefix );
setenv( "OOO_INSTALL_PREFIX", OUSTRING_CSTR( brand_dir ), 1 );
}
}
}
void LayoutTest::Init()
{
ParseCommandLine();
setenv( "OOO_INSTALL_PREFIX", OUSTRING_CSTR( mInstallDir ), 0 );
support_upstream_brand_prefix ();
OSL_TRACE( "OOO_INSTALL_PREFIX=%s", getenv( "OOO_INSTALL_PREFIX" ) );
mxContext = defaultBootstrap_InitialComponentContext();
mxMSF = new UnoBootstrapLayout( Reference< lang::XMultiServiceFactory >( mxContext->getServiceManager(), UNO_QUERY ) );
::comphelper::setProcessServiceFactory( mxMSF );
InitUCB();
}
void LayoutTest::ParseCommandLine()
{
printf ("%s\n", __PRETTY_FUNCTION__);
for ( sal_uInt16 i = 0; i < GetCommandLineParamCount(); i++ )
{
OUString aParam = OUString( GetCommandLineParam( i ) );
if ( aParam.equalsAscii( "-h" ) || aParam.equalsAscii( "--help" ) )
usage();
if ( aParam.equalsAscii( "--inst" ) )
{
if ( i >= GetCommandLineParamCount() - 1)
usage();
mInstallDir = GetCommandLineParam( ++i );
setenv( "OOO_INSTALL_PREFIX", OUSTRING_CSTR( mInstallDir ), 1 );
}
else if ( aParam.equalsAscii( "--test" ) )
{
mTestDialog = OUString::createFromAscii( "zoom" );
if (i + 1 < GetCommandLineParamCount())
mTestDialog = GetCommandLineParam( ++i );
}
else if ( aParam.equalsAscii( "--editor" ) )
mEditMode = true;
else
mFiles.push_back( aParam );
}
if ( mFiles.size() <= 0 )
mFiles.push_back( OUString::createFromAscii( "layout.xml" ) );
}
void LayoutTest::RunEditor()
{
OUString aFile;
if ( !mFiles.empty()
&& mFiles.front().compareToAscii( "layout.xml" ) != 0 )
aFile = mFiles.front();
Editor editor( mxMSF, aFile );
editor.Show();
editor.Execute();
}
short RunDialog( Dialog& dialog )
{
dialog.Show();
short result = dialog.Execute();
fprintf( stderr, "Done: dialog execute exited:%d\n", result);
return result;
}
#undef Dialog
short RunDialog( ::Dialog& dialog )
{
dialog.Show();
short result = dialog.Execute();
fprintf( stderr, "Done: dialog execute exited:%d\n", result);
return result;
}
#if SORT_DLG
static void LoadSC()
{
get_factory( "com.sun.star.comp.sfx2.DocumentTemplates" );
get_factory( "com.sun.star.comp.Calc.SpreadsheetDocument" );
GET_FACTORY( com.sun.star.i18n.Transliteration.l10n );
}
#endif /* SORT_DLG */
void TestDialog( OUString const& name )
{
if ( 0 )
;
else if ( name.equalsAscii( "plugin" ) )
{
PluginDialog plugin ( 0 );
RunDialog( plugin );
}
else if ( name.equalsAscii( "query" ) )
{
QueryBox query ( 0, "Do you want to do?", "do");
RunDialog( query );
}
else if ( name.equalsAscii( "query-compat" ) )
{
QueryBox query ( 0,
WinBits( WB_YES_NO | WB_DEF_YES ),
// WinBits( WB_ABORT_RETRY_IGNORE ),
OUString::createFromAscii ("Do you want to do?"));
RunDialog( query );
}
else if ( name.equalsAscii( "recover" ) )
{
SvxRecoverDialog recover ( 0 );
RunDialog( recover );
}
#if SORT_DLG
else if ( name.equalsAscii( "sort" ) )
{
LoadSC();
ScSortDlg sort (0, 0);
RunDialog( sort );
}
#endif /* SORT_DLG */
else if ( name.equalsAscii( "wordcount" ) )
{
SwWordCountDialog words ( 0 );
RunDialog( words );
}
else if ( name.equalsAscii( "zoom" ) )
{
SvxZoomDialog zoom( 0 );
RunDialog( zoom );
}
}
void LayoutTest::RunFiles()
{
fprintf( stderr, "TEST: loading files\n" );
for ( std::list< OUString >::iterator i = mFiles.begin(); i != mFiles.end(); i++ )
LoadFile( *i );
fprintf( stderr, "TEST: executing\n" );
Execute();
fprintf( stderr, "TEST: done executing\n" );
}
void LayoutTest::ExceptionalMain()
{
if ( mTestDialog.getLength() )
TestDialog( mTestDialog );
else if ( mEditMode )
RunEditor();
else
RunFiles();
}
void LayoutTest::Main()
{
try
{
ExceptionalMain();
}
catch (xml::sax::SAXException & rExc)
{
OString aStr( OUStringToOString( rExc.Message,
RTL_TEXTENCODING_ASCII_US ) );
uno::Exception exc;
if (rExc.WrappedException >>= exc)
{
aStr += OString( " >>> " );
aStr += OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US );
}
fprintf (stderr, "Parsing error: '%s'\n", aStr.getStr());
OSL_ENSURE( 0, aStr.getStr() );
}
catch ( uno::Exception & rExc )
{
OString aStr( OUStringToOString( rExc.Message,
RTL_TEXTENCODING_ASCII_US ) );
fprintf (stderr, "UNO error: '%s'\n", aStr.getStr());
OSL_ENSURE( 0, aStr.getStr() );
}
Reference< lang::XComponent > xComp( mxContext, UNO_QUERY );
if ( xComp.is() )
xComp->dispose();
}
LayoutTest::LayoutTest( char const* installDir )
: mInstallDir( OUString::createFromAscii ( installDir ) )
{
}
LayoutTest layout_test( "/usr/local/lib/ooo" );