/*
* RoutedOSCMessage.java
* Eisenkraut
*
* Copyright (c) 2004-2016 Hanns Holger Rutz. All rights reserved.
*
* This software is published under the GNU General Public License v3+
*
*
* For further information, please contact Hanns Holger Rutz at
* contact@sciss.de
*/
package de.sciss.eisenkraut.net;
import java.io.IOException;
import java.net.SocketAddress;
import de.sciss.app.BasicEvent;
import de.sciss.net.OSCMessage;
@SuppressWarnings("serial")
public class RoutedOSCMessage extends BasicEvent {
public final OSCMessage msg;
public final SocketAddress addr;
public final long when;
public final OSCRoot server;
private final String[] path;
private final int pathIdx;
public RoutedOSCMessage(OSCMessage msg, SocketAddress addr, long when, OSCRoot server, String[] path, int pathIdx) {
super(addr, 0, when);
this.msg = msg;
this.addr = addr;
this.when = when;
this.server = server;
this.path = path;
this.pathIdx = pathIdx;
}
public boolean incorporate(BasicEvent oldEvent) {
return false;
}
public int getPathIndex() {
return pathIdx;
}
public int getPathCount() {
return path.length;
}
public String getPathComponent(int idx) {
return path[idx];
}
public String getPathComponent() {
return path[pathIdx];
}
public String getNextPathComponent() {
return getNextPathComponent(1);
}
public String getNextPathComponent(int skip) {
return path[pathIdx + skip];
}
public boolean hasNext() {
return (hasNext(1));
}
public boolean hasNext(int numComponents) {
return (pathIdx + numComponents < path.length);
}
public RoutedOSCMessage next() {
return next(1);
}
public RoutedOSCMessage next(int skip) {
return new RoutedOSCMessage(msg, addr, when, server, path, pathIdx + skip);
}
public void reply(String cmd, Object[] args)
throws IOException {
server.send(new OSCMessage(cmd, args), addr);
}
public void replyFailed()
throws IOException {
replyFailed(0);
}
public void replyFailed(int argCount)
throws IOException {
final Object[] args = new Object[argCount + 1];
args[0] = msg.getName();
for (int i = 0; i < argCount; i++) {
args[i + 1] = msg.getArg(i);
}
server.send(new OSCMessage(OSCRoot.OSC_FAILEDREPLY, args), addr);
}
public void replyDone(int copyArgCount, Object[] doneArgs)
throws IOException {
final Object[] args = new Object[copyArgCount + doneArgs.length + 1];
int j = 0;
args[j++] = msg.getName();
for (int i = 0; i < copyArgCount; i++) {
args[j++] = msg.getArg(i);
}
for (Object doneArg : doneArgs) {
args[j++] = doneArg;
}
server.send(new OSCMessage(OSCRoot.OSC_DONEREPLY, args), addr);
}
}