System of Liveupdatestream changed
authorRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 14 Jan 2007 14:33:16 +0000 (14:33 +0000)
committerRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 14 Jan 2007 14:33:16 +0000 (14:33 +0000)
the updatestream is now read by an ajaxrequest
IE loads updates in a iframe

webinterface/src/plugin.py
webinterface/src/web-data/gfx/favicon.ico [new file with mode: 0644]
webinterface/src/web-data/tools.js
webinterface/src/web/index.html.xml
webinterface/src/web/updates.xml [new file with mode: 0644]
webinterface/src/webif.py

index e8026d7..bf6775c 100644 (file)
@@ -3,7 +3,7 @@ from Plugins.Plugin import PluginDescriptor
 sessions = [ ]
 
 # set DEBUG to True, if twisted should write logoutput to a file.
-DEBUG = Fals
+DEBUG = Tru
 DEBUGFILE= "/tmp/twisted.log"
 
 def startWebserver():
diff --git a/webinterface/src/web-data/gfx/favicon.ico b/webinterface/src/web-data/gfx/favicon.ico
new file mode 100644 (file)
index 0000000..d048f55
Binary files /dev/null and b/webinterface/src/web-data/gfx/favicon.ico differ
index 78404f5..5818a6a 100644 (file)
@@ -10,7 +10,82 @@ var url_epgnownext = "/web/epgnownext?ref="; // plus serviceRev
 
 var url_fetchchannels = "/web/fetchchannels?ServiceListBrowse="; // plus encoded serviceref
 
