- 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 465bac40a5ae5db77e7c4e1c287b3c87fb07416a..6ffd04c74e098ab96cffeaea1fe7a75132414c57 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <list>
 #include <utility>
 
 #include <list>
 #include <utility>
+#include <lib/base/object.h>
 
 class eAutoInit;
 
 
 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
 #endif
index 895ff0843ea35d82a0025421e573e7f1f5602029..cfdb05af7649ac55eeee48306033fe51bf5c263f 100644 (file)
@@ -180,7 +180,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid)
 
 RESULT eDVBChannel::connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)
 {
 
 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;
 }
 
        return 0;
 }
 
index c51eeea7193054cc9dd8bc8de2054d85462d0ad1..8948f194513f28dba9a26a50e9f10a451a07f00c 100644 (file)
@@ -391,7 +391,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
 
 RESULT eDVBFrontend::connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)
 {
 
 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;
 }
 
        return 0;
 }
 
index 68121c447dc6e3602ea1df75c53b1de44027b883..5571a810feb7923eee08c0f44f6c83d4587ae0f8 100644 (file)
@@ -369,6 +369,6 @@ RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescription
 
 RESULT eDVBScan::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection)
 {
 
 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;
 }
        return 0;
 }
index 196e52fc049bd8dce721d061f3989f7ccf44f553..cc727644336b8c4a80113497c93680cfd9dced6c 100644 (file)
@@ -6,7 +6,7 @@
 #include <lib/dvb_si/bat.h>
 #include <lib/dvb/db.h>
 
 #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: */
                
 {
                /* chid helper functions: */
                
index 99e39ea69424f4c98eae16218abb4a6840a9099f..b3c4b2cc0aed2be06e6de42d5b4e604a0fdf84b5 100644 (file)
@@ -4,6 +4,10 @@
 
 DEFINE_REF(eDVBSatelliteEquipmentControl);
 
 
 DEFINE_REF(eDVBSatelliteEquipmentControl);
 
+eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(): ref(0)
+{
+}
+
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat)
 {
        int hi;
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat)
 {
        int hi;
index e4b2d1d2c44612146b6d2ab4630e8bca04f2c7fc..13aa9aa89c75275829584b7f5963dc88c5681e4d 100644 (file)
@@ -7,6 +7,7 @@ class eDVBSatelliteEquipmentControl: public iDVBSatelliteEquipmentControl
 {
 public:
        DECLARE_REF;
 {
 public:
        DECLARE_REF;
+       eDVBSatelliteEquipmentControl();
        RESULT prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat);
 };
 
        RESULT prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat);
 };
 
index b5c229c79665d5617d5f1d6ecb0f6778783cecdc..9314d2c1756b1b428c28dbc5bc4dad3d37808c5e 100644 (file)
@@ -11,7 +11,11 @@ void eNavigation::serviceEvent(iPlayableService* service, int event)
        switch (event)
        {
        case iPlayableService::evEnd:
        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())
                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)
 {
 
 RESULT eNavigation::playService(const eServiceReference &service)
 {
+       assert(m_servicehandler);
        RESULT res = m_servicehandler->play(service, m_runningService);
        if (m_runningService)
        {
        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)
 {
 
 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;
 }
 
        return 0;
 }
 
@@ -76,8 +81,9 @@ RESULT eNavigation::pause(int dop)
                return p->unpause();
 }
 
                return p->unpause();
 }
 
-eNavigation::eNavigation(iServiceHandler *serviceHandler)
+eNavigation::eNavigation(iServiceHandler *serviceHandler): ref(0)
 {
 {
+       assert(serviceHandler);
        m_servicehandler = serviceHandler;
 }
 
        m_servicehandler = serviceHandler;
 }
 
index 056c150bfe4de8eb4a3eb2d91963990082008a47..99cf75ae35caaf7fd6c7484ae7285fb7ca98fe3c 100644 (file)
@@ -19,7 +19,8 @@ private:
 public:
        enum
        {
 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
        };
                evPlayFailed,
                evPlaylistDone
        };
index 99199aa9dd99c3d4d69e60936575aeb27165be55..6141516ff4ddf3dff15cd5a6e5e84ee76d23d6e6 100644 (file)
@@ -32,16 +32,22 @@ eString eServiceReference::toString() const
 
 eServiceCenter *eServiceCenter::instance;
 
 
 eServiceCenter *eServiceCenter::instance;
 
-eServiceCenter::eServiceCenter()
+eServiceCenter::eServiceCenter(): ref(0)
 {
        if (!instance)
 {
        if (!instance)
+       {
+               eDebug("settings instance.");
                instance = this;
                instance = this;
+       }
 }
 
 eServiceCenter::~eServiceCenter()
 {
        if (instance == this)
 }
 
 eServiceCenter::~eServiceCenter()
 {
        if (instance == this)
+       {
+               eDebug("clear instance");
                instance = 0;
                instance = 0;
+       }
 }
 
 DEFINE_REF(eServiceCenter);
 }
 
 DEFINE_REF(eServiceCenter);
@@ -91,4 +97,4 @@ RESULT eServiceCenter::removeServiceFactory(int id)
        return 0;
 }
 
        return 0;
 }
 
