From f9d403039d205ca78839769d1cd835cded811fbd Mon Sep 17 00:00:00 2001 From: Spoike Date: Wed, 11 Oct 2006 23:17:55 +0000 Subject: [PATCH] Added available demos webpage. Works like current streams. No info is currently provided other than filename. A link is provided from /nowplaying.html. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2406 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- fteqtv/forward.c | 104 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 9 deletions(-) diff --git a/fteqtv/forward.c b/fteqtv/forward.c index 0e3b3ebbc..d8358c60e 100644 --- a/fteqtv/forward.c +++ b/fteqtv/forward.c @@ -472,10 +472,13 @@ void SV_GenerateNowPlayingHTTP(cluster_t *cluster, oproxy_t *dest) if (!cluster->servers) { - s = "No streams are currently being played"; + s = "No streams are currently being played
"; Net_ProxySend(cluster, dest, s, strlen(s)); } + s = "
Available Demos"; + Net_ProxySend(cluster, dest, s, strlen(s)); + sprintf(buffer, ""); Net_ProxySend(cluster, dest, buffer, strlen(buffer)); } @@ -534,7 +537,7 @@ qboolean SV_GetHTTPHeaderField(char *s, char *field, char *buffer, int buffersiz return false; } -void SV_GenerateQTVStub(cluster_t *cluster, oproxy_t *dest, int streamid) +void SV_GenerateQTVStub(cluster_t *cluster, oproxy_t *dest, char *streamtype, char *streamid) { char *s; char hostname[64]; @@ -561,17 +564,24 @@ void SV_GenerateQTVStub(cluster_t *cluster, oproxy_t *dest, int streamid) return; } - s = "HTTP/1.1 200 OK\n" + s = "HTTP/1.1 200 OK\n" "Content-Type: text/x-quaketvident\n" "Connection: close\n" "\n"; Net_ProxySend(cluster, dest, s, strlen(s)); + { + char *ws; + for (ws = streamid; *ws > ' '; ws++) + ; + *ws = '\0'; + } + sprintf(buffer, "[QTV]\r\n" - "Stream: %i@%s\r\n" + "Stream: %s%s@%s\r\n" "", - streamid, hostname); + streamtype, streamid, hostname); Net_ProxySend(cluster, dest, buffer, strlen(buffer)); @@ -697,6 +707,13 @@ void SV_GenerateAdminHTTP(cluster_t *cluster, oproxy_t *dest, int streamid, char "\n" ""; + + Net_ProxySend(cluster, dest, s, strlen(s)); + s = "

FTEQTV Admin: "; + Net_ProxySend(cluster, dest, s, strlen(s)); + s = cluster->hostname; + Net_ProxySend(cluster, dest, s, strlen(s)); + s = "

"; Net_ProxySend(cluster, dest, s, strlen(s)); s = @@ -734,6 +751,46 @@ void SV_GenerateAdminHTTP(cluster_t *cluster, oproxy_t *dest, int streamid, char Net_ProxySend(cluster, dest, s, strlen(s)); } +void SV_GenerateQTVDemoListing(cluster_t *cluster, oproxy_t *dest) +{ + int numdemos = 0; + char link[256]; + char *s; + s = "HTTP/1.1 200 OK\n" + "Content-Type: text/html\n" + "Connection: close\n" + "\n" + "QuakeTV Demos"; + Net_ProxySend(cluster, dest, s, strlen(s)); + + s = "

QTV Demo listing

"; + Net_ProxySend(cluster, dest, s, strlen(s)); + +#ifdef _WIN32 + { + WIN32_FIND_DATA ffd; + HANDLE h; + h = FindFirstFile("*.mvd", &ffd); + do + { + numdemos++; + snprintf(link, sizeof(link), "%s
", ffd.cFileName, ffd.cFileName); + Net_ProxySend(cluster, dest, link, strlen(link)); + } while(FindNextFile(h, &ffd)); + FindClose(h); + } +#else + s = "QTV Proxy is running on a platform for which file system listing is not coded.
Demo listing is not available."; + Net_ProxySend(cluster, dest, s, strlen(s)); +#endif + + sprintf(link, "

Total: %i demos

", numdemos); + Net_ProxySend(cluster, dest, link, strlen(link)); + + s = "" + ""; + Net_ProxySend(cluster, dest, s, strlen(s)); +} @@ -851,7 +908,11 @@ qboolean SV_ReadPendingProxy(cluster_t *cluster, oproxy_t *pend) } else if (!strncmp(pend->inbuffer+4, "/watch.qtv?sid=", 15)) { - SV_GenerateQTVStub(cluster, pend, atoi(pend->inbuffer+19)); + SV_GenerateQTVStub(cluster, pend, "", pend->inbuffer+19); + } + else if (!strncmp(pend->inbuffer+4, "/watch.qtv?demo=", 16)) + { + SV_GenerateQTVStub(cluster, pend, "file:", pend->inbuffer+20); } else if (!strncmp(pend->inbuffer+4, "/about", 6)) { //redirect them to our funky website @@ -873,10 +934,15 @@ qboolean SV_ReadPendingProxy(cluster_t *cluster, oproxy_t *pend) } else if (!strncmp(pend->inbuffer+4, "/demos", 6)) { - s = "HTTP/1.0 302 Found\n" - "Location: http://www.fteqw.com/\n" - "\n"; + SV_GenerateQTVDemoListing(cluster, pend); + /* + s = "HTTP/1.1 200 OK\n" + "Content-Type: text/html\n" + "Connection: close\n" + "\n" + "FTEQTVNot Yet Supported"; Net_ProxySend(cluster, pend, s, strlen(s)); + */ } /* else { @@ -1045,6 +1111,26 @@ qboolean SV_ReadPendingProxy(cluster_t *cluster, oproxy_t *pend) if (pend->flushing) return false; + + if (qtv->usequkeworldprotocols) + { + s = "QTVSV 1\n" + "PERROR: This version of QTV is unable to convert QuakeWorld to QTV protocols\n" + "\n"; + Net_ProxySend(cluster, pend, s, strlen(s)); + pend->flushing = true; + return false; + } + if (cluster->numproxies >= cluster->maxproxies) + { + s = "QTVSV 1\n" + "TERROR: This QTV has reached it's connection limit\n" + "\n"; + Net_ProxySend(cluster, pend, s, strlen(s)); + pend->flushing = true; + return false; + } + pend->next = qtv->proxies; qtv->proxies = pend;