Merge branch 'master' of git.opendreambox.org:/git/enigma2
authorghost <andreas.monzner@multimedia-labs.de>
Thu, 11 Jun 2009 16:41:41 +0000 (18:41 +0200)
committerghost <andreas.monzner@multimedia-labs.de>
Thu, 11 Jun 2009 16:41:41 +0000 (18:41 +0200)
lib/base/filepush.cpp
lib/base/smartptr.h
lib/dvb_ci/dvbci.cpp
lib/python/Components/ServiceEventTracker.py
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h

index 645d368..d43b6e1 100644 (file)
@@ -190,8 +190,10 @@ void eFilePushThread::thread()
                        {
                                eDebug("sending PVR commit");
                                
-                               struct pollfd pfd[1] = {m_fd_dest, POLLHUP};
-                               poll(pfd, 1, 10000);
+                               struct pollfd pfd;
+                               pfd.fd = m_fd_dest;
+                               pfd.events = POLLHUP;
+                               poll(&pfd, 1, 10000);
                                sleep(5); /* HACK to allow ES buffer to drain */
                                already_empty = 1;
 //                             if (::ioctl(m_fd_dest, PVR_COMMIT) < 0 && errno == EINTR)
index a2c6691..be83528 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "object.h"
 #include <stdio.h>
+#include <string.h>
 #include <lib/python/swig.h>
 
 inline void ptrAssert(void *p) { if (!p) *(unsigned long*)0=0; }
@@ -12,6 +13,18 @@ class ePtr
 {
 protected:
        T *ptr;
+       char m_ptrStr[sizeof(void*)*2+1];
+       void updatePtrStr()
+       {
+               if (ptr) {
+                       if (sizeof(void*) > 4)
+                               sprintf(m_ptrStr, "%llx", (unsigned long long)ptr);
+                       else
+                               sprintf(m_ptrStr, "%lx", (unsigned long)ptr);
+               }
+               else
+                       strcpy(m_ptrStr, "NIL");
+       }
 public:
        T &operator*() { return *ptr; }
        ePtr(): ptr(0)
@@ -21,12 +34,13 @@ public:
        {
                if (c)
                        c->AddRef();
+               updatePtrStr();
        }
-       ePtr(const ePtr &c)
+       ePtr(const ePtr &c): ptr(c.ptr)
        {
-               ptr=c.ptr;
                if (ptr)
                        ptr->AddRef();
+               updatePtrStr();
        }
        ePtr &operator=(T *c)
        {
@@ -35,9 +49,9 @@ public:
                if (ptr)
                        ptr->Release();
                ptr=c;
+               updatePtrStr();
                return *this;
        }
-       
        ePtr &operator=(ePtr<T> &c)
        {
                if (c.ptr)
@@ -45,15 +59,18 @@ public:
                if (ptr)
                        ptr->Release();
                ptr=c.ptr;
+               updatePtrStr();
                return *this;
        }
-       
        ~ePtr()
        {
                if (ptr)
                        ptr->Release();
        }
-       
+       char *getPtrString()
+       {
+               return m_ptrStr;
+       }
 #ifndef SWIG
        T* grabRef() { if (!ptr) return 0; ptr->AddRef(); return ptr; }
        T* &ptrref() { ASSERT(!ptr); return ptr; }
@@ -106,7 +123,6 @@ public:
                ptr=c;
                return *this;
        }
-       
        eUsePtr &operator=(eUsePtr<T> &c)
        {
                if (c.ptr)
@@ -122,7 +138,6 @@ public:
                ptr=c.ptr;
                return *this;
        }
-       
        ~eUsePtr()
        {
                if (ptr)
@@ -131,7 +146,6 @@ public:
                        ptr->Release();
                }
        }
-       
 #ifndef SWIG
        T* grabRef() { if (!ptr) return 0; ptr->AddRef(); ptr->AddUse(); return ptr; }
        T* &ptrref() { ASSERT(!ptr); return ptr; }
