-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
LINKS: write proper qw links instead of serving qtv files
BUILD: added ifdef for mingw windows build
- Loading branch information
Showing
2 changed files
with
96 additions
and
83 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" | ||
|
@@ -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) | ||
|
@@ -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 *****/ | ||
|
@@ -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++) | ||
{ | ||
|
@@ -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)); | ||
|
@@ -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"); | ||
|
@@ -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"); | ||
|
@@ -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)); | ||
|
@@ -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 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 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 now!</a></span></td>\n", streams->streamid, hostname.string); | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
ciscon
Author
Collaborator
|
||
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"); | ||
|
@@ -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)); | ||
|
@@ -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"); | ||
} | ||
} | ||
|
@@ -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)); | ||
} | ||
|
@@ -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)); | ||
} | ||
|
@@ -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) | ||
{ | ||
|
@@ -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=\"\" />" | ||
|
@@ -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... | ||
|
@@ -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"; | ||
|
@@ -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) | ||
{ | ||
|
@@ -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) | ||
{ | ||
|
@@ -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"; | ||
|
@@ -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. | ||
|
@@ -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); | ||
} | ||
} | ||
} | ||
|
What "qw://%i@n%s:28000/qtvplay" does mean? Particularily letter n after @.