| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| package org.openoffice.accessibility.misc; |
| |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| import java.io.PrintStream; |
| import java.util.Timer; |
| import java.util.TimerTask; |
| import java.util.Vector; |
| |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.bridge.XUnoUrlResolver; |
| import com.sun.star.lang.XMultiServiceFactory; |
| import com.sun.star.comp.helper.Bootstrap; |
| |
| /** This class establishes a connection to a StarOffice application. |
| */ |
| public class OfficeConnection |
| extends TimerTask |
| { |
| final public static long snDelay = 3000; |
| |
| public static synchronized OfficeConnection Instance () |
| { |
| if (saInstance == null) |
| saInstance = new OfficeConnection (); |
| return saInstance; |
| } |
| |
| |
| |
| |
| static public void SetPipeName (String sPipeName) |
| { |
| ssDefaultPipeName = sPipeName; |
| } |
| |
| |
| |
| |
| public void AddConnectionListener (ActionListener aListener) |
| { |
| SimpleOffice aOffice = SimpleOffice.Instance(); |
| if (IsValid()) |
| aListener.actionPerformed ( |
| new ActionEvent (aOffice,0,"<connected>")); |
| maListeners.add (aListener); |
| } |
| |
| |
| |
| /** @descr Return the service manager that represents the connected |
| StarOffice application |
| */ |
| public XMultiServiceFactory GetServiceManager () |
| { |
| return maServiceManager; |
| } |
| |
| |
| |
| |
| /** Return a flag that indicates if the constructor has been able to |
| establish a valid connection. |
| */ |
| public boolean IsValid () |
| { |
| return (maServiceManager != null); |
| } |
| |
| |
| |
| |
| /** Connect to a already running StarOffice application that has |
| been started with a command line argument like |
| "-accept=pipe,name=<username>;urp;" |
| */ |
| private boolean Connect () |
| { |
| mbInitialized = true; |
| // Set up connection string. |
| String sConnectString = "uno:pipe,name=" + msPipeName |
| + ";urp;StarOffice.ServiceManager"; |
| |
| // connect to a running office and get the ServiceManager |
| try |
| { |
| // Create a URL Resolver. |
| XMultiServiceFactory aLocalServiceManager = |
| Bootstrap.createSimpleServiceManager(); |
| XUnoUrlResolver aURLResolver = |
| (XUnoUrlResolver) UnoRuntime.queryInterface ( |
| XUnoUrlResolver.class, |
| aLocalServiceManager.createInstance ( |
| "com.sun.star.bridge.UnoUrlResolver") |
| ); |
| |
| maServiceManager = |
| (XMultiServiceFactory) UnoRuntime.queryInterface ( |
| XMultiServiceFactory.class, |
| aURLResolver.resolve (sConnectString) |
| ); |
| } |
| |
| catch (Exception e) |
| { |
| if (maOut != null) |
| { |
| maOut.println ("Could not connect with " |
| + sConnectString + " : " + e); |
| maOut.println ("Please start OpenOffice/StarOffice with " |
| + "\"-accept=pipe,name=" + msPipeName + ";urp;\""); |
| } |
| } |
| |
| return maServiceManager != null; |
| } |
| |
| |
| public void run () |
| { |
| if ( ! IsValid()) |
| { |
| MessageArea.println ("trying to connect"); |
| if (Connect()) |
| { |
| // Stop the timer. |
| cancel (); |
| |
| ActionEvent aEvent = new ActionEvent (this,0,"<connected>"); |
| for (int i=0; i<maListeners.size(); i++) |
| ((ActionListener)maListeners.elementAt(i)).actionPerformed(aEvent); |
| } |
| } |
| } |
| |
| private OfficeConnection () |
| { |
| this (null); |
| } |
| |
| |
| private OfficeConnection (PrintStream aOut) |
| { |
| msPipeName = ssDefaultPipeName; |
| maOut = aOut; |
| maListeners = new Vector(); |
| maServiceManager = null; |
| |
| maTimer = new Timer (true); |
| maTimer.schedule (this, 0, snDelay); |
| } |
| |
| |
| private static OfficeConnection saInstance = null; |
| private static String ssDefaultPipeName = System.getenv( "USER" ); |
| |
| private XMultiServiceFactory maServiceManager; |
| String msPipeName; |
| |
| /** A value of true just indicates that it has been tried to establish a connection, |
| not that that has been successfull. |
| */ |
| private boolean mbInitialized = false; |
| |
| /// Stream used to print messages. |
| private PrintStream maOut; |
| private Timer maTimer; |
| private Vector maListeners; |
| } |