blob: 27e5557339d29e2d58c40c6ec858d908dfb353f2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Michael Scharf (Wind River) - initial API and implementation
* Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl
*******************************************************************************/
package org.eclipse.tm.internal.terminal.provisional.api.provider;
import java.io.OutputStream;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
/**
* Abstract base class for all terminal connector implementations to be
* registered via the <code>org.eclipse.tm.terminal.terminalConnectors</code>
* extension point.
*
* @since org.eclipse.tm.terminal 2.0
*/
public abstract class TerminalConnectorImpl {
/**
* The TerminalControl associated with this connector.
* Required for advertising state changes when needed.
*/
protected ITerminalControl fControl;
/**
* Initialize this connector. This is called once after the constructor, in
* order to perform any required initializations such as loading required
* native libraries. Any work that may lead to runtime exceptions should be
* done in this method rather than in the constructor.
*
* @throws Exception when the connector fails to initialize (due to missing
* required libraries, for instance).
*/
public void initialize() throws Exception {
}
/**
* Connect using the current state of the settings.
*
* This method is designed to be overridden by actual implementations, in
* order to open the streams required for communicating with the remote
* side. Extenders must call <code>super.connect(control)</code> as the
* first thing they are doing.
*
* @param control Used to inform the UI about state changes and messages
* from the connection.
*/
public void connect(ITerminalControl control) {
Logger.log("entered."); //$NON-NLS-1$
fControl = control;
}
/**
* Disconnect if connected. Else do nothing. Has to set the state of the
* {@link ITerminalControl} when finished disconnecting.
*/
public final void disconnect() {
Logger.log("entered."); //$NON-NLS-1$
doDisconnect();
fControl.setState(TerminalState.CLOSED);
}
/**
* Disconnect if connected. Else do nothing. Clients should override to
* perform any extra work needed for disconnecting.
*/
protected void doDisconnect() {
// Do nothing by default
}
/**
* @return the terminal to remote stream (bytes written to this stream will
* be sent to the remote site). For the stream in the other direction (remote to
* terminal see {@link ITerminalControl#getRemoteToTerminalOutputStream()}
*/
abstract public OutputStream getTerminalToRemoteStream();
/**
* @return A string that represents the settings of the connection. This representation
* may be shown in the status line of the terminal view.
*/
abstract public String getSettingsSummary();
/**
* Test if local echo is needed. The default implementation returns
* <code>false</code>. Override to modify this behavior.
*
* @return true if a local echo is needed. TODO:Michael Scharf: this should
* be handed within the connection....
*/
public boolean isLocalEcho() {
return false;
}
/**
* Return a settings page for configuring this connector, or
* <code>null</code> if it cannot be configured.
*
* The dialog should persist its settings with the
* {@link #load(ISettingsStore)} and {@link #save(ISettingsStore)} methods.
*
* @return a new page that can be used in a dialog to setup this connection,
* or <code>null</code>.
*/
public ISettingsPage makeSettingsPage() {
return null;
}
/**
* Load the state or settings of this connection. Is typically called before
* {@link #connect(ITerminalControl)}.
*
* Connectors that have nothing to configure do not need to implement this.
* Those terminals that do have configuration (which they expose via
* {@link #makeSettingsPage()} need to override this method to load
* settings.
*
* @param store a string based data store. Short keys like "foo" can be used
* to store the state of the connection.
*/
public void load(ISettingsStore store) {
// do nothing by default
}
/**
* When the view or dialog containing the terminal is closed, the state of
* the connection is saved into the settings store <code>store</code>.
*
* Connectors that have no state or settings to persist do not need to
* override this. Others should override to persist their settings.
*
* @param store the store for persisting settings.
*/
public void save(ISettingsStore store) {
// do nothing by default
}
/**
* Notify the remote site that the size of the terminal has changed.
*
* Concrete connectors should override this if they have the possibility to
* inform the remote about changed terminal size.
*
* @param newWidth the new width in characters.
* @param newHeight the new height in characters.
*/
public void setTerminalSize(int newWidth, int newHeight) {
}
}