blob: 8178dccb18efcfbdb4810ca48630512b0c13710f [file] [log] [blame] [edit]
/*
* libbrlapi - A library providing access to braille terminals for applications.
*
* Copyright (C) 2006-2023 by
* Samuel Thibault <Samuel.Thibault@ens-lyon.org>
* Sébastien Hinderer <Sebastien.Hinderer@ens-lyon.org>
*
* libbrlapi comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
package org.a11y.brlapi;
import java.io.InterruptedIOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;
public class ConnectionBase extends NativeComponent implements AutoCloseable {
private long connectionHandle;
private final static Map<Long, ConnectionBase> connections = new HashMap<>();
private boolean hasBecomeUnusable = false;
private native int openConnection (
ConnectionSettings desiredSettings, ConnectionSettings actualSettings
) throws ConnectException;
private final ConnectionSettings connectionSettings;
private final int fileDescriptor;
public ConnectionBase (ConnectionSettings settings) throws ConnectException {
super();
connectionSettings = new ConnectionSettings();
fileDescriptor = openConnection(settings, connectionSettings);
synchronized (connections) {
if (connections.putIfAbsent(connectionHandle, this) != null) {
throw new IllegalStateException("connection handle already mapped");
}
}
}
public final String getServerHost () {
return connectionSettings.getServerHost();
}
public final String getAuthenticationScheme () {
return connectionSettings.getAuthenticationScheme();
}
public final int getFileDescriptor () {
return fileDescriptor;
}
private native void closeConnection ();
private boolean hasBeenClosed = false;
@Override
public void close () {
synchronized (this) {
if (!hasBeenClosed) {
synchronized (connections) {
connections.remove(connectionHandle);
}
closeConnection();
hasBeenClosed = true;
}
}
}
public static ConnectionBase getConnection (long handle) {
synchronized (connections) {
return connections.get(handle);
}
}
public static void setUnusable (long handle) {
// this needs to be public but it mustn't be easy
ConnectionBase connection = getConnection(handle);
connection.hasBecomeUnusable = true;
}
public final boolean isUnusable () {
return hasBecomeUnusable;
}
public native String getDriverName ();
public native String getModelIdentifier ();
public native DisplaySize getDisplaySize ();
public native void pause (int milliseconds)
throws InterruptedIOException;
public native int enterTtyMode (int tty, String driver);
public native void enterTtyModeWithPath (String driver, int... ttys);
public native void leaveTtyMode ();
public native void setFocus (int tty);
protected native void writeText (int cursor, String text);
protected native void writeDots (byte[] dots);
public native void write (WriteArguments arguments);
public native Long readKey (boolean wait) throws InterruptedIOException;
public native long readKeyWithTimeout (int milliseconds)
throws InterruptedIOException, TimeoutException;
public native void ignoreKeys (long type, long[] keys);
public native void acceptKeys (long type, long[] keys);
public native void ignoreAllKeys ();
public native void acceptAllKeys ();
public native void ignoreKeyRanges (long[][] ranges);
public native void acceptKeyRanges (long[][] ranges);
public native void enterRawMode (String driver);
public native void leaveRawMode ();
public native int sendRaw (byte[] buffer);
public native int recvRaw (byte[] buffer)
throws InterruptedIOException;
public native Object getParameter (int parameter, long subparam, boolean global);
public native void setParameter (int parameter, long subparam, boolean global, Object value);
public native long watchParameter (int parameter, long subparam, boolean global, ParameterWatcher watcher);
public native static void unwatchParameter (long identifier);
}