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