From 302fa2e67276bd0674e81e2a9a01b9e91dd45d8c Mon Sep 17 00:00:00 2001 From: lordjaxom Date: Thu, 30 Dec 2004 22:43:55 +0000 Subject: Initial revision --- server/connectionHTTP.c | 180 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 server/connectionHTTP.c (limited to 'server/connectionHTTP.c') diff --git a/server/connectionHTTP.c b/server/connectionHTTP.c new file mode 100644 index 0000000..7d20f80 --- /dev/null +++ b/server/connectionHTTP.c @@ -0,0 +1,180 @@ +/* + * $Id: connectionHTTP.c,v 1.1 2004/12/30 22:44:19 lordjaxom Exp $ + */ + +#include "server/connectionHTTP.h" +#include "server/livestreamer.h" +#include "server/setup.h" + +cConnectionHTTP::cConnectionHTTP(void): cServerConnection("HTTP") { + m_Channel = NULL; + m_ListChannel = NULL; + m_LiveStreamer = NULL; + m_Status = hsRequest; + m_StreamType = (eStreamType)StreamdevServerSetup.HTTPStreamType; + m_Startup = false; +} + +cConnectionHTTP::~cConnectionHTTP() { + if (m_LiveStreamer != NULL) delete m_LiveStreamer; +} + +void cConnectionHTTP::Detach(void) { + if (m_LiveStreamer != NULL) m_LiveStreamer->Detach(); +} + +void cConnectionHTTP::Attach(void) { + if (m_LiveStreamer != NULL) m_LiveStreamer->Attach(); +} + +bool cConnectionHTTP::Command(char *Cmd) { + switch (m_Status) { + case hsRequest: + if (strncmp(Cmd, "GET ", 4) == 0) return CmdGET(Cmd + 4); + else { + DeferClose(); + m_Status = hsTransfer; // Ignore following lines + return Respond("HTTP/1.0 400 Bad Request"); + } + break; + + case hsHeaders: + if (*Cmd == '\0') { + if (m_ListChannel != NULL) { + m_Status = hsListing; + return Respond("HTTP/1.0 200 OK") + && Respond("Content-Type: text/html") + && Respond("") + && Respond("VDR Channel Listing") + && Respond(""); + DeferClose(); + return; + } + + if (m_ListChannel->GroupSep()) + line.Format("
  • --- %s ---
  • ", m_ListChannel->Name()); + else + line.Format("
  • %s
  • ", + (const char*)LocalIp(), StreamdevServerSetup.HTTPServerPort, + m_ListChannel->GetChannelID().ToString(), m_ListChannel->Name()); + if (!Respond(line)) + DeferClose(); + m_ListChannel = Channels.Next(m_ListChannel); + } else if (m_Startup) { + Dprintf("streamer start\n"); + m_LiveStreamer->Start(this); + m_Startup = false; + } +} + +bool cConnectionHTTP::CmdGET(char *Opts) { + cChannel *chan; + char *ep; + + Opts = skipspace(Opts); + while (*Opts == '/') + ++Opts; + + if (strncasecmp(Opts, "PS/", 3) == 0) { + m_StreamType = stPS; + Opts+=3; + } else if (strncasecmp(Opts, "PES/", 4) == 0) { + m_StreamType = stPES; + Opts+=4; + } else if (strncasecmp(Opts, "TS/", 3) == 0) { + m_StreamType = stTS; + Opts+=3; + } else if (strncasecmp(Opts, "ES/", 3) == 0) { + m_StreamType = stES; + Opts+=3; + } + + while (*Opts == '/') + ++Opts; + for (ep = Opts + strlen(Opts); ep >= Opts && !isspace(*ep); --ep) + ; + *ep = '\0'; + + if (strncmp(Opts, "channels.htm", 12) == 0) { + m_ListChannel = Channels.First(); + m_Status = hsHeaders; + } else if ((chan = ChannelFromString(Opts)) != NULL) { + m_Channel = chan; + m_Status = hsHeaders; + } + return true; +} + +#if 0 +bool cHTTPConnection::Listing(void) { + cChannel *chan; + cTBString line; + + Respond(200, "OK"); + Respond("Content-Type: text/html"); + Respond(""); + Respond("VDR Channel Listing"); + Respond(""); + + m_DeferClose = true; + return true; +} +#endif -- cgit v1.2.3