]> icculus.org git repositories - taylor/freespace2.git/blob - src/inetfile/inetgetfile.cpp
safer strings using SDL string functions
[taylor/freespace2.git] / src / inetfile / inetgetfile.cpp
1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell 
5  * or otherwise commercially exploit the source or things you created based on
6  * the source.
7  */
8
9  /*
10  * $Logfile: /Freespace2/code/Inetfile/inetgetfile.cpp $
11  * $Revision$
12  * $Date$
13  * $Author$
14  *
15  * InternetGetFile Class
16  *
17  * $Log$
18  * Revision 1.6  2005/08/12 08:50:09  taylor
19  * recursively create directories (hurt more on OSX) and update all _mkdir() calls accordingly
20  *
21  * Revision 1.5  2002/06/09 04:41:21  relnev
22  * added copyright header
23  *
24  * Revision 1.4  2002/05/26 20:32:24  theoddone33
25  * Fix some minor stuff
26  *
27  * Revision 1.3  2002/05/26 20:20:54  relnev
28  * unix.h: updated
29  *
30  * inetfile: complete
31  *
32  * Revision 1.2  2002/05/07 03:16:45  theoddone33
33  * The Great Newline Fix
34  *
35  * Revision 1.1.1.1  2002/05/03 03:28:09  root
36  * Initial import.
37  *
38  * 
39  * 4     8/22/99 1:19p Dave
40  * Fixed up http proxy code. Cleaned up scoring code. Reverse the order in
41  * which d3d cards are detected.
42  * 
43  * 3     6/16/99 10:27a Andsager
44  * Make directory if it does not already exist.
45  * 
46  * 2     4/20/99 6:39p Dave
47  * Almost done with artillery targeting. Added support for downloading
48  * images on the PXO screen.
49  * 
50  * 1     4/20/99 4:37p Dave
51  *
52  * Initial version
53  *
54  * $NoKeywords: $
55  */
56
57
58 #ifndef PLAT_UNIX
59 #include <windows.h>
60 #include <direct.h> 
61 #endif
62
63 #include <stdio.h>
64 #include <stdlib.h>
65 #include <string.h>
66
67 #include "pstypes.h"
68 #include "cftp.h"
69 #include "chttpget.h"
70
71 #include "inetgetfile.h"
72
73
74 #define INET_STATE_CONNECTING           1
75 #define INET_STATE_ERROR                        2
76 #define INET_STATE_RECEIVING            3
77 #define INET_STATE_GOT_FILE             4
78
79 void InetGetFile::AbortGet()
80 {
81         if(m_bUseHTTP)
82         {
83                 http->AbortGet();
84         }
85         else
86         {
87                 ftp->AbortGet();
88         }
89 }
90
91 InetGetFile::InetGetFile(char *URL,char *localfile)
92 {
93         m_HardError = 0;
94         http=NULL;
95         ftp=NULL;
96         if ((URL==NULL)||(localfile==NULL)) {
97                 m_HardError = INET_ERROR_BADPARMS;
98         }
99
100         // create directory if not already there.
101         char dir_name[256], *end;
102
103         // make sure localfile has \ in it or we'll be here a long time.
104         if (strstr(localfile, DIR_SEPARATOR_STR)) {
105                 SDL_strlcpy(dir_name, localfile, sizeof(dir_name));
106                 int len = strlen(localfile);
107                 end = dir_name + len;
108
109                 // start from end of localfile and go to first \ to get dirname
110                 while ( *end != DIR_SEPARATOR_CHAR ) {
111                         end--;
112                 }
113                 *end = '\0';
114
115                 if ( _mkdir(dir_name)==0 )      {       
116                         mprintf(( "CFILE: Created new directory '%s'\n", dir_name ));
117                 }
118         }
119
120         if (strstr(URL,"http:")) {
121                 m_bUseHTTP = TRUE;
122
123                 // using http proxy?
124                 extern char Multi_options_proxy[512];
125                 extern ushort Multi_options_proxy_port;
126                 if(strlen(Multi_options_proxy) > 0){
127                         http = new ChttpGet(URL, localfile, Multi_options_proxy, Multi_options_proxy_port);
128                 } else {
129                         http = new ChttpGet(URL, localfile);
130                 }
131
132                 if (http==NULL) {
133                         m_HardError = INET_ERROR_NO_MEMORY;
134                 }
135         } else if (strstr(URL,"ftp:")) {
136                 m_bUseHTTP = FALSE;
137                 ftp = new CFtpGet(URL,localfile);
138                 if (ftp==NULL) {
139                         m_HardError = INET_ERROR_NO_MEMORY;
140                 }
141         } else {
142                 m_HardError = INET_ERROR_CANT_PARSE_URL;
143         }
144         SDL_Delay(1000);
145 }
146
147 InetGetFile::~InetGetFile()
148 {
149         if(http!=NULL) delete http;
150         if(ftp!=NULL) delete ftp;
151 }
152
153 BOOL InetGetFile::IsConnecting()
154 {
155         int state;
156         if(m_bUseHTTP)
157         {
158                 state = http->GetStatus();
159         }
160         else
161         {
162                 state = ftp->GetStatus();
163         }
164         if(state == FTP_STATE_CONNECTING)
165         {
166                 return TRUE;
167         }
168         else
169         {
170                 return FALSE;
171         }
172
173 }
174
175 BOOL InetGetFile::IsReceiving()
176 {
177         int state;
178         if(m_bUseHTTP)
179         {
180                 state = http->GetStatus();
181         }
182         else
183         {
184                 state = ftp->GetStatus();
185         }
186         if(state == FTP_STATE_RECEIVING)
187         {
188                 return TRUE;
189         }
190         else
191         {
192                 return FALSE;
193         }
194 }
195
196 BOOL InetGetFile::IsFileReceived()
197 {
198         int state;
199         if(m_bUseHTTP)
200         {
201                 state = http->GetStatus();
202         }
203         else
204         {
205                 state = ftp->GetStatus();
206         }
207         if(state == FTP_STATE_FILE_RECEIVED)
208         {
209                 return TRUE;
210         }
211         else
212         {
213                 return FALSE;
214         }
215 }
216
217 BOOL InetGetFile::IsFileError()
218 {
219         int state;
220         if(m_HardError) return TRUE;
221         if(m_bUseHTTP)
222         {
223                 state = http->GetStatus();
224         }
225         else
226         {
227                 state = ftp->GetStatus();
228         }
229         switch(state)
230         {
231
232         case FTP_STATE_URL_PARSING_ERROR:
233         case FTP_STATE_HOST_NOT_FOUND:
234         case FTP_STATE_DIRECTORY_INVALID:
235         case FTP_STATE_FILE_NOT_FOUND:
236         case FTP_STATE_CANT_CONNECT:
237         case FTP_STATE_LOGIN_ERROR:
238         case FTP_STATE_INTERNAL_ERROR:
239         case FTP_STATE_SOCKET_ERROR:
240         case FTP_STATE_UNKNOWN_ERROR:
241         case FTP_STATE_RECV_FAILED:
242         case FTP_STATE_CANT_WRITE_FILE:
243                 return TRUE;
244         case FTP_STATE_CONNECTING:
245                 return FALSE;
246         default:
247                 return FALSE;
248         }
249 }
250
251 int InetGetFile::GetErrorCode()
252 {
253         int state;
254         if(m_HardError) return m_HardError;
255         if(m_bUseHTTP)
256         {
257                 state = http->GetStatus();
258         }
259         else
260         {
261                 state = ftp->GetStatus();
262         }
263         switch(state)
264         {
265
266         case FTP_STATE_URL_PARSING_ERROR:
267                 return INET_ERROR_CANT_PARSE_URL;
268
269         case FTP_STATE_HOST_NOT_FOUND:
270                 return INET_ERROR_HOST_NOT_FOUND;
271
272
273         case FTP_STATE_DIRECTORY_INVALID:
274         case FTP_STATE_FILE_NOT_FOUND:
275                 return INET_ERROR_BAD_FILE_OR_DIR;
276
277         case FTP_STATE_CANT_CONNECT:
278         case FTP_STATE_LOGIN_ERROR:
279         case FTP_STATE_INTERNAL_ERROR:
280         case FTP_STATE_SOCKET_ERROR:
281         case FTP_STATE_UNKNOWN_ERROR:
282         case FTP_STATE_RECV_FAILED:
283
284                 return INET_ERROR_UNKNOWN_ERROR;
285
286         case FTP_STATE_CANT_WRITE_FILE:
287                 return INET_ERROR_CANT_WRITE_FILE;
288         default:
289                 return INET_ERROR_NO_ERROR;
290         }
291 }
292
293 int InetGetFile::GetTotalBytes()
294 {
295         if(m_bUseHTTP)
296         {
297                 return http->GetTotalBytes();
298         }
299         else
300         {
301                 return ftp->GetTotalBytes();
302         }
303 }
304
305 int InetGetFile::GetBytesIn()
306 {
307         if(m_bUseHTTP)
308         {
309                 return http->GetBytesIn();
310         }
311         else
312         {
313                 return ftp->GetBytesIn();
314         }
315 }