summaryrefslogtreecommitdiff
path: root/cmpcj/src/de/schwarzrot/control/config
diff options
context:
space:
mode:
authorgeronimo <geronimo013@gmx.de>2012-08-15 07:55:07 +0200
committergeronimo <geronimo013@gmx.de>2012-08-15 07:55:07 +0200
commitaf80bd2426282b7491d9ba0ebfb201abb42e3ca4 (patch)
tree8aeac09a815f3133773cb927597738d4150030f1 /cmpcj/src/de/schwarzrot/control/config
parent7eb41fd1431019f44227af6f5d707e7c98e0416e (diff)
downloadcmp-af80bd2426282b7491d9ba0ebfb201abb42e3ca4.tar.gz
cmp-af80bd2426282b7491d9ba0ebfb201abb42e3ca4.tar.bz2
next variant of java client
Diffstat (limited to 'cmpcj/src/de/schwarzrot/control/config')
-rw-r--r--cmpcj/src/de/schwarzrot/control/config/ConfigDialog.java131
-rw-r--r--cmpcj/src/de/schwarzrot/control/config/ConfigFactory.java225
2 files changed, 356 insertions, 0 deletions
diff --git a/cmpcj/src/de/schwarzrot/control/config/ConfigDialog.java b/cmpcj/src/de/schwarzrot/control/config/ConfigDialog.java
new file mode 100644
index 0000000..2acb026
--- /dev/null
+++ b/cmpcj/src/de/schwarzrot/control/config/ConfigDialog.java
@@ -0,0 +1,131 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: ConfigDialog.java
+ * Created: 13. June 2012, 04:57
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmpc - a java frontend (client) part of compound media player
+ * uses external players to play the media
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+package de.schwarzrot.control.config;
+
+
+import java.awt.Window;
+import java.util.List;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTable;
+import ca.odell.glazedlists.BasicEventList;
+import ca.odell.glazedlists.EventList;
+import ca.odell.glazedlists.GlazedLists;
+import ca.odell.glazedlists.swing.DefaultEventTableModel;
+import de.schwarzrot.base.util.AbstractDialog;
+import de.schwarzrot.base.util.ApplicationServiceProvider;
+import de.schwarzrot.control.table.PlayerDefinitionTableFormat;
+import de.schwarzrot.control.table.ServerDefinitionTableFormat;
+import de.schwarzrot.media.domain.AbstractMediaNode;
+import de.schwarzrot.media.domain.Config;
+import de.schwarzrot.media.domain.MediaServer;
+import de.schwarzrot.media.domain.PlayerDefinition;
+
+
+public class ConfigDialog extends AbstractDialog {
+ private static final long serialVersionUID = 713L;
+
+
+ public ConfigDialog(Window parent) {
+ super(parent, true, DialogMode.CANCEL_APPROVE, Orientation.Right);
+ config = ApplicationServiceProvider.getService(Config.class);
+ }
+
+
+ @Override
+ public JComponent createContentPane() {
+ JTabbedPane rv = new JTabbedPane();
+
+ rv.addTab("server", createServerTable());
+ rv.addTab("player", createPlayerTable());
+
+ return rv;
+ }
+
+
+ protected JComponent createPlayerTable() {
+ playerDefinitions = new BasicEventList<PlayerDefinition>();
+ for (AbstractMediaNode.SupportedMediaType mt : AbstractMediaNode.SupportedMediaType.values()) {
+ if (mt == AbstractMediaNode.SupportedMediaType.Unknown)
+ break;
+ PlayerDefinition pd = config.getPlayerMap().get(mt);
+
+ pd.setMediaType(mt);
+ playerDefinitions.add(pd);
+ }
+ PlayerDefinitionTableFormat ptf = new PlayerDefinitionTableFormat();
+ DefaultEventTableModel<PlayerDefinition> tm = new DefaultEventTableModel<PlayerDefinition>(playerDefinitions,
+ ptf);
+ JTable playerTable = new JTable(tm);
+ JScrollPane playerTableScrollPane = new JScrollPane(playerTable);
+ int mx = playerTable.getColumnModel().getColumnCount();
+
+ for (int i = 0; i < mx; ++i) {
+ int cw = ptf.getColumnWidth(i);
+
+ if (cw > 0) {
+ playerTable.getColumnModel().getColumn(i).setPreferredWidth(cw);
+ playerTable.getColumnModel().getColumn(i).setMaxWidth(cw);
+ }
+ }
+ return playerTableScrollPane;
+ }
+
+
+ protected JComponent createServerTable() {
+ serverDefinitions = GlazedLists.eventList(config.getKnownServers());
+ ServerDefinitionTableFormat stf = new ServerDefinitionTableFormat();
+ DefaultEventTableModel<MediaServer> tm = new DefaultEventTableModel<MediaServer>(serverDefinitions, stf);
+ JTable serverTable = new JTable(tm);
+ JScrollPane serverTableScrollPane = new JScrollPane(serverTable);
+ int mx = serverTable.getColumnModel().getColumnCount();
+
+ for (int i = 0; i < mx; ++i) {
+ int cw = stf.getColumnWidth(i);
+
+ if (cw > 0) {
+ serverTable.getColumnModel().getColumn(i).setPreferredWidth(cw);
+ serverTable.getColumnModel().getColumn(i).setMaxWidth(cw);
+ }
+ }
+ return serverTableScrollPane;
+ }
+
+
+ @Override
+ protected void performApprove() {
+ System.out.println("should save config now!?!");
+ List<MediaServer> cfgServers = config.getKnownServers();
+
+ cfgServers.clear();
+ cfgServers.addAll(serverDefinitions);
+ }
+
+ private EventList<MediaServer> serverDefinitions;
+ private EventList<PlayerDefinition> playerDefinitions;
+ private Config config;
+}
diff --git a/cmpcj/src/de/schwarzrot/control/config/ConfigFactory.java b/cmpcj/src/de/schwarzrot/control/config/ConfigFactory.java
new file mode 100644
index 0000000..5424ef5
--- /dev/null
+++ b/cmpcj/src/de/schwarzrot/control/config/ConfigFactory.java
@@ -0,0 +1,225 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: ConfigFactory.java
+ * Created: 13. June 2012, 04:57
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: cmpc - a java frontend (client) part of compound media player
+ * uses external players to play the media
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+package de.schwarzrot.control.config;
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import de.schwarzrot.media.domain.Config;
+import de.schwarzrot.media.domain.Media;
+import de.schwarzrot.media.domain.MediaServer;
+import de.schwarzrot.media.domain.PlayerDefinition;
+
+
+public class ConfigFactory {
+ protected static final Pattern SETUP_MASK = Pattern.compile("^\\s*(\\S+)\\s*=\\s*(.+)$");
+
+
+ public ConfigFactory(File configDirectory, String applicationID) {
+ baseDir = configDirectory;
+ appID = applicationID;
+ }
+
+
+ public Config getConfig() {
+ if (config == null) {
+ config = readConfig();
+ }
+ return config;
+ }
+
+
+ public File getConfigDirectory() {
+ return baseDir;
+ }
+
+
+ public void putConfig(Config config) {
+ if (config != null)
+ writeConfig(config);
+ }
+
+
+ protected Config readConfig() {
+ File setupFile = new File(baseDir, "srclient.conf");
+ BufferedReader br = null;
+ Config rv = new Config();
+
+ if (setupFile.exists()) {
+ try {
+ br = new BufferedReader(new FileReader(setupFile));
+ String line, trimmedLine;
+
+ while ((line = br.readLine()) != null) {
+ trimmedLine = line.trim();
+
+ if (trimmedLine.isEmpty() || trimmedLine.startsWith("#"))
+ continue;
+ Matcher m = SETUP_MASK.matcher(trimmedLine);
+
+ if (m.matches()) {
+ String key = m.group(1);
+ String value = m.group(2);
+
+ if (key.compareToIgnoreCase("server") == 0) {
+ String[] parts = value.split("\\s*\\:\\s*");
+ MediaServer ms = null;
+
+ if (parts.length > 1) {
+ ms = new MediaServer();
+ ms.setHostName(parts[0]);
+ ms.setPort(Integer.decode(parts[1]));
+
+ rv.addServer(ms);
+ }
+ } else if (key.compareToIgnoreCase("player") == 0) {
+ String[] parts = value.split("\\s*\\:\\s*");
+ PlayerDefinition pd = null;
+
+ if (parts.length > 1) {
+ pd = new PlayerDefinition();
+ String[] cmdline = parts[1].split("\\s+");
+
+ pd.setExecutable(cmdline[0]);
+
+ for (int i = 1; i < cmdline.length; ++i) {
+ pd.addParameter(cmdline[i]);
+ }
+ if (parts[0].compareTo("*") == 0) {
+ // default player
+ for (Media.SupportedMediaType cmt : Media.SupportedMediaType.values())
+ rv.putPlayer(cmt, pd);
+ } else {
+ for (Media.SupportedMediaType cmt : Media.SupportedMediaType.values()) {
+ if (parts[0].compareTo(cmt.name()) == 0)
+ rv.putPlayer(cmt, pd);
+ }
+ }
+ }
+ } else if (key.compareToIgnoreCase("size") == 0) {
+ String[] parts = value.split("\\s*x\\s*");
+
+ if (parts.length > 1) {
+ try {
+ rv.setMainWidth(Integer.decode(parts[0]));
+ } catch (Throwable t) {
+ }
+ try {
+ rv.setMainHeight(Integer.decode(parts[1]));
+ } catch (Throwable t) {
+ }
+ }
+ } else if (key.compareToIgnoreCase("pos") == 0) {
+ String[] parts = value.split("\\s*\\/\\s*");
+
+ if (parts.length > 1) {
+ try {
+ rv.setPosX(Integer.decode(parts[0]));
+ } catch (Throwable t) {
+ }
+ try {
+ rv.setPosY(Integer.decode(parts[1]));
+ } catch (Throwable t) {
+ }
+ }
+ }
+ }
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ } finally {
+ if (br != null) {
+ try {
+ br.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+ }
+ return rv;
+ }
+
+
+ protected void writeConfig(Config config) {
+ File setupFile = new File(baseDir, "srclient.conf");
+ PrintWriter out = null;
+ StringBuilder sb = null;
+
+ if (!setupFile.exists())
+ setupFile.getParentFile().mkdirs();
+ try {
+ out = new PrintWriter(new FileWriter(setupFile));
+
+ sb = new StringBuilder("#\n# configuration for ");
+ sb.append(appID).append("\n#");
+ out.println(sb.toString());
+ for (MediaServer server : config.getKnownServers()) {
+ sb = new StringBuilder("server = ");
+ sb.append(server.getHostName()).append(":").append(server.getPort());
+ out.println(sb.toString());
+ }
+ out.println();
+ sb = new StringBuilder("#\n# currently supported media types (");
+ sb.append(Media.SupportedMediaType.LegacyVdrRecording.name());
+ sb.append(" is the old PES format):\n");
+ sb.append("# ");
+ sb.append("#");
+ out.println(sb.toString());
+ for (Media.SupportedMediaType mt : config.getPlayerMap().keySet()) {
+ PlayerDefinition player = config.getPlayerMap().get(mt);
+
+ sb = new StringBuilder("player = ");
+ sb.append(mt.name()).append(" : ").append(player.getExecutable());
+ for (String p : player.getParameters()) {
+ sb.append(" ").append(p);
+ }
+ out.println(sb.toString());
+ }
+ out.println();
+ sb = new StringBuilder("size = ");
+ sb.append(config.getMainWidth()).append(" x ").append(config.getMainHeight());
+ out.println(sb.toString());
+
+ sb = new StringBuilder("pos = ");
+ sb.append(config.getPosX()).append(" / ").append(config.getPosY());
+ out.println(sb.toString());
+ } catch (Throwable t) {
+ t.printStackTrace();
+ } finally {
+ if (out != null)
+ out.close();
+ }
+ }
+ private Config config;
+ private File baseDir;
+ private final String appID;
+}