Fix some of the issues highlighted by the emscripten port.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4452 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
7225b474b6
commit
3343370115
11 changed files with 345 additions and 110 deletions
|
@ -3682,13 +3682,15 @@ void Host_DoRunFile(hrf_t *f)
|
|||
int len = VFS_GETLEN(f->srcfile);
|
||||
char *fdata = BZ_Malloc(len+1);
|
||||
VFS_READ(f->srcfile, fdata, len);
|
||||
VFS_CLOSE(f->srcfile);
|
||||
fdata[len] = 0;
|
||||
man = FS_Manifest_Parse(fdata);
|
||||
if (!man->updateurl)
|
||||
man->updateurl = Z_StrDup(f->fname);
|
||||
BZ_Free(fdata);
|
||||
FS_ChangeGame(man, true);
|
||||
|
||||
f->flags |= HRF_ABORT;
|
||||
Host_DoRunFile(f);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -4385,11 +4387,10 @@ void CL_ExecInitialConfigs(char *resetcommand)
|
|||
{
|
||||
int qrc, hrc, def;
|
||||
|
||||
Cbuf_AddText ("cl_warncmd 0\n", RESTRICT_LOCAL);
|
||||
|
||||
Cmd_ExecuteString("unbindall", RESTRICT_LOCAL);
|
||||
Cmd_ExecuteString("cvarreset *", RESTRICT_LOCAL);
|
||||
Cmd_ExecuteString(resetcommand, RESTRICT_LOCAL);
|
||||
Cbuf_AddText("cl_warncmd 0\n", RESTRICT_LOCAL);
|
||||
Cbuf_AddText("unbindall", RESTRICT_LOCAL);
|
||||
Cbuf_AddText("cvarreset *", RESTRICT_LOCAL);
|
||||
Cbuf_AddText(resetcommand, RESTRICT_LOCAL);
|
||||
|
||||
//who should we imitate?
|
||||
qrc = COM_FDepthFile("quake.rc", true); //q1
|
||||
|
@ -4418,6 +4419,12 @@ void CL_ExecInitialConfigs(char *resetcommand)
|
|||
|
||||
com_parseutf8.ival = com_parseutf8.value;
|
||||
|
||||
//if the renderer is already up and running, be prepared to reload content to match the new conback/font/etc
|
||||
if (qrenderer != QR_NONE)
|
||||
Cbuf_AddText ("vid_reload\n", RESTRICT_LOCAL);
|
||||
if (key_dest == key_menu)
|
||||
Cbuf_AddText ("closemenu\ntogglemenu\n", RESTRICT_LOCAL); //make sure the menu has the right content loaded.
|
||||
|
||||
Cbuf_Execute (); //if the server initialisation causes a problem, give it a place to abort to
|
||||
|
||||
|
||||
|
|
|
@ -36,10 +36,10 @@ extern cvar_t in_xflip;
|
|||
extern float mousecursor_x, mousecursor_y;
|
||||
extern float mousemove_x, mousemove_y;
|
||||
|
||||
#ifdef _SDL
|
||||
//#ifdef _SDL
|
||||
void IN_ActivateMouse(void);
|
||||
void IN_DeactivateMouse(void);
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
int CL_TargettedSplit(qboolean nowrap);
|
||||
|
||||
|
|
|
@ -524,6 +524,7 @@ void R_InitTextures (void)
|
|||
|
||||
|
||||
void R_SetRenderer_f (void);
|
||||
void R_ReloadRenderer_f (void);
|
||||
|
||||
void Renderer_Init(void)
|
||||
{
|
||||
|
@ -540,6 +541,7 @@ void Renderer_Init(void)
|
|||
r_blockvidrestart = true;
|
||||
Cmd_AddCommand("setrenderer", R_SetRenderer_f);
|
||||
Cmd_AddCommand("vid_restart", R_RestartRenderer_f);
|
||||
Cmd_AddCommand("vid_reload", R_ReloadRenderer_f);
|
||||
|
||||
#ifdef RTLIGHTS
|
||||
Cmd_AddCommand ("r_editlights_reload", R_ReloadRTLights_f);
|
||||
|
@ -1326,35 +1328,9 @@ TRACE(("dbg: R_ApplyRenderer: efrags\n"));
|
|||
#endif
|
||||
}
|
||||
|
||||
switch (qrenderer)
|
||||
if (newr && qrenderer != QR_NONE)
|
||||
{
|
||||
case QR_NONE:
|
||||
Con_Printf( "\n"
|
||||
"-----------------------------\n"
|
||||
"Dedicated console created\n");
|
||||
break;
|
||||
case QR_SOFTWARE:
|
||||
Con_Printf( "\n"
|
||||
"-----------------------------\n"
|
||||
"Software renderer initialized\n");
|
||||
break;
|
||||
|
||||
case QR_OPENGL:
|
||||
Con_Printf( "\n"
|
||||
"-----------------------------\n"
|
||||
"OpenGL renderer initialized\n");
|
||||
break;
|
||||
|
||||
case QR_DIRECT3D9:
|
||||
Con_Printf( "\n"
|
||||
"-----------------------------\n"
|
||||
"Direct3d9 renderer initialized\n");
|
||||
break;
|
||||
case QR_DIRECT3D11:
|
||||
Con_Printf( "\n"
|
||||
"-----------------------------\n"
|
||||
"Direct3d11 renderer initialized\n");
|
||||
break;
|
||||
Con_Printf("%s renderer initialized\n", newr->renderer->description);
|
||||
}
|
||||
|
||||
TRACE(("dbg: R_ApplyRenderer: S_Restart_f\n"));
|
||||
|
@ -1368,6 +1344,12 @@ TRACE(("dbg: R_ApplyRenderer: efrags\n"));
|
|||
return true;
|
||||
}
|
||||
|
||||
void R_ReloadRenderer_f (void)
|
||||
{
|
||||
//reloads textures without destroying video context.
|
||||
R_ApplyRenderer_Load(NULL);
|
||||
}
|
||||
|
||||
#define DEFAULT_WIDTH 640
|
||||
#define DEFAULT_HEIGHT 480
|
||||
#define DEFAULT_BPP 32
|
||||
|
|
|
@ -666,7 +666,6 @@ void S_Voip_Decode(unsigned int sender, unsigned int codec, unsigned int gen, un
|
|||
start += len;
|
||||
break;
|
||||
case VOIP_OPUS:
|
||||
#if 1
|
||||
len = bytes;
|
||||
if (decodesamps > 0)
|
||||
{
|
||||
|
@ -686,25 +685,6 @@ void S_Voip_Decode(unsigned int sender, unsigned int codec, unsigned int gen, un
|
|||
|
||||
bytes -= len;
|
||||
start += len;
|
||||
#else
|
||||
//FIXME: we shouldn't need this crap
|
||||
bytes--;
|
||||
len = *start++;
|
||||
if (bytes < len)
|
||||
break;
|
||||
r = qopus_decode(s_voip.decoder[sender], start, len, decodebuf + decodesamps, sizeof(decodebuf)/sizeof(decodebuf[0]) - decodesamps, false);
|
||||
if (r > 0)
|
||||
{
|
||||
decodesamps += r;
|
||||
s_voip.decseq[sender]++;
|
||||
seq++;
|
||||
}
|
||||
else if (r < 0)
|
||||
Con_Printf("Opus decoding error %i\n", r);
|
||||
|
||||
bytes -= len;
|
||||
start += len;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1085,7 +1065,6 @@ void S_Voip_Transmit(unsigned char clc, sizebuf_t *buf)
|
|||
samps+=len / 2; //number of samplepairs eaten in this packet. for stats.
|
||||
break;
|
||||
case VOIP_OPUS:
|
||||
#if 1
|
||||
{
|
||||
//opus rtp only supports/allows a single chunk in each packet.
|
||||
int frames;
|
||||
|
@ -1128,26 +1107,6 @@ void S_Voip_Transmit(unsigned char clc, sizebuf_t *buf)
|
|||
}
|
||||
}
|
||||
break;
|
||||
#else
|
||||
level += S_Voip_Preprocess(start, s_voip.encframesize, micamp);
|
||||
len = qopus_encode(s_voip.encoder, start, s_voip.encframesize, outbuf+(outpos+1), max(255, sizeof(outbuf) - (outpos+1)));
|
||||
if (len == 1) //packet does not need to be transmitted if it returns 1, supposedly. crazyness.
|
||||
len = 0;
|
||||
else if (len > 0)
|
||||
{
|
||||
outbuf[outpos] = len;
|
||||
outpos += 1+len;
|
||||
}
|
||||
else
|
||||
{
|
||||
//error!
|
||||
Con_Printf("Opus encoding error: %i\n", len);
|
||||
}
|
||||
s_voip.encsequence++;
|
||||
samps+=s_voip.encframesize;
|
||||
encpos += s_voip.encframesize*2;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
outbuf[outpos] = 0;
|
||||
break;
|
||||
|
|
|
@ -336,7 +336,6 @@ extern char com_configdir[MAX_OSPATH]; //dir to put cfg_save configs in
|
|||
//extern char *com_basedir;
|
||||
|
||||
void COM_WriteFile (const char *filename, const void *data, int len);
|
||||
FTE_DEPRECATED FILE *COM_WriteFileOpen (char *filename);
|
||||
|
||||
typedef struct {
|
||||
struct searchpath_s *search;
|
||||
|
@ -457,6 +456,7 @@ typedef struct
|
|||
struct
|
||||
{
|
||||
char *path; //the 'pure' name
|
||||
qboolean crcknown; //if the crc was specified
|
||||
unsigned int crc; //the public crc
|
||||
char *mirrors[8]; //a randomized (prioritized) list of http mirrors to use.
|
||||
int mirrornum; //the index we last tried to download from, so we still work even if mirrors are down.
|
||||
|
|
|
@ -261,7 +261,10 @@ void FS_Manifest_Print(ftemanifest_t *man)
|
|||
{
|
||||
if (man->package[i].path)
|
||||
{
|
||||
Con_Printf("package \"%s\" 0x%x", man->package[i].path, man->package[i].crc);
|
||||
if (man->package[i].crcknown)
|
||||
Con_Printf("package \"%s\" 0x%x", man->package[i].path, man->package[i].crc);
|
||||
else
|
||||
Con_Printf("package \"%s\" -", man->package[i].path);
|
||||
for (j = 0; j < sizeof(man->package[i].mirrors) / sizeof(man->package[i].mirrors[0]); j++)
|
||||
if (man->package[i].mirrors[j])
|
||||
Con_Printf(" \"%s\"", man->package[i].mirrors[j]);
|
||||
|
@ -348,11 +351,13 @@ static void FS_Manifest_ParseTokens(ftemanifest_t *man)
|
|||
}
|
||||
else
|
||||
{
|
||||
qboolean crcknown;
|
||||
int crc;
|
||||
int i, j;
|
||||
if (!stricmp(fname, "package"))
|
||||
Cmd_ShiftArgs(1, false);
|
||||
|
||||
crcknown = (strcmp(Cmd_Argv(1), "-") && *Cmd_Argv(1));
|
||||
crc = strtoul(Cmd_Argv(1), NULL, 0);
|
||||
|
||||
for (i = 0; i < sizeof(man->package) / sizeof(man->package[0]); i++)
|
||||
|
@ -360,6 +365,7 @@ static void FS_Manifest_ParseTokens(ftemanifest_t *man)
|
|||
if (!man->package[i].path)
|
||||
{
|
||||
man->package[i].path = Z_StrDup(Cmd_Argv(0));
|
||||
man->package[i].crcknown = crcknown;
|
||||
man->package[i].crc = crc;
|
||||
for (j = 0; j < Cmd_Argc()-2 && j < sizeof(man->package[i].mirrors) / sizeof(man->package[i].mirrors[0]); j++)
|
||||
{
|
||||
|
@ -393,6 +399,13 @@ ftemanifest_t *FS_Manifest_Parse(const char *data)
|
|||
data = Cmd_TokenizeString((char*)data, false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
}
|
||||
if (!man->installation)
|
||||
{ //every manifest should have an internal name specified, so we can use the correct basedir
|
||||
//if we don't recognise it, then we'll typically prompt (or just use the working directory), but always assuming a default at least ensures things are sane.
|
||||
//fixme: we should probably fill in the basegame here (and share that logic with the legacy manifest generation code)
|
||||
data = Cmd_TokenizeString((char*)"game quake", false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
}
|
||||
return man;
|
||||
}
|
||||
|
||||
|
@ -576,22 +589,6 @@ void COM_WriteFile (const char *filename, const void *data, int len)
|
|||
com_fschanged=true;
|
||||
}
|
||||
|
||||
FILE *COM_WriteFileOpen (char *filename) //like fopen, but based around quake's paths.
|
||||
{
|
||||
FILE *f;
|
||||
char name[MAX_OSPATH];
|
||||
|
||||
if (!FS_NativePath(filename, FS_GAMEONLY, name, sizeof(name)))
|
||||
return NULL;
|
||||
|
||||
COM_CreatePath(name);
|
||||
|
||||
f = fopen (name, "wb");
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
COM_CreatePath
|
||||
|
@ -1690,10 +1687,13 @@ static void FS_AddDataFiles(searchpath_t **oldpaths, const char *purepath, const
|
|||
searchpath_t *oldp;
|
||||
char pname[MAX_OSPATH];
|
||||
char lname[MAX_OSPATH];
|
||||
snprintf(lname, sizeof(lname), "%#x", fs_manifest->package[i].crc);
|
||||
if (fs_manifest->package[i].crcknown)
|
||||
snprintf(lname, sizeof(lname), "%#x", fs_manifest->package[i].crc);
|
||||
else
|
||||
snprintf(lname, sizeof(lname), "");
|
||||
if (!FS_GenCachedPakName(fs_manifest->package[i].path, lname, pname, sizeof(pname)))
|
||||
continue;
|
||||
snprintf (lname, sizeof(lname), "%s%s", logicalpath, pname+ptlen+1);
|
||||
snprintf (lname, sizeof(lname), "%s%s", logicalpaths, pname+ptlen+1);
|
||||
|
||||
for (oldp = com_searchpaths; oldp; oldp = oldp->next)
|
||||
{
|
||||
|
@ -1714,7 +1714,7 @@ static void FS_AddDataFiles(searchpath_t **oldpaths, const char *purepath, const
|
|||
handle = OpenNew (vfs, lname);
|
||||
}
|
||||
}
|
||||
if (handle)
|
||||
if (handle && fs_manifest->package[i].crcknown)
|
||||
{
|
||||
int truecrc = handle->GeneratePureCRC(handle, 0, false);
|
||||
if (truecrc != fs_manifest->package[i].crc)
|
||||
|
@ -3317,6 +3317,7 @@ static void FS_PackageDownloaded(struct dl_download *dl)
|
|||
}
|
||||
static void FS_BeginNextPackageDownload(void)
|
||||
{
|
||||
char *crcstr;
|
||||
int j;
|
||||
ftemanifest_t *man = fs_manifest;
|
||||
vfsfile_t *check;
|
||||
|
@ -3329,7 +3330,11 @@ static void FS_BeginNextPackageDownload(void)
|
|||
if (!man->package[j].path)
|
||||
continue;
|
||||
|
||||
if (!FS_GenCachedPakName(man->package[j].path, va("%#x", man->package[j].crc), buffer, sizeof(buffer)))
|
||||
if (man->package[j].crcknown)
|
||||
crcstr = va("%#x", man->package[j].crc);
|
||||
else
|
||||
crcstr = "";
|
||||
if (!FS_GenCachedPakName(man->package[j].path, crcstr, buffer, sizeof(buffer)))
|
||||
continue;
|
||||
|
||||
check = FS_OpenVFS(buffer, "rb", FS_ROOT);
|
||||
|
@ -3339,7 +3344,7 @@ static void FS_BeginNextPackageDownload(void)
|
|||
continue;
|
||||
}
|
||||
FS_NativePath(buffer, FS_ROOT, fspdl_finalpath, sizeof(fspdl_finalpath));
|
||||
if (!FS_GenCachedPakName(va("%s.tmp", man->package[j].path), va("%#x", man->package[j].crc), buffer, sizeof(buffer)))
|
||||
if (!FS_GenCachedPakName(va("%s.tmp", man->package[j].path), crcstr, buffer, sizeof(buffer)))
|
||||
continue;
|
||||
FS_NativePath(buffer, FS_ROOT, fspdl_temppath, sizeof(fspdl_temppath));
|
||||
|
||||
|
|
|
@ -605,7 +605,7 @@ static void SnapVector( vec3_t normal )
|
|||
normal[i] = 1;
|
||||
break;
|
||||
}
|
||||
if( fabs( normal[i] - -1 ) < PLANE_NORMAL_EPSILON )
|
||||
if( fabs( normal[i] + 1 ) < PLANE_NORMAL_EPSILON )
|
||||
{
|
||||
VectorClear( normal );
|
||||
normal[i] = -1;
|
||||
|
|
|
@ -17406,6 +17406,170 @@
|
|||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\gl\gl_vidsdl.c"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="MinGLDebug|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MinGLDebug|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="D3DDebug|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="D3DDebug|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MinGLRelease|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MinGLRelease|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="GLDebug|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="GLDebug|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release Dedicated Server|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release Dedicated Server|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MRelease|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MRelease|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug Dedicated Server|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug Dedicated Server|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MDebug|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="MDebug|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="GLRelease|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="GLRelease|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="D3DRelease|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="D3DRelease|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\client\in_macos.c"
|
||||
>
|
||||
|
|
|
@ -453,10 +453,7 @@ void GLDraw_Init (void)
|
|||
int maxtexsize;
|
||||
|
||||
if (gltextures)
|
||||
{
|
||||
Con_Printf("gl_draw didn't shut down cleanly\n");
|
||||
gltextures = NULL;
|
||||
}
|
||||
|
||||
memset(gltexturetablebuckets, 0, sizeof(gltexturetablebuckets));
|
||||
Hash_InitTable(&gltexturetable, sizeof(gltexturetablebuckets)/sizeof(gltexturetablebuckets[0]), gltexturetablebuckets);
|
||||
|
@ -470,12 +467,16 @@ void GLDraw_Init (void)
|
|||
|
||||
maxtexsize = gl_max_size.value;
|
||||
|
||||
if (uploadmemorybuffer)
|
||||
BZ_Free(uploadmemorybuffer);
|
||||
if (uploadmemorybufferintermediate)
|
||||
BZ_Free(uploadmemorybufferintermediate);
|
||||
//required to hold the image after scaling has occured
|
||||
sizeofuploadmemorybuffer = 1;
|
||||
sizeofuploadmemorybufferintermediate = 1;
|
||||
sizeofuploadmemorybuffer = 0;
|
||||
sizeofuploadmemorybufferintermediate = 0;
|
||||
TRACE(("dbg: GLDraw_ReInit: Allocating upload buffers\n"));
|
||||
uploadmemorybuffer = BZ_Realloc(uploadmemorybuffer, sizeofuploadmemorybuffer);
|
||||
uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate);
|
||||
uploadmemorybuffer = NULL;
|
||||
uploadmemorybufferintermediate = NULL;
|
||||
|
||||
R2D_Init();
|
||||
|
||||
|
|
|
@ -11,6 +11,115 @@
|
|||
static qboolean httpserverinitied = false;
|
||||
qboolean httpserverfailed = false;
|
||||
static int httpserversocket;
|
||||
static int httpserverport;
|
||||
|
||||
#ifdef WEBSVONLY
|
||||
static int natpmpsocket = INVALID_SOCKET;
|
||||
static int natpmptime;
|
||||
#include <mmsystem.h>
|
||||
static void sendnatpmp(int port)
|
||||
{
|
||||
struct sockaddr_in router;
|
||||
struct
|
||||
{
|
||||
qbyte ver;
|
||||
qbyte op;
|
||||
short reserved1;
|
||||
short privport; short pubport;
|
||||
int mapping_expectancy;
|
||||
} pmpreqmsg;
|
||||
|
||||
int curtime = timeGetTime();
|
||||
if (natpmpsocket == INVALID_SOCKET)
|
||||
{
|
||||
unsigned long _true = true;
|
||||
natpmpsocket = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (natpmpsocket == INVALID_SOCKET)
|
||||
return;
|
||||
ioctlsocket (natpmpsocket, FIONBIO, &_true);
|
||||
}
|
||||
else if (curtime - natpmptime < 0)
|
||||
return;
|
||||
natpmptime = curtime+60*1000;
|
||||
|
||||
memset(&router, 0, sizeof(router));
|
||||
router.sin_family = AF_INET;
|
||||
router.sin_port = htons(5351);
|
||||
router.sin_addr.S_un.S_un_b.s_b1 = 192;
|
||||
router.sin_addr.S_un.S_un_b.s_b2 = 168;
|
||||
router.sin_addr.S_un.S_un_b.s_b3 = 0;
|
||||
router.sin_addr.S_un.S_un_b.s_b4 = 1;
|
||||
|
||||
pmpreqmsg.ver = 0;
|
||||
pmpreqmsg.op = 0;
|
||||
pmpreqmsg.reserved1 = htons(0);
|
||||
pmpreqmsg.privport = htons(port);
|
||||
pmpreqmsg.pubport = htons(port);
|
||||
pmpreqmsg.mapping_expectancy = htons(60*5);
|
||||
|
||||
sendto(natpmpsocket, (void*)&pmpreqmsg, 2, 0, (struct sockaddr*)&router, sizeof(router));
|
||||
|
||||
pmpreqmsg.op = 2;
|
||||
sendto(natpmpsocket, (void*)&pmpreqmsg, sizeof(pmpreqmsg), 0, (struct sockaddr*)&router, sizeof(router));
|
||||
}
|
||||
void checknatpmp(int port)
|
||||
{
|
||||
struct
|
||||
{
|
||||
qbyte ver; qbyte op; short resultcode;
|
||||
int age;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
short privport; short pubport;
|
||||
int mapping_expectancy;
|
||||
};
|
||||
qbyte ipv4[4];
|
||||
};
|
||||
} pmpreqrep;
|
||||
struct sockaddr_in from;
|
||||
int fromlen = sizeof(from);
|
||||
int len;
|
||||
static int oldip=-1;
|
||||
static short oldport;
|
||||
memset(&pmpreqrep, 0, sizeof(pmpreqrep));
|
||||
sendnatpmp(port);
|
||||
if (natpmpsocket == INVALID_SOCKET)
|
||||
len = -1;
|
||||
else
|
||||
len = recvfrom(natpmpsocket, (void*)&pmpreqrep, sizeof(pmpreqrep), 0, (struct sockaddr*)&from, &fromlen);
|
||||
if (len == 12 && pmpreqrep.op == 128)
|
||||
{
|
||||
if (oldip != *(int*)pmpreqrep.ipv4)
|
||||
{
|
||||
oldip = *(int*)pmpreqrep.ipv4;
|
||||
oldport = 0;
|
||||
IWebPrintf("Public ip is %i.%i.%i.%i\n", pmpreqrep.ipv4[0], pmpreqrep.ipv4[1], pmpreqrep.ipv4[2], pmpreqrep.ipv4[3]);
|
||||
}
|
||||
}
|
||||
else if (len == 16 && pmpreqrep.op == 129)
|
||||
{
|
||||
if (oldport != pmpreqrep.pubport)
|
||||
{
|
||||
oldport = pmpreqrep.pubport;
|
||||
IWebPrintf("Public udp port %i (local %i)\n", ntohs(pmpreqrep.pubport), ntohs(pmpreqrep.privport));
|
||||
}
|
||||
}
|
||||
else if (len == 16 && pmpreqrep.op == 130)
|
||||
{
|
||||
if (oldport != pmpreqrep.pubport)
|
||||
{
|
||||
oldport = pmpreqrep.pubport;
|
||||
IWebPrintf("Public tcp port %i (local %i)\n", ntohs(pmpreqrep.pubport), ntohs(pmpreqrep.privport));
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
void checknatpmp(int port)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef enum {HTTP_WAITINGFORREQUEST,HTTP_SENDING} http_mode_t;
|
||||
|
||||
|
@ -64,6 +173,7 @@ qboolean HTTP_ServerInit(int port)
|
|||
|
||||
httpserverinitied = true;
|
||||
httpserverfailed = false;
|
||||
httpserverport = port;
|
||||
|
||||
IWebPrintf("HTTP server is running\n");
|
||||
return true;
|
||||
|
@ -554,6 +664,8 @@ qboolean HTTP_ServerPoll(qboolean httpserverwanted, int portnum) //loop while tr
|
|||
|
||||
HTTP_active_connections_t *cl;
|
||||
|
||||
if (httpserverport != portnum && httpserverinitied)
|
||||
HTTP_ServerShutdown();
|
||||
if (!httpserverinitied)
|
||||
{
|
||||
if (httpserverwanted)
|
||||
|
@ -566,6 +678,8 @@ qboolean HTTP_ServerPoll(qboolean httpserverwanted, int portnum) //loop while tr
|
|||
return false;
|
||||
}
|
||||
|
||||
checknatpmp(httpserverport);
|
||||
|
||||
if (httpconnectioncount>32)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -1102,7 +1102,10 @@ pubprogfuncs_t deffuncs = {
|
|||
PR_UglyValueString,
|
||||
ED_ParseEval
|
||||
};
|
||||
#undef printf
|
||||
static int PDECL qclib_null_printf(const char *s, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//defs incase following structure is not passed.
|
||||
struct edict_s *safesv_edicts;
|
||||
|
@ -1115,7 +1118,7 @@ progexterns_t defexterns = {
|
|||
NULL, //char *(*ReadFile) (char *fname, void *buffer, int len);
|
||||
NULL, //int (*FileSize) (char *fname); //-1 if file does not exist
|
||||
NULL, //bool (*WriteFile) (char *name, void *data, int len);
|
||||
printf, //void (*printf) (char *, ...);
|
||||
qclib_null_printf, //void (*printf) (char *, ...);
|
||||
(void*)exit, //void (*Sys_Error) (char *, ...);
|
||||
NULL, //void (*Abort) (char *, ...);
|
||||
sizeof(edictrun_t), //int edictsize; //size of edict_t
|
||||
|
|
Loading…
Reference in a new issue