Skip to main content

[andunix~libandunix:44] Added eyetv package to read Elgato EyeTV program files and improved the p

  • From: andunix@...
  • To: commits@...
  • Subject: [andunix~libandunix:44] Added eyetv package to read Elgato EyeTV program files and improved the p
  • Date: Tue, 28 Aug 2012 21:51:03 +0000

Project:    andunix
Repository: libandunix
Revision:   44
Author:     andunix
Date:       2012-08-28 21:50:06 UTC
Link:       

Log Message:
------------
added "thetvdb" package to access http://thetvdb.com/.
Major improvements on the html package.
Restructured AX and had to follow with FileDielivery from mail package.
Added eyetv package to read Elgato EyeTV program files and improved the 
property list package for it.


Revisions:
----------
41
42
43
44


Modified Paths:
---------------
src/net/andunix/lib/html/Element.java
src/net/andunix/lib/html/HTML.java
src/net/andunix/lib/html/HeadScope.java
src/net/andunix/lib/html/ListScope.java
src/net/andunix/lib/html/Node.java
src/net/andunix/lib/html/PageScope.java
src/net/andunix/lib/html/Text.java
src/net/andunix/lib/html/TextScope.java
src/net/andunix/lib/AX.java
src/net/andunix/lib/mail/FileDelivery.java
src/net/andunix/lib/xml/XmlElement.java
src/net/andunix/lib/plist/PropertyList.java


Added Paths:
------------
src/net/andunix/lib/dc/thetvdb/Episode.java
src/net/andunix/lib/dc/thetvdb/Series.java
src/net/andunix/lib/dc/thetvdb/TheTVDB.java
src/net/andunix/lib/html/Scope.java
src/net/andunix/lib/dc/eyetv/EyeTVArchive.java
src/net/andunix/lib/dc/eyetv/EyeTVBundle.java
src/net/andunix/lib/dc/eyetv/EyeTVRecording.java
src/net/andunix/lib/dc/eyetv/EyeTVSchedule.java
src/net/andunix/lib/plist/PListData.java
src/net/andunix/lib/plist/PListDate.java


