Skip to content

Commit

Permalink
LINKS: write proper qw links instead of serving qtv files
Browse files Browse the repository at this point in the history
BUILD: added ifdef for mingw windows build
  • Loading branch information
ciscon committed Apr 6, 2020
1 parent 506938f commit 65eb99d
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 83 deletions.
15 changes: 11 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,26 @@ EXTRACFLAGS=-Wall -O2
CC=gcc $(EXTRACFLAGS)
STRIP=strip

ifdef CONFIG_WINDOWS
LDFLAGS=-Lmingw32-libs/lib -lwsock32 -lwinmm
CC=x86_64-w64-mingw32-gcc
STRIP=x86_64-w64-mingw32-strip
CFLAGS=-g0 -D_DEBUG -D_WIN32_WINNT=0x0501 -D__USE_MINGW_ANSI_STDIO -Imingw32-libs/include -Wall -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -Wno-strict-aliasing -MMD ${EXTRACFLAGS}
endif

STRIPFLAGS=--strip-unneeded --remove-section=.comment

OBJS = cmd.o crc.o cvar.o forward.o forward_pending.o info.o main.o mdfour.o \
msg.o net_utils.o parse.o qw.o source.o source_cmds.o sys.o build.o token.o httpsv.o httpsv_generate.o \
cl_cmds.o fs.o ban.o udp.o
msg.o net_utils.o parse.o qw.o source.o source_cmds.o sys.o build.o token.o httpsv.o httpsv_generate.o \
cl_cmds.o fs.o ban.o udp.o

qtv: $(OBJS) qtv.h qconst.h
$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $@.db -lm
$(STRIP) $(STRIPFLAGS) $@.db -o $@.bin

qtv.exe: *.c *.h
$(MAKE) qtv CFLAGS=-mno-cygwin LDFLAGS="-lwsock32 -lwinmm"
mv qtv qtv.exe
$(MAKE) qtv
mv qtv.bin qtv.exe

clean:
rm -rf qtv.bin qtv.exe qtv.db *.o
164 changes: 85 additions & 79 deletions httpsv_generate.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
httpsv_generate.c
*/
httpsv_generate.c
*/

#include "qtv.h"
#include "stdlib.h"
Expand Down Expand Up @@ -52,14 +52,14 @@ void HTTPSV_GenerateCSSFile(cluster_t *cluster, oproxy_t *dest)

if (dest->buffer_file)
Sys_Error("HTTPSV_GenerateCSSFile: dest->buffer_file");

dest->buffer_file = FS_OpenFile(HTMLFILESPATH, "style.css", &s);
if (!dest->buffer_file) {
HTTPSV_GenerateNotFoundError(cluster, dest);
return;
}

HTTPSV_SendHTTPHeader(cluster, dest, "200", "text/css", false);
HTTPSV_SendHTTPHeader(cluster, dest, "200", "text/css", false);
}

void HTTPSV_GenerateJSFile(cluster_t *cluster, oproxy_t *dest)
Expand All @@ -68,14 +68,14 @@ void HTTPSV_GenerateJSFile(cluster_t *cluster, oproxy_t *dest)

if (dest->buffer_file)
Sys_Error("HTTPSV_GenerateJSFile: dest->buffer_file");

dest->buffer_file = FS_OpenFile(HTMLFILESPATH, "script.js", &s);
if (!dest->buffer_file) {
HTTPSV_GenerateNotFoundError(cluster, dest);
return;
}

HTTPSV_SendHTTPHeader(cluster, dest, "200", "text/javascript", false);
HTTPSV_SendHTTPHeader(cluster, dest, "200", "text/javascript", false);
}

/***** SCOREBOARD *****/
Expand Down Expand Up @@ -123,7 +123,7 @@ void ScoreBoard_AddPlayer(scoreboard *b, playerinfo_t* p)
b->players[b->players_count].frags = p->frags;
Info_ValueForKey(p->userinfo, "name", b->players[b->players_count].name, sizeof(b->players[0].name));
Info_ValueForKey(p->userinfo, "team", b->players[b->players_count].team, sizeof(b->players[0].team));

