1 // SONIC ROBO BLAST 2 2 //----------------------------------------------------------------------------- 3 // Copyright (C) 1998-2000 by DooM Legacy Team. 4 // Copyright (C) 1999-2020 by Sonic Team Junior. 5 // 6 // This program is free software distributed under the 7 // terms of the GNU General Public License, version 2. 8 // See the 'LICENSE' file for more details. 9 //----------------------------------------------------------------------------- 10 /// \file d_netfil.h 11 /// \brief File transferring related structs and functions. 12 13 #ifndef __D_NETFIL__ 14 #define __D_NETFIL__ 15 16 #include "d_net.h" 17 #include "d_clisrv.h" 18 #include "w_wad.h" 19 20 typedef enum 21 { 22 SF_FILE, 23 SF_Z_RAM, 24 SF_RAM, 25 SF_NOFREERAM 26 } freemethod_t; 27 28 typedef enum 29 { 30 FS_NOTFOUND, 31 FS_FOUND, 32 FS_REQUESTED, 33 FS_DOWNLOADING, 34 FS_OPEN, // Is opened and used in w_wad 35 FS_MD5SUMBAD 36 } filestatus_t; 37 38 typedef struct 39 { 40 UINT8 willsend; // Is the server willing to send it? 41 char filename[MAX_WADPATH]; 42 UINT8 md5sum[16]; 43 filestatus_t status; // The value returned by recsearch 44 boolean justdownloaded; // To prevent late fragments from causing an I_Error 45 46 // Used only for download 47 FILE *file; 48 boolean *receivedfragments; 49 UINT32 fragmentsize; 50 UINT8 iteration; 51 fileack_pak *ackpacket; 52 UINT32 currentsize; 53 UINT32 totalsize; 54 UINT32 ackresendposition; // Used when resuming downloads 55 } fileneeded_t; 56 57 extern INT32 fileneedednum; 58 extern fileneeded_t fileneeded[MAX_WADFILES]; 59 extern char downloaddir[512]; 60 61 #ifndef NONET 62 extern INT32 lastfilenum; 63 #endif 64 65 UINT8 *PutFileNeeded(void); 66 void D_ParseFileneeded(INT32 fileneedednum_parm, UINT8 *fileneededstr); 67 void CL_PrepareDownloadSaveGame(const char *tmpsave); 68 69 INT32 CL_CheckFiles(void); 70 void CL_LoadServerFiles(void); 71 void AddRamToSendQueue(INT32 node, void *data, size_t size, freemethod_t freemethod, 72 UINT8 fileid); 73 74 void FileSendTicker(void); 75 void PT_FileAck(void); 76 void PT_FileReceived(void); 77 boolean SendingFile(INT32 node); 78 79 void FileReceiveTicker(void); 80 void PT_FileFragment(void); 81 82 boolean CL_CheckDownloadable(void); 83 boolean CL_SendFileRequest(void); 84 boolean PT_RequestFile(INT32 node); 85 86 typedef enum 87 { 88 LFTNS_NONE, // This node is not connected 89 LFTNS_WAITING, // This node is waiting for the server to send the file 90 LFTNS_ASKED, // The server has told the node they're ready to send the file 91 LFTNS_SENDING, // The server is sending the file to this node 92 LFTNS_SENT // The node already has the file 93 } luafiletransfernodestatus_t; 94 95 typedef struct luafiletransfer_s 96 { 97 char *filename; 98 char *realfilename; 99 char mode[4]; // rb+/wb+/ab+ + null character 100 INT32 id; // Callback ID 101 boolean ongoing; 102 luafiletransfernodestatus_t nodestatus[MAXNETNODES]; 103 tic_t nodetimeouts[MAXNETNODES]; 104 struct luafiletransfer_s *next; 105 } luafiletransfer_t; 106 107 extern luafiletransfer_t *luafiletransfers; 108 extern boolean waitingforluafiletransfer; 109 extern boolean waitingforluafilecommand; 110 extern char luafiledir[256 + 16]; 111 112 void AddLuaFileTransfer(const char *filename, const char *mode); 113 void SV_PrepareSendLuaFile(void); 114 boolean AddLuaFileToSendQueue(INT32 node, const char *filename); 115 void SV_HandleLuaFileSent(UINT8 node); 116 void RemoveLuaFileTransfer(void); 117 void RemoveAllLuaFileTransfers(void); 118 void SV_AbortLuaFileTransfer(INT32 node); 119 void CL_PrepareDownloadLuaFile(void); 120 void Got_LuaFile(UINT8 **cp, INT32 playernum); 121 void StoreLuaFileCallback(INT32 id); 122 void RemoveLuaFileCallback(INT32 id); 123 void MakePathDirs(char *path); 124 125 void SV_AbortSendFiles(INT32 node); 126 void CloseNetFile(void); 127 void CL_AbortDownloadResume(void); 128 129 void Command_Downloads_f(void); 130 131 boolean fileexist(char *filename, time_t ptime); 132 133 // Search a file in the wadpath, return FS_FOUND when found 134 filestatus_t findfile(char *filename, const UINT8 *wantedmd5sum, 135 boolean completepath); 136 filestatus_t checkfilemd5(char *filename, const UINT8 *wantedmd5sum); 137 138 void nameonly(char *s); 139 size_t nameonlylength(const char *s); 140 141 #endif // __D_NETFIL__ 142