Diffs:
------
diff -r 866c4f63b844 -r 9fc80cb345d9 
src/net/andunix/lib/dc/thetvdb/Episode.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/dc/thetvdb/Episode.java       Wed Aug 22 12:48:09 
2012 +0200
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2011 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.dc.thetvdb;
+
+/**
+ * FIXME: class description
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+public class Episode {
+    //
+    //
+    //
+    // FIELDS
+    //
+    public int id;
+    public int seasonid;
+    public int seriesid;
+    public String EpisodeName;
+    public int EpisodeNumber;
+    public String Language;
+    public String Overview;
+    public int SeasonNumber;
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    //
+    //
+    //
+    // METHODS
+    //
+}

diff -r 866c4f63b844 -r 9fc80cb345d9 
src/net/andunix/lib/dc/thetvdb/Series.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/dc/thetvdb/Series.java        Wed Aug 22 12:48:09 
2012 +0200
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2011 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.dc.thetvdb;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.xml.parsers.ParserConfigurationException;
+import net.andunix.lib.xml.XmlDocument;
+import net.andunix.lib.xml.XmlElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xml.sax.SAXException;
+
+/**
+ * FIXME: class description
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+public class Series extends XmlDocument {
+    //
+    //
+    //
+    // CONSTANTS
+    //
+    private static final Log log = LogFactory.getLog(Series.class);
+    //
+    //
+    //
+    // FIELDS
+    //
+    private List<Episode> episodes;
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    Series(URL seriesURL) {
+        try {
+            parse(seriesURL);
+        } catch (IOException ex) {
+            log.error(ex, ex);
+            invalidate();
+        } catch (ParserConfigurationException ex) {
+            log.error(ex, ex);
+            invalidate();
+        } catch (SAXException ex) {
+            log.error(ex, ex);
+            invalidate();
+        }
+    }
+    //
+    //
+    //
+    // METHODS
+    //
+    public List<Episode> getEpisodes() {
+        return Collections.unmodifiableList(episodes == null ? 
parseEpisodes() : episodes);
+    }
+    private List<Episode> parseEpisodes() {
+        episodes = new ArrayList<Episode>();
+        for (XmlElement episodeE = 
getChildElement("Data").getChildElement("Episode"); episodeE.isValid(); 
episodeE = episodeE.getNextEqualElement()) {
+            Episode episode = new Episode();
+            episode.id = episodeE.getChildElement("id").getValue(0);
+            episode.seasonid = 
episodeE.getChildElement("seasonid").getValue(0);
+            episode.seriesid = 
episodeE.getChildElement("seriesid").getValue(0);
+            episode.EpisodeName = 
episodeE.getChildElement("EpisodeName").getValue("");
+            episode.EpisodeNumber = 
episodeE.getChildElement("EpisodeNumber").getValue(0);
+            episode.Language = 
episodeE.getChildElement("Language").getValue("");
+            episode.Overview = 
episodeE.getChildElement("Overview").getValue("");
+            episode.SeasonNumber = 
episodeE.getChildElement("SeasonNumber").getValue(0);
+            episodes.add(episode);
+        }
+        return episodes;
+    }
+}

diff -r 866c4f63b844 -r 9fc80cb345d9 
src/net/andunix/lib/dc/thetvdb/TheTVDB.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/dc/thetvdb/TheTVDB.java       Wed Aug 22 12:48:09 
2012 +0200
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2011 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.dc.thetvdb;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import javax.xml.parsers.ParserConfigurationException;
+import net.andunix.lib.xml.XmlDocument;
+import net.andunix.lib.xml.XmlElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xml.sax.SAXException;
+
+/**
+ * FIXME: class description
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+public class TheTVDB {
+    //
+    //
+    //
+    // CONSTANTS
+    //
+    private static final Log log = LogFactory.getLog(TheTVDB.class);
+    //
+    //
+    //
+    // FIELDS
+    //
+    private String apiKey;
+    private String xmlMirror;
+    private String bannerMirror;
+    private String zipMirror;
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    public TheTVDB(String apiKey) {
+        this.apiKey = apiKey;
+    }
+    //
+    //
+    //
+    // METHODS
+    //
+    public void init() throws MalformedURLException, IOException, 
ParserConfigurationException, SAXException {
+        String urlBase = "http://thetvdb.com/api/"+apiKey+"/";;
+        URL mirrorURL = new URL(urlBase+"mirrors.xml");
+        XmlDocument mirrorDocument = new XmlDocument();
+        mirrorDocument.parse(mirrorURL);
+        ArrayList<String> xmlmirrors = new ArrayList<String>();
+        ArrayList<String> bannermirrors = new ArrayList<String>();
+        ArrayList<String> zipmirrors = new ArrayList<String>();
+        for (XmlElement mirror = 
mirrorDocument.selectElement("Mirrors.Mirror"); mirror.isValid(); mirror = 
mirror.getNextEqualElement()) {
+            String mirrorpath = 
mirror.getChildElement("mirrorpath").getText();
+            log.debug("mirrorpath="+mirrorpath);
+            int typemask = mirror.getChildElement("typemask").getValue(0);
+            if ((typemask & 0x1) > 0) {
+                xmlmirrors.add(mirrorpath);
+            }
+            if ((typemask & 0x2) > 0) {
+                bannermirrors.add(mirrorpath);
+            }
+            if ((typemask & 0x4) > 0) {
+                zipmirrors.add(mirrorpath);
+            }
+        }
+        xmlMirror = xmlmirrors.get((int)(Math.random()*xmlmirrors.size()));
+        log.debug("using xml mirror: "+xmlMirror);
+        bannerMirror = 
bannermirrors.get((int)(Math.random()*bannermirrors.size()));
+        log.debug("using banner mirror: "+bannerMirror);
+        zipMirror = zipmirrors.get((int)(Math.random()*zipmirrors.size()));
+        log.debug("using zip mirror: "+zipMirror);
+    }
+    public Series getSeries(String language, int seriesid) throws 
MalformedURLException {
+        URL seriesURL = new URL(xmlMirror + "/api/" + apiKey + "/series/" + 
seriesid + "/all/" + language + ".xml");
+        Series seriesDocument = new Series(seriesURL);
+        return seriesDocument;
+    }
+}


diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/Element.java
--- a/src/net/andunix/lib/html/Element.java     Wed Aug 22 12:48:09 2012 +0200
+++ b/src/net/andunix/lib/html/Element.java     Tue Aug 28 23:45:33 2012 +0200
@@ -48,7 +48,24 @@
     //
     // METHODS
     //
-    public void addAttribute(String name, String value) {
+    public Element setId(String id) {
+        setAttribute("id", id);
+        return this;
+    }
+    public void appendToAttribute(String name, String binder, String value) {
+        if (hasAttribute(name)) {
+            setAttribute(name, getAttribute(name) + binder + value);
+        } else {
+            setAttribute(name, value);
+        }
+    }
+    public String getAttribute(String name) {
+        return attributes.get(name);
+    }
+    public boolean hasAttribute(String name) {
+        return attributes.containsKey(name);
+    }
+    public void setAttribute(String name, String value) {
         attributes.put(name, value);
     }
     @Override

diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/HTML.java
--- a/src/net/andunix/lib/html/HTML.java        Wed Aug 22 12:48:09 2012 +0200
+++ b/src/net/andunix/lib/html/HTML.java        Tue Aug 28 23:45:33 2012 +0200
@@ -33,38 +33,53 @@
         private Implementation(String element) {
             super(element);
         }
-        private Implementation elem(String element) {
-            final Implementation result = new Implementation(element);
-            add(result);
-            return result;
+        private Implementation elem(String element) { return 
(Implementation)add(new Implementation(element)); }
+        private Implementation _(String text) {
+            append(text);
+            return this;
         }
-        @Override public TextScope a_href(String href) { final 
Implementation result = elem("a"); result.addAttribute("href", href); return 
result; }
+        private Implementation _(String name, String value) {
+            setAttribute(name, value);
+            return this;
+        }
+        private Implementation _(String name, String binder, String value) {
+            appendToAttribute(name, binder, value);
+            return this;
+        }
+        @Override public Element getElement() { return this; }
+        @Override public Implementation setId(String id) { return _("id", 
id); }
+        @Override public Implementation addClass(String cls) { return 
_("class", " ", cls); }
+        @Override public Implementation setClass(String cls) { return 
_("class", cls); }
+        @Override public Implementation addStyle(String style) { return 
_("style", "\n", style); }
+        @Override public Implementation setStyle(String style) { return 
_("style", style); }
+        @Override public HeadScope setTitle(String title) { return 
_("title", title); }
+        @Override public TextScope a_href(String href) { return 
elem("a")._("href", href); }
         @Override public void br() { elem("br");  }
-        @Override public void br_clear(String clear) { 
elem("br").addAttribute("clear", clear);  }
+        @Override public void br_clear(String clear) { elem("br")._("clear", 
clear);  }
         @Override public PageScope div() { return elem("div");  }
+        @Override public PageScope div_class(String cls) { return 
elem("div")._("class", cls); }
+        @Override public PageScope div_id(String id) { return 
elem("div")._("id", id); }
         @Override public TextScope em() { return elem("em");  }
         @Override public TextScope h1() { return elem("h1"); }
-        @Override public TextScope h1(String text) { final Implementation 
result = elem("h1"); result.append(text); return result; }
+        @Override public TextScope h1(String text) { return 
elem("h1")._(text); }
         @Override public TextScope h2() { return elem("h2"); }
-        @Override public TextScope h2(String text) { final Implementation 
result = elem("h2"); result.append(text); return result; }
+        @Override public TextScope h2(String text) { return 
elem("h2")._(text); }
         @Override public TextScope h3() { return elem("h3"); }
-        @Override public TextScope h3(String text) { final Implementation 
result = elem("h3"); result.append(text); return result; }
+        @Override public TextScope h3(String text) { return 
elem("h3")._(text); }
         @Override public TextScope h4() { return elem("h4"); }
-        @Override public TextScope h4(String text) { final Implementation 
result = elem("h4"); result.append(text); return result; }
+        @Override public TextScope h4(String text) { return 
elem("h4")._(text); }
         @Override public TextScope h5() { return elem("h5"); }
-        @Override public TextScope h5(String text) { final Implementation 
result = elem("h5"); result.append(text); return result; }
+        @Override public TextScope h5(String text) { return 
elem("h5")._(text); }
         @Override public TextScope h6() { return elem("h6"); }
-        @Override public TextScope h6(String text) { final Implementation 
result = elem("h6"); result.append(text); return result; }
+        @Override public TextScope h6(String text) { return 
elem("h6")._(text); }
         @Override public TextScope li() { return elem("li");  }
-        @Override public void meta(String name, String content) {
-            Element meta = elem("meta");
-            meta.addAttribute("name", name);
-            meta.addAttribute("content", content);
+        @Override public HeadScope meta(String name, String content) {
+            elem("meta")._("name", name)._("content", content);
+            return this;
         }
-        @Override public void http_equiv(String http_equiv, String content) {
-            Element meta = elem("meta");
-            meta.addAttribute("http-equiv", http_equiv);
-            meta.addAttribute("content", content);
+        @Override public HeadScope http_equiv(String http_equiv, String 
content) {
+            elem("meta")._("http-equiv", http_equiv)._("content", content);
+            return this;
         }
         @Override public ListScope ol() { return elem("ol");  }
         @Override public TextScope p() { return elem("p"); }

diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/HeadScope.java
--- a/src/net/andunix/lib/html/HeadScope.java   Wed Aug 22 12:48:09 2012 +0200
+++ b/src/net/andunix/lib/html/HeadScope.java   Tue Aug 28 23:45:33 2012 +0200
@@ -22,7 +22,8 @@
  * 
  * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
  */