@@ -168,24 +182,18 @@ public:
        eMutablePtr(): ePtr<T>(0)
        {
        }
-       
        eMutablePtr(T *c): ePtr<T>(c)
        {
        }
-
        eMutablePtr(const eMutablePtr &c): ePtr<T>(c)
        {
        }
-       
        eMutablePtr &operator=(T *c)
        {
                ePtr<T>::operator=(c);
                return *this;
        }
-       
-       
        ePtrHelper<T> operator->() { ptrAssert(ptr); return ePtrHelper<T>(ptr); }
-
                        /* for const objects, we don't need the helper, as they can't */
                        /* be changed outside the program flow. at least this is */
                        /* what the compiler assumes, so in case you're using const */
index 9583db5..0a32b8f 100644 (file)
@@ -577,7 +577,7 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler)
                {
                        if (!sameServiceExist)
                        {
-                               if (slot->getNumOfServices() > 1)
+//                             if (slot->getNumOfServices() > 1)
                                {
                                        eDebug("[eDVBCIInterfaces] remove last pmt handler for service %s send empty capmt",
                                                service_to_remove.toString().c_str());
index 164f688..ee4bf38 100644 (file)
@@ -14,7 +14,7 @@ class ServiceEventTracker:
        """Tracks service events into a screen"""
        InfoBarStack = [ ]
        InfoBarStackSize = 0
-       oldService = None
+       oldServiceStr = None
        EventMap = { }
        navcore = None
 
@@ -25,10 +25,9 @@ class ServiceEventTracker:
                if func_list:
                        nav = set.navcore
                        cur_ref = nav.getCurrentlyPlayingServiceReference()
-                       old_service_running = set.oldRef and cur_ref and cur_ref == set.oldRef and set.oldService and set.oldService == str(nav.getCurrentService())
-#                      print "old_service_running", old_service_running
-                       if not old_service_running and set.oldService:
-                               set.oldService = None
+                       old_service_running = set.oldRef and cur_ref and cur_ref == set.oldRef and set.oldServiceStr == nav.getCurrentService().getPtrString()
+                       if not old_service_running and set.oldServiceStr:
+                               set.oldServiceStr = None
                                set.oldRef = None
                        ssize = set.InfoBarStackSize
                        stack = set.InfoBarStack
@@ -37,14 +36,12 @@ class ServiceEventTracker:
                                        (not old_service_running and stack[ssize-1] == func[1]) or # let pass events from currently running service just to current active screen (derived from InfoBarBase)
                                        (old_service_running and ssize > 1 and stack[ssize-2] == func[1])): # let pass events from old running service just to previous active screen (derived from InfoBarBase)
                                        func[2]()
-#                              else:
-#                                      print "ignore event", ev, "for inactive infobar '" + str(self.screen) + "'"
 
        @staticmethod
        def setActiveInfoBar(infobar, old_service, old_ref):
                set = ServiceEventTracker
                set.oldRef = old_ref
-               set.oldService = old_service and str(old_service)
+               set.oldServiceStr = old_service and old_service.getPtrString()
                assert infobar not in set.InfoBarStack, "FATAL: Infobar '" + str(infobar) + "' is already active!"
                set.InfoBarStack.append(infobar)
                set.InfoBarStackSize += 1
@@ -55,8 +52,12 @@ class ServiceEventTracker:
                set = ServiceEventTracker
                stack = set.InfoBarStack
                if set.InfoBarStackSize:
+                       nav = set.navcore
                        set.InfoBarStackSize -= 1
                        del stack[set.InfoBarStackSize]
+                       old_service = nav.getCurrentService()
+                       set.oldServiceStr = old_service and old_service.getPtrString()
+                       set.oldRef = nav.getCurrentlyPlayingServiceReference()
 #                      if set.InfoBarStackSize:
 #                              print "ServiceEventTracker reset active '" + str(stack[set.InfoBarStackSize-1]) + "'"
 
index cf26f35..074b318 100644 (file)
@@ -51,7 +51,7 @@ DEFINE_REF(eServiceFactoryDVD)
 RESULT eServiceFactoryDVD::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
 {
                // check resources...
-       ptr = new eServiceDVD(ref.path.c_str());
+       ptr = new eServiceDVD(ref);
        return 0;
 }
 
@@ -84,8 +84,8 @@ RESULT eServiceFactoryDVD::offlineOperations(const eServiceReference &, ePtr<iSe
 
 DEFINE_REF(eServiceDVD);
 
-eServiceDVD::eServiceDVD(const char *filename):
-       m_filename(filename),
+eServiceDVD::eServiceDVD(eServiceReference ref):
+       m_ref(ref),
        m_ddvdconfig(ddvd_create()),
        m_subtitle_widget(0),
        m_state(stIdle),
@@ -101,7 +101,7 @@ eServiceDVD::eServiceDVD(const char *filename):
        m_sn = eSocketNotifier::create(eApp, ddvd_get_messagepipe_fd(m_ddvdconfig), eSocketNotifier::Read|eSocketNotifier::Priority|eSocketNotifier::Error|eSocketNotifier::Hungup);
        eDebug("SERVICEDVD construct!");
        // create handle
-       ddvd_set_dvd_path(m_ddvdconfig, filename);
+       ddvd_set_dvd_path(m_ddvdconfig, ref.path.c_str());
        ddvd_set_ac3thru(m_ddvdconfig, 0);
 
        std::string ddvd_language;
@@ -326,7 +326,7 @@ RESULT eServiceDVD::stop()
        ASSERT(m_state != stIdle);
        if (m_state == stStopped)
                return -1;
-       eDebug("DVD: stop %s", m_filename.c_str());
+       eDebug("DVD: stop %s", m_ref.path.c_str());
        m_state = stStopped;
        ddvd_send_key(m_ddvdconfig, DDVD_KEY_EXIT);
 
@@ -440,7 +440,7 @@ RESULT eServiceDVD::getName(std::string &name)
        if ( m_ddvd_titlestring[0] != '\0' )
                name = m_ddvd_titlestring;
        else
-               name = m_filename;
+               name = m_ref.path;
        return 0;
 }
 
@@ -493,7 +493,7 @@ std::string eServiceDVD::getInfoString(int w)
        switch(w)
        {
                case sServiceref:
-                       break;
+                       return m_ref.toString();
                default:
                        eDebug("unhandled getInfoString(%d)", w);
        }
@@ -769,7 +769,7 @@ void eServiceDVD::loadCuesheet()
        if ( m_ddvd_titlestring[0] != '\0' )
                snprintf(filename, 128, "/home/root/dvd-%s.cuts", m_ddvd_titlestring);
        else
-               snprintf(filename, 128, "%s/dvd.cuts", m_filename.c_str());
+               snprintf(filename, 128, "%s/dvd.cuts", m_ref.path.c_str());
 
        eDebug("eServiceDVD::loadCuesheet() filename=%s",filename);
 
@@ -840,7 +840,7 @@ void eServiceDVD::saveCuesheet()
        if ( m_ddvd_titlestring[0] != '\0' )
                snprintf(filename, 128, "/home/root/dvd-%s.cuts", m_ddvd_titlestring);
        else
-               snprintf(filename, 128, "%s/dvd.cuts", m_filename.c_str());
+               snprintf(filename, 128, "%s/dvd.cuts", m_ref.path.c_str());
        
        FILE *f = fopen(filename, "wb");
 
index 94843a4..c730d50 100644 (file)
@@ -92,7 +92,7 @@ public:
                // iServiceKeys
        RESULT keyPressed(int key);
 private:
-       eServiceDVD(const char *filename);
+       eServiceDVD(eServiceReference ref);
 
        void gotMessage(int); // message from dvdlib
        void gotThreadMessage(const int &); // message from dvd thread
@@ -101,7 +101,7 @@ private:
        void thread();
        void thread_finished();
 
-       std::string m_filename;
+       eServiceReference m_ref;
 
        Signal2<void,iPlayableService*,int> m_event;