- eConnections holds reference to object
authorFelix Domke <tmbinc@elitedvb.net>
Sun, 23 May 2004 20:52:00 +0000 (20:52 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Sun, 23 May 2004 20:52:00 +0000 (20:52 +0000)
 - use eAutoInitPtr instead of eAutoInitP for iObject-based stuff
 - fix some ref initialization
 - added service stop

15 files changed:
lib/base/init.h
lib/dvb/dvb.cpp
lib/dvb/frontend.cpp
lib/dvb/scan.cpp
lib/dvb/scan.h
lib/dvb/sec.cpp
lib/dvb/sec.h
lib/nav/core.cpp
lib/nav/core.h
lib/service/service.cpp
lib/service/servicedvb.cpp
lib/service/servicefs.cpp
lib/service/servicemp3.cpp
lib/service/servicemp3.h
main/enigma.cpp

index 465bac4..6ffd04c 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <list>
 #include <utility>
+#include <lib/base/object.h>
 
 class eAutoInit;
 
@@ -94,4 +95,35 @@ public:
        }
 };
 
+template<class T1> class
+eAutoInitPtr: protected eAutoInit
+{
+       ePtr<T1> t;
+       void initNow()
+       {
+               t = new T1();
+       }
+       void closeNow()
+       {
+               t = 0;
+       }
+public:
+       operator T1*()
+       {
+               return t;
+       }
+       T1 *operator->()
+       {
+               return t;
+       }
+       eAutoInitPtr(int runl, char *description): eAutoInit(runl, description)
+       {
+               eInit::add(rl, this);
+       }
+       ~eAutoInitPtr()
+       {
+               eInit::remove(rl, this);
+       }
+};
+
 #endif
index 895ff08..cfdb05a 100644 (file)
@@ -180,7 +180,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid)
 
 RESULT eDVBChannel::connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)
 {
-       connection = new eConnection(m_stateChanged.connect(stateChange));
+       connection = new eConnection(this, m_stateChanged.connect(stateChange));
        return 0;
 }
 
index c51eeea..8948f19 100644 (file)
@@ -391,7 +391,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
 
 RESULT eDVBFrontend::connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)
 {
-       connection = new eConnection(m_stateChanged.connect(stateChange));
+       connection = new eConnection(this, m_stateChanged.connect(stateChange));
        return 0;
 }
 
index 68121c4..5571a81 100644 (file)
@@ -369,6 +369,6 @@ RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescription
 
 RESULT eDVBScan::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection)
 {
-       connection = new eConnection(m_event.connect(event));
+       connection = new eConnection(this, m_event.connect(event));
        return 0;
 }
index 196e52f..cc72764 100644 (file)
@@ -6,7 +6,7 @@
 #include <lib/dvb_si/bat.h>
 #include <lib/dvb/db.h>
 
-class eDVBScan: public Object
+class eDVBScan: public Object, public virtual iObject
 {
                /* chid helper functions: */
                
index 99e39ea..b3c4b2c 100644 (file)
@@ -4,6 +4,10 @@
 
 DEFINE_REF(eDVBSatelliteEquipmentControl);
 
+eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(): ref(0)
+{
+}
+
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat)
 {
        int hi;
index e4b2d1d..13aa9aa 100644 (file)
@@ -7,6 +7,7 @@ class eDVBSatelliteEquipmentControl: public iDVBSatelliteEquipmentControl
 {
 public:
        DECLARE_REF;
+       eDVBSatelliteEquipmentControl();
        RESULT prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat);
 };
 
