mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-23 01:21:42 +00:00
Implement local notification.
The default behavior is to only notify remote changes, but for some applications (e.g. GUI's) it's advantageous to know about local changes as well. This is (slightly) optimized in that local changes only result in additional resources being consumed if (any) local listeners have been created.
This commit is contained in:
@@ -240,7 +240,12 @@ public class NetworkTable implements ITable, IRemote {
|
||||
}
|
||||
|
||||
public void addTableListener(ITableListener listener) {
|
||||
addTableListener(listener, false);
|
||||
addTableListener(listener, false, false);
|
||||
}
|
||||
|
||||
public void addTableListener(ITableListener listener,
|
||||
boolean immediateNotify) {
|
||||
addTableListener(listener, immediateNotify, false);
|
||||
}
|
||||
|
||||
private class TableListenerAdapter extends ListenerBase implements NetworkTablesJNI.EntryListenerFunction {
|
||||
@@ -264,7 +269,8 @@ public class NetworkTable implements ITable, IRemote {
|
||||
|
||||
private final Hashtable<ITableListener,List<ListenerBase>> listenerMap = new Hashtable<ITableListener,List<ListenerBase>>();
|
||||
public synchronized void addTableListener(ITableListener listener,
|
||||
boolean immediateNotify) {
|
||||
boolean immediateNotify,
|
||||
boolean localNotify) {
|
||||
List<ListenerBase> adapters = listenerMap.get(listener);
|
||||
if (adapters == null) {
|
||||
adapters = new ArrayList<ListenerBase>();
|
||||
@@ -272,10 +278,15 @@ public class NetworkTable implements ITable, IRemote {
|
||||
}
|
||||
TableListenerAdapter adapter =
|
||||
new TableListenerAdapter(path.length() + 1, this, listener);
|
||||
adapter.uid = NetworkTablesJNI.addEntryListener(path + PATH_SEPARATOR, adapter, immediateNotify);
|
||||
adapter.uid = NetworkTablesJNI.addEntryListener(path + PATH_SEPARATOR, adapter, immediateNotify, localNotify);
|
||||
adapters.add(adapter);
|
||||
}
|
||||
|
||||
public void addTableListener(String key, ITableListener listener,
|
||||
boolean immediateNotify) {
|
||||
addTableListener(key, listener, immediateNotify, false);
|
||||
}
|
||||
|
||||
private class KeyListenerAdapter extends ListenerBase implements NetworkTablesJNI.EntryListenerFunction {
|
||||
private final String relativeKey;
|
||||
private final String fullKey;
|
||||
@@ -297,7 +308,8 @@ public class NetworkTable implements ITable, IRemote {
|
||||
}
|
||||
|
||||
public synchronized void addTableListener(String key, ITableListener listener,
|
||||
boolean immediateNotify) {
|
||||
boolean immediateNotify,
|
||||
boolean localNotify) {
|
||||
List<ListenerBase> adapters = listenerMap.get(listener);
|
||||
if (adapters == null) {
|
||||
adapters = new ArrayList<ListenerBase>();
|
||||
@@ -306,10 +318,14 @@ public class NetworkTable implements ITable, IRemote {
|
||||
String fullKey = path + PATH_SEPARATOR + key;
|
||||
KeyListenerAdapter adapter =
|
||||
new KeyListenerAdapter(key, fullKey, this, listener);
|
||||
adapter.uid = NetworkTablesJNI.addEntryListener(fullKey, adapter, immediateNotify);
|
||||
adapter.uid = NetworkTablesJNI.addEntryListener(fullKey, adapter, immediateNotify, localNotify);
|
||||
adapters.add(adapter);
|
||||
}
|
||||
|
||||
public void addSubTableListener(final ITableListener listener) {
|
||||
addSubTableListener(listener, false);
|
||||
}
|
||||
|
||||
private class SubListenerAdapter extends ListenerBase implements NetworkTablesJNI.EntryListenerFunction {
|
||||
private final int prefixLen;
|
||||
private final ITable targetSource;
|
||||
@@ -335,7 +351,8 @@ public class NetworkTable implements ITable, IRemote {
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void addSubTableListener(final ITableListener listener) {
|
||||
public synchronized void addSubTableListener(final ITableListener listener,
|
||||
boolean localNotify) {
|
||||
List<ListenerBase> adapters = listenerMap.get(listener);
|
||||
if (adapters == null) {
|
||||
adapters = new ArrayList<ListenerBase>();
|
||||
@@ -343,7 +360,7 @@ public class NetworkTable implements ITable, IRemote {
|
||||
}
|
||||
SubListenerAdapter adapter =
|
||||
new SubListenerAdapter(path.length() + 1, this, listener);
|
||||
adapter.uid = NetworkTablesJNI.addEntryListener(path + PATH_SEPARATOR, adapter, true);
|
||||
adapter.uid = NetworkTablesJNI.addEntryListener(path + PATH_SEPARATOR, adapter, true, localNotify);
|
||||
adapters.add(adapter);
|
||||
}
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ public class NetworkTablesJNI {
|
||||
public interface EntryListenerFunction {
|
||||
void apply(int uid, String key, Object value, boolean isNew);
|
||||
}
|
||||
public static native int addEntryListener(String prefix, EntryListenerFunction listener, boolean immediateNotify);
|
||||
public static native int addEntryListener(String prefix, EntryListenerFunction listener, boolean immediateNotify, boolean localNotify);
|
||||
public static native void removeEntryListener(int entryListenerUid);
|
||||
|
||||
public interface ConnectionListenerFunction {
|
||||
|
||||
Reference in New Issue
Block a user