1
0
Fork 0
forked from fte/fteqw
fteqw/engine/http/iweb.h

168 lines
5.2 KiB
C

#ifndef IWEB_H__
#define IWEB_H__
qboolean SV_AllowDownload (const char *name);
#if defined(WEBSERVER) || defined(FTPSERVER)
#ifdef WEBSVONLY
//When running standalone
#define Con_TPrintf IWebPrintf
void VARGS IWebDPrintf(char *fmt, ...) LIKEPRINTF(1);
#define IWebPrintf printf
#define com_gamedir "." //current dir.
#define IWebMalloc(x) calloc(x, 1)
#define IWebRealloc(x, y) realloc(x, y)
#define IWebFree free
#else
//Inside FTE
#define IWebDPrintf Con_DPrintf
#define IWebPrintf Con_Printf
#define IWebMalloc Z_Malloc
#define IWebRealloc BZF_Realloc
#define IWebFree Z_Free
void VARGS IWebWarnPrintf(char *fmt, ...) LIKEPRINTF(1);
#endif
#define IWEBACC_READ 1
#define IWEBACC_WRITE 2
#define IWEBACC_FULL 4
struct sockaddr_in;
struct sockaddr;
struct sockaddr_qstorage;
int NetadrToSockadr (netadr_t *a, struct sockaddr_qstorage *s);
#if defined(__unix__) && !defined(__CYGWIN__)
#include <sys/epoll.h>
#endif
typedef qboolean iwboolean;
typedef struct {
float gentime; //useful for generating a new file (if too old, removes reference)
int references; //freed if 0
char *data;
int len;
} IWeb_FileGen_t;
int IWebAuthorize(const char *name, const char *password);
iwboolean IWebAllowUpLoad(const char *fname, const char *uname);
vfsfile_t *IWebGenerateFile(const char *name, const char *content, int contentlength);
int IWebGetSafeListeningPort(void);
//char *COM_ParseOut (const char *data, char *out, int outlen);
//struct searchpath_s;
//void COM_EnumerateFiles (const char *match, int (*func)(const char *, int, void *, struct searchpath_s *), void *parm);
char *Q_strcpyline(char *out, const char *in, int maxlen);
//server tick/control functions
iwboolean FTP_ServerRun(iwboolean ftpserverwanted, int port);
qboolean HTTP_ServerInit(int epfd, int port);
//server interface called from main server routines.
void IWebInit(void);
void IWebRun(void);
void IWebShutdown(void);
/*
qboolean FTP_Client_Command (char *cmd, void (*NotifyFunction)(vfsfile_t *file, char *localfile, qboolean sucess));
void IRC_Command(char *imsg);
void FTP_ClientThink (void);
void IRC_Frame(void);
*/
qboolean SV_POP3(qboolean activewanted);
qboolean SV_SMTP(qboolean activewanted);
#endif
#if 1
struct dl_download
{
/*not used by anything in the download itself, useful for context*/
unsigned int user_num;
float user_float;
void *user_ctx;
int user_sequence;
qboolean isquery; //will not be displayed in the download/progress bar stuff.
#ifdef HAVE_CLIENT
qdownload_t qdownload;
#endif
/*stream config*/
char *url; /*original url*/
char redir[MAX_OSPATH]; /*current redirected url*/
unsigned int redircount; /* so no infinite redirects with naughty servers.*/
char localname[MAX_OSPATH]; /*leave empty for a temp file*/
enum fs_relative fsroot;
struct vfsfile_s *file; /*downloaded to, if not already set when starting will open localname or a temp file*/
char postmimetype[64];
char *postdata; /*if set, this is a post and not a get*/
size_t postlen;
/*stream status*/
enum
{
DL_PENDING, /*not started*/
DL_FAILED, /*gave up*/
DL_RESOLVING, /*resolving the host*/
DL_QUERY, /*sent query, waiting for response*/
DL_ACTIVE, /*receiving data*/
DL_FINISHED /*its complete*/
} status;
unsigned int replycode;
size_t totalsize; /*max size (can be 0 for unknown)*/
size_t completed; /*ammount correctly received so far*/
size_t sizelimit;
/*internals*/
#ifdef MULTITHREAD
qboolean threadenable;
void *threadctx;
#endif
void *ctx; /*internal context, depending on http/ftp/etc protocol*/
void (*abort) (struct dl_download *); /*cleans up the internal context*/
qboolean (*poll) (struct dl_download *);
/*not used internally by the backend, but used by HTTP_CL_Get/thread wrapper*/
struct dl_download *next;
qboolean (*notifystarted) (struct dl_download *dl, char *mimetype); //mime can be null for some protocols, read dl->totalsize for size. false if the mime just isn't acceptable.
void (*notifycomplete) (struct dl_download *dl); //lets the requester know that the download context is complete and the handle is no longer valid.
};
vfsfile_t *VFSPIPE_Open(int refs, qboolean seekable); //refs should be 1 or 2, to say how many times it must be closed before its actually closed, so both ends can close separately
vfsfile_t *VFS_OpenPipeCallback(void (*callback)(void*ctx, vfsfile_t *file), void *ctx);
void HTTP_CL_Think(const char **fname, float *percent);
void HTTP_CL_Terminate(void); //kills all active downloads
unsigned int HTTP_CL_GetActiveDownloads(void);
struct dl_download *HTTP_CL_Get(const char *url, const char *localfile, void (*NotifyFunction)(struct dl_download *dl));
struct dl_download *HTTP_CL_Put(const char *url, const char *mime, const char *data, size_t datalen, void (*NotifyFunction)(struct dl_download *dl));
struct dl_download *DL_Create(const char *url);
qboolean DL_CreateThread(struct dl_download *dl, vfsfile_t *file, void (*NotifyFunction)(struct dl_download *dl));
void DL_Close(struct dl_download *dl);
void DL_DeThread(void);
//internal 'http' error codes.
#define HTTP_DNSFAILURE 900 //no ip known
#define HTTP_NORESPONSE 901 //tcp failure
#define HTTP_REFUSED 902 //tcp failure
#define HTTP_EOF 903 //unexpected eof
#define HTTP_MITM 904 //wrong cert
#define HTTP_UNTRUSTED 905 //unverifiable cert
#endif
#endif