index b5c229c..9314d2c 100644 (file)
@@ -11,7 +11,11 @@ void eNavigation::serviceEvent(iPlayableService* service, int event)
        switch (event)
        {
        case iPlayableService::evEnd:
-                       /* our running main service stopped. */
+                       /* at first, kill the running service */
+               m_event(this, evStopService);
+               m_runningService = 0;
+               m_service_event_conn = 0;
+                       /* our running main service stopped. remove it from playlist */
                if (!m_playlist.empty())
                        m_playlist.erase(m_playlist.begin());
                if (!m_playlist.empty())
@@ -33,6 +37,7 @@ void eNavigation::serviceEvent(iPlayableService* service, int event)
 
 RESULT eNavigation::playService(const eServiceReference &service)
 {
+       assert(m_servicehandler);
        RESULT res = m_servicehandler->play(service, m_runningService);
        if (m_runningService)
        {
@@ -53,7 +58,7 @@ RESULT eNavigation::enqueueService(const eServiceReference &service)
 
 RESULT eNavigation::connectEvent(const Slot2<void,eNavigation*,int> &event, ePtr<eConnection> &connection)
 {
-       connection = new eConnection(m_event.connect(event));
+       connection = new eConnection(this, m_event.connect(event));
        return 0;
 }
 
@@ -76,8 +81,9 @@ RESULT eNavigation::pause(int dop)
                return p->unpause();
 }
 
-eNavigation::eNavigation(iServiceHandler *serviceHandler)
+eNavigation::eNavigation(iServiceHandler *serviceHandler): ref(0)
 {
+       assert(serviceHandler);
        m_servicehandler = serviceHandler;
 }
 
index 056c150..99cf75a 100644 (file)
@@ -19,7 +19,8 @@ private:
 public:
        enum
        {
-               evNewService,
+               evStopService,  /** the "current" service was just stopped and likes to be deallocated (clear refs!) */
+               evNewService, /** a new "current" service was just started */
                evPlayFailed,
                evPlaylistDone
        };
index 99199aa..6141516 100644 (file)
@@ -32,16 +32,22 @@ eString eServiceReference::toString() const
 
 eServiceCenter *eServiceCenter::instance;
 
-eServiceCenter::eServiceCenter()
+eServiceCenter::eServiceCenter(): ref(0)
 {
        if (!instance)
+       {
+               eDebug("settings instance.");
                instance = this;
+       }
 }
 
 eServiceCenter::~eServiceCenter()
 {
        if (instance == this)
+       {
+               eDebug("clear instance");
                instance = 0;
+       }
 }
 
 DEFINE_REF(eServiceCenter);
@@ -91,4 +97,4 @@ RESULT eServiceCenter::removeServiceFactory(int id)
        return 0;
 }
 
-eAutoInitP0<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
+eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
index 62dbee5..199b58a 100644 (file)
@@ -166,4 +166,4 @@ RESULT eDVBServicePlay::getName(eString &name)
 
 DEFINE_REF(eDVBServicePlay)
 
-eAutoInitP0<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
+eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
index ad40f0a..91ae44e 100644 (file)
@@ -109,4 +109,4 @@ RESULT eServiceFS::getContent(std::list<eServiceReference> &list)
        return 0;
 }
 
-eAutoInitP0<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
+eAutoInitPtr<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
index 27ae114..a6d1928 100644 (file)
@@ -61,10 +61,12 @@ void eServiceMP3::test_end()
 eServiceMP3::eServiceMP3(const char *filename): ref(0), filename(filename), test(eApp)
 {
        m_state = stIdle;
+       eDebug("SERVICEMP3 construct!");
 }
 
 eServiceMP3::~eServiceMP3()
 {
+       eDebug("SERVICEMP3 destruct!");
        if (m_state == stRunning)
                stop();
 }
@@ -73,7 +75,7 @@ DEFINE_REF(eServiceMP3);
 
 RESULT eServiceMP3::connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)
 {
-       connection = new eConnection(m_event.connect(event));
+       connection = new eConnection(this, m_event.connect(event));
        return 0;
 }
 
@@ -85,7 +87,7 @@ RESULT eServiceMP3::start()
 
        printf("mp3 starts\n");
        printf("MP3: %s start\n", filename.c_str());
-       test.start(10000, 1);
+       test.start(1000, 1);
        CONNECT(test.timeout, eServiceMP3::test_end);
        m_event(this, evStart);
        return 0;
