blob: 9afe4b515a910c4b534e999fefca64d8fbb5359d [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;
public abstract class Parameter extends ParameterComponent {
private final ConnectionBase clientConnection;
protected Parameter (ConnectionBase connection) {
super();
clientConnection = connection;
}
private String parameterLabel = null;
public String getLabel () {
synchronized (this) {
if (parameterLabel == null) {
parameterLabel = Strings.wordify(
Strings.replaceAll(getClass().getSimpleName(), "Parameter$", "")
);
}
}
return parameterLabel;
}
private String parameterName = null;
public String getName () {
synchronized (this) {
if (parameterName == null) {
parameterName = toOperandName(getLabel());
}
}
return parameterName;
}
public abstract int getParameter ();
public abstract boolean isGlobal ();
public boolean isHidable () {
return false;
}
protected final Object getValue (long subparam) {
return clientConnection.getParameter(getParameter(), subparam, isGlobal());
}
protected final Object getValue () {
return getValue(0);
}
protected final void setValue (long subparam, Object value) {
clientConnection.setParameter(getParameter(), subparam, isGlobal(), value);
}
protected final void setValue (Object value) {
setValue(0, value);
}
public Object get (long subparam) {
return null;
}
public String toString (long subparam) {
return toString(get(subparam));
}
public Object get () {
return null;
}
@Override
public String toString () {
return toString(get());
}
public interface Settable {
}
public final boolean isSettable () {
return this instanceof Settable;
}
public interface StringSettable extends Settable {
public void set (String value) throws SyntaxException;
}
public interface BooleanSettable extends Settable {
public void set (boolean value);
}
public interface ByteSettable extends Settable {
public void set (byte value);
public default byte getMinimum () {
return 0;
}
public default byte getMaximum () {
return Byte.MAX_VALUE;
}
}
public interface ShortSettable extends Settable {
public void set (short value);
public default short getMinimum () {
return 0;
}
public default short getMaximum () {
return Short.MAX_VALUE;
}
}
public interface IntSettable extends Settable {
public void set (int value);
public default int getMinimum () {
return 0;
}
public default int getMaximum () {
return Integer.MAX_VALUE;
}
}
public interface LongSettable extends Settable {
public void set (long value);
public default long getMinimum () {
return 0;
}
public default long getMaximum () {
return Long.MAX_VALUE;
}
}
protected final String getParseDescription () {
return getName() + " value";
}
public void set (String value) throws OperandException {
if (!isSettable()) {
throw new SemanticException("parameter is not settable: %s", getName());
}
if (this instanceof StringSettable) {
StringSettable settable = (StringSettable)this;
settable.set(value);
return;
}
if (this instanceof BooleanSettable) {
BooleanSettable settable = (BooleanSettable)this;
settable.set(Parse.asBoolean(getParseDescription(), value));
return;
}
if (this instanceof ByteSettable) {
ByteSettable settable = (ByteSettable)this;
settable.set(Parse.asByte(getParseDescription(), value, settable.getMinimum(), settable.getMaximum()));
return;
}
if (this instanceof ShortSettable) {
ShortSettable settable = (ShortSettable)this;
settable.set(Parse.asShort(getParseDescription(), value, settable.getMinimum(), settable.getMaximum()));
return;
}
if (this instanceof IntSettable) {
IntSettable settable = (IntSettable)this;
settable.set(Parse.asInt(getParseDescription(), value, settable.getMinimum(), settable.getMaximum()));
return;
}
if (this instanceof LongSettable) {
LongSettable settable = (LongSettable)this;
settable.set(Parse.asLong(getParseDescription(), value, settable.getMinimum(), settable.getMaximum()));
return;
}
{
Class<?> type = Settable.class;
for (Class<?> i : getClass().getInterfaces()) {
if (type.isAssignableFrom(i)) {
type = i;
break;
}
}
throw new UnsupportedOperationException(
String.format(
"set not supported: %s: %s", getName(), type.getSimpleName()
)
);
}
}
public final static class WatcherHandle implements AutoCloseable {
private long watchIdentifier;
private WatcherHandle (long identifier) {
watchIdentifier = identifier;
}
@Override
public void close () {
synchronized (this) {
if (watchIdentifier != 0) {
ConnectionBase.unwatchParameter(watchIdentifier);
watchIdentifier = 0;
}
}
}
}
public final WatcherHandle watch (long subparam, ParameterWatcher watcher) {
return new WatcherHandle(
clientConnection.watchParameter(
getParameter(), subparam, isGlobal(), watcher
)
);
}
public final WatcherHandle watch (ParameterWatcher watcher) {
return watch(0, watcher);
}
}