// add frags to team
for (i = 0; i < b->teams_count; i++)
{
Expand Down Expand Up @@ -200,7 +200,7 @@ void HTTPSV_GenerateTableForTeam(cluster_t *cluster, oproxy_t *dest, scoreboard
HTMLPRINT(" <tr class='scodd'>\n");
else
HTMLPRINT(" <tr>\n");

// frags
snprintf(buffer, sizeof(buffer), " <td class='frags'>%i</td>\n", b->players[i].frags);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
Expand Down Expand Up @@ -230,9 +230,9 @@ void HTTPSV_GenerateScoreBoard(cluster_t *cluster, oproxy_t *dest, scoreboard *b
HTMLPRINT(" <td><span>Team: </span><span class='teamname'>");
HTMLprintf(buffer, sizeof(buffer), true, "%s", b->teams[i].name);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
HTMLPRINT("</span><span class='frags'> ");
HTMLprintf(buffer, sizeof(buffer), true, "[%i]", b->teams[i].frags);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
HTMLPRINT("</span><span class='frags'> ");
HTMLprintf(buffer, sizeof(buffer), true, "[%i]", b->teams[i].frags);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
HTMLPRINT("</span></td>\n");
}
HTMLPRINT("</tr>\n <tr>\n");
Expand All @@ -251,7 +251,7 @@ void HTTPSV_GenerateScoreBoard(cluster_t *cluster, oproxy_t *dest, scoreboard *b
{
HTTPSV_GenerateTableForTeam(cluster, dest, b, NULL); // NOTE: team argement sent as NULL
}

if (teams)
{
HTMLPRINT(" </tr>\n </table>\n");
Expand Down Expand Up @@ -285,7 +285,7 @@ void HTTPSV_GenerateNowPlaying(cluster_t *cluster, oproxy_t *dest)
{
// skip "tcp:" prefix if any
server = (strncmp(streams->server, "tcp:", sizeof("tcp:") - 1) ? streams->server : streams->server + sizeof("tcp:") - 1);

// get the name of the map
// FIXME: is "maps/notready.bsp" is ok to show when we are not ready?
strlcpy(mapname, streams->modellist[1].name[0] ? streams->modellist[1].name : "maps/notready.bsp", sizeof(mapname));
Expand Down Expand Up @@ -321,17 +321,23 @@ void HTTPSV_GenerateNowPlaying(cluster_t *cluster, oproxy_t *dest)
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
oddrow = !oddrow;


// 1st cell: watch now button
if (!allow_join.integer) {
snprintf(buffer, sizeof(buffer), " <td class='wn'><span class=\"qtvfile\"><a href=\"/watch.qtv?sid=%i\">Watch&nbsp;now!</a></span></td>\n", streams->streamid);
snprintf(buffer, sizeof(buffer), " <td class='wn'><span class=\"qtvfile\"><a href=\"qw://%i@%s:28000/qtvplay\">Watch&nbsp;now!</a></span></td>\n", streams->streamid, hostname.string);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
} else {
snprintf(buffer, sizeof(buffer), " <td class='wn'><span class=\"qtvfile\"><a href=\"/watch.qtv?sid=%i\">Watch</a></span><span class=\"qtvfile\"><a href=\"/join.qtv?sid=%i\">Join</a></span></td>\n", streams->streamid, streams->streamid);
snprintf(buffer, sizeof(buffer), " <td class='wn'><span class=\"qtvfile\"><a href=\"qw://%i@n%s:28000/qtvplay\">Watch&nbsp;now!</a></span></td>\n", streams->streamid, hostname.string);

This comment has been minimized.

Copy link
@qqshka

qqshka Oct 10, 2021

Collaborator

What "qw://%i@n%s:28000/qtvplay" does mean? Particularily letter n after @.

This comment has been minimized.

Copy link
@ciscon

ciscon Oct 10, 2021

Author Collaborator

that is probably a typo from when i ported the change over from my fork in which i was just hardcoding things

Net_ProxySend(cluster, dest, buffer, strlen(buffer));
}

char hostname[1024];

// 2nd cell: server adress
HTMLPRINT(" <td class='adr'>");
HTMLPRINT(" <td class='adr'><p class='hostname' style='display:none'>");
HTMLPRINT(Info_ValueForKey(streams->serverinfo, "hostname", hostname, sizeof(hostname)));
HTMLPRINT("</p>");

HTMLprintf(buffer, sizeof(buffer), true, "%s", server);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
HTMLPRINT("</td>\n");
Expand Down Expand Up @@ -368,13 +374,13 @@ void HTTPSV_GenerateNowPlaying(cluster_t *cluster, oproxy_t *dest)

HTMLPRINT(" </tr>\n");
// end of row

// details if server not empty
if (!sv_empty)
{
char buf[32], matchtag[32];
HTMLPRINT(" <tr class='notempty nebottom'>\n");

// map preview
snprintf(buffer, sizeof(buffer), " <td class='mappic'><img src='/levelshots/%s.jpg' width='144' height='108' alt='%s' title='%s' /></td>\n", mapname, mapname, mapname);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
Expand All @@ -389,14 +395,14 @@ void HTTPSV_GenerateNowPlaying(cluster_t *cluster, oproxy_t *dest)
if (matchtag[0] || buf[0])
{
snprintf(buffer,sizeof(buffer), " <p class='status'>%s%s%s</p>\n",
matchtag, (matchtag[0] && buf[0]) ? ": " : "", buf);
matchtag, (matchtag[0] && buf[0]) ? ": " : "", buf);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
}

// number of observers
snprintf(buffer,sizeof(buffer), " <p class='observers'>Observers: <span>%u</span></p>\n", Proxy_UsersCount(streams));
Net_ProxySend(cluster, dest, buffer, strlen(buffer));

HTMLPRINT(" </td>\n </tr>\n");
}
}
Expand Down Expand Up @@ -428,9 +434,9 @@ void HTTPSV_GenerateQTVStub(cluster_t *cluster, oproxy_t *dest, char *streamtype
HTTPSV_SendHTTPHeader(cluster, dest, "200", "application/octet-stream", false);

snprintf(buffer, sizeof(buffer), "[QTV]\r\n"
"Stream: %s%s@%s\r\n"
"",
streamtype, unescaped_streamid, hostname);
"Stream: %s%s@%s\r\n"
"",
streamtype, unescaped_streamid, hostname);

Net_ProxySend(cluster, dest, buffer, strlen(buffer));
}
Expand Down Expand Up @@ -458,13 +464,13 @@ void HTTPSV_GenerateQTVJoinStub(cluster_t *cluster, oproxy_t *dest, char *stream

if (!streamfound)
return;

HTTPSV_SendHTTPHeader(cluster, dest, "200", "application/octet-stream", false);

snprintf(buffer, sizeof(buffer), "[QTV]\r\n"
"Join: %s\r\n"
"",
server);
"Join: %s\r\n"
"",
server);

Net_ProxySend(cluster, dest, buffer, strlen(buffer));
}
Expand Down Expand Up @@ -492,26 +498,26 @@ void HTTPSV_GenerateAdmin(cluster_t *cluster, oproxy_t *dest, int streamid, char
cmd[0] = 0;

if (postbody)
while (*postbody)
{
if (!strncmp(postbody, "pwd=", 4))
{
postbody = HTTPSV_ParsePOST(postbody+4, pwd, sizeof(pwd));
}
else if (!strncmp(postbody, "cmd=", 4))
while (*postbody)
{
postbody = HTTPSV_ParsePOST(postbody+4, cmd, sizeof(cmd));
}
else
{
while(*postbody && *postbody != '&')
if (!strncmp(postbody, "pwd=", 4))
{
postbody = HTTPSV_ParsePOST(postbody+4, pwd, sizeof(pwd));
}
else if (!strncmp(postbody, "cmd=", 4))
{
postbody++;
postbody = HTTPSV_ParsePOST(postbody+4, cmd, sizeof(cmd));
}
else
{
while(*postbody && *postbody != '&')
{
postbody++;
}
if (*postbody == '&')
postbody++;
}
if (*postbody == '&')
postbody++;
}
}

if (!*pwd)
{
Expand Down Expand Up @@ -558,10 +564,10 @@ void HTTPSV_GenerateAdmin(cluster_t *cluster, oproxy_t *dest, int streamid, char

Net_ProxySend(cluster, dest, s, strlen(s));
/*
if (passwordokay)
Net_ProxySend(cluster, dest, pwd, strlen(pwd));
*/
if (passwordokay)
Net_ProxySend(cluster, dest, pwd, strlen(pwd));
*/

s = "\" />"
"<br />"
"Command <input name='cmd' maxlength='255' size='40' value=\"\" />"
Expand Down Expand Up @@ -595,8 +601,8 @@ void HTTPSV_GenerateDemoListing(cluster_t *cluster, oproxy_t *dest)
{
int i;
char link[1024],
name[sizeof(cluster->availdemos[0].name) * 5],
href[sizeof(cluster->availdemos[0].name) * 5];
name[sizeof(cluster->availdemos[0].name) * 5],
href[sizeof(cluster->availdemos[0].name) * 5];
char *s;

dest->_bufferautoadjustmaxsize_ = 1024 * 1024; // NOTE: this allow 1MB buffer...
Expand Down Expand Up @@ -624,19 +630,19 @@ void HTTPSV_GenerateDemoListing(cluster_t *cluster, oproxy_t *dest)

snprintf(link, sizeof(link), " <tr class='%s'>\n <td class='stream'>", ((i % 2) ? "even" : "odd"));
Net_ProxySend(cluster, dest, link, strlen(link));

if (stricmp(name + strlen(name) - 4, ".mvd") == 0) {
snprintf(link, sizeof(link),
"<a href='/watch.qtv?demo=%s'><img src='/stream.png' width='14' height='15' /></a>",
href);
"<a href='/watch.qtv?demo=%s'><img src='/stream.png' width='14' height='15' /></a>",
href);
Net_ProxySend(cluster, dest, link, strlen(link));
}

snprintf(link, sizeof(link), "</td>\n"
" <td class='save'><a href='/dl/demos/%s'><img src='/save.png' width='16' height='16' /></a></td>\n"
" <td class='name'>%s</td><td class='size'>%i kB</td>\n"
" </tr>\n",
href, name, cluster->availdemos[i].size/1024);
" <td class='save'><a href='/dl/demos/%s'><img src='/save.png' width='16' height='16' /></a></td>\n"
" <td class='name'>%s</td><td class='size'>%i kB</td>\n"
" </tr>\n",
href, name, cluster->availdemos[i].size/1024);
Net_ProxySend(cluster, dest, link, strlen(link));
}
s = " </tbody>\n </table>\n";
Expand All @@ -654,7 +660,7 @@ void HTTPSV_GenerateImage(cluster_t *cluster, oproxy_t *dest, char *imgfilename)

if (dest->buffer_file)
Sys_Error("HTTPSV_GenerateImage: dest->buffer_file");

dest->buffer_file = FS_OpenFile(HTMLFILESPATH, imgfilename, &s);
if (!dest->buffer_file)
{
Expand Down Expand Up @@ -690,7 +696,7 @@ void HTTPSV_GenerateLevelshot(cluster_t *cluster, oproxy_t *dest, char *name)
Sys_Error("HTTPSV_GenerateLevelshot: dest->buffer_file");

MediaPathName(pathname, sizeof(pathname), name, "levelshots");

dest->buffer_file = FS_OpenFile(HTMLFILESPATH, pathname, &s);
if (!dest->buffer_file)
{
Expand Down Expand Up @@ -782,15 +788,15 @@ void HTTPSV_GenerateRSS(cluster_t *cluster, oproxy_t *dest, char *str)
header_fmt =
"<?xml version=\"1.0\"?>" CRLF
"<rss version=\"2.0\">" CRLF
"<channel>" CRLF
"<title>QTV RSS</title>" CRLF
"<link></link>" CRLF // TODO: Set channel link for RSS.
"<description>%s - QTV Current active feeds</description>" CRLF
"<language>en-us</language>" CRLF
"<pubDate></pubDate>" CRLF; // TODO: Set date when stream started?
"<channel>" CRLF
"<title>QTV RSS</title>" CRLF
"<link></link>" CRLF // TODO: Set channel link for RSS.
"<description>%s - QTV Current active feeds</description>" CRLF
"<language>en-us</language>" CRLF
"<pubDate></pubDate>" CRLF; // TODO: Set date when stream started?

footer_fmt =
"</channel>" CRLF
"</channel>" CRLF
"</rss>" CRLF;

link_fmt = "http://%s/watch.qtv?sid=%i";
Expand Down Expand Up @@ -893,17 +899,17 @@ void HTTPSV_GenerateRSS(cluster_t *cluster, oproxy_t *dest, char *str)
FS_StripPathAndExtension(mapname);

item_fmt = CRLF
"<type>text/plain</type>" CRLF
"<title>%s</title>" CRLF
"<link>%s</link>" CRLF
"<description>%s</description>" CRLF
"<pubDate>%s</pubDate>" CRLF
"<guid>%s</guid>" CRLF
"<hostname>%s</hostname>" CRLF
"<port>%i</port>" CRLF
"<map>%s</map>" CRLF
"<observercount>%u</observercount>" CRLF
"<status>%s</status>" CRLF;
"<type>text/plain</type>" CRLF
"<title>%s</title>" CRLF
"<link>%s</link>" CRLF
"<description>%s</description>" CRLF
"<pubDate>%s</pubDate>" CRLF
"<guid>%s</guid>" CRLF
"<hostname>%s</hostname>" CRLF
"<port>%i</port>" CRLF
"<map>%s</map>" CRLF
"<observercount>%u</observercount>" CRLF
"<status>%s</status>" CRLF;

{
// Separate the hostname and port.
Expand Down Expand Up @@ -990,7 +996,7 @@ void HTTPSV_GenerateQTVStatus(cluster_t *cluster, oproxy_t *dest, char *str)

for (qtv = g_cluster.servers; qtv; qtv = qtv->next)
Net_ProxyPrintf(dest, "net: %s in/out %llu/%llu clients: in/out %llu/%llu\n",
qtv->server, qtv->socket_stat.r, qtv->socket_stat.w, qtv->proxies_socket_stat.r, qtv->proxies_socket_stat.w);
qtv->server, qtv->socket_stat.r, qtv->socket_stat.w, qtv->proxies_socket_stat.r, qtv->proxies_socket_stat.w);
}
}
}
Expand Down

0 comments on commit 65eb99d

Please sign in to comment.