diff options
author | phintuka <phintuka> | 2009-08-05 10:46:15 +0000 |
---|---|---|
committer | phintuka <phintuka> | 2009-08-05 10:46:15 +0000 |
commit | bc3cc9dd760d078eafe2ba0eeb02b1291a06ee6c (patch) | |
tree | 36090b925a28786c7d6e4f9ac209446e07e96a89 | |
parent | 375bfd4cc2e1db295b6f4e552580ea0babd9b80b (diff) | |
download | xineliboutput-bc3cc9dd760d078eafe2ba0eeb02b1291a06ee6c.tar.gz xineliboutput-bc3cc9dd760d078eafe2ba0eeb02b1291a06ee6c.tar.bz2 |
Cosmetics
-rw-r--r-- | frontend_svr.c | 762 |
1 files changed, 331 insertions, 431 deletions
diff --git a/frontend_svr.c b/frontend_svr.c index c993fec2..4552ac08 100644 --- a/frontend_svr.c +++ b/frontend_svr.c @@ -4,7 +4,7 @@ * See the main source file 'xineliboutput.c' for copyright information and * how to reach the author. * - * $Id: frontend_svr.c,v 1.74 2009-07-02 18:27:19 phintuka Exp $ + * $Id: frontend_svr.c,v 1.75 2009-08-05 10:46:15 phintuka Exp $ * */ @@ -46,8 +46,6 @@ #include "device.h" #include "osd.h" -//#define HTTP_OSD - #define MAX_OSD_TIMEOUTS (25*5) /* max. rate 25 updates/s -> at least 5 seconds */ #define LOG_OSD_BANDWIDTH (128*1024) /* log messages if OSD bandwidth > 1 Mbit/s */ @@ -93,7 +91,7 @@ enum { #define DATA_NOCONTROL(dt) ((dt) & (dtHttp | dtRtspMux)) cXinelibServer::cXinelibServer(int listen_port) : - cXinelibThread("Remote decoder/display server (cXinelibServer)") + cXinelibThread("Remote decoder/display server (cXinelibServer)") { int i; for(i=0; i<MAXCLIENTS; i++) { @@ -115,7 +113,7 @@ cXinelibServer::cXinelibServer(int listen_port) : m_iMulticastMask = 0; m_MasterCli = -1; - + m_Master = false; m_Scheduler = new cUdpScheduler; @@ -135,18 +133,18 @@ cXinelibServer::cXinelibServer(int listen_port) : m_HeaderSize = 0; } -cXinelibServer::~cXinelibServer() +cXinelibServer::~cXinelibServer() { int i; - + CLOSESOCKET(fd_listen); CLOSESOCKET(fd_discovery); cHttpStreamer::CloseAll(); - - for(i=0; i<MAXCLIENTS; i++) + + for(i=0; i<MAXCLIENTS; i++) CloseConnection(i); - + delete m_StcFuture; delete m_Futures; delete m_Scheduler; @@ -165,7 +163,7 @@ void cXinelibServer::Stop(void) CLOSESOCKET(fd_listen); CLOSESOCKET(fd_discovery); - for(i=0; i<MAXCLIENTS; i++) + for(i=0; i<MAXCLIENTS; i++) CloseConnection(i); cXinelibThread::Stop(); @@ -177,8 +175,8 @@ void cXinelibServer::Clear(void) LOCK_THREAD; - for(int i = 0; i < MAXCLIENTS; i++) - if(fd_control[i].open() && m_Writer[i]) + for(int i = 0; i < MAXCLIENTS; i++) + if(fd_control[i].open() && m_Writer[i]) m_Writer[i]->Clear(); if(m_Scheduler) @@ -192,21 +190,21 @@ void cXinelibServer::CloseDataConnection(int cli) if(m_bUdp[cli] && fd_data[cli]>=0) m_Scheduler->RemoveHandle(fd_data[cli]); - CLOSESOCKET(fd_data[cli]); + CLOSESOCKET(fd_data[cli]); - if(m_Writer[cli]) { - delete m_Writer[cli]; - m_Writer[cli] = NULL; - } + if(m_Writer[cli]) { + delete m_Writer[cli]; + m_Writer[cli] = NULL; + } - m_bUdp[cli] = false; - m_bMulticast[cli] = false; - m_bConfigOk[cli] = false; + m_bUdp[cli] = false; + m_bMulticast[cli] = false; + m_bConfigOk[cli] = false; - m_iMulticastMask &= ~(1<<cli); + m_iMulticastMask &= ~(1<<cli); - if(!m_iMulticastMask && !xc.remote_rtp_always_on) - m_Scheduler->RemoveRtp(); + if(!m_iMulticastMask && !xc.remote_rtp_always_on) + m_Scheduler->RemoveRtp(); } void cXinelibServer::CloseConnection(int cli) @@ -249,17 +247,17 @@ static int write_osd_command(cxSocket& s, osd_command_t *cmd) } ssize_t max = s.tx_buffer_free(); - ssize_t size = (ssize_t)8 + - (ssize_t)(sizeof(osd_command_t)) + - (ssize_t)(sizeof(xine_clut_t) * ntohl(cmd->colors)) + + ssize_t size = (ssize_t)8 + + (ssize_t)(sizeof(osd_command_t)) + + (ssize_t)(sizeof(xine_clut_t) * ntohl(cmd->colors)) + (ssize_t)(ntohl(cmd->datalen)); if(max > 0 && max < size) { -/* #warning TODO: buffer latest failed OSD and retry - -> skipped OSDs can be left out but - latest will be always delivered */ +/* #warning TODO: buffer latest failed OSD and retry + -> skipped OSDs can be left out but + latest will be always delivered */ LOGMSG("write_osd_command: socket buffer full, OSD send skipped (got %d ; need %d", - (int)max, (int)size); + (int)max, (int)size); return 0; } @@ -269,13 +267,13 @@ static int write_osd_command(cxSocket& s, osd_command_t *cmd) LOGDBG("write_osd_command: write (command) failed"); return -1; } - if((ssize_t)sizeof(osd_command_t) != + if((ssize_t)sizeof(osd_command_t) != s.write(cmd, sizeof(osd_command_t), 100)) { LOGDBG("write_osd_command: write (data) failed"); return -1; } if(cmd->palette && cmd->colors && - (ssize_t)(sizeof(xine_clut_t)*ntohl(cmd->colors)) != + (ssize_t)(sizeof(xine_clut_t)*ntohl(cmd->colors)) != s.write(cmd->palette, sizeof(xine_clut_t)*ntohl(cmd->colors), 100)) { LOGDBG("write_osd_command: write (palette) failed"); return -1; @@ -288,60 +286,14 @@ static int write_osd_command(cxSocket& s, osd_command_t *cmd) return 1; } -#ifdef HTTP_OSD -#include "dvdauthor/rgb.h" -#include "dvdauthor/subgen-encode.c" -#include "dvdauthor/subgen.c" -#include "dvdauthor/subgen-image.c" -//subgen-image: palette generation, image divided to buttons --> 16-col palette -static uint8_t *dvdspu_encode(osd_command_t *cmd, int *spulen) -{ -#if 0 - stinfo st; - st.x0 = cmd->x; - st.y0 = cmd->y; - st.xd = cmd->w; - st.yd = cmd->h; - - st.spts = 0; /* start pts */ - st.sd = 0; /* duration */ - st.forced = 0; - st.numbuttons = 0; - st.numpal = 0; - - st.autooutline = 0; /* -> 1 -> imgfix calls detectbuttons(s); */ - st.outlinewidth = 0; - st.autoorder = 0; - - st.img =; /* img */ - st.hlt =; /* img */ - st.sel =; /* img */ - st.fimg = NULL; - - st.pal[4] = ; /* palt */ - st.masterpal[16] = ; /* palt */ - st.transparentc = ; /* palt */ - - st.numgroups = ; - st.groupmap[3][4] = ; - st.buttons = ; /* button * */ - - if(imgfix(&st)) - dvd_encode(&st); -#endif - return NULL; - -} -#endif - void cXinelibServer::OsdCmd(void *cmd_gen) { TRACEF("cXinelibServer::OsdCmd"); int i; - + LOCK_THREAD; - // check if there are any clients + // check if there are any clients if(!HasClients()) return; @@ -356,42 +308,23 @@ void cXinelibServer::OsdCmd(void *cmd_gen) // -> network byte order hton_osdcmd(cmdnet); -#ifdef HTTP_OSD - uint8_t *spudata = NULL; - int spulen = 0; -#endif - for(i = 0; i < MAXCLIENTS; i++) { if(fd_control[i].open() && m_bConfigOk[i]) { - int r = write_osd_command(fd_control[i], &cmdnet); - if(r < 0) { - LOGMSG("Send OSD command failed, closing connection"); - CloseConnection(i); - } else if(r == 0) { - if(m_OsdTimeouts[i]++ > MAX_OSD_TIMEOUTS) { - LOGMSG("Too many OSD timeouts, dropping client"); - CloseConnection(i); - } - } else { - m_OsdTimeouts[i] = 0; - } - } -#ifdef HTTP_OSD - if(m_ConnType[i] == ctHttp) { - if(m_Writer[i]) { - if(!spudata) - spudata = dvdspu_encode(cmd, &spulen); - if(spudata) - m_Writer[i]->Put(-1, spudata, spulen); - } + int r = write_osd_command(fd_control[i], &cmdnet); + if(r < 0) { + LOGMSG("Send OSD command failed, closing connection"); + CloseConnection(i); + } else if(r == 0) { + if(m_OsdTimeouts[i]++ > MAX_OSD_TIMEOUTS) { + LOGMSG("Too many OSD timeouts, dropping client"); + CloseConnection(i); + } + } else { + m_OsdTimeouts[i] = 0; + } } -#endif } -#ifdef HTTP_OSD - free(spudata); -#endif - free(cmdnet.data); #ifdef LOG_OSD_BANDWIDTH @@ -399,16 +332,16 @@ void cXinelibServer::OsdCmd(void *cmd_gen) static int64_t timer = 0LL; static int bytes = 0; int64_t now = cTimeMs::Now(); - + if(timer + 5000LL < now) { - timer = now; - bytes = 0; + timer = now; + bytes = 0; } else if(timer + 1000LL < now) { - bytes = bytes / (((int)(now - timer)) / 1000); - if(bytes > LOG_OSD_BANDWIDTH) - LOGMSG("OSD bandwidth: %d bytes/s (%d kbit/s)", bytes, bytes*8/1024); - timer = now; - bytes = 0; + bytes = bytes / (((int)(now - timer)) / 1000); + if(bytes > LOG_OSD_BANDWIDTH) + LOGMSG("OSD bandwidth: %d bytes/s (%d kbit/s)", bytes, bytes*8/1024); + timer = now; + bytes = 0; } bytes += sizeof(osd_command_t) + ntohl(cmdnet.datalen); } @@ -420,7 +353,7 @@ int64_t cXinelibServer::GetSTC(void) { Lock(); - // check if there are any clients + // check if there are any clients if(!HasClients()) { Unlock(); return -1ULL; @@ -436,7 +369,7 @@ int64_t cXinelibServer::GetSTC(void) LOGMSG("cXinelibServer::GetSTC timeout (200ms)"); return -1ULL; } - + //if(delay.Elapsed() > 0 && !is_Paused) // LOGMSG("GetSTC: compensating network delay by %s ticks (ms)\n", // delay.Elapsed()*90000/2, delay.Elapsed()/2); @@ -475,27 +408,27 @@ int cXinelibServer::Play_PES(const uchar *data, int len) for(int i=0; i<MAXCLIENTS; i++) { if(fd_control[i].open()) { - if((m_bConfigOk[i] && fd_data[i] >= 0) || - m_ConnType[i] & (ctHttp|ctRtsp)) { - - if(m_bUdp[i]) { - - UdpClients++; - - } else if(m_Writer[i]) { - - int result = m_Writer[i]->Put(m_StreamPos, data, len); - if(!result) { - LOGMSG("cXinelibServer::Play_PES Write/Queue error (TCP/PIPE)"); - CloseConnection(i); - } else if(result<0) { - LOGMSG("cXinelibServer::Play_PES Buffer overflow (TCP/PIPE)"); - if(m_ConnType[i] == ctHttp) - m_Writer[i]->Clear(); - } - - TcpClients++; - } + if((m_bConfigOk[i] && fd_data[i] >= 0) || + m_ConnType[i] & (ctHttp|ctRtsp)) { + + if(m_bUdp[i]) { + + UdpClients++; + + } else if(m_Writer[i]) { + + int result = m_Writer[i]->Put(m_StreamPos, data, len); + if(!result) { + LOGMSG("cXinelibServer::Play_PES Write/Queue error (TCP/PIPE)"); + CloseConnection(i); + } else if(result<0) { + LOGMSG("cXinelibServer::Play_PES Buffer overflow (TCP/PIPE)"); + if(m_ConnType[i] == ctHttp) + m_Writer[i]->Clear(); + } + + TcpClients++; + } } } } @@ -506,13 +439,13 @@ int cXinelibServer::Play_PES(const uchar *data, int len) if(! m_Scheduler->Queue(m_StreamPos, data, len)) LOGMSG("cXinelibServer::Play_PES Buffer overflow (UDP/RTP)"); - if(TcpClients || UdpClients || RtpClients) + if(TcpClients || UdpClients || RtpClients) cXinelibThread::Play_PES(data, len); return len; } -void cXinelibServer::SetHDMode(bool On) +void cXinelibServer::SetHDMode(bool On) { cXinelibThread::SetHDMode(On); #if 0 @@ -527,12 +460,12 @@ void cXinelibServer::SetHDMode(bool On) #endif } -int cXinelibServer::Poll(cPoller &Poller, int TimeoutMs) +int cXinelibServer::Poll(cPoller &Poller, int TimeoutMs) { - // in live mode transponder clock is the master ... + // in live mode transponder clock is the master ... // in replay mode local frontend (if present) is master if(m_bLiveMode || (*xc.local_frontend && strncmp(xc.local_frontend, "none", 4))) { - if(m_Scheduler->Clients()) + if(m_Scheduler->Clients()) return m_Scheduler->Poll(TimeoutMs, m_Master = false); return DEFAULT_POLL_SIZE; } @@ -545,18 +478,18 @@ int cXinelibServer::Poll(cPoller &Poller, int TimeoutMs) int Clients = 0, Http = 0, Udp = 0; for(int i=0; i<MAXCLIENTS; i++) { if(fd_control[i].open()) { - if(m_bConfigOk[i]) { - if(m_Writer[i]) - Free = min(Free, m_Writer[i]->Free()); - else if(m_bUdp[i]) - Udp++; - Clients++; - } else if(m_ConnType[i] & (ctHttp|ctRtspMux)) { - if(m_Writer[i]) { - FreeHttp = min(FreeHttp, m_Writer[i]->Free()); - Http++; - } - } + if(m_bConfigOk[i]) { + if(m_Writer[i]) + Free = min(Free, m_Writer[i]->Free()); + else if(m_bUdp[i]) + Udp++; + Clients++; + } else if(m_ConnType[i] & (ctHttp|ctRtspMux)) { + if(m_Writer[i]) { + FreeHttp = min(FreeHttp, m_Writer[i]->Free()); + Http++; + } + } } } if(m_iMulticastMask) { @@ -567,60 +500,60 @@ int cXinelibServer::Poll(cPoller &Poller, int TimeoutMs) /* select master timing source for replay mode */ int master = -1; if(Clients && !Udp) { - for(int i=0; i<MAXCLIENTS; i++) - if(fd_control[i].open() && m_bConfigOk[i] && m_Writer[i]) { - master = i; - break; - } + for(int i=0; i<MAXCLIENTS; i++) + if(fd_control[i].open() && m_bConfigOk[i] && m_Writer[i]) { + master = i; + break; + } } if(master != m_MasterCli) { if(m_MasterCli >= 0) - Xine_Control("MASTER 0"); + Xine_Control("MASTER 0"); if(master >= 0) - fd_control[master].write_cmd("MASTER 1\r\n"); + fd_control[master].write_cmd("MASTER 1\r\n"); m_MasterCli = master; } Unlock(); - + if(!Clients && !Http) { // live mode runs even if there are no clients if(m_bLiveMode) - return DEFAULT_POLL_SIZE; - // replay is paused when no clients + return DEFAULT_POLL_SIZE; + // replay is paused when no clients if(TimeoutMs>0) - cCondWait::SleepMs(TimeoutMs); + cCondWait::SleepMs(TimeoutMs); return 0; } - // in replay mode cUdpScheduler is master timing source - if( Free < 8128 || - ((FreeUdp = m_Scheduler->Poll(TimeoutMs, true)) < 1) || - (!Clients && FreeHttp < 8128)) { - + // in replay mode cUdpScheduler is master timing source + if( Free < 8128 || + ((FreeUdp = m_Scheduler->Poll(TimeoutMs, true)) < 1) || + (!Clients && FreeHttp < 8128)) { + if(TimeoutMs > 0) - cCondWait::SleepMs(min(TimeoutMs, 5)); + cCondWait::SleepMs(min(TimeoutMs, 5)); TimeoutMs -= 5; - + } else { Free = min(Free, FreeHttp) / 2070; Free = min(Free, FreeUdp); return max(0, Free); } - + } while(TimeoutMs > 0); - + return 0; } -bool cXinelibServer::Flush(int TimeoutMs) +bool cXinelibServer::Flush(int TimeoutMs) { int result = true; if(m_Scheduler) result = m_Scheduler->Flush(TimeoutMs) && result; - - for(int i=0; i<MAXCLIENTS; i++) + + for(int i=0; i<MAXCLIENTS; i++) if(fd_control[i].open() && fd_data[i]>=0 && m_Writer[i]) result = m_Writer[i]->Flush(TimeoutMs) && result; @@ -628,8 +561,8 @@ bool cXinelibServer::Flush(int TimeoutMs) TimeoutMs = 50; if(result) { - cString tmp = cString::sprintf("FLUSH %d %" PRIu64 " %d", - TimeoutMs, m_StreamPos, m_Frames); + cString tmp = cString::sprintf("FLUSH %d %" PRIu64 " %d", + TimeoutMs, m_StreamPos, m_Frames); result = (PlayFileCtrl(tmp)) <= 0 && result; } @@ -648,15 +581,15 @@ int cXinelibServer::Xine_Control(const char *cmd) //len = sizeof(buf); return 0; } - + LOCK_THREAD; for(int i=0; i<MAXCLIENTS; i++) if(fd_control[i].open() && (fd_data[i]>=0 || m_bMulticast[i]) && m_bConfigOk[i]) - if(len != fd_control[i].write(buf, len, 100)) { - LOGMSG("Control send failed (%s), dropping client", cmd); - CloseConnection(i); - } + if(len != fd_control[i].write(buf, len, 100)) { + LOGMSG("Control send failed (%s), dropping client", cmd); + CloseConnection(i); + } } return 1; @@ -680,21 +613,21 @@ int cXinelibServer::Xine_Control_Sync(const char *cmd) for(i=0; i<MAXCLIENTS; i++) if(fd_control[i].open() && m_bConfigOk[i]) { - if(fd_data[i] >= 0) { - if(m_bUdp[i]) - UdpClients++; - else if(m_Writer[i]) - m_Writer[i]->Put((uint64_t)(-1ULL), (const uchar*)buf, len); - } + if(fd_data[i] >= 0) { + if(m_bUdp[i]) + UdpClients++; + else if(m_Writer[i]) + m_Writer[i]->Put((uint64_t)(-1ULL), (const uchar*)buf, len); + } } RtpClients = (m_iMulticastMask || xc.remote_rtp_always_on); if(UdpClients || RtpClients) - if(! m_Scheduler->Queue((uint64_t)(-1ULL), (const uchar*)buf, len)) - LOGMSG("cXinelibServer::Xine_Control_Sync overflow (UDP/RTP)"); + if(! m_Scheduler->Queue((uint64_t)(-1ULL), (const uchar*)buf, len)) + LOGMSG("cXinelibServer::Xine_Control_Sync overflow (UDP/RTP)"); } - + return 1; } @@ -706,14 +639,14 @@ void cXinelibServer::TrickSpeed(int Speed) m_Scheduler->Pause(false); m_Scheduler->TrickSpeed(Speed == -1 ? 1 : Speed); } - + cXinelibThread::TrickSpeed(Speed); } bool cXinelibServer::EndOfStreamReached(void) { LOCK_THREAD; - + /* Check if there are any clients */ if(!HasClients()) return true; @@ -737,8 +670,8 @@ bool cXinelibServer::HasClients(void) LOCK_THREAD; int i; - for(i=0; i<MAXCLIENTS; i++) - if(fd_control[i].open() && m_bConfigOk[i]) + for(i=0; i<MAXCLIENTS; i++) + if(fd_control[i].open() && m_bConfigOk[i]) return true; return false; @@ -756,9 +689,9 @@ int cXinelibServer::PlayFileCtrl(const char *Cmd, int TimeoutMs) if((!strncmp(Cmd, "FLUSH", 5) /*&& (bFlush=true)*/) || (!strncmp(Cmd, "PLAYFILE", 8) && (bPlayfile=true)) || (!strncmp(Cmd, "GET", 3) /*&& (bGet=true)*/)) { // GETPOS, GETLENGTH, ... - - Lock(); - + + Lock(); + /* Get token, send it to client and set future for it */ int token = AllocToken(); cReplyFuture future; @@ -793,14 +726,14 @@ int cXinelibServer::PlayFileCtrl(const char *Cmd, int TimeoutMs) } TRACE("cXinelibServer::PlayFileCtrl("<<Cmd<<"): result=" << future.Value() - << " delay: " << (int)(cTimeMs::Now()-t) << "ms"); + << " delay: " << (int)(cTimeMs::Now()-t) << "ms"); if(bPlayfile) m_bEndOfStreamReached = false; return future.Value(); } - + bool result = cXinelibThread::PlayFileCtrl(Cmd); if(!*m_FileName) cHttpStreamer::CloseAll(); @@ -808,7 +741,7 @@ int cXinelibServer::PlayFileCtrl(const char *Cmd, int TimeoutMs) } -bool cXinelibServer::Listen(int listen_port) +bool cXinelibServer::Listen(int listen_port) { LOCK_THREAD; @@ -838,24 +771,24 @@ bool cXinelibServer::Listen(int listen_port) if(xc.remote_local_ip[0]) { uint32_t ip = inet_addr(xc.remote_local_ip); if(ip != INADDR_NONE) { - char txt[128]; - name.sin_addr.s_addr = ip; - LOGDBG("Binding server to %s", cxSocket::ip2txt(name.sin_addr.s_addr, htons(m_Port), txt)); + char txt[128]; + name.sin_addr.s_addr = ip; + LOGDBG("Binding server to %s", cxSocket::ip2txt(name.sin_addr.s_addr, htons(m_Port), txt)); } else { - LOGERR("Local interface address %s is invalid !", xc.remote_local_ip); + LOGERR("Local interface address %s is invalid !", xc.remote_local_ip); } } fd_listen = socket(PF_INET,SOCK_STREAM,0); setsockopt(fd_listen, SOL_SOCKET, SO_REUSEADDR, &iReuse, sizeof(int)); if (bind(fd_listen, (struct sockaddr *)&name, sizeof(name)) < 0) { - LOGERR("cXinelibServer: bind error %s port %d: %s", - xc.remote_local_ip[0] ? xc.remote_local_ip : "", - m_Port, strerror(errno)); + LOGERR("cXinelibServer: bind error %s port %d: %s", + xc.remote_local_ip[0] ? xc.remote_local_ip : "", + m_Port, strerror(errno)); CLOSESOCKET(fd_listen); } else if(listen(fd_listen, MAXCLIENTS)) { - LOGERR("cXinelibServer: listen error (port %d): %s", - m_Port, strerror(errno)); + LOGERR("cXinelibServer: listen error (port %d): %s", + m_Port, strerror(errno)); CLOSESOCKET(fd_listen); } else { LOGMSG("Listening on port %d", m_Port); @@ -890,16 +823,16 @@ bool cXinelibServer::Listen(int listen_port) return result; } -uchar *cXinelibServer::GrabImage(int &Size, bool Jpeg, - int Quality, int SizeX, int SizeY) +uchar *cXinelibServer::GrabImage(int &Size, bool Jpeg, + int Quality, int SizeX, int SizeY) { cGrabReplyFuture future; uchar *result = NULL; cString cmd; - cmd = cString::sprintf("GRAB %s %d %d %d\r\n", - Jpeg ? "JPEG" : "PNM", - Quality, SizeX, SizeY); + cmd = cString::sprintf("GRAB %s %d %d %d\r\n", + Jpeg ? "JPEG" : "PNM", + Quality, SizeX, SizeY); Lock(); @@ -912,13 +845,13 @@ uchar *cXinelibServer::GrabImage(int &Size, bool Jpeg, int token = AllocToken(); m_Futures->Add(&future, token); - // might be better to request iamge from one client only (?) + // might be better to request image from one client only (?) Xine_Control(cmd); Unlock(); if(future.Wait(5000)) { - grab_result_t r = future.Value(); + grab_result_t r = future.Value(); if((Size = r.Size) > 0) { LOGDBG("cXinelibServer::GrabImage: image size is %d bytes", Size); result = r.Data; @@ -977,7 +910,7 @@ void cXinelibServer::Handle_Control_PIPE(int cli, const char *arg) } fd_control[cli].printf("PIPE %s\r\n", *pipeName); - + cxPoller poller(fd_control[cli]); poller.Poll(500); /* quite short time ... */ @@ -985,7 +918,7 @@ void cXinelibServer::Handle_Control_PIPE(int cli, const char *arg) if((fd = open(pipeName, O_WRONLY|O_NONBLOCK)) < 0) { LOGDBG("Pipe not opened by client"); /*write_cmd(fd_control[cli], "PIPE NONE\r\n");*/ - unlink(pipeName); + unlink(pipeName); RemoveFileOrDir(m_PipesDir, false); return; } @@ -1024,10 +957,10 @@ void cXinelibServer::Handle_Control_DATA(int cli, const char *arg) CloseConnection(cli); /* actually closes the new data connection */ return; } - + /* validate client ID */ if(3 != sscanf(arg, "%d 0x%x:%d", &clientId, &ipc, &portc) || - clientId < 0 || + clientId < 0 || clientId >= MAXCLIENTS || !fd_control[clientId].open()) { fd_control[cli].write_cmd("TCP: Error in request (ClientId).\r\n"); @@ -1047,16 +980,16 @@ void cXinelibServer::Handle_Control_DATA(int cli, const char *arg) if(sinc.sin_addr.s_addr != sind.sin_addr.s_addr) { fd_control[cli].write_cmd("TCP: Error in request (IP does not match).\r\n"); LOGMSG("Invalid data connection (TCP) request: IP does not match: ctrl %x, data %x", - (unsigned int)sinc.sin_addr.s_addr, (unsigned int)sind.sin_addr.s_addr); + (unsigned int)sinc.sin_addr.s_addr, (unsigned int)sind.sin_addr.s_addr); CloseConnection(cli); return; } if(htonl(ipc) != sinc.sin_addr.s_addr || htons(portc) != sinc.sin_port) { fd_control[cli].write_cmd("TCP: Error in request (invalid IP:port).\r\n"); LOGMSG("Invalid data connection (TCP) request: control IP:port does not match" - "control: %x:%d client: %x:%d", - (unsigned int)sinc.sin_addr.s_addr, (unsigned int)sinc.sin_port, - (unsigned int)htonl(ipc), (unsigned int)htons(portc)); + "control: %x:%d client: %x:%d", + (unsigned int)sinc.sin_addr.s_addr, (unsigned int)sinc.sin_port, + (unsigned int)htonl(ipc), (unsigned int)htons(portc)); CloseConnection(cli); return; } @@ -1079,7 +1012,7 @@ void cXinelibServer::Handle_Control_DATA(int cli, const char *arg) m_Writer[cli]->Put(0, m_Header, m_HeaderLength); /* not anymore control connection, so dec primary device reference counter */ - cXinelibDevice::Instance().ForcePrimaryDevice(false); + cXinelibDevice::Instance().ForcePrimaryDevice(false); } void cXinelibServer::Handle_Control_RTP(int cli, const char *arg) @@ -1175,9 +1108,9 @@ void cXinelibServer::Handle_Control_KEY(int cli, const char *arg) if(NULL != (pt = strchr(key, ' '))) { *(pt++) = 0; if(strstr(pt, "Repeat")) - repeat = true; + repeat = true; if(strstr(pt, "Release")) - release = true; + release = true; } cXinelibThread::KeypressHandler(buf, key, repeat, release); } else { @@ -1191,8 +1124,8 @@ void cXinelibServer::Handle_Control_CONFIG(int cli) fd_control[cli].set_nodelay(true); - fd_control[cli].printf("NOVIDEO %d\r\nLIVE %d\r\n", - m_bNoVideo?1:0, m_bLiveMode?1:0); + fd_control[cli].printf("NOVIDEO %d\r\nLIVE %d\r\n", + m_bNoVideo?1:0, m_bLiveMode?1:0); SetVolume(m_Volume); @@ -1205,8 +1138,8 @@ void cXinelibServer::Handle_Control_CONFIG(int cli) int pos = cXinelibDevice::Instance().PlayFileCtrl("GETPOS"); Lock(); if(m_bPlayingFile && *m_FileName) { - fd_control[cli].printf("PLAYFILE %d %s %s\r\n", - (pos>0?pos/1000:0), xc.audio_visualization, *m_FileName); + fd_control[cli].printf("PLAYFILE %d %s %s\r\n", + (pos>0?pos/1000:0), xc.audio_visualization, *m_FileName); } } @@ -1225,20 +1158,20 @@ void cXinelibServer::Handle_Control_UDP_RESEND(int cli, const char *arg) } if(3 == sscanf(arg, "%d-%d %" PRIu64, &seq1, &seq2, &pos)) { - + if(seq1 <= UDP_SEQ_MASK && seq2 <= UDP_SEQ_MASK && pos <= m_StreamPos) { if(fd_data[cli] >= 0) - m_Scheduler->ReSend(fd_data[cli], pos, seq1, seq2); + m_Scheduler->ReSend(fd_data[cli], pos, seq1, seq2); else - m_Scheduler->ReSend(-1, pos, seq1, seq2); + m_Scheduler->ReSend(-1, pos, seq1, seq2); } else { - LOGMSG("Invalid re-send request: %s (send pos=%" PRIu64 ")", - arg, m_StreamPos); + LOGMSG("Invalid re-send request: %s (send pos=%" PRIu64 ")", + arg, m_StreamPos); } } else { - LOGMSG("Invalid re-send request: %s (send pos=%" PRIu64 ")", - arg, m_StreamPos); + LOGMSG("Invalid re-send request: %s (send pos=%" PRIu64 ")", + arg, m_StreamPos); } } @@ -1253,19 +1186,19 @@ void cXinelibServer::Handle_Control_GRAB(int cli, const char *arg) ssize_t n = fd_control[cli].read(result, size, 2000); Lock(); if(n == size) { - if(NULL != (f = (cGrabReplyFuture*)m_Futures->Get(token))) { - grab_result_t r; - r.Size = size; - r.Data = result; - m_Futures->Del(f, token); - f->Set(r); - result = NULL; - } else { - LOGMSG("cXinelibServer: Grab image discarded"); - } + if(NULL != (f = (cGrabReplyFuture*)m_Futures->Get(token))) { + grab_result_t r; + r.Size = size; + r.Data = result; + m_Futures->Del(f, token); + f->Set(r); + result = NULL; + } else { + LOGMSG("cXinelibServer: Grab image discarded"); + } } else { - LOGMSG("cXinelibServer: Grab result read() failed"); - CloseConnection(cli); + LOGMSG("cXinelibServer: Grab result read() failed"); + CloseConnection(cli); } free(result); } else if(NULL != (f = (cGrabReplyFuture*)m_Futures->Get(token))) { @@ -1281,8 +1214,8 @@ void cXinelibServer::Handle_Control_GRAB(int cli, const char *arg) void cXinelibServer::Handle_Control_CONTROL(int cli, const char *arg) { fd_control[cli].printf("VDR-" VDRVERSION " " - "xineliboutput-" XINELIBOUTPUT_VERSION " " - "READY\r\nCLIENT-ID %d\r\n", cli); + "xineliboutput-" XINELIBOUTPUT_VERSION " " + "READY\r\nCLIENT-ID %d\r\n", cli); m_ConnType[cli] = ctControl; } @@ -1308,14 +1241,14 @@ void cXinelibServer::Handle_Control_HTTP(int cli, const char *arg) // Parse request if(m_ConnType[cli] == ctDetecting || !m_State[cli]) { LOGDBG("HTTP request: %s", arg); - + DELETENULL(m_Writer[cli]); DELETENULL(m_State[cli]); m_State[cli] = new cConnState; if( !m_State[cli]->SetCommand(arg) || - strncmp(m_State[cli]->Version(), "HTTP/1.", 7) || - strcmp(m_State[cli]->Name(), "GET")) { + strncmp(m_State[cli]->Version(), "HTTP/1.", 7) || + strcmp(m_State[cli]->Name(), "GET")) { LOGMSG("invalid HTTP request: %s", arg); CloseConnection(cli); return; @@ -1354,13 +1287,13 @@ void cXinelibServer::Handle_Control_HTTP(int cli, const char *arg) #if 0 // pack header (scr 0, mux rate 0x6270) fd_control[cli].write( - "\x00\x00\x01\xba" - "\x44\x00\x04\x00" "\x04\x01\x01\x89" "\xc3\xf8", 14); + "\x00\x00\x01\xba" + "\x44\x00\x04\x00" "\x04\x01\x01\x89" "\xc3\xf8", 14); // system header (streams C0, E0, BD, BF) fd_control[cli].write( - "\x00\x00\x01\xbb" "\x00\x12" - "\x80\xc4\xe1" "\x00\xe1" "\x7f" - "\xb9\xe0\xe8" "\xb8\xc0\x20" "\xbd\xe0\x3a" "\xbf\xe0\x02", 24); + "\x00\x00\x01\xbb" "\x00\x12" + "\x80\xc4\xe1" "\x00\xe1" "\x7f" + "\xb9\xe0\xe8" "\xb8\xc0\x20" "\xbd\xe0\x3a" "\xbf\xe0\x02", 24); #endif m_Writer[cli] = new cRawWriter(fd_control[cli].handle(), KILOBYTE(1024)); @@ -1371,31 +1304,6 @@ void cXinelibServer::Handle_Control_HTTP(int cli, const char *arg) return; } -#if 0 - // - // primary device output (TS) - // - if(!strcmp(m_State[cli]->Uri(), "/TS")) { - LOGMSG("HTTP streaming primary device feed (TS)"); - fd_control[cli].write_cmd(HTTP_REPLY_200_PRIMARY_TS); - m_Writer[cli] = new cTsWriter(fd_control[cli].handle(), KILOBYTE(1024)); - DELETENULL(m_State[cli]); - return; - } -#endif - -#if 0 /* for testing */ - else if(!strcmp(m_State[cli]->Uri(), "/test.avi")) { - LOGMSG("HTTP streaming test file"); - - // detach socket - new cHttpStreamer(fd_control[cli].handle(true), "/tmp/test.avi", m_State[cli]); - m_State[cli] = NULL; - CloseConnection(cli); - return; - } -#endif - // // currently playing media file // @@ -1411,24 +1319,24 @@ void cXinelibServer::Handle_Control_HTTP(int cli, const char *arg) if( *m_FileName && m_bPlayingFile) { cString file = m_FileName; - const char *pos = strstr(m_FileName, "#subtitle:"); - if(pos) + const char *pos = strstr(m_FileName, "#subtitle:"); + if(pos) file.Truncate(pos - m_FileName); - bool Allow = ( !strcmp_escaped(file, m_State[cli]->Uri() + 9) - || (pos && !strcmp_escaped(pos + 10, m_State[cli]->Uri() + 9))); - if(Allow) { - LOGMSG("HTTP streaming media file"); - - // detach socket - new cHttpStreamer(fd_control[cli].handle(true), m_State[cli]->Uri() + 9, m_State[cli]); - m_State[cli] = NULL; - CloseConnection(cli); - return; - } - LOGDBG("HTTP Unauthorized request: %s", *m_State[cli]->Uri()); + bool Allow = ( !strcmp_escaped(file, m_State[cli]->Uri() + 9) + || (pos && !strcmp_escaped(pos + 10, m_State[cli]->Uri() + 9))); + if(Allow) { + LOGMSG("HTTP streaming media file"); + + // detach socket + new cHttpStreamer(fd_control[cli].handle(true), m_State[cli]->Uri() + 9, m_State[cli]); + m_State[cli] = NULL; + CloseConnection(cli); + return; + } + LOGDBG("HTTP Unauthorized request: %s", *m_State[cli]->Uri()); } - else - LOGDBG("No currently playing file"); + else + LOGDBG("No currently playing file"); } // @@ -1468,12 +1376,12 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) // if(m_ConnType[cli] == ctDetecting || !m_State[cli]) { LOGDBG("RTSP request: %s", arg); - + DELETENULL(m_State[cli]); m_State[cli] = new cConnState; if( !m_State[cli]->SetCommand(arg) || - strcmp(m_State[cli]->Version(), "RTSP/1.0")) { + strcmp(m_State[cli]->Version(), "RTSP/1.0")) { LOGMSG("invalid RTSP request: %s", arg); CloseConnection(cli); return; @@ -1511,8 +1419,8 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) // if(!strcmp(m_State[cli]->Name(), "OPTIONS")) { RTSPOUT(RTSP_200_OK - "Public: DESCRIBE, SETUP, TEARDOWN, PLAY\r\n" - RTSP_FIN); + "Public: DESCRIBE, SETUP, TEARDOWN, PLAY\r\n" + RTSP_FIN); } // OPTIONS // @@ -1528,7 +1436,7 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) char buf[64]; uint32_t payload_type = VDRVERSNUM > 10702 ? SDP_PAYLOAD_MPEG_TS : SDP_PAYLOAD_MPEG_PES; fd_control[cli].getsockname((struct sockaddr *)&sin, &len); - const char *sdp_descr = vdr_sdp_description(cxSocket::ip2txt(sin.sin_addr.s_addr, + const char *sdp_descr = vdr_sdp_description(cxSocket::ip2txt(sin.sin_addr.s_addr, sin.sin_port, buf), 2001, xc.listen_port, @@ -1537,15 +1445,15 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) /*m_ssrc*/0x4df73452, xc.remote_rtp_port, xc.remote_rtp_ttl); - size_t sdplen = sdp_descr ? strlen(sdp_descr) : 0; - RTSPOUT(RTSP_200_OK - "Content-Type: application/sdp\r\n" - "Content-Length: %lu\r\n" - "\r\n", - CSeq, (unsigned long)sdplen); - fd_control[cli].write_cmd(sdp_descr, sdplen); + size_t sdplen = sdp_descr ? strlen(sdp_descr) : 0; + RTSPOUT(RTSP_200_OK + "Content-Type: application/sdp\r\n" + "Content-Length: %lu\r\n" + "\r\n", + CSeq, (unsigned long)sdplen); + fd_control[cli].write_cmd(sdp_descr, sdplen); } else { - RTSPOUT(RTSP_415 /*UNSUPPORTED_MEDIATYPE*/); + RTSPOUT(RTSP_415 /*UNSUPPORTED_MEDIATYPE*/); } } // DESCRIBE @@ -1559,19 +1467,19 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) cHeader *transport = m_State[cli]->Header("Transport"); int urtp=0, mrtp=0, tcp=0; if(transport && - ( (strstr(transport->Value(), "RTP/AVP;multicast") && (mrtp=1)) || - (strstr(transport->Value(), "RTP/AVP;unicast") && (urtp=1)) || - (strstr(transport->Value(), "RTP/AVP;interleaved") && (tcp=1)))) { - //if(!mrtp) - // sprintf(buf, "RTSP/1.0 461 Unsupported transport\r\n" RTSP_H_CSEQ RTSP_OK_FIN); - //else - RTSPOUT(RTSP_200_OK - "Session: %u\r\n" - "Transport: RTP/AVP;multicast;destination=224.8.4.9;server_port=37890-37891\r\n" - RTSP_FIN, - cli); + ( (strstr(transport->Value(), "RTP/AVP;multicast") && (mrtp=1)) || + (strstr(transport->Value(), "RTP/AVP;unicast") && (urtp=1)) || + (strstr(transport->Value(), "RTP/AVP;interleaved") && (tcp=1)))) { + //if(!mrtp) + // sprintf(buf, "RTSP/1.0 461 Unsupported transport\r\n" RTSP_H_CSEQ RTSP_OK_FIN); + //else + RTSPOUT(RTSP_200_OK + "Session: %u\r\n" + "Transport: RTP/AVP;multicast;destination=224.8.4.9;server_port=37890-37891\r\n" + RTSP_FIN, + cli); } else { - RTSPOUT(RTSP_461 /*UNSUPPORTED_TRANSPORT*/ ); + RTSPOUT(RTSP_461 /*UNSUPPORTED_TRANSPORT*/ ); } } // SETUP @@ -1584,27 +1492,27 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) // else if(!strcmp(m_State[cli]->Name(), "PLAY")) { RTSPOUT(RTSP_200_OK - RTSP_FIN); + RTSP_FIN); if(!m_iMulticastMask && !xc.remote_rtp_always_on) - m_Scheduler->AddRtp(); - + m_Scheduler->AddRtp(); + m_bMulticast[cli] = true; m_iMulticastMask |= (1<<cli); #if 0 //udp int fd = sock_connect(fd_control[cli], atoi(arg), SOCK_DGRAM); if(fd < 0) { - LOGERR("socket() for UDP failed"); - write_cmd(fd_control[cli], "UDP: Socked failed.\r\n"); - return; + LOGERR("socket() for UDP failed"); + write_cmd(fd_control[cli], "UDP: Socked failed.\r\n"); + return; } m_bUdp[cli] = true; fd_data[cli] = fd; m_Scheduler->AddHandle(fd); #endif } // PLAY - + // // TEARDOWN rtsp://127.0.0.1:37890 RTSP/1.0 // CSeq: 39 @@ -1612,8 +1520,8 @@ void cXinelibServer::Handle_Control_RTSP(int cli, const char *arg) // User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10) // else if(!strcmp(m_State[cli]->Name(), "TEARDOWN")) { - RTSPOUT(RTSP_200_OK - RTSP_FIN); + RTSPOUT(RTSP_200_OK + RTSP_FIN); CloseConnection(cli); } // TEARDOWN @@ -1636,28 +1544,20 @@ void cXinelibServer::Handle_Control(int cli, const char *cmd) { TRACEF("cXinelibServer::Handle_Control"); -#ifdef LOG_CONTROL_MESSAGES - static FILE *flog = fopen("/video/control.log","w"); - if (flog) { - fprintf(flog,"CTRL (%d): %s\n",cli,cmd); fflush(flog); - } -#endif - - //LOGDBG("Server received %s", cmd); - TRACE("Server received " << cmd); + LOGVERBOSE("Server received %s", cmd); /* Order of tests is significant !!! (example: UDP 2\r\n or UDP FULL 1\r\n) */ - if(!strncasecmp(cmd, "OPTIONS ", 8) || - !strncasecmp(cmd, "SETUP ", 6) || - !strncasecmp(cmd, "DESCRIBE ", 9) || + if(!strncasecmp(cmd, "OPTIONS ", 8) || + !strncasecmp(cmd, "SETUP ", 6) || + !strncasecmp(cmd, "DESCRIBE ", 9) || m_ConnType[cli] == ctRtsp) { - + Handle_Control_RTSP(cli, cmd); - } else if(!strncasecmp(cmd, "GET ", 4) || - m_ConnType[cli] == ctHttp) { + } else if(!strncasecmp(cmd, "GET ", 4) || + m_ConnType[cli] == ctHttp) { Handle_Control_HTTP(cli, cmd); @@ -1694,14 +1594,14 @@ void cXinelibServer::Handle_Control(int cli, const char *cmd) } else if(!strncasecmp(cmd, "ENDOFSTREAM", 11)) { m_bEndOfStreamReached = true; - + } else if(!strncasecmp(cmd, "RESULT ", 7)) { int token = -1, result = -1; - if(2 == sscanf(cmd+7, "%d %d", &token, &result)) { + if(2 == sscanf(cmd+7, "%d %d", &token, &result)) { cReplyFuture *f = m_Futures->Get(token); if(f) { - m_Futures->Del(f, token); - f->Set(result); + m_Futures->Del(f, token); + f->Set(result); } } @@ -1729,16 +1629,16 @@ void cXinelibServer::Read_Control(int cli) ++m_CtrlBufPos[cli]; if( m_CtrlBufPos[cli] > CTRL_BUF_SIZE-2) { - LOGMSG("Received too long control message from client %d (%d bytes)", - cli, m_CtrlBufPos[cli]); + LOGMSG("Received too long control message from client %d (%d bytes)", + cli, m_CtrlBufPos[cli]); LOGMSG("%81s",m_CtrlBuf[cli]); CloseConnection(cli); return; } if( m_CtrlBufPos[cli] > 1 && - m_CtrlBuf[ cli ][ m_CtrlBufPos[cli] - 2 ] == '\r' && - m_CtrlBuf[ cli ][ m_CtrlBufPos[cli] - 1 ] == '\n') { + m_CtrlBuf[ cli ][ m_CtrlBufPos[cli] - 2 ] == '\r' && + m_CtrlBuf[ cli ][ m_CtrlBufPos[cli] - 1 ] == '\n') { m_CtrlBufPos[cli] -= 2; m_CtrlBuf[ cli ][ m_CtrlBufPos[cli] ] = 0; @@ -1767,12 +1667,12 @@ void cXinelibServer::Handle_ClientConnected(int fd) if(getpeername(fd, (struct sockaddr *)&sin, &len)) { LOGERR("getpeername() failed, dropping new incoming connection %d", cli); - CLOSESOCKET(fd); + CLOSESOCKET(fd); return; } - LOGMSG("Client %d connected: %s", cli, - cxSocket::ip2txt(sin.sin_addr.s_addr, sin.sin_port, buf)); + LOGMSG("Client %d connected: %s", cli, + cxSocket::ip2txt(sin.sin_addr.s_addr, sin.sin_port, buf)); bool accepted = SVDRPhosts.Acceptable(sin.sin_addr.s_addr); if(!accepted) { @@ -1781,8 +1681,8 @@ void cXinelibServer::Handle_ClientConnected(int fd) LOGMSG("Address not allowed to connect (svdrphosts.conf)."); if(write(fd, msg, len) != len) LOGERR("Write failed."); - CLOSESOCKET(fd); - return; + CLOSESOCKET(fd); + return; } if(cli>=xc.remote_max_clients || cli>=MAXCLIENTS) { @@ -1792,14 +1692,14 @@ void cXinelibServer::Handle_ClientConnected(int fd) LOGMSG("Too many clients, connection refused"); if(write(fd, msg, len) != len) LOGERR("Write failed."); - CLOSESOCKET(fd); + CLOSESOCKET(fd); return; } if (fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK) == -1) { LOGERR("Error setting control socket to nonblocking mode"); CLOSESOCKET(fd); - } + } CloseDataConnection(cli); @@ -1829,18 +1729,18 @@ void cXinelibServer::Handle_Discovery_Broadcast(void) // Reply only if we can accept one more client int clients = 0; for(int c=0; c<MAXCLIENTS; c++) - if(fd_control[c].open()) - clients++; + if(fd_control[c].open()) + clients++; if(clients >= xc.remote_max_clients) { - LOGMSG("Not replying to discovery broadcast (too many clients)"); - return; + LOGMSG("Not replying to discovery broadcast (too many clients)"); + return; } - udp_discovery_broadcast(fd_discovery, m_Port, xc.remote_local_ip); + udp_discovery_broadcast(fd_discovery, m_Port, xc.remote_local_ip); } } -void cXinelibServer::Action(void) +void cXinelibServer::Action(void) { TRACEF("cXinelibServer::Action"); @@ -1848,7 +1748,7 @@ void cXinelibServer::Action(void) pollfd pfd[MAXCLIENTS]; /* higher priority */ - SetPriority(-1); + SetPriority(-1); sched_param temp; temp.sched_priority = 2; @@ -1856,32 +1756,32 @@ void cXinelibServer::Action(void) /* request real-time scheduling */ if (!pthread_setschedparam(pthread_self(), SCHED_RR, &temp)) { LOGDBG("cXinelibServer priority set successful SCHED_RR %d [%d,%d]", - temp.sched_priority, - sched_get_priority_min(SCHED_RR), - sched_get_priority_max(SCHED_RR)); + temp.sched_priority, + sched_get_priority_min(SCHED_RR), + sched_get_priority_max(SCHED_RR)); } else { LOGDBG("cXinelibServer: Can't set priority to SCHED_RR %d [%d,%d]", - temp.sched_priority, - sched_get_priority_min(SCHED_RR), - sched_get_priority_max(SCHED_RR)); + temp.sched_priority, + sched_get_priority_min(SCHED_RR), + sched_get_priority_max(SCHED_RR)); } errno = 0; Lock(); Listen(m_Port); m_bReady=true; - + if(fd_listen>=0) while (!GetStopSignal() && fds>=0) { fds = 0; if(fd_listen>=0) { - pfd[fds].fd = fd_listen; - pfd[fds++].events = POLLIN; + pfd[fds].fd = fd_listen; + pfd[fds++].events = POLLIN; } if(fd_discovery >= 0) { - pfd[fds].fd = fd_discovery; - pfd[fds++].events = POLLIN; + pfd[fds].fd = fd_discovery; + pfd[fds++].events = POLLIN; } for(i=0; i<MAXCLIENTS; i++) { @@ -1897,80 +1797,80 @@ void cXinelibServer::Action(void) Unlock(); int err = poll(pfd,fds,1000); - + if(err < 0) { - LOGERR("cXinelibServer: poll failed"); - if(!GetStopSignal()) - cCondWait::SleepMs(100); - + LOGERR("cXinelibServer: poll failed"); + if(!GetStopSignal()) + cCondWait::SleepMs(100); + } else if(err == 0) { // poll timeout - + } else { Lock(); for(int f=0; f<fds; f++) { - // Check errors (closed connections etc.) + // Check errors (closed connections etc.) if(pfd[f].revents & (POLLERR|POLLHUP|POLLNVAL)) { if(pfd[f].fd == fd_listen) { - LOGERR("cXinelibServer: listen socket error"); + LOGERR("cXinelibServer: listen socket error"); CLOSESOCKET(fd_listen); - cCondWait::SleepMs(100); - Listen(m_Port); + cCondWait::SleepMs(100); + Listen(m_Port); } /* fd_listen */ else if(pfd[f].fd == fd_discovery) { - LOGERR("cXinelibServer: discovery socket error"); + LOGERR("cXinelibServer: discovery socket error"); CLOSESOCKET(fd_discovery); } /* fd_discovery */ else /* fd_data[] / fd_control[] */ { - for(i=0; i<MAXCLIENTS; i++) { - if(pfd[f].fd == fd_data[i] || pfd[f].fd == fd_control[i].handle()) { - LOGMSG("Client %d disconnected", i); - CloseConnection(i); - } - } - } /* fd_data / fd_control */ + for(i=0; i<MAXCLIENTS; i++) { + if(pfd[f].fd == fd_data[i] || pfd[f].fd == fd_control[i].handle()) { + LOGMSG("Client %d disconnected", i); + CloseConnection(i); + } + } + } /* fd_data / fd_control */ } /* Check ERRORS */ - // Check ready for reading - else if(pfd[f].revents & POLLIN) { + // Check ready for reading + else if(pfd[f].revents & POLLIN) { - // New connection + // New connection if(pfd[f].fd == fd_listen) { int fd = accept(fd_listen, 0, 0); - if(fd>=0) - Handle_ClientConnected(fd); + if(fd>=0) + Handle_ClientConnected(fd); } /* fd_listen */ - // VDR Discovery - else if(pfd[f].fd == fd_discovery) { - Handle_Discovery_Broadcast(); + // VDR Discovery + else if(pfd[f].fd == fd_discovery) { + Handle_Discovery_Broadcast(); } /* fd_discovery */ - // Control data - else { - for(i=0; i<MAXCLIENTS; i++) { - if(pfd[f].fd == fd_control[i].handle()) { - Read_Control(i); - break; - } - } - } /* fd_control */ - - } /* Check ready for reading */ + // Control data + else { + for(i=0; i<MAXCLIENTS; i++) { + if(pfd[f].fd == fd_control[i].handle()) { + Read_Control(i); + break; + } + } + } /* fd_control */ + + } /* Check ready for reading */ } /* for(fds) */ Unlock(); } /* Check poll result */ - + Lock(); } /* while running */ - + m_bReady = false; m_bIsFinished = true; Unlock(); |