@@ -109,7 +111,12 @@ RESULT eServiceMP3::getIPausableService(ePtr<iPauseableService> &ptr) { ptr=this
 RESULT eServiceMP3::pause() { printf("mp3 pauses!\n"); return 0; }
 RESULT eServiceMP3::unpause() { printf("mp3 unpauses!\n"); return 0; }
 
-RESULT eServiceMP3::getIServiceInformation(ePtr<iServiceInformation>&) { return -1; }
+RESULT eServiceMP3::getIServiceInformation(ePtr<iServiceInformation>&i) { i = this; return 0; }
 
+RESULT eServiceMP3::getName(eString &name)
+{
+       name = "MP3 File: " + filename;
+       return 0;
+}
 
-eAutoInitP0<eServiceFactoryMP3> init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3");
+eAutoInitPtr<eServiceFactoryMP3> init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3");
index b443d6e..d51207f 100644 (file)
@@ -17,7 +17,7 @@ public:
        RESULT list(const eServiceReference &, ePtr<iListableService> &ptr);
 };
 
-class eServiceMP3: public virtual iPlayableService, public virtual iPauseableService, public virtual iObject, public Object
+class eServiceMP3: public virtual iPlayableService, public virtual iPauseableService, public virtual iServiceInformation, public virtual iObject, public Object
 {
 DECLARE_REF;
 private:
@@ -46,6 +46,9 @@ public:
        RESULT unpause();
        
        RESULT getIServiceInformation(ePtr<iServiceInformation>&);
+       
+               // iServiceInformation
+       RESULT getName(eString &name);
 };
 
 #endif
index 4cc8eaf..668c7c5 100644 (file)
@@ -27,6 +27,7 @@ class eMain: public eApplication, public Object
        ePtr<iPlayableService> m_playservice;
        ePtr<eNavigation> m_nav;
        ePtr<eConnection> m_conn_event;
+       ePtr<iServiceInformation> m_serviceInformation;
 public:
        eMain()
        {
@@ -38,8 +39,9 @@ public:
                ePtr<eServiceCenter> service_center;
                eServiceCenter::getInstance(service_center);
 
+               assert(service_center);
                m_nav = new eNavigation(service_center);
-#if 1
+#if 0
                if (service_center)
                {
                        eServiceReference ref("2:0:1:0:0:0:0:0:0:0:/");
@@ -79,6 +81,11 @@ public:
        {
                switch (ev)
                {
+               case eNavigation::evStopService:
+                               /* very important: the old service should be deallocated, so clear *all* references to it */
+                       m_serviceInformation = 0;
+                       eDebug("STOP service!");
+                       break;
                case eNavigation::evNewService:
                {
                        ePtr<iPlayableService> service;
@@ -88,14 +95,13 @@ public:
                                eDebug("no running service!");
                                break;
                        }
-                       ePtr<iServiceInformation> s;
-                       if (service->getIServiceInformation(s))
+                       if (service->getIServiceInformation(m_serviceInformation))
                        {
                                eDebug("failed to get iserviceinformation");
                                break;
                        }
                        eString name;
-                       s->getName(name);
+                       m_serviceInformation->getName(name);
                        eDebug("NEW running service: %s", name.c_str());
                        break;
                }
@@ -104,6 +110,7 @@ public:
                        break;
                case eNavigation::evPlaylistDone:
                        eDebug("playlist done");
+                       quit();
                        break;
                default:
                        eDebug("Navigation event %d", ev);
@@ -113,7 +120,6 @@ public:
        
        ~eMain()
        {
-               
        }
 };
 
@@ -127,10 +133,11 @@ void object_dump()
 #endif
 
 int main()
-{      
+{
 #ifdef OBJECT_DEBUG
        atexit(object_dump);
 #endif
        eMain app;
-       return app.exec();
+       int res = app.exec();
+       eDebug("after exec");
 }