|
@@ -18,8 +18,17 @@ package de.nplusc.izc.izpl.plugins.jukebox;
|
|
|
|
|
|
import de.nplusc.izc.iZpl.API.shared.InvalidPlayListFileException;
|
|
|
import de.nplusc.izc.iZpl.API.shared.networking.Packet;
|
|
|
+import java.io.BufferedReader;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStreamReader;
|
|
|
+import java.io.PrintStream;
|
|
|
+import java.net.Socket;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
+import org.apache.logging.log4j.LogManager;
|
|
|
+import org.apache.logging.log4j.Logger;
|
|
|
+import org.yaml.snakeyaml.Yaml;
|
|
|
|
|
|
/**
|
|
|
*
|
|
@@ -27,7 +36,19 @@ import java.util.List;
|
|
|
*/
|
|
|
public class RemoteBackend implements Backend
|
|
|
{
|
|
|
-
|
|
|
+ Socket sck;
|
|
|
+ private static final Logger l = LogManager.getLogger();
|
|
|
+ private final String targetIP;
|
|
|
+ private String returnMsg = "";
|
|
|
+ private PlaybackStatusUpdater frontend;
|
|
|
+ private String[] titles = {};
|
|
|
+ private List<String> schedule = new ArrayList<>();
|
|
|
+ public RemoteBackend(String target, PlaybackStatusUpdater frontend)
|
|
|
+ {
|
|
|
+ targetIP = target;
|
|
|
+ this.frontend = frontend;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void play()
|
|
|
{
|
|
@@ -49,7 +70,81 @@ public class RemoteBackend implements Backend
|
|
|
@Override
|
|
|
public void initBackend()
|
|
|
{
|
|
|
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
|
+ try {
|
|
|
+ sck=new Socket(targetIP, JukeBox.JUKEBOX_PORT);
|
|
|
+ try {
|
|
|
+ BufferedReader r = new BufferedReader(new InputStreamReader(sck.getInputStream()));
|
|
|
+ PrintStream out = new PrintStream(sck.getOutputStream());
|
|
|
+ Thread t = new Thread(()->{
|
|
|
+ while(sck.isConnected())
|
|
|
+ {
|
|
|
+ String request = "";
|
|
|
+ try {
|
|
|
+ String ln = r.readLine();
|
|
|
+ l.trace("packet line = "+ln);
|
|
|
+ while(ln!=null&&!ln.equals("---"))
|
|
|
+ {
|
|
|
+ request+=ln+"\n";
|
|
|
+
|
|
|
+ ln=r.readLine();
|
|
|
+ }
|
|
|
+ if(ln==null)
|
|
|
+ {
|
|
|
+ l.warn("Null-Read");
|
|
|
+ System.exit(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (IOException ex) {
|
|
|
+ l.warn("NETZAP");
|
|
|
+ System.exit(0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ l.trace(request);
|
|
|
+ Object packet = new Yaml().load(request);
|
|
|
+ if(packet instanceof Packet)
|
|
|
+ {
|
|
|
+
|
|
|
+ l.trace("PACKET");
|
|
|
+ dispatchResponse((Packet)packet);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //error();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ t.setName("InputCruncher");
|
|
|
+ t.start();
|
|
|
+ Thread t2 = new Thread(()->{
|
|
|
+ //System.out.println("Gefangen!");
|
|
|
+ while(sck.isConnected())
|
|
|
+ {
|
|
|
+ synchronized(targetIP)
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ targetIP.wait();
|
|
|
+ } catch (InterruptedException ex) {
|
|
|
+ }
|
|
|
+ l.trace("MSG sent");
|
|
|
+ l.trace("PKT="+returnMsg);
|
|
|
+ out.println(returnMsg);
|
|
|
+ out.flush();
|
|
|
+ returnMsg="";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //System.out.println("Flucht ist zwecklos");
|
|
|
+ });
|
|
|
+ t2.setName("OutputCruncher");
|
|
|
+ t2.start();
|
|
|
+
|
|
|
+ }
|
|
|
+ catch (IOException ex)
|
|
|
+ {}
|
|
|
+ }
|
|
|
+ catch (IOException ex)
|
|
|
+ {
|
|
|
+ ex.printStackTrace();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -74,14 +169,14 @@ public class RemoteBackend implements Backend
|
|
|
public String[] getTitles() throws InvalidPlayListFileException
|
|
|
{
|
|
|
sendCommand("getTitles", null); //TODO
|
|
|
- return null;
|
|
|
+ return titles;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public List<String> getScheduledTracks()
|
|
|
{
|
|
|
sendCommand("getScheduled", null); //TODO
|
|
|
- return null;
|
|
|
+ return schedule;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -90,15 +185,73 @@ public class RemoteBackend implements Backend
|
|
|
APIWrapper.quickQuit();
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
private void sendCommand(String action, String param)
|
|
|
{
|
|
|
HashMap<String,Object> data = new HashMap<>();
|
|
|
- Packet response = new Packet();
|
|
|
+ Packet request = new Packet();
|
|
|
data.put("COMMAND", "action");
|
|
|
data.put("PARAM", param);
|
|
|
- response.setData(data);
|
|
|
-
|
|
|
+ request.setData(data);
|
|
|
+ synchronized(targetIP)
|
|
|
+ {
|
|
|
+ System.out.println("POKE");
|
|
|
+ returnMsg=new Yaml().dump(request)+"\n---\n";
|
|
|
+ targetIP.notify();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void dispatchResponse(Packet p)
|
|
|
+ {
|
|
|
+ HashMap<String,Object> data = p.getData();
|
|
|
+ if(data.get("RESPONSE") !=null)
|
|
|
+ {
|
|
|
+ String respType = (String) data.get("RESPONSE");
|
|
|
+
|
|
|
+ switch(respType)
|
|
|
+ {
|
|
|
+ case "UPDATE":
|
|
|
+ if(data.get("TOPIC") != null)
|
|
|
+ {
|
|
|
+ String topic = (String) data.get("TOPIC");
|
|
|
+ String param = (String) data.get("VALUE");
|
|
|
+ switch(topic)
|
|
|
+ {
|
|
|
+ case "LENGTH":
|
|
|
+ frontend.updateTrackLength(Integer.valueOf(param));
|
|
|
+ break;
|
|
|
+ case "TITLE":
|
|
|
+ frontend.updateTrackTitle(topic);
|
|
|
+ break;
|
|
|
+ case "POSITION":
|
|
|
+ frontend.updateCurrentPlaybackPosition(Integer.valueOf(param));
|
|
|
+ break;
|
|
|
+ case "TRACKS":
|
|
|
+ sendCommand("getTitles", null); //TODO
|
|
|
+ break;
|
|
|
+ case "QUEUE":
|
|
|
+ sendCommand("getScheduled", null); //TODO
|
|
|
+ break;
|
|
|
+ case "PLAYING":
|
|
|
+ frontend.setPlayStatus(Boolean.valueOf(param));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "TITLES":
|
|
|
+ List<String> titles = (List<String>) data.get("DATA");
|
|
|
+ this.titles = titles.toArray(this.titles);
|
|
|
+ frontend.triggerTableRefresh();
|
|
|
+ break;
|
|
|
+ case "QUEUE":
|
|
|
+ schedule = (List<String>) data.get("DATA");
|
|
|
+ frontend.triggerScheduleRefresh();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
}
|