add possibility to view eventinfo in recorded movielist (move cursor to
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 14 Jul 2006 12:59:18 +0000 (12:59 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 14 Jul 2006 12:59:18 +0000 (12:59 +0000)
recorded movie and press info)

data/keymap.xml
lib/python/Components/MovieList.py
lib/python/Screens/MovieSelection.py
lib/service/event.cpp
lib/service/event.h
lib/service/iservice.h
lib/service/servicedvb.cpp

index 047e074..1300b7a 100644 (file)
 
        <map context="MovieSelectionActions">
                <key id="KEY_MENU" mapto="contextMenu" flags="m" />
+               <key id="KEY_INFO" mapto="showEventInfo" flags="m" />
        </map>
 
        <map context="InfobarMovieListActions">
index 970180c..1a61d20 100644 (file)
@@ -59,6 +59,10 @@ class MovieList(HTMLComponent, GUIComponent):
        def getCurrentIndex(self):
                return self.instance.getCurrentIndex()
 
+       def getCurrentEvent(self):
+               l = self.l.getCurrentSelection()
+               return l and l[0] and l[1] and l[1].getEvent(l[0])
+
        def getCurrent(self):
                l = self.l.getCurrentSelection()
                return l and l[0]
index 82c9c7e..62c797e 100644 (file)
@@ -20,15 +20,15 @@ class ChannelContextMenu(FixedMenu):
        def __init__(self, session, csel, service):
                self.csel = csel
                self.service = service
-               
+
                menu = [(_("back"), self.close), (_("delete..."), self.delete)]
-               
+
                for p in plugins.getPlugins(PluginDescriptor.WHERE_MOVIELIST):
                        menu.append((p.description, boundFunction(self.execPlugin, p)))
-               
+
                FixedMenu.__init__(self, session, _("Movie Menu"), menu)
                self.skinName = "Menu"
-       
+
        def execPlugin(self, plugin):
                plugin(session=self.session, service=self.service)
 
@@ -89,6 +89,7 @@ class MovieSelection(Screen):
                        {
                                "cancel": self.abort,
                                "ok": self.movieSelected,
+                               "showEventInfo": self.showEventInformation,
                                "contextMenu": self.doContext,
                        })
                self["actions"].csel = self
@@ -96,7 +97,14 @@ class MovieSelection(Screen):
                
                self.lengthTimer = eTimer()
                self.lengthTimer.timeout.get().append(self.updateLengthData)
-               
+
+       def showEventInformation(self):
+               from Screens.EventView import EventViewSimple
+               from ServiceReference import ServiceReference
+               evt = self["list"].getCurrentEvent()
+               if evt:
+                       self.session.open(EventViewSimple, evt, ServiceReference(self.getCurrent()))
+
        def go(self):
                # ouch. this should redraw our "Please wait..."-text.
                # this is of course not the right way to do this.
index 07c92c5..4dda577 100644 (file)
@@ -10,6 +10,9 @@
 #include <dvbsi++/component_descriptor.h>
 #include <dvbsi++/descriptor_tag.h>
 
+#include <sys/types.h>
+#include <fcntl.h>
+
 // static members / methods
 std::string eServiceEvent::m_language = "de_DE";
 
@@ -185,6 +188,27 @@ RESULT eServiceEvent::parseFrom(Event *evt, int tsidonid)
        return 0;
 }
 
