wininet: Revert commit 760043c2455a90cd74178d98b7c81bfbfc81793f.
[wine] / dlls / wininet / internet.h
1 /*
2  * Wininet
3  *
4  * Copyright 1999 Corel Corporation
5  *
6  * Ulrich Czekalla
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22
23 #ifndef _WINE_INTERNET_H_
24 #define _WINE_INTERNET_H_
25
26 #include "wine/unicode.h"
27
28 #include <time.h>
29 #ifdef HAVE_NETDB_H
30 # include <netdb.h>
31 #endif
32 #ifdef HAVE_NETINET_IN_H
33 # include <sys/types.h>
34 # include <netinet/in.h>
35 #endif
36 #ifdef HAVE_OPENSSL_SSL_H
37 #define DSA __ssl_DSA  /* avoid conflict with commctrl.h */
38 #undef FAR
39 # include <openssl/ssl.h>
40 #undef FAR
41 #define FAR do_not_use_this_in_wine
42 #undef DSA
43 #endif
44 #ifdef HAVE_SYS_SOCKET_H
45 # include <sys/socket.h>
46 #endif
47
48 #if defined(__MINGW32__) || defined (_MSC_VER)
49 #include "winsock2.h"
50 #ifndef MSG_WAITALL
51 #define MSG_WAITALL 0
52 #endif
53 #else
54 #define closesocket close
55 #endif /* __MINGW32__ */
56
57 /* used for netconnection.c stuff */
58 typedef struct
59 {
60     BOOL useSSL;
61     int socketFD;
62 #ifdef HAVE_OPENSSL_SSL_H
63     SSL *ssl_s;
64     char *peek_msg;
65     char *peek_msg_mem;
66     size_t peek_len;
67 #endif
68 } WININET_NETCONNECTION;
69
70 inline static LPSTR WININET_strdup( LPCSTR str )
71 {
72     LPSTR ret = HeapAlloc( GetProcessHeap(), 0, strlen(str) + 1 );
73     if (ret) strcpy( ret, str );
74     return ret;
75 }
76
77 inline static LPWSTR WININET_strdupW( LPCWSTR str )
78 {
79     LPWSTR ret = HeapAlloc( GetProcessHeap(), 0, (strlenW(str) + 1)*sizeof(WCHAR) );
80     if (ret) strcpyW( ret, str );
81     return ret;
82 }
83
84 inline static LPWSTR WININET_strdup_AtoW( LPCSTR str )
85 {
86     int len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0);
87     LPWSTR ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
88     if (ret)
89         MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len);
90     return ret;
91 }
92
93 inline static LPSTR WININET_strdup_WtoA( LPCWSTR str )
94 {
95     int len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
96     LPSTR ret = HeapAlloc( GetProcessHeap(), 0, len );
97     if (ret)
98         WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL);
99     return ret;
100 }
101
102 inline static void WININET_find_data_WtoA(LPWIN32_FIND_DATAW dataW, LPWIN32_FIND_DATAA dataA)
103 {
104     dataA->dwFileAttributes = dataW->dwFileAttributes;
105     dataA->ftCreationTime   = dataW->ftCreationTime;
106     dataA->ftLastAccessTime = dataW->ftLastAccessTime;
107     dataA->ftLastWriteTime  = dataW->ftLastWriteTime;
108     dataA->nFileSizeHigh    = dataW->nFileSizeHigh;
109     dataA->nFileSizeLow     = dataW->nFileSizeLow;
110     dataA->dwReserved0      = dataW->dwReserved0;
111     dataA->dwReserved1      = dataW->dwReserved1;
112     WideCharToMultiByte(CP_ACP, 0, dataW->cFileName, -1, 
113         dataA->cFileName, sizeof(dataA->cFileName),
114         NULL, NULL);
115     WideCharToMultiByte(CP_ACP, 0, dataW->cAlternateFileName, -1, 
116         dataA->cAlternateFileName, sizeof(dataA->cAlternateFileName),
117         NULL, NULL);
118 }
119
120 typedef enum
121 {
122     WH_HINIT = INTERNET_HANDLE_TYPE_INTERNET,
123     WH_HFTPSESSION = INTERNET_HANDLE_TYPE_CONNECT_FTP,
124     WH_HGOPHERSESSION = INTERNET_HANDLE_TYPE_CONNECT_GOPHER,
125     WH_HHTTPSESSION = INTERNET_HANDLE_TYPE_CONNECT_HTTP,
126     WH_HFILE = INTERNET_HANDLE_TYPE_FTP_FILE,
127     WH_HFTPFINDNEXT = INTERNET_HANDLE_TYPE_FTP_FIND,
128     WH_HHTTPREQ = INTERNET_HANDLE_TYPE_HTTP_REQUEST,
129 } WH_TYPE;
130
131 #define INET_OPENURL 0x0001
132 #define INET_CALLBACKW 0x0002
133
134 struct _WININETHANDLEHEADER;
135 typedef struct _WININETHANDLEHEADER WININETHANDLEHEADER, *LPWININETHANDLEHEADER;
136
137 typedef void (*WININET_object_destructor)( LPWININETHANDLEHEADER );
138
139 struct _WININETHANDLEHEADER
140 {
141     WH_TYPE htype;
142     HINTERNET hInternet;
143     DWORD  dwFlags;
144     DWORD  dwContext;
145     DWORD  dwError;
146     DWORD  dwInternalFlags;
147     DWORD  dwRefCount;
148     WININET_object_destructor destroy;
149     INTERNET_STATUS_CALLBACK lpfnStatusCB;
150 };
151
152
153 typedef struct
154 {
155     WININETHANDLEHEADER hdr;
156     LPWSTR  lpszAgent;
157     LPWSTR  lpszProxy;
158     LPWSTR  lpszProxyBypass;
159     LPWSTR  lpszProxyUsername;
160     LPWSTR  lpszProxyPassword;
161     DWORD   dwAccessType;
162 } WININETAPPINFOW, *LPWININETAPPINFOW;
163
164
165 typedef struct
166 {
167     WININETHANDLEHEADER hdr;
168     WININETAPPINFOW *lpAppInfo;
169     LPWSTR  lpszHostName; /* the final destination of the request */
170     LPWSTR  lpszServerName; /* the name of the server we directly connect to */
171     LPWSTR  lpszUserName;
172     INTERNET_PORT nHostPort; /* the final destination port of the request */
173     INTERNET_PORT nServerPort; /* the port of the server we directly connect to */
174     struct sockaddr_in socketAddress;
175 } WININETHTTPSESSIONW, *LPWININETHTTPSESSIONW;
176
177 #define HDR_ISREQUEST           0x0001
178 #define HDR_COMMADELIMITED      0x0002
179 #define HDR_SEMIDELIMITED       0x0004
180
181 typedef struct
182 {
183     LPWSTR lpszField;
184     LPWSTR lpszValue;
185     WORD wFlags;
186     WORD wCount;
187 } HTTPHEADERW, *LPHTTPHEADERW;
188
189
190 typedef struct
191 {
192     WININETHANDLEHEADER hdr;
193     WININETHTTPSESSIONW *lpHttpSession;
194     LPWSTR lpszPath;
195     LPWSTR lpszVerb;
196     LPWSTR lpszRawHeaders;
197     WININET_NETCONNECTION netConnection;
198     LPWSTR lpszVersion;
199     LPWSTR lpszStatusText;
200     HTTPHEADERW *pCustHeaders;
201     DWORD nCustHeaders;
202 } WININETHTTPREQW, *LPWININETHTTPREQW;
203
204
205 struct _WININETFTPSESSIONW;
206
207 typedef struct
208 {
209     WININETHANDLEHEADER hdr;
210     struct _WININETFTPSESSIONW *lpFtpSession;
211     BOOL session_deleted;
212     int nDataSocket;
213 } WININETFTPFILE, *LPWININETFTPFILE;
214
215
216 typedef struct _WININETFTPSESSIONW
217 {
218     WININETHANDLEHEADER hdr;
219     WININETAPPINFOW *lpAppInfo;
220     int sndSocket;
221     int lstnSocket;
222     int pasvSocket; /* data socket connected by us in case of passive FTP */
223     LPWININETFTPFILE download_in_progress;
224     struct sockaddr_in socketAddress;
225     struct sockaddr_in lstnSocketAddress;
226     LPWSTR  lpszPassword;
227     LPWSTR  lpszUserName;
228 } WININETFTPSESSIONW, *LPWININETFTPSESSIONW;
229
230
231 typedef struct
232 {
233     BOOL bIsDirectory;
234     LPWSTR lpszName;
235     DWORD nSize;
236     struct tm tmLastModified;
237     unsigned short permissions;
238 } FILEPROPERTIESW, *LPFILEPROPERTIESW;
239
240
241 typedef struct
242 {
243     WININETHANDLEHEADER hdr;
244     WININETFTPSESSIONW *lpFtpSession;
245     DWORD index;
246     DWORD size;
247     LPFILEPROPERTIESW lpafp;
248 } WININETFTPFINDNEXTW, *LPWININETFTPFINDNEXTW;
249
250 typedef enum
251 {
252     FTPPUTFILEW,
253     FTPSETCURRENTDIRECTORYW,
254     FTPCREATEDIRECTORYW,
255     FTPFINDFIRSTFILEW,
256     FTPGETCURRENTDIRECTORYW,
257     FTPOPENFILEW,
258     FTPGETFILEW,
259     FTPDELETEFILEW,
260     FTPREMOVEDIRECTORYW,
261     FTPRENAMEFILEW,
262     FTPFINDNEXTW,
263     HTTPSENDREQUESTW,
264     HTTPOPENREQUESTW,
265     SENDCALLBACK,
266     INTERNETOPENURLW,
267     INTERNETREADFILEEXA,
268 } ASYNC_FUNC;
269
270 struct WORKREQ_FTPPUTFILEW
271 {
272     LPWSTR lpszLocalFile;
273     LPWSTR lpszNewRemoteFile;
274     DWORD  dwFlags;
275     DWORD  dwContext;
276 };
277
278 struct WORKREQ_FTPSETCURRENTDIRECTORYW
279 {
280     LPWSTR lpszDirectory;
281 };
282
283 struct WORKREQ_FTPCREATEDIRECTORYW
284 {
285     LPWSTR lpszDirectory;
286 };
287
288 struct WORKREQ_FTPFINDFIRSTFILEW
289 {
290     LPWSTR lpszSearchFile;
291     LPWIN32_FIND_DATAW lpFindFileData;
292     DWORD  dwFlags;
293     DWORD  dwContext;
294 };
295
296 struct WORKREQ_FTPGETCURRENTDIRECTORYW
297 {
298     LPWSTR lpszDirectory;
299     DWORD *lpdwDirectory;
300 };
301
302 struct WORKREQ_FTPOPENFILEW
303 {
304     LPWSTR lpszFilename;
305     DWORD  dwAccess;
306     DWORD  dwFlags;
307     DWORD  dwContext;
308 };
309
310 struct WORKREQ_FTPGETFILEW
311 {
312     LPWSTR lpszRemoteFile;
313     LPWSTR lpszNewFile;
314     BOOL   fFailIfExists;
315     DWORD  dwLocalFlagsAttribute;
316     DWORD  dwFlags;
317     DWORD  dwContext;
318 };
319
320 struct WORKREQ_FTPDELETEFILEW
321 {
322     LPWSTR lpszFilename;
323 };
324
325 struct WORKREQ_FTPREMOVEDIRECTORYW
326 {
327     LPWSTR lpszDirectory;
328 };
329
330 struct WORKREQ_FTPRENAMEFILEW
331 {
332     LPWSTR lpszSrcFile;
333     LPWSTR lpszDestFile;
334 };
335
336 struct WORKREQ_FTPFINDNEXTW
337 {
338     LPWIN32_FIND_DATAW lpFindFileData;
339 };
340
341 struct WORKREQ_HTTPOPENREQUESTW
342 {
343     LPWSTR lpszVerb;
344     LPWSTR lpszObjectName;
345     LPWSTR lpszVersion;
346     LPWSTR lpszReferrer;
347     LPCWSTR *lpszAcceptTypes;
348     DWORD  dwFlags;
349     DWORD  dwContext;
350 };
351
352 struct WORKREQ_HTTPSENDREQUESTW
353 {
354     LPWSTR lpszHeader;
355     DWORD  dwHeaderLength;
356     LPVOID lpOptional;
357     DWORD  dwOptionalLength;
358     DWORD  dwContentLength;
359     BOOL   bEndRequest;
360 };
361
362 struct WORKREQ_SENDCALLBACK
363 {
364     DWORD     dwContext;
365     DWORD     dwInternetStatus;
366     LPVOID    lpvStatusInfo;
367     DWORD     dwStatusInfoLength;
368 };
369
370 struct WORKREQ_INTERNETOPENURLW
371 {
372     HINTERNET hInternet;
373     LPWSTR     lpszUrl;
374     LPWSTR     lpszHeaders;
375     DWORD     dwHeadersLength;
376     DWORD     dwFlags;
377     DWORD     dwContext;
378 };
379
380 struct WORKREQ_INTERNETREADFILEEXA
381 {
382     LPINTERNET_BUFFERSA lpBuffersOut;
383 };
384
385 typedef struct WORKREQ
386 {
387     ASYNC_FUNC asyncall;
388     WININETHANDLEHEADER *hdr;
389
390     union {
391         struct WORKREQ_FTPPUTFILEW              FtpPutFileW;
392         struct WORKREQ_FTPSETCURRENTDIRECTORYW  FtpSetCurrentDirectoryW;
393         struct WORKREQ_FTPCREATEDIRECTORYW      FtpCreateDirectoryW;
394         struct WORKREQ_FTPFINDFIRSTFILEW        FtpFindFirstFileW;
395         struct WORKREQ_FTPGETCURRENTDIRECTORYW  FtpGetCurrentDirectoryW;
396         struct WORKREQ_FTPOPENFILEW             FtpOpenFileW;
397         struct WORKREQ_FTPGETFILEW              FtpGetFileW;
398         struct WORKREQ_FTPDELETEFILEW           FtpDeleteFileW;
399         struct WORKREQ_FTPREMOVEDIRECTORYW      FtpRemoveDirectoryW;
400         struct WORKREQ_FTPRENAMEFILEW           FtpRenameFileW;
401         struct WORKREQ_FTPFINDNEXTW             FtpFindNextW;
402         struct WORKREQ_HTTPOPENREQUESTW         HttpOpenRequestW;
403         struct WORKREQ_HTTPSENDREQUESTW         HttpSendRequestW;
404         struct WORKREQ_SENDCALLBACK             SendCallback;
405         struct WORKREQ_INTERNETOPENURLW         InternetOpenUrlW;
406         struct WORKREQ_INTERNETREADFILEEXA      InternetReadFileExA;
407     } u;
408
409     struct WORKREQ *next;
410     struct WORKREQ *prev;
411
412 } WORKREQUEST, *LPWORKREQUEST;
413
414 HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info );
415 LPWININETHANDLEHEADER WININET_GetObject( HINTERNET hinternet );
416 LPWININETHANDLEHEADER WININET_AddRef( LPWININETHANDLEHEADER info );
417 BOOL WININET_Release( LPWININETHANDLEHEADER info );
418 BOOL WININET_FreeHandle( HINTERNET hinternet );
419
420 time_t ConvertTimeString(LPCWSTR asctime);
421
422 HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
423         INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
424         LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
425         DWORD dwInternalFlags);
426
427 HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
428         INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
429         LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
430         DWORD dwInternalFlags);
431
432 BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
433         struct sockaddr_in *psa);
434
435 void INTERNET_SetLastError(DWORD dwError);
436 DWORD INTERNET_GetLastError(void);
437 BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest);
438 LPSTR INTERNET_GetResponseBuffer(void);
439 LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen);
440
441 BOOLAPI FTP_FtpPutFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszLocalFile,
442     LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD dwContext);
443 BOOLAPI FTP_FtpSetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
444 BOOLAPI FTP_FtpCreateDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
445 INTERNETAPI HINTERNET WINAPI FTP_FtpFindFirstFileW(LPWININETFTPSESSIONW lpwfs,
446     LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD dwContext);
447 BOOL WINAPI FTP_FindNextFileW(LPWININETFTPFINDNEXTW lpwh, LPVOID lpvFindData);
448 BOOLAPI FTP_FtpGetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPWSTR lpszCurrentDirectory,
449         LPDWORD lpdwCurrentDirectory);
450 BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData);
451 BOOL FTP_FtpRenameFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszSrc, LPCWSTR lpszDest);
452 BOOL FTP_FtpRemoveDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
453 BOOL FTP_FtpDeleteFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName);
454 HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName,
455         DWORD fdwAccess, DWORD dwFlags, DWORD dwContext);
456 BOOLAPI FTP_FtpGetFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile,
457         BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags,
458         DWORD dwContext);
459
460 BOOLAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
461         DWORD dwHeaderLength, LPVOID lpOptional, DWORD dwOptionalLength,
462         DWORD dwContentLength, BOOL bEndRequest);
463 INTERNETAPI HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
464         LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion,
465         LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes,
466         DWORD dwFlags, DWORD dwContext);
467
468 VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
469                        DWORD dwInternetStatus, LPVOID lpvStatusInfo,
470                        DWORD dwStatusInfoLength);
471
472 VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
473                            DWORD dwInternetStatus, LPVOID lpvStatusInfo,
474                            DWORD dwStatusInfoLength);
475
476 LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW lpwhr, LPCWSTR header);
477
478 BOOL NETCON_connected(WININET_NETCONNECTION *connection);
479 BOOL NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
480 BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain,
481               int type, int protocol);
482 BOOL NETCON_close(WININET_NETCONNECTION *connection);
483 BOOL NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr,
484                     unsigned int addrlen);
485 BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname);
486 BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
487                 int *sent /* out */);
488 BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
489                 int *recvd /* out */);
490 BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
491 LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
492 BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
493
494 extern void URLCacheContainers_CreateDefaults(void);
495 extern void URLCacheContainers_DeleteAll(void);
496
497 #define MAX_REPLY_LEN           0x5B4
498
499 /* Used for debugging - maybe need to be shared in the Wine debugging code ? */
500 typedef struct
501 {
502     DWORD val;
503     const char* name;
504 } wininet_flag_info;
505
506 #endif /* _WINE_INTERNET_H_ */