Files
libreoffice/bean/com/sun/star/comp/beans/LocalOfficeConnection.java

775 lines
26 KiB
Java
Raw Normal View History

2012-06-12 17:28:01 +01:00
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
2004-09-06 14:11:38 +00:00
package com.sun.star.comp.beans;
import java.awt.Container;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
2004-09-06 14:11:38 +00:00
import com.sun.star.beans.XPropertySet;
2004-09-06 14:11:38 +00:00
import com.sun.star.bridge.XBridge;
import com.sun.star.bridge.XBridgeFactory;
import com.sun.star.connection.XConnection;
import com.sun.star.connection.XConnector;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XEventListener;
import com.sun.star.lang.XMultiComponentFactory;
2004-09-06 14:11:38 +00:00
import com.sun.star.lib.uno.helper.UnoUrl;
import com.sun.star.lib.util.NativeLibraryLoader;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
2004-09-06 14:11:38 +00:00
/**
* This class represents a connection to the local office application.
2004-10-14 09:37:14 +00:00
*
* @since OOo 2.0.0
2004-09-06 14:11:38 +00:00
*/
public class LocalOfficeConnection
implements OfficeConnection
{
public static final String OFFICE_APP_NAME = "soffice";
public static final String OFFICE_LIB_NAME = "officebean";
public static final String OFFICE_ID_SUFFIX = "_Office";
2004-09-06 14:11:38 +00:00
private Process mProcess;
2004-09-06 14:11:38 +00:00
private XComponentContext mContext;
private XBridge mBridge;
2004-09-06 14:11:38 +00:00
private String mURL;
private String mConnType;
private String mPipe;
private String mPort;
private String mProtocol;
private String mInitialObject;
2004-09-06 14:11:38 +00:00
private final List<XEventListener> mComponents = new ArrayList<XEventListener>();
2004-09-06 14:11:38 +00:00
private static final AtomicLong m_nBridgeCounter = new AtomicLong(0);
2004-10-28 14:49:01 +00:00
static
{
// preload shared libraries whichs import lips are linked to officebean
if ( System.getProperty( "os.name" ).startsWith( "Windows" ) )
{
try
{
NativeLibraryLoader.loadLibrary(LocalOfficeConnection.class.getClassLoader(), "msvcr70");
}
catch (Throwable e)
{
// loading twice would fail
System.err.println( "cannot find msvcr70" );
}
try
{
NativeLibraryLoader.loadLibrary(LocalOfficeConnection.class.getClassLoader(), "msvcr71");
}
catch (Throwable e)
{
// loading twice would fail
System.err.println( "cannot find msvcr71" );
}
try
{
NativeLibraryLoader.loadLibrary(LocalOfficeConnection.class.getClassLoader(), "uwinapi");
}
catch (Throwable e)
{
// loading twice would fail
System.err.println( "cannot find uwinapi" );
}
try
{
NativeLibraryLoader.loadLibrary(LocalOfficeConnection.class.getClassLoader(), "jawt");
}
catch (Throwable e)
{
// loading twice would fail
System.err.println( "cannot find jawt" );
}
}
// load shared library for JNI code
NativeLibraryLoader.loadLibrary( LocalOfficeConnection.class.getClassLoader(), "officebean" );
}
2004-09-14 14:10:24 +00:00
2004-09-06 14:11:38 +00:00
/**
* Constructor.
* Sets up paths to the office application and native libraries if
* values are available in <code>OFFICE_PROP_FILE</code> in the user
* home directory.<br />
* "com.sun.star.beans.path" - the office application directory;<br/>
* "com.sun.star.beans.libpath" - native libraries directory.
*/
public LocalOfficeConnection()
{
// init member vars
try
{
setUnoUrl( "uno:pipe,name=" + getPipeName() + ";urp;StarOffice.ServiceManager" );
}
catch ( java.net.MalformedURLException e )
{
throw new com.sun.star.uno.RuntimeException(e);
}
catch ( UnsupportedEncodingException e)
{
throw new com.sun.star.uno.RuntimeException(e);
}
2004-09-06 14:11:38 +00:00
}
/**
* protected Constructor
* Initialise a LocalOfficeConnection with an already running office.
* This C'Tor is only used in complex tests at the moment.
* @param xContext
*/
protected LocalOfficeConnection(com.sun.star.uno.XComponentContext xContext)
{
this.mContext = xContext;
}
/**
2004-09-06 14:11:38 +00:00
* Sets a connection URL.
* This implementation accepts a UNO URL with following format:<br />
* <pre>
* url := uno:localoffice[,&lt;params&gt;];urp;StarOffice.ServiceManager
* params := &lt;path&gt;[,&lt;pipe&gt;]
* path := path=&lt;pathv&gt;
* pipe := pipe=&lt;pipev&gt;
* pathv := platform_specific_path_to_the_local_office_distribution
* pipev := local_office_connection_pipe_name
* </pre>
*
Many spelling fixes: directories a* - g*. Attempt to clean up most but certainly not all the spelling mistakes that found home in OpenOffice through decades. We could probably blame the international nature of the code but it is somewhat shameful that this wasn't done before. (cherry picked from commit a6efc99d19d533fcf53106b6667bafba4d364370) Conflicts: accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java accessibility/bridge/org/openoffice/java/accessibility/Component.java accessibility/bridge/org/openoffice/java/accessibility/Container.java accessibility/bridge/org/openoffice/java/accessibility/DescendantManager.java accessibility/bridge/org/openoffice/java/accessibility/Dialog.java accessibility/bridge/org/openoffice/java/accessibility/Frame.java accessibility/bridge/org/openoffice/java/accessibility/List.java accessibility/bridge/org/openoffice/java/accessibility/Menu.java accessibility/bridge/org/openoffice/java/accessibility/Table.java accessibility/bridge/org/openoffice/java/accessibility/Tree.java accessibility/bridge/org/openoffice/java/accessibility/Window.java accessibility/bridge/source/java/WindowsAccessBridgeAdapter.cxx accessibility/inc/accessibility/extended/AccessibleBrowseBoxBase.hxx accessibility/inc/accessibility/extended/AccessibleGridControlBase.hxx accessibility/inc/accessibility/standard/vclxaccessiblebox.hxx accessibility/source/extended/accessibleiconchoicectrlentry.cxx accessibility/source/extended/accessiblelistboxentry.cxx accessibility/source/extended/accessibletablistbox.cxx accessibility/source/extended/accessibletablistboxtable.cxx accessibility/workben/org/openoffice/accessibility/awb/canvas/Canvas.java accessibility/workben/org/openoffice/accessibility/misc/OfficeConnection.java apple_remote/AppleRemote.m autodoc/inc/ary/cpp/c_gate.hxx autodoc/inc/ary/cpp/cp_ce.hxx autodoc/inc/ary/cpp/cp_def.hxx autodoc/inc/ary/cpp/cp_type.hxx autodoc/inc/ary/doc/d_parametrized.hxx autodoc/inc/ary/idl/i_type.hxx autodoc/source/ary/inc/cross_refs.hxx autodoc/source/ary/inc/sorted_idset.hxx autodoc/source/display/html/outfile.hxx autodoc/source/display/html/pagemake.cxx autodoc/source/display/idl/hi_env.hxx autodoc/source/parser/inc/tokens/tokproct.hxx autodoc/source/parser_i/inc/s2_luidl/tokproct.hxx autodoc/source/parser_i/inc/tokens/tkp2.hxx automation/inc/automation/commtypes.hxx automation/inc/automation/simplecm.hxx automation/source/server/recorder.cxx automation/source/server/recorder.hxx automation/source/server/statemnt.cxx automation/source/simplecm/packethandler.hxx automation/source/simplecm/simplecm.cxx avmedia/source/framework/soundhandler.cxx basegfx/inc/basegfx/range/rangeexpander.hxx basic/inc/basic/sbxdef.hxx basic/source/classes/sbunoobj.cxx basic/source/classes/sbxmod.cxx basic/source/comp/dim.cxx basic/source/comp/exprgen.cxx basic/source/runtime/step1.cxx basic/source/runtime/step2.cxx basic/source/sbx/sbxint.cxx basic/source/uno/namecont.cxx basic/workben/mgrtest.cxx bean/com/sun/star/beans/LocalOfficeConnection.java bean/com/sun/star/beans/LocalOfficeWindow.java bean/com/sun/star/comp/beans/LocalOfficeConnection.java bean/com/sun/star/comp/beans/LocalOfficeWindow.java bean/com/sun/star/comp/beans/OOoBean.java bridges/inc/bridges/cpp_uno/bridge.hxx bridges/source/cpp_uno/cc50_solaris_intel/cpp2uno.cxx bridges/source/cpp_uno/cc50_solaris_intel/except.cxx bridges/source/cpp_uno/cc50_solaris_intel/uno2cpp.cxx bridges/source/cpp_uno/cc50_solaris_sparc/cpp2uno.cxx bridges/source/cpp_uno/cc50_solaris_sparc/except.cxx bridges/source/cpp_uno/cc50_solaris_sparc/uno2cpp.cxx bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/cpp2uno.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/except.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/uno2cpp.cxx bridges/source/cpp_uno/gcc3_os2_intel/cpp2uno.cxx bridges/source/cpp_uno/gcc3_os2_intel/except.cxx bridges/source/cpp_uno/gcc3_os2_intel/uno2cpp.cxx bridges/source/cpp_uno/mingw_x86-64/uno2cpp.cxx bridges/source/cpp_uno/msvc_win32_intel/except.cxx bridges/source/cpp_uno/s5abi_macosx_x86-64/except.cxx bridges/source/cpp_uno/shared/component.cxx bridges/source/jni_uno/jni_base.h bridges/source/jni_uno/jni_bridge.cxx bridges/source/jni_uno/jni_java2uno.cxx bridges/source/jni_uno/jni_uno2java.cxx canvas/inc/canvas/base/doublebitmapbase.hxx canvas/inc/canvas/base/floatbitmapbase.hxx canvas/inc/canvas/base/integerbitmapbase.hxx canvas/source/cairo/cairo_canvasbitmap.cxx canvas/source/cairo/cairo_textlayout.cxx chart2/source/controller/dialogs/ObjectNameProvider.cxx chart2/source/view/diagram/VDiagram.cxx chart2/source/view/main/ChartView.cxx cli_ure/source/native/makefile.mk cli_ure/source/uno_bridge/cli_data.cxx codemaker/source/javamaker/javatype.cxx comphelper/inc/comphelper/componentcontext.hxx comphelper/inc/comphelper/interaction.hxx comphelper/inc/comphelper/locale.hxx comphelper/inc/comphelper/string.hxx comphelper/source/container/embeddedobjectcontainer.cxx comphelper/source/misc/accessiblecontexthelper.cxx comphelper/source/misc/asyncnotification.cxx comphelper/source/misc/locale.cxx comphelper/source/misc/mediadescriptor.cxx comphelper/source/misc/numberedcollection.cxx comphelper/source/misc/proxyaggregation.cxx comphelper/source/misc/scopeguard.cxx comphelper/source/misc/sequenceashashmap.cxx configure.in connectivity/source/commontools/parameters.cxx connectivity/source/drivers/dbase/DTable.cxx connectivity/source/drivers/evoab2/NStatement.cxx connectivity/source/drivers/file/FPreparedStatement.cxx connectivity/source/drivers/jdbc/DatabaseMetaData.cxx connectivity/source/inc/flat/ETable.hxx connectivity/source/parse/sqlnode.cxx cosv/inc/cosv/persist.hxx cosv/inc/cosv/ploc_dir.hxx cosv/inc/cosv/tpl/dyn.hxx cppu/source/LogBridge/LogBridge.cxx cppu/source/uno/data.cxx cppuhelper/source/bootstrap.cxx cppuhelper/source/component_context.cxx cppuhelper/source/propshlp.cxx cppuhelper/source/servicefactory.cxx cpputools/source/registercomponent/registercomponent.cxx cui/source/customize/acccfg.cxx cui/source/dialogs/about.cxx cui/source/dialogs/commonlingui.hxx cui/source/dialogs/showcols.cxx cui/source/inc/cuihyperdlg.hxx cui/source/inc/cuitabline.hxx cui/source/options/optsave.src cui/source/tabpages/tpline.cxx cui/source/tabpages/transfrm.cxx dbaccess/source/core/api/CacheSet.cxx dbaccess/source/core/api/KeySet.cxx dbaccess/source/core/api/RowSet.cxx dbaccess/source/core/api/RowSet.hxx dbaccess/source/core/api/RowSetBase.cxx dbaccess/source/core/api/RowSetBase.hxx dbaccess/source/core/api/RowSetCache.cxx dbaccess/source/core/api/querycomposer.cxx dbaccess/source/ext/adabas/Acomponentmodule.hxx dbaccess/source/ui/app/AppControllerDnD.cxx dbaccess/source/ui/app/AppDetailView.cxx dbaccess/source/ui/browser/brwctrlr.cxx dbaccess/source/ui/browser/sbagrid.cxx dbaccess/source/ui/browser/unodatbr.cxx dbaccess/source/ui/dlg/AdabasStat.hxx dbaccess/source/ui/dlg/UserAdmin.cxx dbaccess/source/ui/dlg/directsql.cxx dbaccess/source/ui/dlg/generalpage.hxx dbaccess/source/ui/dlg/tablespage.cxx dbaccess/source/ui/inc/JoinTableView.hxx dbaccess/source/ui/inc/TableController.hxx dbaccess/source/ui/inc/UITools.hxx dbaccess/source/ui/inc/brwctrlr.hxx dbaccess/source/ui/inc/datasourcemap.hxx dbaccess/source/ui/querydesign/JoinTableView.cxx dbaccess/source/ui/querydesign/QueryDesignView.cxx dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx dbaccess/source/ui/querydesign/TableWindow.cxx dbaccess/source/ui/querydesign/querycontroller.cxx dbaccess/source/ui/relationdesign/RelationTableView.cxx dbaccess/source/ui/tabledesign/TableController.cxx desktop/source/app/app.cxx desktop/source/app/appinit.cxx desktop/source/app/langselect.cxx desktop/source/app/officeipcthread.cxx desktop/source/deployment/manager/dp_extensionmanager.cxx desktop/source/deployment/misc/dp_misc.cxx desktop/source/deployment/misc/dp_resource.cxx desktop/source/deployment/registry/dp_backend.cxx desktop/source/deployment/registry/package/dp_package.cxx desktop/source/migration/cfgfilter.cxx desktop/source/migration/migration.cxx desktop/source/splash/splash.cxx desktop/win32/source/QuickStart/QuickStart.cpp desktop/win32/source/setup/setup.cpp drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx dtrans/source/win32/clipb/MtaOleClipb.hxx dtrans/source/win32/clipb/WinClipbImpl.cxx editeng/source/editeng/editview.cxx editeng/source/editeng/impedit2.cxx editeng/source/editeng/impedit3.cxx editeng/source/editeng/impedit4.cxx editeng/source/editeng/textconv.hxx editeng/source/misc/unolingu.cxx embeddedobj/source/commonembedding/persistence.cxx embeddedobj/source/general/dummyobject.cxx embeddedobj/source/msole/olecomponent.cxx embeddedobj/source/msole/olepersist.cxx embeddedobj/test/Container1/NativeView.java extensions/source/bibliography/framectr.cxx extensions/source/macosx/spotlight/OOoContentDataParser.m extensions/source/macosx/spotlight/unzip.h extensions/source/macosx/spotlight/unzip.m extensions/source/oooimprovement/myconfigurationhelper.hxx extensions/source/propctrlr/eventhandler.cxx extensions/source/propctrlr/formcomponenthandler.cxx extensions/source/propctrlr/pcrcomponentcontext.hxx extensions/source/scanner/twain.cxx extensions/source/update/check/updatecheckconfig.hxx external/mingwheaders/mingw_atl_headers.patch extras/source/misc_config/wizard/web/layouts/source.xml.xsl fileaccess/source/FileAccess.cxx filter/inc/filter/msfilter/msocximex.hxx filter/inc/filter/msfilter/svxmsbas.hxx filter/qa/complex/filter/detection/typeDetection/Helper.java filter/source/config/cache/basecontainer.cxx filter/source/config/cache/cacheitem.hxx filter/source/config/cache/contenthandlerfactory.cxx filter/source/config/cache/filtercache.cxx filter/source/config/cache/filtercache.hxx filter/source/config/cache/filterfactory.cxx filter/source/config/cache/frameloaderfactory.cxx filter/source/config/cache/querytokenizer.hxx filter/source/config/cache/typedetection.cxx filter/source/config/cache/typedetection.hxx filter/source/config/cache/versions.hxx filter/source/config/fragments/makefile.mk filter/source/config/tools/merge/pyAltFCFGMerge filter/source/flash/swfwriter.cxx filter/source/flash/swfwriter1.cxx filter/source/msfilter/msdffimp.cxx filter/source/msfilter/msocximex.cxx filter/source/msfilter/msvbahelper.cxx filter/source/msfilter/svxmsbas.cxx filter/source/xmlfilterdetect/filterdetect.cxx filter/source/xslt/import/uof2/uof2odf.xsl filter/source/xslt/odf2xhtml/export/xhtml/body.xsl filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64.java forms/source/xforms/convert.hxx forms/source/xforms/model.cxx fpicker/source/aqua/SalAquaFilePicker.mm fpicker/source/office/fpinteraction.cxx fpicker/source/unx/gnome/SalGtkFolderPicker.cxx fpicker/source/unx/kde4/KDE4FilePicker.cxx fpicker/source/win32/filepicker/PreviewCtrl.cxx fpicker/source/win32/filepicker/PreviewCtrl.hxx fpicker/source/win32/filepicker/VistaFilePicker.cxx fpicker/source/win32/filepicker/VistaFilePickerImpl.hxx fpicker/source/win32/filepicker/helppopupwindow.hxx fpicker/source/win32/folderpicker/MtaFop.hxx framework/inc/classes/droptargetlistener.hxx framework/inc/classes/filtercache.hxx framework/inc/classes/filtercachedata.hxx framework/inc/classes/protocolhandlercache.hxx framework/inc/classes/servicemanager.hxx framework/inc/commands.h framework/inc/dispatch/basedispatcher.hxx framework/inc/dispatch/blankdispatcher.hxx framework/inc/dispatch/closedispatcher.hxx framework/inc/dispatch/createdispatcher.hxx framework/inc/dispatch/dispatchprovider.hxx framework/inc/dispatch/helpagentdispatcher.hxx framework/inc/dispatch/mailtodispatcher.hxx framework/inc/dispatch/menudispatcher.hxx framework/inc/dispatch/oxt_handler.hxx framework/inc/dispatch/popupmenudispatcher.hxx framework/inc/dispatch/selfdispatcher.hxx framework/inc/dispatch/servicehandler.hxx framework/inc/dispatch/startmoduledispatcher.hxx framework/inc/dispatch/systemexec.hxx framework/inc/helper/fixeddocumentproperties.hxx framework/inc/helper/ocomponentaccess.hxx framework/inc/helper/oframes.hxx framework/inc/helper/otasksenumeration.hxx framework/inc/helper/persistentwindowstate.hxx framework/inc/helper/statusindicator.hxx framework/inc/helper/statusindicatorfactory.hxx framework/inc/helper/tagwindowasmodified.hxx framework/inc/helper/titlebarupdate.hxx framework/inc/helper/vclstatusindicator.hxx framework/inc/interaction/quietinteraction.hxx framework/inc/jobs/helponstartup.hxx framework/inc/jobs/job.hxx framework/inc/jobs/jobdata.hxx framework/inc/jobs/jobexecutor.hxx framework/inc/loadstate.h framework/inc/macros/debug/assertion.hxx framework/inc/macros/debug/event.hxx framework/inc/macros/debug/filterdbg.hxx framework/inc/macros/debug/memorymeasure.hxx framework/inc/macros/debug/timemeasure.hxx framework/inc/macros/xserviceinfo.hxx framework/inc/queries.h framework/inc/recording/dispatchrecordersupplier.hxx framework/inc/services/autorecovery.hxx framework/inc/services/backingcomp.hxx framework/inc/services/contenthandlerfactory.hxx framework/inc/services/desktop.hxx framework/inc/services/detectorfactory.hxx framework/inc/services/frame.hxx framework/inc/services/frameloaderfactory.hxx framework/inc/services/layoutmanager.hxx framework/inc/services/license.hxx framework/inc/services/logindialog.hxx framework/inc/services/modulemanager.hxx framework/inc/services/pathsettings.hxx framework/inc/services/pluginframe.hxx framework/inc/services/substitutepathvars.hxx framework/inc/services/task.hxx framework/inc/services/taskcreatorsrv.hxx framework/inc/stdtypes.h framework/inc/threadhelp/fairrwlock.hxx framework/inc/threadhelp/inoncopyable.h framework/inc/threadhelp/itransactionmanager.h framework/inc/threadhelp/lockhelper.hxx framework/inc/threadhelp/readguard.hxx framework/inc/threadhelp/resetableguard.hxx framework/inc/threadhelp/transactionguard.hxx framework/inc/threadhelp/writeguard.hxx framework/inc/uifactory/uielementfactorymanager.hxx framework/inc/xml/acceleratorconfigurationreader.hxx framework/qa/complex/dispatches/checkdispatchapi.java framework/qa/complex/framework/autosave/AutoSave.java framework/qa/complex/framework/autosave/Protocol.java framework/qa/complex/framework/recovery/RecoveryTest.java framework/qa/complex/loadAllDocuments/StreamSimulator.java framework/source/accelerators/acceleratorconfiguration.cxx framework/source/accelerators/acceleratorexecute.cxx framework/source/accelerators/acceleratorexecute.hxx framework/source/accelerators/keymapping.cxx framework/source/accelerators/presethandler.cxx framework/source/application/framework.cxx framework/source/application/login.cxx framework/source/classes/framecontainer.cxx framework/source/classes/menumanager.cxx framework/source/classes/taskcreator.cxx framework/source/dispatch/closedispatcher.cxx framework/source/dispatch/dispatchprovider.cxx framework/source/dispatch/helpagentdispatcher.cxx framework/source/dispatch/interceptionhelper.cxx framework/source/dispatch/mailtodispatcher.cxx framework/source/dispatch/menudispatcher.cxx framework/source/dispatch/oxt_handler.cxx framework/source/dispatch/servicehandler.cxx framework/source/fwe/classes/framelistanalyzer.cxx framework/source/fwe/dispatch/interaction.cxx framework/source/fwe/helper/titlehelper.cxx framework/source/fwe/helper/undomanagerhelper.cxx framework/source/fwe/xml/eventsdocumenthandler.cxx framework/source/fwe/xml/statusbardocumenthandler.cxx framework/source/fwe/xml/toolboxdocumenthandler.cxx framework/source/fwi/classes/protocolhandlercache.cxx framework/source/fwi/threadhelp/lockhelper.cxx framework/source/fwi/threadhelp/transactionmanager.cxx framework/source/helper/persistentwindowstate.cxx framework/source/helper/statusindicatorfactory.cxx framework/source/helper/vclstatusindicator.cxx framework/source/inc/accelerators/acceleratorcache.hxx framework/source/inc/accelerators/acceleratorconfiguration.hxx framework/source/inc/accelerators/presethandler.hxx framework/source/inc/accelerators/storageholder.hxx framework/source/inc/loadenv/actionlockguard.hxx framework/source/inc/loadenv/loadenv.hxx framework/source/inc/loadenv/loadenvexception.hxx framework/source/inc/pattern/frame.hxx framework/source/inc/pattern/storages.hxx framework/source/inc/pattern/window.hxx framework/source/jobs/helponstartup.cxx framework/source/jobs/job.cxx framework/source/jobs/jobdata.cxx framework/source/jobs/jobdispatch.cxx framework/source/jobs/jobresult.cxx framework/source/jobs/joburl.cxx framework/source/jobs/shelljob.cxx framework/source/loadenv/loadenv.cxx framework/source/services/autorecovery.cxx framework/source/services/backingwindow.cxx framework/source/services/desktop.cxx framework/source/services/frame.cxx framework/source/services/modulemanager.cxx framework/source/services/pathsettings.cxx framework/source/services/substitutepathvars.cxx framework/source/uiconfiguration/moduleuicfgsupplier.cxx framework/source/uiconfiguration/moduleuiconfigurationmanager.cxx framework/source/uiconfiguration/uicategorydescription.cxx framework/source/uiconfiguration/uiconfigurationmanagerimpl.cxx framework/source/uiconfiguration/windowstateconfiguration.cxx framework/source/uielement/uicommanddescription.cxx framework/source/unotypes/fwk.xml framework/source/xml/imagesdocumenthandler.cxx framework/test/test.cxx framework/test/test_componentenumeration.bas framework/test/test_statusindicatorfactory.bas framework/test/threadtest.cxx framework/test/threadtest/threadtest.cxx framework/test/typecfg/cfgview.cxx framework/test/typecfg/xml2xcd.cxx include/basegfx/polygon/b2dpolygon.hxx include/canvas/base/graphicdevicebase.hxx include/canvas/canvastools.hxx include/comphelper/configurationhelper.hxx include/comphelper/embeddedobjectcontainer.hxx include/comphelper/propagg.hxx include/comphelper/sequenceashashmap.hxx include/connectivity/sqlerror.hxx include/connectivity/sqlnode.hxx include/cppuhelper/propshlp.hxx include/editeng/AccessibleContextBase.hxx include/framework/framelistanalyzer.hxx sfx2/source/dialog/backingcomp.cxx vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx Change-Id: I2618bf83c0e30f68f23ff25f6eb466df04d34c6d
2014-04-29 19:05:05 +00:00
* @param url This is UNO URL which describes the type of a connection.
2004-09-06 14:11:38 +00:00
*/
public void setUnoUrl(String url)
throws java.net.MalformedURLException
{
mURL = null;
String prefix = "uno:localoffice";
if ( url.startsWith(prefix) )
parseUnoUrlWithOfficePath( url, prefix );
else
{
try
{
UnoUrl aURL = UnoUrl.parseUnoUrl( url );
mConnType = aURL.getConnection();
mPipe = aURL.getConnectionParameters().get( "pipe" );
mPort = aURL.getConnectionParameters().get( "port" );
2004-09-06 14:11:38 +00:00
mProtocol = aURL.getProtocol();
mInitialObject = aURL.getRootOid();
}
catch ( com.sun.star.lang.IllegalArgumentException ex1 )
2004-09-06 14:11:38 +00:00
{
java.net.MalformedURLException ex2 = new java.net.MalformedURLException(
2004-09-06 14:11:38 +00:00
"Invalid UNO connection URL.");
ex2.initCause(ex1);
throw ex2;
2004-09-06 14:11:38 +00:00
}
}
mURL = url;
}
/**
* Sets an AWT container factory.
2004-09-06 14:11:38 +00:00
*
* @param containerFactory This is a application provided AWT container
* factory.
*/
@Deprecated
2004-09-06 14:11:38 +00:00
public void setContainerFactory(ContainerFactory containerFactory)
{
}
/**
* Retrieves the UNO component context.
2004-09-06 14:11:38 +00:00
* Establishes a connection if necessary and initialises the
* UNO service manager if it has not already been initialised.
* This method can return <code>null</code> if it fails to connect
* to the office application.
*
* @return The office UNO component context.
*/
synchronized public XComponentContext getComponentContext()
2004-09-06 14:11:38 +00:00
{
if ( mContext == null )
mContext = connect();
return mContext;
}
/**
* Creates an office window.
* The window is either a sub-class of java.awt.Canvas (local) or
* java.awt.Container (RVP).
*
* @param container This is an AWT container.
* @return The office window instance.
*/
@Deprecated
2004-09-06 14:11:38 +00:00
public OfficeWindow createOfficeWindow(Container container)
{
return new LocalOfficeWindow(this);
}
/**
* Closes the connection.
*/
public void dispose()
{
Iterator<XEventListener> itr = mComponents.iterator();
while (itr.hasNext()) {
2004-09-06 14:11:38 +00:00
// ignore runtime exceptions in dispose
try { itr.next().disposing(null); }
2004-09-06 14:11:38 +00:00
catch ( RuntimeException aExc ) {}
}
mComponents.clear();
// Terminate the bridge. It turned out that this is necessary for the bean
// to work properly when displayed in an applet within Internet Explorer.
// When navigating off the page which is showing the applet and then going
// back to it, then the Java remote bridge is damaged. That is the Java threads
// do not work properly anymore. Therefore when Applet.stop is called the connection
// to the office including the bridge needs to be terminated.
if (mBridge != null)
{
XComponent comp = UnoRuntime.queryInterface(
XComponent.class, mBridge);
if (comp != null)
comp.dispose();
else
System.err.println("LocalOfficeConnection: could not dispose bridge!");
mBridge = null;
}
2004-09-06 14:11:38 +00:00
mContext = null;
}
/**
* Adds an event listener to the object.
*
* @param listener is a listener object.
*/
public void addEventListener(XEventListener listener)
{
mComponents.add(listener);
}
/**
* Removes an event listener from the listener list.
*
* @param listener is a listener object.
*/
public void removeEventListener(XEventListener listener)
{
mComponents.remove(listener);
}
/**
* Establishes the connection to the office.
*/
private XComponentContext connect()
{
try
{
// create default local component context
XComponentContext xLocalContext =
com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null);
// initial serviceManager
xLocalContext.getServiceManager();
2004-09-06 14:11:38 +00:00
// try to connect to soffice
Object aInitialObject = null;
try
{
aInitialObject = resolve(xLocalContext, mURL);
2004-09-06 14:11:38 +00:00
}
catch( com.sun.star.connection.NoConnectException e )
{
// launch soffice
OfficeService aSOffice = new OfficeService();
aSOffice.startupService();
// wait until soffice is started
long nGiveUpTimeMillis = System.currentTimeMillis() + 1000L*aSOffice.getStartupTime();
2004-09-06 14:11:38 +00:00
while ( aInitialObject == null )
{
try
{
Thread.currentThread();
2004-09-06 14:11:38 +00:00
// try to connect to soffice
Thread.sleep( 100 );
aInitialObject = resolve(xLocalContext, mURL);
2004-09-06 14:11:38 +00:00
}
catch( com.sun.star.connection.NoConnectException aEx )
{
// soffice did not start in time
if ( System.currentTimeMillis() > nGiveUpTimeMillis )
2004-09-06 14:11:38 +00:00
throw aEx;
}
}
}
// XComponentContext
if( null != aInitialObject )
{
XPropertySet xPropertySet = UnoRuntime.queryInterface( XPropertySet.class, aInitialObject);
2004-09-06 14:11:38 +00:00
Object xContext = xPropertySet.getPropertyValue("DefaultContext");
XComponentContext xComponentContext = UnoRuntime.queryInterface(
2004-09-06 14:11:38 +00:00
XComponentContext.class, xContext);
return xComponentContext;
}
}
catch( com.sun.star.connection.NoConnectException e )
{
System.out.println( "Couldn't connect to remote server" );
System.out.println( e.getMessage() );
}
catch( com.sun.star.connection.ConnectionSetupException e )
{
System.out.println( "Couldn't access necessary local resource to establish the interprocess connection" );
System.out.println( e.getMessage() );
}
catch( com.sun.star.lang.IllegalArgumentException e )
{
System.out.println( "uno-url is syntactical illegal ( " + mURL + " )" );
System.out.println( e.getMessage() );
}
catch( com.sun.star.uno.RuntimeException e )
{
System.out.println( "--- RuntimeException:" );
System.out.println( e.getMessage() );
e.printStackTrace();
System.out.println( "--- end." );
throw e;
}
catch( java.lang.Exception e )
{
System.out.println( "java.lang.Exception: " );
System.out.println( e );
e.printStackTrace();
System.out.println( "--- end." );
throw new com.sun.star.uno.RuntimeException(e);
2004-09-06 14:11:38 +00:00
}
return null;
}
// The function is copied and adapted from the UrlResolver.resolve.
// We cannot use the URLResolver because we need access to the bridge which has
// to be disposed when Applet.stop is called.
private Object resolve(XComponentContext xLocalContext, String dcp)
throws com.sun.star.connection.NoConnectException,
com.sun.star.connection.ConnectionSetupException,
com.sun.star.lang.IllegalArgumentException
{
String conDcp = null;
String protDcp = null;
String rootOid = null;
if(dcp.indexOf(';') == -1) { // use old style
conDcp = dcp;
protDcp = "iiop";
rootOid = "classic_uno";
}
else { // new style
int index = dcp.indexOf(':');
dcp = dcp.substring(index + 1).trim();
index = dcp.indexOf(';');
conDcp = dcp.substring(0, index).trim();
dcp = dcp.substring(index + 1).trim();
index = dcp.indexOf(';');
protDcp = dcp.substring(0, index).trim();
dcp = dcp.substring(index + 1).trim();
rootOid = dcp.trim().trim();
}
Object rootObject = null;
XBridgeFactory xBridgeFactory= null;
XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager();
try {
xBridgeFactory = UnoRuntime.queryInterface(
XBridgeFactory.class,
xLocalServiceManager.createInstanceWithContext(
"com.sun.star.bridge.BridgeFactory", xLocalContext));
} catch (com.sun.star.uno.Exception e) {
throw new com.sun.star.uno.RuntimeException(e);
}
synchronized(this) {
if(mBridge == null) {
Object connector= null;
try {
connector = xLocalServiceManager.createInstanceWithContext(
"com.sun.star.connection.Connector", xLocalContext);
} catch (com.sun.star.uno.Exception e) {
throw new com.sun.star.uno.RuntimeException(e);
}
XConnector connector_xConnector = UnoRuntime.queryInterface(XConnector.class, connector);
// connect to the server
XConnection xConnection = connector_xConnector.connect(conDcp);
// create the bridge name. This should not be necessary if we pass an
// empty string as bridge name into createBridge. Then we should always get
// a new bridge. This does not work because of (i51323). Therefore we
// create unique bridge names for the current process.
String sBridgeName = "OOoBean_private_bridge_" + m_nBridgeCounter.getAndIncrement();
try {
mBridge = xBridgeFactory.createBridge(sBridgeName, protDcp, xConnection, null);
} catch (com.sun.star.bridge.BridgeExistsException e) {
throw new com.sun.star.uno.RuntimeException(e);
}
}
rootObject = mBridge.getInstance(rootOid);
return rootObject;
}
}
2004-09-06 14:11:38 +00:00
/**
* Parses a connection URL.
* This method accepts a UNO URL with following format:<br />
* <pre>
* url := uno:localoffice[,&lt;params&gt;];urp;StarOffice.NamingService
* params := &lt;path&gt;[,&lt;pipe&gt;]
* path := path=&lt;pathv&gt;
* pipe := pipe=&lt;pipev&gt;
* pathv := platform_specific_path_to_the_local_office_distribution
* pipev := local_office_connection_pipe_name
* </pre>
*
* <h4>Examples</h4>
* <ul>
* <li>"uno:localoffice,pipe=xyz_Office,path=/opt/openoffice11/program;urp;StarOffice.ServiceManager";
* <li>"uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager";
* </ul>
*
* @param url This is UNO URL which describes the type of a connection.
* @exception java.net.MalformedURLException when inappropreate URL was
* provided.
*/
private void parseUnoUrlWithOfficePath(String url, String prefix)
throws java.net.MalformedURLException
{
// Extract parameters.
int idx = url.indexOf(";urp;StarOffice.ServiceManager");
2004-09-06 14:11:38 +00:00
if (idx < 0)
throw new java.net.MalformedURLException(
"Invalid UNO connection URL.");
String params = url.substring(prefix.length(), idx + 1);
// Parse parameters.
String name = null;
String path = null;
String pipe = null;
char ch;
int state = 0;
StringBuffer buffer = new StringBuffer();
for(idx = 0; idx < params.length(); idx += 1) {
ch = params.charAt(idx);
switch (state) {
case 0: // initial state
switch(ch) {
case ',':
buffer.delete(0, buffer.length());
state = 1;
break;
case ';':
state = 7;
break;
default:
buffer.delete(0, buffer.length());
buffer.append(ch);
state = 1;
break;
}
break;
case 1: // parameter name
switch(ch) {
case ' ':
case '=':
name = buffer.toString();
state = (ch == ' ')? 2: 3;
break;
case ',':
case ';':
state = -6; // error: invalid name
break;
default:
buffer.append(ch);
break;
}
break;
case 2: // equal between the name and the value
switch(ch) {
case '=':
state = 3;
break;
case ' ':
break;
default:
state = -1; // error: missing '='
break;
}
break;
case 3: // value leading spaces
switch(ch) {
case ' ':
break;
default:
buffer.delete(0, buffer.length());
buffer.append(ch);
state = 4;
break;
}
break;
case 4: // value
switch(ch) {
case ' ':
case ',':
case ';':
idx -= 1; // put back the last read character
state = 5;
if (name.equals("path")) {
if (path == null)
path = buffer.toString();
else
state = -3; // error: more than one 'path'
2004-09-06 14:11:38 +00:00
} else if (name.equals("pipe")) {
if (pipe == null)
pipe = buffer.toString();
else
state = -4; // error: more than one 'pipe'
2004-09-06 14:11:38 +00:00
} else
state = -2; // error: unknown parameter
buffer.delete(0, buffer.length());
break;
default:
buffer.append(ch);
break;
}
break;
case 5: // a delimiter after the value
2004-09-06 14:11:38 +00:00
switch(ch) {
case ' ':
break;
case ',':
state = 6;
break;
case ';':
state = 7;
break;
default:
state = -5; // error: ' ' inside the value
break;
}
break;
case 6: // leading spaces before next parameter name
switch(ch) {
case ' ':
break;
default:
buffer.delete(0, buffer.length());
buffer.append(ch);
state = 1;
break;
}
break;
default:
throw new java.net.MalformedURLException(
"Invalid UNO connection URL.");
}
}
if (state != 7)
throw new java.net.MalformedURLException(
"Invalid UNO connection URL.");
// Set up the connection parameters.
if (pipe != null)
mPipe = pipe;
}
/** creates a unique pipe name.
*/
private static String getPipeName() throws UnsupportedEncodingException
2004-09-06 14:11:38 +00:00
{
// turn user name into a URL and file system safe name (% chars will not work)
String aPipeName = System.getProperty("user.name") + OFFICE_ID_SUFFIX;
aPipeName = aPipeName.replace( "_", "%B7" );
return java.net.URLEncoder.encode( aPipeName, "UTF-8" ).replace( "+", "%20" ).replace( "%", "_" );
2004-09-06 14:11:38 +00:00
}
/**
* @para This is an implementation of the native office service.
*/
private class OfficeService
implements NativeService
{
/**
* Retrieve the office service identifier.
2004-09-06 14:11:38 +00:00
*
* @return The identifier of the office service.
*/
public String getIdentifier()
{
String identifier = null;
try
{
identifier = ( mPipe == null) ? getPipeName() : mPipe;
}
catch (UnsupportedEncodingException e)
{
throw new com.sun.star.uno.RuntimeException(e);
}
return identifier;
2004-09-06 14:11:38 +00:00
}
/**
* Starts the office process.
*/
public void startupService()
throws java.io.IOException
{
int nSizeCmdArray = 4;
String sOption = null;
// examine if user specified command-line options in system properties.
// We may offer later a more sophisticated way of providing options if
// the need arises. Currently this is intended to ease the pain during
// development with pre-release builds of LibO where one wants to start
// LibO with the --norestore options. The value of the property is simple
// passed on to the Runtime.exec call.
try {
sOption = System.getProperty("com.sun.star.officebean.Options");
if (sOption != null)
nSizeCmdArray ++;
} catch (java.lang.SecurityException e)
{
e.printStackTrace();
}
// create call with arguments
String[] cmdArray = new String[nSizeCmdArray];
// read UNO_PATH environment variable to get path to soffice binary
String unoPath = System.getenv("UNO_PATH");
if (unoPath == null)
throw new java.io.IOException( "UNO_PATH environment variable is not set (required system path to the office program directory)" );
cmdArray[0] = (new File(unoPath, OFFICE_APP_NAME)).getPath();
cmdArray[1] = "--nologo";
cmdArray[2] = "--nodefault";
2004-09-06 14:11:38 +00:00
if ( mConnType.equals( "pipe" ) )
cmdArray[3] = "--accept=pipe,name=" + getIdentifier() + ";" +
2004-09-06 14:11:38 +00:00
mProtocol + ";" + mInitialObject;
else if ( mConnType.equals( "socket" ) )
cmdArray[3] = "--accept=socket,port=" + mPort + ";urp";
2004-09-06 14:11:38 +00:00
else
throw new java.io.IOException( "not connection specified" );
if (sOption != null)
cmdArray[4] = sOption;
2004-09-06 14:11:38 +00:00
// start process
mProcess = Runtime.getRuntime().exec(cmdArray);
if ( mProcess == null )
throw new com.sun.star.uno.RuntimeException( "cannot start soffice: " + Arrays.toString(cmdArray) );
new StreamProcessor(mProcess.getInputStream(), System.out);
new StreamProcessor(mProcess.getErrorStream(), System.err);
2004-09-06 14:11:38 +00:00
}
/**
* Retrieves the amount of time to wait for the startup.
2004-09-06 14:11:38 +00:00
*
* @return The amount of time to wait in seconds(?).
2004-09-06 14:11:38 +00:00
*/
public int getStartupTime()
{
return 60;
}
}
private static class StreamProcessor extends Thread
{
private final java.io.InputStream m_in;
private final java.io.PrintStream m_print;
public StreamProcessor(final java.io.InputStream in, final java.io.PrintStream out)
{
super("StreamProcessor");
m_in = in;
m_print = out;
start();
}
@Override
public void run() {
java.io.BufferedReader r = new java.io.BufferedReader(
new java.io.InputStreamReader(m_in) );
try {
for ( ; ; ) {
String s = r.readLine();
if ( s == null ) {
break;
}
m_print.println(s);
}
} catch ( java.io.IOException e ) {
e.printStackTrace( System.err );
}
}
}
2004-09-06 14:11:38 +00:00
}