+RESULT eServiceEvent::parseFrom(const std::string filename, int tsidonid)
+{
+       if (!filename.empty())
+       {
+               int fd = ::open( filename.c_str(), O_RDONLY );
+               if ( fd > -1 )
+               {
+                       __u8 buf[4096];
+                       int rd = ::read(fd, buf, 4096);
+                       ::close(fd);
+                       if ( rd > 12 /*EIT_LOOP_SIZE*/ )
+                       {
+                               Event ev(buf);
+                               parseFrom(&ev, tsidonid);
+                               return 0;
+                       }
+               }
+       }
+       return -1;
+}
+
 std::string eServiceEvent::getBeginTimeString() const
 {
        tm t;
index 285a4ae..25b9d0b 100644 (file)
@@ -44,6 +44,7 @@ class eServiceEvent: public iObject
 public:
 #ifndef SWIG
        RESULT parseFrom(Event *evt, int tsidonid=0);
+       RESULT parseFrom(const std::string filename, int tsidonid=0);
 #endif
        static void setEPGLanguage( const std::string language );
        time_t getBeginTime() const { return m_begin; }
index 7eeee69..7dba732 100644 (file)
@@ -205,6 +205,8 @@ typedef long long pts_t;
           
           Hide the result only if there is another way to check for failure! */
           
+TEMPLATE_TYPEDEF(ePtr<eServiceEvent>, eServiceEventPtr);
+       
 class iStaticServiceInformation: public iObject
 {
 #ifdef SWIG
@@ -226,8 +228,6 @@ public:
 
 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
 
-TEMPLATE_TYPEDEF(ePtr<eServiceEvent>, eServiceEventPtr);
-
 class iServiceInformation: public iObject
 {
 #ifdef SWIG
index bae45aa..616c700 100644 (file)
@@ -25,8 +25,6 @@
 #include <byteswap.h>
 #include <netinet/in.h>
 
-#include <dvbsi++/event_information_section.h>
-
 #define INTERNAL_TELETEXT
 
 #ifndef BYTE_ORDER
@@ -149,7 +147,8 @@ public:
        eStaticServiceDVBPVRInformation(const eServiceReference &ref);
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
-       
+       RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time);
+
        int getInfo(const eServiceReference &ref, int w);
        std::string getInfoString(const eServiceReference &ref,int w);
 };
@@ -216,6 +215,24 @@ std::string eStaticServiceDVBPVRInformation::getInfoString(const eServiceReferen
        }
 }
 
+RESULT eStaticServiceDVBPVRInformation::getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &evt, time_t start_time)
+{
+       if (!ref.path.empty())
+       {
+               ePtr<eServiceEvent> event = new eServiceEvent;
+               std::string filename = ref.path;
+               filename.erase(filename.length()-2, 2);
+               filename+="eit";
+               if (!event->parseFrom(filename, (m_parser.m_ref.getTransportStreamID().get()<<16)|m_parser.m_ref.getOriginalNetworkID().get()))
+               {
+                       evt = event;
+                       return 0;
+               }
+       }
+       evt = 0;
+       return -1;
+}
+
 class eDVBPVRServiceOfflineOperations: public iServiceOfflineOperations
 {
        DECLARE_REF(eDVBPVRServiceOfflineOperations);
@@ -758,25 +775,15 @@ RESULT eDVBServicePlay::start()
                std::string filename = service.path;
                filename.erase(filename.length()-2, 2);
                filename+="eit";
-               int fd = ::open( filename.c_str(), O_RDONLY );
-               if ( fd > -1 )
+               ePtr<eServiceEvent> event = new eServiceEvent;
+               if (!event->parseFrom(filename, (service.getTransportStreamID().get()<<16)|service.getOriginalNetworkID().get()))
                {
-                       __u8 buf[4096];
-                       int rd = ::read(fd, buf, 4096);
-                       ::close(fd);
-                       if ( rd > 12 /*EIT_LOOP_SIZE*/ )
-                       {
-                               Event ev(buf);
-                               ePtr<eServiceEvent> event = new eServiceEvent;
-                               ePtr<eServiceEvent> empty;
-                               event->parseFrom(&ev, (service.getTransportStreamID().get()<<16)|service.getOriginalNetworkID().get());
-                               m_event_handler.inject(event, 0);
-                               m_event_handler.inject(empty, 1);
-                               eDebug("injected");
-                       }
+                       ePtr<eServiceEvent> empty;
+                       m_event_handler.inject(event, 0);
+                       m_event_handler.inject(empty, 1);
                }
        }
-       
+
        if (m_is_pvr)
                loadCuesheet();