-var DBG = true;
+var url_updates= "/web/updates";
+
+var DBG = false;
+
+// UpdateStreamReader
+var UpdateStreamReaderNextReadPos = 0;
+var UpdateStreamReaderPollTimer;
+UpdateStreamReaderRequest = null;
+function UpdateStreamReaderStart(){
+       var ua = navigator.userAgent;
+       if(navigator.userAgent.indexOf("MSIE") >=0) {
+               debug("UpdateStreamReader IE Fix *IE sucks*");
+               $('UpdateStreamReaderIEFixPanel').innerHTML = '<iframe id="UpdateStreamReaderIEFixIFrame" src="'+url_updates+'" height="0" width="0" scrolling="none" frameborder="0">no iframe support!</iframe>';
+       }else {
+               debug("UpdateStreamReader Start");
+               UpdateStreamReaderNextReadPos = 0;
+               allMessages = "";
+               UpdateStreamReaderRequest =new XMLHttpRequest();
+               UpdateStreamReaderRequest.onload = UpdateStreamReaderOnLoad;
+               UpdateStreamReaderRequest.onerror = UpdateStreamReaderOnError;
+               UpdateStreamReaderRequest.open("GET", url_updates, true);
+               //try{
+                       UpdateStreamReaderRequest.send(null);
+               //}catch(e){ debug(e); /*strange errors :) */}
+               UpdateStreamReaderPollTimer = setInterval(UpdateStreamReaderLatestResponse, 500);
+       }
+}
+  
+function UpdateStreamReaderLatestResponse() {
+       var allMessages = UpdateStreamReaderRequest.responseText;
+    do {
+      var unprocessed = allMessages.substring(UpdateStreamReaderNextReadPos);
+      var messageXMLEndIndex = unprocessed.indexOf("\n");
+      if (messageXMLEndIndex!=-1) {
+        var endOfFirstMessageIndex = messageXMLEndIndex + "\n".length;
+        var anUpdate = unprocessed.substring(0, endOfFirstMessageIndex);
+               //anUpdate = anUpdate.replace(/&lt;div id="scriptzone"\/>/,'');
+               anUpdate = anUpdate.replace(/<script>parent./, '');
+        anUpdate = anUpdate.replace(/<\/script>\n/, '');
+        eval(anUpdate);
+        UpdateStreamReaderNextReadPos += endOfFirstMessageIndex;
+      }
+    } while (messageXMLEndIndex != -1);
+}
+
+function UpdateStreamReaderOnLoad(request){
+       window.clearInterval(UpdateStreamReaderPollTimer);
+       debug("UpdateStreamReaderOnLoad");
+       Dialog.confirm(
+               "Live Update Stream ends!<br><br>You will not receive any Update from Enigma2.<br>Should I reconnect?"
+               , {windowParameters: {width:300, className: "alphacube"}
+                       , okLabel: "reconnect"
+                       , buttonClass: "myButtonClass"
+                       , id: new Date().toUTCString()
+                       , cancel:function(win) {debug("cancel confirm panel")}
+                       , ok: function(win) {UpdateStreamReaderStart(); return true;}
+                       }
+               );
+}
+function UpdateStreamReaderOnError(request){
+       // TODO: change this, because it will be called on 'PageUnload' while the request is still running
+       debug("UpdateStreamReaderOnError");
+       window.clearInterval(UpdateStreamReaderPollTimer);
+       Dialog.confirm(
+               "Live Update Stream has an Error!<br><br>You will not receive any Update from Enigma2.<br>Should I try to reconnect?"
+               , {windowParameters: {width:300, className: "alphacube"}
+                       , okLabel: "reconnect"
+                       , buttonClass: "myButtonClass"
+                       , id:  new Date().toUTCString()
+                       , cancel:function(win) {debug("cancel confirm panel")}
+                       , ok: function(win) {UpdateStreamReaderStart(); return true;}
+                       }
+               );
+}
+
+//end UpdateStreamReader
 
 function openWindow(title, inner, width, height, id){
                        if(id == null) id = new Date().toUTCString();
@@ -97,17 +172,22 @@ function showhide(id){
 
 function set(what, value){
        //debug(what+"-"+value);
-       element = document.getElementById(what);
+       element = parent.document.getElementById(what);
        if (element){
                element.innerHTML = value;
        }
-       //$('scriptzone').innerHTML = ""; // deleting set() from page, to keep the page short and to save memory
+       if(navigator.userAgent.indexOf("MSIE") >=0) {
+               elementscript= $('UpdateStreamReaderIEFixIFrame').document.getElementById('scriptzone');
+               if(elementscript){
+                       elementscript.innerHTML = ""; // deleting set() from page, to keep the page short and to save memory                    
+               }
+       }
 }
 // requestindikator
 var requestcounter = 0;
 
 function requestIndicatorUpdate(){
-       debug(requestcounter+" open requests");
+       //debug(requestcounter+" open requests");
        if(requestcounter>=1){
                $('RequestIndicator').style.display = "inline";
        }else{
index a66c3e8..1b36321 100644 (file)
@@ -3,7 +3,6 @@
        <meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
        <title>Enigma 2 Webinterface (ALPHA)</title>
        <!--load everything for prototype and prototype window -->
-
        <script type="text/javascript" src="/webdata/lib/prototype.js" />
        <script type="text/javascript" src="/webdata/lib/rico.js"/>
        <script type="text/javascript" src="/webdata/lib/ptwindow/effects.js" />
@@ -18,6 +17,7 @@
        <script type="text/javascript" src="/webdata/tools.js" />
 
        <link href="/webdata/style.css" type="text/css" rel="stylesheet" />
+       <link rel="shortcut icon" type="image/x-icon" href="/webdata/gfx/favicon.ico"/>
 
        <!-- Live RSS Feeds //-->
        <link rel="alternate" type="application/rss+xml" title="Movie List" href="/web/movielist.rss" />
 
        </div>
 </div>
-<!--iframe onload="hide(this)" width="0" id="updates" height="0" src="updates.html" name="updates" scrolling="none" frameborder="0">no iframe support!</iframe-->
+<div>
+<!-- START LIVEUPDATESTREAM  is used to enable the liveupdatestream in MS Internet Explorer //-->
+<div id="UpdateStreamReaderIEFixPanel"></div>
+<!-- END LIVEUPDATESTREAM//-->
+</div>
 <script type="text/javascript" >
 if(DBG) { debugWin = openWindow("DEBUG", "", 300, 300, "debugWindow"); }
 
@@ -111,89 +115,14 @@ var accordionOptions = {
 
 new Rico.Accordion( $('accordionMenue'), accordionOptions );
 
+// do things to do at startup
 initVolumePanel();
 initSignalPanel();
 initChannelList();
 setBodyMainContent('BodyContentChannellist');
-function imdb()
-{
-       w = window.open("http://www.imdb.com/find?s=all&amp;q=" + escape(document.getElementById("Event_Now_Name").innerHTML));
-       w.focus();
-       set("BodyContentChannellist", "TEST!!!");
-}
+UpdateStreamReaderStart();
 
 </script>
-
 </body>
-&lt;div id="scriptzone">
-<!-- realtime updates follow -->
-<e2:element source="CurrentTime" streaming="yes">
-       <e2:convert type="ClockToText">WithSeconds</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="CurrentService" streaming="yes">
-<e2:convert type="ServiceName">Name</e2:convert>
-<e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="Event_Now" id="Event_Now_Name" streaming="yes">
-       <e2:convert type="EventName">Name</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="Event_Now" id="Event_Now_Extended_Description" streaming="yes">
-       <e2:convert type="EventName">ExtendedDescription</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="Event_Now" id="Event_Now_Begin" streaming="yes">
-       <e2:convert type="EventTime">StartTime</e2:convert>
-       <e2:convert type="ClockToText">Default</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="Event_Now" id="Event_Now_Remaining" streaming="yes">
-       <e2:convert type="EventTime">Remaining</e2:convert>
-       <e2:convert type="RemainingToText">InMinutes</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="Event_Next" id="Event_Next_Name" streaming="yes">
-       <e2:convert type="EventName">Name</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="Event_Next" id="Event_Next_Begin" streaming="yes">
-       <e2:convert type="EventTime">StartTime</e2:convert>
-       <e2:convert type="ClockToText">Default</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="Event_Next" id="Event_Next_Remaining" streaming="yes">
-       <e2:convert type="EventTime">Remaining</e2:convert>
-       <e2:convert type="RemainingToText">InMinutes</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="Event_Next" id="Event_Next_Extended_Description" streaming="yes">
-       <e2:convert type="EventName">ExtendedDescription</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="FrontendStatus"  id="SNR" streaming="yes">
-       <e2:convert type="FrontendInfo">SNR</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="FrontendStatus"  id="BER" streaming="yes">
-       <e2:convert type="FrontendInfo">BER</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>
-
-<e2:element source="FrontendStatus"  id="AGC" streaming="yes">
-       <e2:convert type="FrontendInfo">AGC</e2:convert>
-       <e2:convert type="web:JavascriptUpdate" />
-</e2:element>                
-                
+&lt;/html>
 </e2:screen>
diff --git a/webinterface/src/web/updates.xml b/webinterface/src/web/updates.xml
new file mode 100644 (file)
index 0000000..e79e1b5
--- /dev/null
@@ -0,0 +1,72 @@
+<e2:screen name="TestScreen">
+&lt;div id="scriptzone"/>
+<e2:element source="CurrentTime" streaming="yes">
+       <e2:convert type="ClockToText">WithSeconds</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="CurrentService" streaming="yes">
+<e2:convert type="ServiceName">Name</e2:convert>
+<e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="Event_Now" id="Event_Now_Name" streaming="yes">
+       <e2:convert type="EventName">Name</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="Event_Now" id="Event_Now_Extended_Description" streaming="yes">
+       <e2:convert type="EventName">ExtendedDescription</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="Event_Now" id="Event_Now_Begin" streaming="yes">
+       <e2:convert type="EventTime">StartTime</e2:convert>
+       <e2:convert type="ClockToText">Default</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="Event_Now" id="Event_Now_Remaining" streaming="yes">
+       <e2:convert type="EventTime">Remaining</e2:convert>
+       <e2:convert type="RemainingToText">InMinutes</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="Event_Next" id="Event_Next_Name" streaming="yes">
+       <e2:convert type="EventName">Name</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="Event_Next" id="Event_Next_Begin" streaming="yes">
+       <e2:convert type="EventTime">StartTime</e2:convert>
+       <e2:convert type="ClockToText">Default</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="Event_Next" id="Event_Next_Remaining" streaming="yes">
+       <e2:convert type="EventTime">Remaining</e2:convert>
+       <e2:convert type="RemainingToText">InMinutes</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="Event_Next" id="Event_Next_Extended_Description" streaming="yes">
+       <e2:convert type="EventName">ExtendedDescription</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="FrontendStatus"  id="SNR" streaming="yes">
+       <e2:convert type="FrontendInfo">SNR</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="FrontendStatus"  id="BER" streaming="yes">
+       <e2:convert type="FrontendInfo">BER</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>
+
+<e2:element source="FrontendStatus"  id="AGC" streaming="yes">
+       <e2:convert type="FrontendInfo">AGC</e2:convert>
+       <e2:convert type="web:JavascriptUpdate" />
+</e2:element>                
+                
+</e2:screen>
index ba13512..c9dd666 100644 (file)
@@ -168,8 +168,10 @@ class JavascriptUpdate(Converter):
                Converter.__init__(self, arg)
 
        def getHTML(self, id):
-               return '<script>set("' + id + '", "' + filter_javascript_escape(self.source.text) + '");</script>\n'
-
+               # 3c5x9, added parent. , this is because the ie loads this in a iframe. an the set is in index.html.xml
+               #                all other will replace this in JS
+               return '<script>parent.set("' + id + '", "' + filter_javascript_escape(self.source.text) + '");</script>\n'
+       
 # the performant 'listfiller'-engine (plfe)
 class ListFiller(Converter):
        def __init__(self, arg):