-eAutoInitP0<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
+eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
index 62dbee5456918c429cc6ec3bc629245fc928eec5..199b58aac962763fa77cc1930bf86fca3e4462a8 100644 (file)
@@ -166,4 +166,4 @@ RESULT eDVBServicePlay::getName(eString &name)
 
 DEFINE_REF(eDVBServicePlay)
 
 
 DEFINE_REF(eDVBServicePlay)
 
-eAutoInitP0<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
+eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
index ad40f0af9ff9020e59668a0e0863ebb7a5576a48..91ae44e3842081b8f8c122f111e7a037e6ecdbe2 100644 (file)
@@ -109,4 +109,4 @@ RESULT eServiceFS::getContent(std::list<eServiceReference> &list)
        return 0;
 }
 
        return 0;
 }
 
-eAutoInitP0<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
+eAutoInitPtr<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
index 27ae1147882a02d6bb5eeeda8a5cc006b031fdbb..a6d19287a04c4a6065a80d06f4964786468ca271 100644 (file)
@@ -61,10 +61,12 @@ void eServiceMP3::test_end()
 eServiceMP3::eServiceMP3(const char *filename): ref(0), filename(filename), test(eApp)
 {
        m_state = stIdle;
 eServiceMP3::eServiceMP3(const char *filename): ref(0), filename(filename), test(eApp)
 {
        m_state = stIdle;
+       eDebug("SERVICEMP3 construct!");
 }
 
 eServiceMP3::~eServiceMP3()
 {
 }
 
 eServiceMP3::~eServiceMP3()
 {
+       eDebug("SERVICEMP3 destruct!");
        if (m_state == stRunning)
                stop();
 }
        if (m_state == stRunning)
                stop();
 }
@@ -73,7 +75,7 @@ DEFINE_REF(eServiceMP3);
 
 RESULT eServiceMP3::connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)
 {
 
 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;
 }
 
        return 0;
 }
 
@@ -85,7 +87,7 @@ RESULT eServiceMP3::start()
 
        printf("mp3 starts\n");
        printf("MP3: %s start\n", filename.c_str());
 
        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;
        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::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 b443d6ebfec973817bfe21f9858a1e8302b29d32..d51207ff8ce8a3f320becad07058390485d4e76b 100644 (file)
@@ -17,7 +17,7 @@ public:
        RESULT list(const eServiceReference &, ePtr<iListableService> &ptr);
 };
 
        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:
 {
 DECLARE_REF;
 private:
@@ -46,6 +46,9 @@ public:
        RESULT unpause();
        
        RESULT getIServiceInformation(ePtr<iServiceInformation>&);
        RESULT unpause();
        
        RESULT getIServiceInformation(ePtr<iServiceInformation>&);
+       
+               // iServiceInformation
+       RESULT getName(eString &name);
 };
 
 #endif
 };
 
 #endif
index 4cc8eaf96c8c753453fe9ae18fd74dc79f94b939..668c7c5ad1b504ece0318dd81c3f2daca0cc1ff6 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<iPlayableService> m_playservice;
        ePtr<eNavigation> m_nav;
        ePtr<eConnection> m_conn_event;
+       ePtr<iServiceInformation> m_serviceInformation;
 public:
        eMain()
        {
 public:
        eMain()
        {
@@ -38,8 +39,9 @@ public:
                ePtr<eServiceCenter> service_center;
                eServiceCenter::getInstance(service_center);
 
                ePtr<eServiceCenter> service_center;
                eServiceCenter::getInstance(service_center);
 
+               assert(service_center);
                m_nav = new eNavigation(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:/");
                if (service_center)
                {
                        eServiceReference ref("2:0:1:0:0:0:0:0:0:0:/");
@@ -79,6 +81,11 @@ public:
        {
                switch (ev)
                {
        {
                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;
                case eNavigation::evNewService:
                {
                        ePtr<iPlayableService> service;
@@ -88,14 +95,13 @@ public:
                                eDebug("no running service!");
                                break;
                        }
                                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;
                        {
                                eDebug("failed to get iserviceinformation");
                                break;
                        }
                        eString name;
-                       s->getName(name);
+                       m_serviceInformation->getName(name);
                        eDebug("NEW running service: %s", name.c_str());
                        break;
                }
                        eDebug("NEW running service: %s", name.c_str());
                        break;
                }
@@ -104,6 +110,7 @@ public:
                        break;
                case eNavigation::evPlaylistDone:
                        eDebug("playlist done");
                        break;
                case eNavigation::evPlaylistDone:
                        eDebug("playlist done");
+                       quit();
                        break;
                default:
                        eDebug("Navigation event %d", ev);
                        break;
                default:
                        eDebug("Navigation event %d", ev);
@@ -113,7 +120,6 @@ public:
        
        ~eMain()
        {
        
        ~eMain()
        {
-               
        }
 };
 
        }
 };
 
@@ -127,10 +133,11 @@ void object_dump()
 #endif
 
 int main()
 #endif
 
 int main()
-{      
+{
 #ifdef OBJECT_DEBUG
        atexit(object_dump);
 #endif
        eMain app;
 #ifdef OBJECT_DEBUG
        atexit(object_dump);
 #endif
        eMain app;
-       return app.exec();
+       int res = app.exec();
+       eDebug("after exec");
 }
 }