Move the peek_msg buffers for SSL connections into the
[wine/wine-kai.git] / dlls / wininet / internet.h
blob4c5d7f31d74a73944f7cd3d485a35e4babc418e0
1 /*
2 * Wininet
4 * Copyright 1999 Corel Corporation
6 * Ulrich Czekalla
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.
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.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #ifndef _WINE_INTERNET_H_
24 #define _WINE_INTERNET_H_
26 #include "wine/unicode.h"
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
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__ */
57 /* used for netconnection.c stuff */
58 typedef struct
60 BOOL useSSL;
61 int socketFD;
62 #ifdef HAVE_OPENSSL_SSL_H
63 SSL *ssl_s;
64 int ssl_sock;
65 char *peek_msg;
66 char *peek_msg_mem;
67 #endif
68 } WININET_NETCONNECTION;
70 inline static LPSTR WININET_strdup( LPCSTR str )
72 LPSTR ret = HeapAlloc( GetProcessHeap(), 0, strlen(str) + 1 );
73 if (ret) strcpy( ret, str );
74 return ret;
77 inline static LPWSTR WININET_strdupW( LPCWSTR str )
79 LPWSTR ret = HeapAlloc( GetProcessHeap(), 0, (strlenW(str) + 1)*sizeof(WCHAR) );
80 if (ret) strcpyW( ret, str );
81 return ret;
84 inline static LPWSTR WININET_strdup_AtoW( LPCSTR str )
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;
93 inline static LPSTR WININET_strdup_WtoA( LPCWSTR str )
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;
102 inline static void WININET_find_data_WtoA(LPWIN32_FIND_DATAW dataW, LPWIN32_FIND_DATAA dataA)
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);
120 typedef enum
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_HFINDNEXT = INTERNET_HANDLE_TYPE_FTP_FIND,
128 WH_HHTTPREQ = INTERNET_HANDLE_TYPE_HTTP_REQUEST,
129 } WH_TYPE;
131 #define INET_OPENURL 0x0001
132 #define INET_CALLBACKW 0x0002
134 struct _WININETHANDLEHEADER;
135 typedef struct _WININETHANDLEHEADER WININETHANDLEHEADER, *LPWININETHANDLEHEADER;
137 typedef void (*WININET_object_destructor)( LPWININETHANDLEHEADER );
139 struct _WININETHANDLEHEADER
141 WH_TYPE htype;
142 DWORD dwFlags;
143 DWORD dwContext;
144 DWORD dwError;
145 DWORD dwInternalFlags;
146 DWORD dwRefCount;
147 WININET_object_destructor destroy;
148 INTERNET_STATUS_CALLBACK lpfnStatusCB;
149 struct _WININETHANDLEHEADER *lpwhparent;
153 typedef struct
155 WININETHANDLEHEADER hdr;
156 LPWSTR lpszAgent;
157 LPWSTR lpszProxy;
158 LPWSTR lpszProxyBypass;
159 LPWSTR lpszProxyUsername;
160 LPWSTR lpszProxyPassword;
161 DWORD dwAccessType;
162 } WININETAPPINFOW, *LPWININETAPPINFOW;
165 typedef struct
167 WININETHANDLEHEADER hdr;
168 LPWSTR lpszServerName;
169 LPWSTR lpszUserName;
170 INTERNET_PORT nServerPort;
171 struct sockaddr_in socketAddress;
172 struct hostent *phostent;
173 } WININETHTTPSESSIONW, *LPWININETHTTPSESSIONW;
175 #define HDR_ISREQUEST 0x0001
176 #define HDR_COMMADELIMITED 0x0002
177 #define HDR_SEMIDELIMITED 0x0004
179 typedef struct
181 LPWSTR lpszField;
182 LPWSTR lpszValue;
183 WORD wFlags;
184 WORD wCount;
185 } HTTPHEADERW, *LPHTTPHEADERW;
188 typedef struct
190 WININETHANDLEHEADER hdr;
191 LPWSTR lpszPath;
192 LPWSTR lpszVerb;
193 LPWSTR lpszRawHeaders;
194 WININET_NETCONNECTION netConnection;
195 HTTPHEADERW StdHeaders[HTTP_QUERY_MAX+1];
196 HTTPHEADERW *pCustHeaders;
197 DWORD nCustHeaders;
198 } WININETHTTPREQW, *LPWININETHTTPREQW;
201 typedef struct
203 WININETHANDLEHEADER hdr;
204 BOOL session_deleted;
205 int nDataSocket;
206 } WININETFILE, *LPWININETFILE;
209 typedef struct
211 WININETHANDLEHEADER hdr;
212 int sndSocket;
213 int lstnSocket;
214 int pasvSocket; /* data socket connected by us in case of passive FTP */
215 LPWININETFILE download_in_progress;
216 struct sockaddr_in socketAddress;
217 struct sockaddr_in lstnSocketAddress;
218 struct hostent *phostent;
219 LPWSTR lpszPassword;
220 LPWSTR lpszUserName;
221 } WININETFTPSESSIONW, *LPWININETFTPSESSIONW;
224 typedef struct
226 BOOL bIsDirectory;
227 LPWSTR lpszName;
228 DWORD nSize;
229 struct tm tmLastModified;
230 unsigned short permissions;
231 } FILEPROPERTIESW, *LPFILEPROPERTIESW;
234 typedef struct
236 WININETHANDLEHEADER hdr;
237 DWORD index;
238 DWORD size;
239 LPFILEPROPERTIESW lpafp;
240 } WININETFINDNEXTW, *LPWININETFINDNEXTW;
242 typedef enum
244 FTPPUTFILEW,
245 FTPSETCURRENTDIRECTORYW,
246 FTPCREATEDIRECTORYW,
247 FTPFINDFIRSTFILEW,
248 FTPGETCURRENTDIRECTORYW,
249 FTPOPENFILEW,
250 FTPGETFILEW,
251 FTPDELETEFILEW,
252 FTPREMOVEDIRECTORYW,
253 FTPRENAMEFILEW,
254 INTERNETFINDNEXTW,
255 HTTPSENDREQUESTW,
256 HTTPOPENREQUESTW,
257 SENDCALLBACK,
258 INTERNETOPENURLW,
259 } ASYNC_FUNC;
261 struct WORKREQ_FTPPUTFILEW
263 LPWSTR lpszLocalFile;
264 LPWSTR lpszNewRemoteFile;
265 DWORD dwFlags;
266 DWORD dwContext;
269 struct WORKREQ_FTPSETCURRENTDIRECTORYW
271 LPWSTR lpszDirectory;
274 struct WORKREQ_FTPCREATEDIRECTORYW
276 LPWSTR lpszDirectory;
279 struct WORKREQ_FTPFINDFIRSTFILEW
281 LPWSTR lpszSearchFile;
282 LPWIN32_FIND_DATAW lpFindFileData;
283 DWORD dwFlags;
284 DWORD dwContext;
287 struct WORKREQ_FTPGETCURRENTDIRECTORYW
289 LPWSTR lpszDirectory;
290 DWORD *lpdwDirectory;
293 struct WORKREQ_FTPOPENFILEW
295 LPWSTR lpszFilename;
296 DWORD dwAccess;
297 DWORD dwFlags;
298 DWORD dwContext;
301 struct WORKREQ_FTPGETFILEW
303 LPWSTR lpszRemoteFile;
304 LPWSTR lpszNewFile;
305 BOOL fFailIfExists;
306 DWORD dwLocalFlagsAttribute;
307 DWORD dwFlags;
308 DWORD dwContext;
311 struct WORKREQ_FTPDELETEFILEW
313 LPWSTR lpszFilename;
316 struct WORKREQ_FTPREMOVEDIRECTORYW
318 LPWSTR lpszDirectory;
321 struct WORKREQ_FTPRENAMEFILEW
323 LPWSTR lpszSrcFile;
324 LPWSTR lpszDestFile;
327 struct WORKREQ_INTERNETFINDNEXTW
329 LPWIN32_FIND_DATAW lpFindFileData;
332 struct WORKREQ_HTTPOPENREQUESTW
334 LPWSTR lpszVerb;
335 LPWSTR lpszObjectName;
336 LPWSTR lpszVersion;
337 LPWSTR lpszReferrer;
338 LPCWSTR *lpszAcceptTypes;
339 DWORD dwFlags;
340 DWORD dwContext;
343 struct WORKREQ_HTTPSENDREQUESTW
345 LPWSTR lpszHeader;
346 DWORD dwHeaderLength;
347 LPVOID lpOptional;
348 DWORD dwOptionalLength;
351 struct WORKREQ_SENDCALLBACK
353 DWORD dwContext;
354 DWORD dwInternetStatus;
355 LPVOID lpvStatusInfo;
356 DWORD dwStatusInfoLength;
359 struct WORKREQ_INTERNETOPENURLW
361 HINTERNET hInternet;
362 LPWSTR lpszUrl;
363 LPWSTR lpszHeaders;
364 DWORD dwHeadersLength;
365 DWORD dwFlags;
366 DWORD dwContext;
369 typedef struct WORKREQ
371 ASYNC_FUNC asyncall;
372 WININETHANDLEHEADER *hdr;
374 union {
375 struct WORKREQ_FTPPUTFILEW FtpPutFileW;
376 struct WORKREQ_FTPSETCURRENTDIRECTORYW FtpSetCurrentDirectoryW;
377 struct WORKREQ_FTPCREATEDIRECTORYW FtpCreateDirectoryW;
378 struct WORKREQ_FTPFINDFIRSTFILEW FtpFindFirstFileW;
379 struct WORKREQ_FTPGETCURRENTDIRECTORYW FtpGetCurrentDirectoryW;
380 struct WORKREQ_FTPOPENFILEW FtpOpenFileW;
381 struct WORKREQ_FTPGETFILEW FtpGetFileW;
382 struct WORKREQ_FTPDELETEFILEW FtpDeleteFileW;
383 struct WORKREQ_FTPREMOVEDIRECTORYW FtpRemoveDirectoryW;
384 struct WORKREQ_FTPRENAMEFILEW FtpRenameFileW;
385 struct WORKREQ_INTERNETFINDNEXTW InternetFindNextW;
386 struct WORKREQ_HTTPOPENREQUESTW HttpOpenRequestW;
387 struct WORKREQ_HTTPSENDREQUESTW HttpSendRequestW;
388 struct WORKREQ_SENDCALLBACK SendCallback;
389 struct WORKREQ_INTERNETOPENURLW InternetOpenUrlW;
390 } u;
392 struct WORKREQ *next;
393 struct WORKREQ *prev;
395 } WORKREQUEST, *LPWORKREQUEST;
397 HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info );
398 LPWININETHANDLEHEADER WININET_GetObject( HINTERNET hinternet );
399 LPWININETHANDLEHEADER WININET_AddRef( LPWININETHANDLEHEADER info );
400 BOOL WININET_Release( LPWININETHANDLEHEADER info );
401 BOOL WININET_FreeHandle( HINTERNET hinternet );
402 HINTERNET WININET_FindHandle( LPWININETHANDLEHEADER info );
404 time_t ConvertTimeString(LPCWSTR asctime);
406 HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
407 INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
408 LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
409 DWORD dwInternalFlags);
411 HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
412 INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
413 LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
414 DWORD dwInternalFlags);
416 BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
417 struct hostent **phe, struct sockaddr_in *psa);
419 void INTERNET_SetLastError(DWORD dwError);
420 DWORD INTERNET_GetLastError(void);
421 BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest);
422 LPSTR INTERNET_GetResponseBuffer(void);
423 LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen);
425 BOOLAPI FTP_FtpPutFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszLocalFile,
426 LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD dwContext);
427 BOOLAPI FTP_FtpSetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
428 BOOLAPI FTP_FtpCreateDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
429 INTERNETAPI HINTERNET WINAPI FTP_FtpFindFirstFileW(LPWININETFTPSESSIONW lpwfs,
430 LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD dwContext);
431 BOOLAPI FTP_FtpGetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPWSTR lpszCurrentDirectory,
432 LPDWORD lpdwCurrentDirectory);
433 BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData);
434 BOOL FTP_FtpRenameFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszSrc, LPCWSTR lpszDest);
435 BOOL FTP_FtpRemoveDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
436 BOOL FTP_FtpDeleteFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName);
437 HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName,
438 DWORD fdwAccess, DWORD dwFlags, DWORD dwContext);
439 BOOLAPI FTP_FtpGetFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile,
440 BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags,
441 DWORD dwContext);
443 BOOLAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
444 DWORD dwHeaderLength, LPVOID lpOptional ,DWORD dwOptionalLength);
445 INTERNETAPI HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
446 LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion,
447 LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes,
448 DWORD dwFlags, DWORD dwContext);
450 VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
451 DWORD dwInternetStatus, LPVOID lpvStatusInfo,
452 DWORD dwStatusInfoLength);
454 VOID SendSyncCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
455 DWORD dwInternetStatus, LPVOID lpvStatusInfo,
456 DWORD dwStatusInfoLength);
458 BOOL HTTP_InsertProxyAuthorization( LPWININETHTTPREQW lpwhr,
459 LPCWSTR username, LPCWSTR password );
461 BOOL NETCON_connected(WININET_NETCONNECTION *connection);
462 void NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
463 BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain,
464 int type, int protocol);
465 BOOL NETCON_close(WININET_NETCONNECTION *connection);
466 BOOL NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr,
467 unsigned int addrlen);
468 BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
469 int *sent /* out */);
470 BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
471 int *recvd /* out */);
472 BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
474 extern void URLCacheContainers_CreateDefaults(void);
475 extern void URLCacheContainers_DeleteAll(void);
477 #define MAX_REPLY_LEN 0x5B4
479 /* Used for debugging - maybe need to be shared in the Wine debugging code ? */
480 typedef struct
482 DWORD val;
483 const char* name;
484 } wininet_flag_info;
486 extern void dump_INTERNET_FLAGS(DWORD dwFlags) ;
488 #endif /* _WINE_INTERNET_H_ */