-public interface HeadScope {
-    public void meta(String name, String content);
-    public void http_equiv(String http_equiv, String content);
+public interface HeadScope extends Scope {
+    public HeadScope http_equiv(String http_equiv, String content);
+    public HeadScope meta(String name, String content);
+    public HeadScope setTitle(String title);
 }

diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/ListScope.java
--- a/src/net/andunix/lib/html/ListScope.java   Wed Aug 22 12:48:09 2012 +0200
+++ b/src/net/andunix/lib/html/ListScope.java   Tue Aug 28 23:45:33 2012 +0200
@@ -22,7 +22,12 @@
  * 
  * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
  */
-public interface ListScope {
+public interface ListScope extends Scope {
+    @Override public ListScope setId(String id);
+    @Override public ListScope addClass(String cls);
+    @Override public ListScope setClass(String cls);
+    @Override public ListScope addStyle(String style);
+    @Override public ListScope setStyle(String style);
     public TextScope li();
     public ListScope ol();
     public ListScope ul();

diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/Node.java
--- a/src/net/andunix/lib/html/Node.java        Wed Aug 22 12:48:09 2012 +0200
+++ b/src/net/andunix/lib/html/Node.java        Tue Aug 28 23:45:33 2012 +0200
@@ -42,34 +42,34 @@
     //
     // METHODS
     //
-    public Element add(Element element) {
+    public Element add(final Element element) {
         children.add(element);
         element.setParent(this);
         return element;
     }
-    public Node add(Node node) {
+    public Node add(final Node node) {
         children.add(node);
         node.setParent(this);
         return node;
     }
-    public Text add(Text text) {
+    public Text add(final Text text) {
         children.add(text);
         text.setParent(this);
         return text;
     }
-    public Element addElement(String element) {
+    public Element addElement(final String element) {
         final Element result = new Element(element);
         children.add(result);
         result.setParent(this);
         return result;
     }
-    public Text addText(String text) {
+    public Text addText(final String text) {
         final Text result = new Text(text);
         children.add(result);
         result.setParent(this);
         return result;
     }
-    public Text append(String content) {
+    public Text append(final String content) {
         Text text = null;
         if (!children.isEmpty()) {
             Node lastChild = children.get(children.size()-1);

diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/PageScope.java
--- a/src/net/andunix/lib/html/PageScope.java   Wed Aug 22 12:48:09 2012 +0200
+++ b/src/net/andunix/lib/html/PageScope.java   Tue Aug 28 23:45:33 2012 +0200
@@ -22,8 +22,15 @@
  * 
  * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
  */
-public interface PageScope {
+public interface PageScope extends Scope {
+    @Override public PageScope setId(String id);
+    @Override public PageScope addClass(String cls);
+    @Override public PageScope setClass(String cls);
+    @Override public PageScope addStyle(String style);
+    @Override public PageScope setStyle(String style);
     public PageScope div();
+    public PageScope div_class(String cls);
+    public PageScope div_id(String id);
     public TextScope h1();
     public TextScope h1(String text);
     public TextScope h2();
@@ -40,5 +47,4 @@
     public TextScope p();
     public Table table();
     public ListScope ul();
-
 }

diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/Scope.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/html/Scope.java       Tue Aug 28 23:45:33 2012 +0200
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.html;
+
+/**
+ * FIXME: class description
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+public interface Scope {
+    public Element getElement();
+    public Scope setId(String id);
+    public Scope addClass(String cls);
+    public Scope setClass(String cls);
+    public Scope addStyle(String style);
+    public Scope setStyle(String style);
+}

diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/Text.java
--- a/src/net/andunix/lib/html/Text.java        Wed Aug 22 12:48:09 2012 +0200
+++ b/src/net/andunix/lib/html/Text.java        Tue Aug 28 23:45:33 2012 +0200
@@ -41,6 +41,11 @@
     //
     // METHODS
     //
+    @Override
+    public Text append(String text) {
+        this.text.append(text);
+        return this;
+    }
     public StringBuffer getBuffer() { return text; }
     @Override
     public void render(RenderSet renderSet) throws RenderException {

diff -r 9fc80cb345d9 -r d10244e567c3 src/net/andunix/lib/html/TextScope.java
--- a/src/net/andunix/lib/html/TextScope.java   Wed Aug 22 12:48:09 2012 +0200
+++ b/src/net/andunix/lib/html/TextScope.java   Tue Aug 28 23:45:33 2012 +0200
@@ -22,7 +22,12 @@
  * 
  * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
  */
-public interface TextScope {
+public interface TextScope extends Scope {
+    @Override public TextScope setId(String id);
+    @Override public TextScope addClass(String cls);
+    @Override public TextScope setClass(String cls);
+    @Override public TextScope addStyle(String style);
+    @Override public TextScope setStyle(String style);
     public Text append(String text);
     public TextScope a_href(String href);
     public void br();


diff -r d10244e567c3 -r 022fbec19a2f src/net/andunix/lib/AX.java
--- a/src/net/andunix/lib/AX.java       Tue Aug 28 23:45:33 2012 +0200
+++ b/src/net/andunix/lib/AX.java       Tue Aug 28 23:47:16 2012 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright 2006-2011 Andreas Huber - http://andunix.net/
+ * Copyright 2006-2012 Andreas Huber - http://andunix.net/
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -44,57 +44,14 @@
     //
 //    private final static DateFormat dateFormat = new 
SimpleDateFormat("dd.MM.yy");
 //    private final static DateFormat dateTimeFormat = new 
SimpleDateFormat("dd.MM.yy HH:mm");
-    private final static DateFormat shortTimeFormat = new 
SimpleDateFormat("HH:mm");
-    private final static DateFormat longTimeFormat = new 
SimpleDateFormat("HH:mm:ss");
-    private final static DateFormat isoDateFormat = new 
SimpleDateFormat("yyyy-MM-dd");
-    private final static DateFormat isoFullFormat = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
-    private final static DateFormat urlDateFormat = new 
SimpleDateFormat("yyyyMMdd");
-    private final static DateFormat urlDateTimeFormat = new 
SimpleDateFormat("yyyyMMddHHmmssSSS");
-    private final static DateFormat urlTimeFormat = new 
SimpleDateFormat("HHmmss");
-    //
-    //
-    //
-    // STATIC METHODS
-    //
-//    public static DateFormat getDateFormat() { return dateFormat; }
-//    public static DateFormat getDateTimeFormat() { return dateTimeFormat; }
-    /**
-     * <code>DateFormat</code> for short time notation: HH:mm
-     * @return a <code>DateFormat</code> object for the requested format.
-     */
-    public static DateFormat getShortTimeFormat() { return shortTimeFormat; }
-    /**
-     * <code>DateFormat</code> for long time notation: HH:mm:ss
-     * @return a <code>DateFormat</code> object for the requested format.
-     */
-    public static DateFormat getLongTimeFormat() { return longTimeFormat; }
-    /**
-     * <code>DateFormat</code> for ISO date notation: yyyy-MM-dd
-     * @return a <code>DateFormat</code> object for the requested format.
-     */
-    public static DateFormat getIsoDateFormat() { return isoDateFormat; }
-    /**
-     * <code>DateFormat</code> for ISO date and time notation:
-     * yyyy-MM-dd HH:mm:ss.SSS
-     * @return a <code>DateFormat</code> object for the requested format.
-     */
-    public static DateFormat getIsoFullFormat() { return isoFullFormat; }
-    /**
-     * <code>DateFormat</code> for date notation in URLs (no colons): 
yyyyMMdd
-     * @return a <code>DateFormat</code> object for the requested format.
-     */
-    public static DateFormat getUrlDateFormat() { return urlDateFormat; }
-    /**
-     * <code>DateFormat</code> for date and time notation in URLs (no 
colons):
-     * yyyyMMddHHmmssSSS
-     * @return a <code>DateFormat</code> object for the requested format.
-     */
-    public static DateFormat getUrlDateTimeFormat() { return 
urlDateTimeFormat; }
-    /**
-     * <code>DateFormat</code> for time notation in URLs (no colons): HHmmss
-     * @return a <code>DateFormat</code> object for the requested format.
-     */
-    public static DateFormat getUrlTimeFormat() { return urlTimeFormat; }
+    public final static DateFormat shortTimeFormat = new 
SimpleDateFormat("HH:mm");
+    public final static DateFormat longTimeFormat = new 
SimpleDateFormat("HH:mm:ss");
+    public final static DateFormat isoDateFormat = new 
SimpleDateFormat("yyyy-MM-dd");
+    public final static DateFormat isoDateTimeFormat = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
+    public final static DateFormat isoFullFormat = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
+    public final static DateFormat urlDateFormat = new 
SimpleDateFormat("yyyyMMdd");
+    public final static DateFormat urlDateTimeFormat = new 
SimpleDateFormat("yyyyMMddHHmmssSSS");
+    public final static DateFormat urlTimeFormat = new 
SimpleDateFormat("HHmmss");
     //
     //
     //
@@ -312,25 +269,25 @@
             setter.invoke(obj, params);
         } else if (type.equals(java.sql.Date.class)) {
             try {
-                java.sql.Date date = new 
java.sql.Date(getUrlDateFormat().parse(stringValue).getTime());
+                java.sql.Date date = new 
java.sql.Date(urlDateFormat.parse(stringValue).getTime());
                 params = new Object[]{ date };
                 setter.invoke(obj, params);
             } catch (java.text.ParseException exc) { }
         } else if (type.equals(java.sql.Time.class)) {
             try {
-                java.sql.Time date = new 
java.sql.Time(getUrlTimeFormat().parse(stringValue).getTime());
+                java.sql.Time date = new 
java.sql.Time(urlTimeFormat.parse(stringValue).getTime());
                 params = new Object[]{ date };
                 setter.invoke(obj, params);
             } catch (java.text.ParseException exc) { }
         } else if (type.equals(java.sql.Timestamp.class)) {
             try {
-                java.sql.Timestamp date = new 
java.sql.Timestamp(getUrlDateTimeFormat().parse(stringValue).getTime());
+                java.sql.Timestamp date = new 
java.sql.Timestamp(urlDateTimeFormat.parse(stringValue).getTime());
                 params = new Object[]{ date };
                 setter.invoke(obj, params);
             } catch (java.text.ParseException exc) { }
         } else if (type.equals(java.util.Date.class)) {
             try {
-                java.util.Date date = 
getUrlDateTimeFormat().parse(stringValue);
+                java.util.Date date = urlDateTimeFormat.parse(stringValue);
                 params = new Object[]{ date };
                 setter.invoke(obj, params);
             } catch (java.text.ParseException exc) { }

diff -r d10244e567c3 -r 022fbec19a2f 
src/net/andunix/lib/mail/FileDelivery.java
--- a/src/net/andunix/lib/mail/FileDelivery.java        Tue Aug 28 23:45:33 
2012 +0200
+++ b/src/net/andunix/lib/mail/FileDelivery.java        Tue Aug 28 23:47:16 
2012 +0200
@@ -1,11 +1,17 @@
 /*
- * Copyright 2007 Andreas Huber - http://andunix.net/
+ * Copyright 2007-2012 Andreas Huber - http://andunix.net/
  *
- * Licensed unter the Creative Commons Attribution 3.0 Germany License
- * http://creativecommons.org/licenses/by/3.0/de/deed.en
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
  *
- * Lizensiert unter der Creative Commons Namensnennung 3.0 Deutschland Lizenz
- * http://creativecommons.org/licenses/by/3.0/de/
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  *
  */
 
@@ -78,7 +84,7 @@
      * @return true if mail was delivered without errors
      */
     public boolean deliver(MailDraft msg) throws MailException {
-        this.logOut.println("*** STARTING MAIL DELIVERY 
"+DION.formatDate(new Date(), AX.getIsoFullFormat())+" ***");
+        this.logOut.println("*** STARTING MAIL DELIVERY 
"+DION.formatDate(new Date(), AX.isoFullFormat)+" ***");
         if (msg == null) {
             this.logOut.println("*** ERROR: TRYING TO SEND null MAIL ***");
             return false;

diff -r d10244e567c3 -r 022fbec19a2f src/net/andunix/lib/xml/XmlElement.java
--- a/src/net/andunix/lib/xml/XmlElement.java   Tue Aug 28 23:45:33 2012 +0200
+++ b/src/net/andunix/lib/xml/XmlElement.java   Tue Aug 28 23:47:16 2012 +0200
@@ -80,7 +80,7 @@
         return this.impl.getAttribute(attribute);
     }
     public XmlElement getFirstChildElement() {
-        Node result = impl.getFirstChild();
+        Node result = impl == null ? null : impl.getFirstChild();
         // go to the first Element (skip Attributes etc.)
         while ((result != null) && !(result instanceof Element)) {
             result = result.getNextSibling();


diff -r 022fbec19a2f -r 55d81b3ef5e1 
src/net/andunix/lib/dc/eyetv/EyeTVArchive.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/dc/eyetv/EyeTVArchive.java    Tue Aug 28 23:50:06 
2012 +0200
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2012 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.dc.eyetv;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * FIXME: class description
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+public class EyeTVArchive {
+    //
+    //
+    //
+    // CONSTANTS
+    //
+    private static final Log log = LogFactory.getLog(EyeTVArchive.class);
+    //
+    //
+    //
+    // FIELDS
+    //
+    private final File eyeTVArchiveDir;
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    public EyeTVArchive(File eyeTVArchiveDir) {
+        this.eyeTVArchiveDir = eyeTVArchiveDir;
+    }
+    //
+    //
+    //
+    // METHODS
+    //
+    public List<EyeTVBundle> getAll() {
+        List<EyeTVBundle> result = new ArrayList<EyeTVBundle>();
+        for (File file : eyeTVArchiveDir.listFiles()) {
+            final String filename = file.getName();
+            if (filename.endsWith(".eyetv")) {
+                result.add(new EyeTVRecording(file));
+            } else if (filename.endsWith(".eyetvsced")) {
+                result.add(new EyeTVSchedule(file));
+            }
+        }
+        return result;
+    }
+    public List<EyeTVBundle> findByFilenamePrefix(final String prefix) {
+        List<EyeTVBundle> result = new ArrayList<EyeTVBundle>();
+        FilenameFilter fnf = new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return name.startsWith(prefix);
+            }
+        };
+        for (File file : eyeTVArchiveDir.listFiles(fnf)) {
+            final String filename = file.getName();
+            if (filename.endsWith(".eyetv")) {
+                result.add(new EyeTVRecording(file));
+            } else if (filename.endsWith(".eyetvsched")) {
+                result.add(new EyeTVSchedule(file));
+            }
+        }
+        return result;
+    }
+}

diff -r 022fbec19a2f -r 55d81b3ef5e1 
src/net/andunix/lib/dc/eyetv/EyeTVBundle.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/dc/eyetv/EyeTVBundle.java     Tue Aug 28 23:50:06 
2012 +0200
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2012 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.dc.eyetv;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import javax.xml.parsers.ParserConfigurationException;
+import net.andunix.lib.plist.PListDict;
+import net.andunix.lib.plist.PropertyList;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.xml.sax.SAXException;
+
+/**
+ * FIXME: class description
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+public class EyeTVBundle {
+    //
+    //
+    //
+    // CONSTANTS
+    //
+    private static final Log log = LogFactory.getLog(EyeTVBundle.class);
+    //
+    //
+    //
+    // FIELDS
+    //
+    private final File dir;
+    private PropertyList eyetvp;
+    private PListDict epg_info;
+    private PListDict info;
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    public EyeTVBundle(File eyeTVFileDir) {
+        this.dir = eyeTVFileDir;
+        for (File file : eyeTVFileDir.listFiles()) {
+            if (file.getName().endsWith(".eyetvp")) {
+                try {
+                    this.eyetvp = PropertyList.parse(file);
+                    try {
+                        this.epg_info = 
(PListDict)((PListDict)eyetvp.getRoot()).get("epg info");
+                    } catch (Exception ex) {
+                        log.error(ex, ex);
+                        this.epg_info = null;
+                    }
+                    try {
+                        this.info = 
(PListDict)((PListDict)eyetvp.getRoot()).get("info");
+                    } catch (Exception ex) {
+                        log.error(ex, ex);
+                        this.info = null;
+                    }
+                } catch (IOException ex) {
+                    log.error(ex);
+                } catch (ParserConfigurationException ex) {
+                    log.error(ex);
+                } catch (SAXException ex) {
+                    log.error(ex);
+                }
+            }
+        }
+    }
+    //
+    //
+    //
+    // METHODS
+    //
+    @Override
+    public String toString() {
+        return dir.getName();
+    }
+    public int getFsk() {
+        if (epg_info == null) return -1;
+        return epg_info.getInteger("FSK");
+    }
+    public Date getStartTime() {
+        if (epg_info == null) return null;
+        return new 
Date(977702400000L+1000L*epg_info.getInteger("STARTTIME"));
+    }
+    public Date getStopTime() {
+        if (epg_info == null) return null;
+        return new Date(977702400000L+1000L*epg_info.getInteger("STOPTIME"));
+    }
+}

diff -r 022fbec19a2f -r 55d81b3ef5e1 
src/net/andunix/lib/dc/eyetv/EyeTVRecording.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/dc/eyetv/EyeTVRecording.java  Tue Aug 28 23:50:06 
2012 +0200
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.dc.eyetv;
+
+import java.io.File;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * FIXME: class description
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+class EyeTVRecording extends EyeTVBundle {
+    //
+    //
+    //
+    // CONSTANTS
+    //
+    private static final Log log = LogFactory.getLog(EyeTVRecording.class);
+    //
+    //
+    //
+    // FIELDS
+    //
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    public EyeTVRecording(File eyeTVRecordingDir) {
+        super(eyeTVRecordingDir);
+    }
+    //
+    //
+    //
+    // METHODS
+    //
+}

diff -r 022fbec19a2f -r 55d81b3ef5e1 
src/net/andunix/lib/dc/eyetv/EyeTVSchedule.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/dc/eyetv/EyeTVSchedule.java   Tue Aug 28 23:50:06 
2012 +0200
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.dc.eyetv;
+
+import java.io.File;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * FIXME: class description
+ *
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+class EyeTVSchedule extends EyeTVBundle {
+    //
+    //
+    //
+    // CONSTANTS
+    //
+    private static final Log log = LogFactory.getLog(EyeTVSchedule.class);
+    //
+    //
+    //
+    // FIELDS
+    //
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    public EyeTVSchedule(File eyeTVScheduleDir) {
+        super(eyeTVScheduleDir);
+    }
+    //
+    //
+    //
+    // METHODS
+    //
+}

diff -r 022fbec19a2f -r 55d81b3ef5e1 src/net/andunix/lib/plist/PListData.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/plist/PListData.java  Tue Aug 28 23:50:06 2012 +0200
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.plist;
+
+import net.andunix.lib.render.RenderException;
+import net.andunix.lib.render.RenderSet;
+import net.andunix.lib.xml.XmlElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * FIXME: class description
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+public class PListData implements PListObject {
+    //
+    //
+    //
+    // CONSTANTS
+    //
+    private static final Log log = LogFactory.getLog(PListString.class);
+    //
+    //
+    //
+    // FIELDS
+    //
+    private String value;
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    public PListData(XmlElement element) {
+        this.value = element.getText();
+    }
+    //
+    //
+    //
+    // METHODS
+    //
+    public String getValue() {
+        return value;
+    }
+    @Override
+    public void render(RenderSet renderSet) throws RenderException {
+        if (RenderSet.RENDER_TYPE_XML.equals(renderSet.getRenderType())) {
+            final StringBuilder buffer = renderSet.getBuffer();
+            renderSet.appendIndentPrefix();
+            buffer.append("<data>").append(value).append("</data>\n");
+        } else {
+            throw new RenderException("can't render as " + 
renderSet.getRenderType());
+        }
+    }
+}

diff -r 022fbec19a2f -r 55d81b3ef5e1 src/net/andunix/lib/plist/PListDate.java
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/net/andunix/lib/plist/PListDate.java  Tue Aug 28 23:50:06 2012 +0200
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2012 Andreas Huber - http://andunix.net/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package net.andunix.lib.plist;
+
+import java.util.Date;
+import net.andunix.lib.AX;
+import net.andunix.lib.DIOD;
+import net.andunix.lib.DION;
+import net.andunix.lib.render.RenderException;
+import net.andunix.lib.render.RenderSet;
+import net.andunix.lib.xml.XmlElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Property List Integer
+ *
+ * Implements the
+ * <code>&lt;integer&gt;</code> element of a Apple property list.
+ * 
+ * @author Andreas Huber, <a 
href="http://andunix.net/";>http://andunix.net/</a>
+ */
+public class PListDate implements PListObject {
+    //
+    //
+    //
+    // CONSTANTS
+    //
+    private static final Log log = LogFactory.getLog(PListDate.class);
+    //
+    //
+    //
+    // FIELDS
+    //
+    private Date value;
+    //
+    //
+    //
+    // CONSTRUCTORS
+    //
+    public PListDate(XmlElement element) {
+        this.value = DION.parseDate(element.getText(), AX.isoDateTimeFormat);
+    }
+    //
+    //
+    //
+    // METHODS
+    //
+    public Date getValue() {
+        return value;
+    }
+    @Override
+    public void render(RenderSet renderSet) throws RenderException {
+        if (RenderSet.RENDER_TYPE_XML.equals(renderSet.getRenderType())) {
+            final StringBuilder buffer = renderSet.getBuffer();
+            renderSet.appendIndentPrefix();
+            buffer.append("<date>").append(DIOD.formatDate(value, 
AX.isoDateTimeFormat, "NULL")).append("</date>\n");
+        } else {
+            throw new RenderException("can't render as " + 
renderSet.getRenderType());
+        }
+    }
+}

diff -r 022fbec19a2f -r 55d81b3ef5e1 
src/net/andunix/lib/plist/PropertyList.java
--- a/src/net/andunix/lib/plist/PropertyList.java       Tue Aug 28 23:47:16 
2012 +0200
+++ b/src/net/andunix/lib/plist/PropertyList.java       Tue Aug 28 23:50:06 
2012 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Andreas Huber - http://andunix.net/
+ * Copyright 2011-2012 Andreas Huber - http://andunix.net/
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -50,8 +50,7 @@
     // STATIC METHODS
     //
     public static PropertyList parse(File file) throws IOException, 
ParserConfigurationException, SAXException {
-        XmlDocument doc = new XmlDocument();
-        doc.parse(file);
+        XmlDocument doc = XmlDocument.parse(file);
         return parse(doc);
     }
     public static PropertyList parse(XmlDocument doc) {
@@ -67,23 +66,30 @@
         } else if (!element.isValid()) {
             log.error("invalid plist object");
             return null;
-        } else if ("array".equals(element.getTagName())) {
-            return new PListArray(element);
-        } else if ("dict".equals(element.getTagName())) {
-            return new PListDict(element);
-        } else if ("false".equals(element.getTagName())) {
-            return new PListBoolean(false);
-        } else if ("integer".equals(element.getTagName())) {
-            return new PListInteger(element);
-        } else if ("real".equals(element.getTagName())) {
-            return new PListReal(element);
-        } else if ("string".equals(element.getTagName())) {
-            return new PListString(element);
-        } else if ("true".equals(element.getTagName())) {
-            return new PListBoolean(true);
         } else {
-            log.error("unknown plist object of type: "+element.getTagName());
-            return null;
+            final String tagName = element.getTagName();
+            if ("array".equals(tagName)) {
+                return new PListArray(element);
+            } else if ("data".equals(tagName)) {
+                return new PListData(element);
+            } else if ("date".equals(tagName)) {
+                return new PListDate(element);
+            } else if ("dict".equals(tagName)) {
+                return new PListDict(element);
+            } else if ("false".equals(tagName)) {
+                return new PListBoolean(false);
+            } else if ("integer".equals(tagName)) {
+                return new PListInteger(element);
+            } else if ("real".equals(tagName)) {
+                return new PListReal(element);
+            } else if ("string".equals(tagName)) {
+                return new PListString(element);
+            } else if ("true".equals(tagName)) {
+                return new PListBoolean(true);
+            } else {
+                log.error("unknown plist object of type: " + tagName);
+                return null;
+            }
         }
     }
     //






[andunix~libandunix:44] Added eyetv package to read Elgato EyeTV program files and improved the p

andunix 08/28/2012
 
 
Close
loading
Please Confirm
Close