reconnect camd.socket on connection lost
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Wed, 2 Jan 2008 19:13:12 +0000 (19:13 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Wed, 2 Jan 2008 19:13:12 +0000 (19:13 +0000)
lib/dvb/pmt.cpp
lib/dvb/pmt.h

index e2c55385612ca7765914de6bf21d04cc14bf3e87..fc4333862f715f75f00c6133e0186af8c43e7037 100644 (file)
@@ -621,7 +621,7 @@ ChannelMap eDVBCAService::exist_channels;
 ePtr<eConnection> eDVBCAService::m_chanAddedConn;
 
 eDVBCAService::eDVBCAService()
 ePtr<eConnection> eDVBCAService::m_chanAddedConn;
 
 eDVBCAService::eDVBCAService()
-       :m_prev_build_hash(0), m_sendstate(0), m_retryTimer(eApp)
+       :m_sn(0), m_prev_build_hash(0), m_sendstate(0), m_retryTimer(eApp)
 {
        memset(m_used_demux, 0xFF, sizeof(m_used_demux));
        CONNECT(m_retryTimer.timeout, eDVBCAService::sendCAPMT);
 {
        memset(m_used_demux, 0xFF, sizeof(m_used_demux));
        CONNECT(m_retryTimer.timeout, eDVBCAService::sendCAPMT);
@@ -632,6 +632,7 @@ eDVBCAService::~eDVBCAService()
 {
        eDebug("[eDVBCAService] free service %s", m_service.toString().c_str());
        ::close(m_sock);
 {
        eDebug("[eDVBCAService] free service %s", m_service.toString().c_str());
        ::close(m_sock);
+       delete m_sn;
 }
 
 // begin static methods
 }
 
 // begin static methods
@@ -808,17 +809,49 @@ channel_data *eDVBCAService::getChannelData(eDVBChannelID &chid)
 }
 // end static methods
 
 }
 // end static methods
 
+void eDVBCAService::socketCB(int what)
+{
+       if (what & eSocketNotifier::Read)
+               /*eDebug("[eDVBCAService] data to read\n")*/;
+       if (what & eSocketNotifier::Priority)
+               /*eDebug("[eDVBCAService] priority data to read\n")*/;
+       if (what & eSocketNotifier::Hungup) {
+               /*eDebug("[eDVBCAService] connection closed\n")*/;
+               m_sendstate=1;
+               sendCAPMT();
+       }
+       if (what & eSocketNotifier::Error)
+               /*eDebug("[eDVBCAService] connection error\n")*/;
+}
+
 void eDVBCAService::Connect()
 {
 void eDVBCAService::Connect()
 {
+       if (m_sn) {
+               delete m_sn;
+               m_sn=0;
+       }
        memset(&m_servaddr, 0, sizeof(struct sockaddr_un));
        m_servaddr.sun_family = AF_UNIX;
        strcpy(m_servaddr.sun_path, "/tmp/camd.socket");
        m_clilen = sizeof(m_servaddr.sun_family) + strlen(m_servaddr.sun_path);
        m_sock = socket(PF_UNIX, SOCK_STREAM, 0);
        memset(&m_servaddr, 0, sizeof(struct sockaddr_un));
        m_servaddr.sun_family = AF_UNIX;
        strcpy(m_servaddr.sun_path, "/tmp/camd.socket");
        m_clilen = sizeof(m_servaddr.sun_family) + strlen(m_servaddr.sun_path);
        m_sock = socket(PF_UNIX, SOCK_STREAM, 0);
-       connect(m_sock, (struct sockaddr *) &m_servaddr, m_clilen);
-       fcntl(m_sock, F_SETFL, O_NONBLOCK);
-       int val=1;
-       setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, &val, 4);
+       if (m_sock != -1)
+       {
+               if (!connect(m_sock, (struct sockaddr *) &m_servaddr, m_clilen))
+               {
+                       int val=1;
+                       fcntl(m_sock, F_SETFL, O_NONBLOCK);
+                       setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, &val, 4);
+                       m_sn = new eSocketNotifier(eApp, m_sock,
+                               eSocketNotifier::Read|eSocketNotifier::Priority|eSocketNotifier::Error|eSocketNotifier::Hungup);
+                       CONNECT(m_sn->activated, eDVBCAService::socketCB);
+                       
+               }
+//             else
+//                     eDebug("[eDVBCAService] connect failed %m");
+       }
+       else
+               eDebug("[eDVBCAService] create socket failed %m");
 }
 
 void eDVBCAService::buildCAPMT(eTable<ProgramMapSection> *ptr)
 }
 
 void eDVBCAService::buildCAPMT(eTable<ProgramMapSection> *ptr)
index 9e7c52740e390b8c38040f577a1f723af2e28592..eae05bb18cd6c15c1e1773cce725a6aad6f06b0a 100644 (file)
@@ -35,6 +35,7 @@ typedef std::map<iDVBChannel*, channel_data*> ChannelMap;
 
 class eDVBCAService: public Object
 {
 
 class eDVBCAService: public Object
 {
+       eSocketNotifier *m_sn;
        eServiceReferenceDVB m_service;
        uint8_t m_used_demux[32];
        unsigned int m_prev_build_hash;
        eServiceReferenceDVB m_service;
        uint8_t m_used_demux[32];
        unsigned int m_prev_build_hash;
@@ -46,6 +47,7 @@ class eDVBCAService: public Object
        eTimer m_retryTimer;
        void sendCAPMT();
        void Connect();
        eTimer m_retryTimer;
        void sendCAPMT();
        void Connect();
+       void socketCB(int what);
 
        static void DVBChannelAdded(eDVBChannel*);
        static void DVBChannelStateChanged(iDVBChannel*);
 
        static void DVBChannelAdded(eDVBChannel*);
        static void DVBChannelStateChanged(iDVBChannel*);