/*
* DocumentHandler.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.session;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import de.sciss.app.Document;
import de.sciss.eisenkraut.Main;
import de.sciss.eisenkraut.net.OSCRoot;
import de.sciss.eisenkraut.net.OSCRouter;
import de.sciss.eisenkraut.net.OSCRouterWrapper;
import de.sciss.eisenkraut.net.RoutedOSCMessage;
public class DocumentHandler
extends de.sciss.app.AbstractDocumentHandler
implements OSCRouter {
private static final String OSC_DOC = "doc";
// sub level
private static final String OSC_ACTIVE = "active";
private static final String OSC_INDEX = "index";
private static final String OSC_ID = "id";
// key = Integer( nodeID ) ; value = Session
private final Map<Integer, Document> mapIDs;
private final OSCRouterWrapper osc;
private final Main root;
public DocumentHandler(Main root) {
super(true); // we are multi-document aware
this.root = root;
this.osc = new OSCRouterWrapper(OSCRoot.getInstance(), this);
mapIDs = new HashMap<Integer, Document>();
}
public void addDocument(Object source, Document doc) {
synchronized (this.sync) {
super.addDocument(source, doc);
this.mapIDs.put(((Session) doc).getNodeID(), doc);
}
}
public void removeDocument(Object source, Document doc) {
synchronized (this.sync) {
this.mapIDs.remove(((Session) doc).getNodeID());
super.removeDocument(source, doc);
}
}
// ------------- OSCRouter interface -------------
public String oscGetPathComponent()
{
return OSC_DOC;
}
public void oscRoute( RoutedOSCMessage rom )
{
if( rom.hasNext() ) { // special handling here as documents can be accessed with different paths
oscRouteNext( rom.next() );
} else {
osc.oscRoute( rom );
}
}
private void oscRouteNext( RoutedOSCMessage rom ) throws NumberFormatException {
final String subPath;
final Document doc;
try {
subPath = rom.getPathComponent();
if (subPath.equals(OSC_ACTIVE)) {
doc = getActiveDocument();
} else if (subPath.equals(OSC_ID)) {
rom = rom.next();
final Integer id = new Integer(rom.getPathComponent());
synchronized (this.sync) {
doc = this.mapIDs.get(id);
}
} else if (subPath.equals(OSC_INDEX)) {
rom = rom.next();
final int idx = Integer.parseInt(rom.getPathComponent());
if (getDocumentCount() > idx) {
doc = getDocument(idx);
} else {
doc = null;
}
} else {
OSCRoot.failedUnknownPath(rom);
return;
}
if( doc == null ) {
OSCRoot.failed( rom.msg, "Document not found" );
return;
}
if( !(doc instanceof OSCRouter) ) {
OSCRoot.failed( rom.msg, "Document doesn't speak OSC" );
return;
}
((OSCRouter) doc).oscRoute( rom );
} catch (IndexOutOfBoundsException e1) {
OSCRoot.failedUnknownPath(rom);
}
}
public void oscAddRouter(OSCRouter subRouter) {
osc.oscAddRouter(subRouter);
}
public void oscRemoveRouter(OSCRouter subRouter) {
osc.oscRemoveRouter(subRouter);
}
public Object oscQuery_count() {
return getDocumentCount();
}
public void oscCmd_open(RoutedOSCMessage rom) {
try {
final String path = rom.msg.getArg(1).toString();
root.getMenuFactory().openDocument(new File(path));
} catch (IndexOutOfBoundsException e1) {
OSCRoot.failedArgCount(rom);
}
}
}