summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorphintuka <phintuka>2009-08-05 10:46:15 +0000
committerphintuka <phintuka>2009-08-05 10:46:15 +0000
commitbc3cc9dd760d078eafe2ba0eeb02b1291a06ee6c (patch)
tree36090b925a28786c7d6e4f9ac209446e07e96a89
parent375bfd4cc2e1db295b6f4e552580ea0babd9b80b (diff)
downloadxineliboutput-bc3cc9dd760d078eafe2ba0eeb02b1291a06ee6c.tar.gz
xineliboutput-bc3cc9dd760d078eafe2ba0eeb02b1291a06ee6c.tar.bz2
Cosmetics
-rw-r--r--frontend_svr.c762
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();