wininet: Use proc instead of enum in INTERNETREADFILEEXA request.
[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     CALLASYNCPROC,
253     FTPPUTFILEW,
254     FTPSETCURRENTDIRECTORYW,
255     FTPCREATEDIRECTORYW,
256     FTPFINDFIRSTFILEW,
257     FTPGETCURRENTDIRECTORYW,
258     FTPOPENFILEW,
259     FTPGETFILEW,
260     FTPDELETEFILEW,
261     FTPREMOVEDIRECTORYW,
262     FTPRENAMEFILEW,
263     FTPFINDNEXTW,
264 } ASYNC_FUNC;
265
266 struct WORKREQ_FTPPUTFILEW
267 {
268     LPWSTR lpszLocalFile;
269     LPWSTR lpszNewRemoteFile;
270     DWORD  dwFlags;
271     DWORD  dwContext;
272 };
273
274 struct WORKREQ_FTPSETCURRENTDIRECTORYW
275 {
276     LPWSTR lpszDirectory;
277 };
278
279 struct WORKREQ_FTPCREATEDIRECTORYW
280 {
281     LPWSTR lpszDirectory;
282 };
283
284 struct WORKREQ_FTPFINDFIRSTFILEW
285 {
286     LPWSTR lpszSearchFile;
287     LPWIN32_FIND_DATAW lpFindFileData;
288     DWORD  dwFlags;
289     DWORD  dwContext;
290 };
291
292 struct WORKREQ_FTPGETCURRENTDIRECTORYW
293 {
294     LPWSTR lpszDirectory;
295     DWORD *lpdwDirectory;
296 };
297
298 struct WORKREQ_FTPOPENFILEW
299 {
300     LPWSTR lpszFilename;
301     DWORD  dwAccess;
302     DWORD  dwFlags;
303     DWORD  dwContext;
304 };
305
306 struct WORKREQ_FTPGETFILEW
307 {
308     LPWSTR lpszRemoteFile;
309     LPWSTR lpszNewFile;
310     BOOL   fFailIfExists;
311     DWORD  dwLocalFlagsAttribute;
312     DWORD  dwFlags;
313     DWORD  dwContext;
314 };
315
316 struct WORKREQ_FTPDELETEFILEW
317 {
318     LPWSTR lpszFilename;
319 };
320
321 struct WORKREQ_FTPREMOVEDIRECTORYW
322 {
323     LPWSTR lpszDirectory;
324 };
325
326 struct WORKREQ_FTPRENAMEFILEW
327 {
328     LPWSTR lpszSrcFile;
329     LPWSTR lpszDestFile;
330 };
331
332 struct WORKREQ_FTPFINDNEXTW
333 {
334     LPWIN32_FIND_DATAW lpFindFileData;
335 };
336
337 struct WORKREQ_HTTPSENDREQUESTW
338 {
339     LPWSTR lpszHeader;
340     DWORD  dwHeaderLength;
341     LPVOID lpOptional;
342     DWORD  dwOptionalLength;
343     DWORD  dwContentLength;
344     BOOL   bEndRequest;
345 };
346
347 struct WORKREQ_SENDCALLBACK
348 {
349     DWORD     dwContext;
350     DWORD     dwInternetStatus;
351     LPVOID    lpvStatusInfo;
352     DWORD     dwStatusInfoLength;
353 };
354
355 struct WORKREQ_INTERNETOPENURLW
356 {
357     HINTERNET hInternet;
358     LPWSTR     lpszUrl;
359     LPWSTR     lpszHeaders;
360     DWORD     dwHeadersLength;
361     DWORD     dwFlags;
362     DWORD     dwContext;
363 };
364
365 struct WORKREQ_INTERNETREADFILEEXA
366 {
367     LPINTERNET_BUFFERSA lpBuffersOut;
368 };
369
370 typedef struct WORKREQ
371 {
372     ASYNC_FUNC asyncall;
373     void (*asyncproc)(struct WORKREQ*);
374     WININETHANDLEHEADER *hdr;
375
376     union {
377         struct WORKREQ_FTPPUTFILEW              FtpPutFileW;
378         struct WORKREQ_FTPSETCURRENTDIRECTORYW  FtpSetCurrentDirectoryW;
379         struct WORKREQ_FTPCREATEDIRECTORYW      FtpCreateDirectoryW;
380         struct WORKREQ_FTPFINDFIRSTFILEW        FtpFindFirstFileW;
381         struct WORKREQ_FTPGETCURRENTDIRECTORYW  FtpGetCurrentDirectoryW;
382         struct WORKREQ_FTPOPENFILEW             FtpOpenFileW;
383         struct WORKREQ_FTPGETFILEW              FtpGetFileW;
384         struct WORKREQ_FTPDELETEFILEW           FtpDeleteFileW;
385         struct WORKREQ_FTPREMOVEDIRECTORYW      FtpRemoveDirectoryW;
386         struct WORKREQ_FTPRENAMEFILEW           FtpRenameFileW;
387         struct WORKREQ_FTPFINDNEXTW             FtpFindNextW;
388         struct WORKREQ_HTTPSENDREQUESTW         HttpSendRequestW;
389         struct WORKREQ_SENDCALLBACK             SendCallback;
390         struct WORKREQ_INTERNETOPENURLW         InternetOpenUrlW;
391         struct WORKREQ_INTERNETREADFILEEXA      InternetReadFileExA;
392     } u;
393
394     struct WORKREQ *next;
395     struct WORKREQ *prev;
396
397 } WORKREQUEST, *LPWORKREQUEST;
398
399 HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info );
400 LPWININETHANDLEHEADER WININET_GetObject( HINTERNET hinternet );
401 LPWININETHANDLEHEADER WININET_AddRef( LPWININETHANDLEHEADER info );
402 BOOL WININET_Release( LPWININETHANDLEHEADER info );
403 BOOL WININET_FreeHandle( HINTERNET hinternet );
404
405 time_t ConvertTimeString(LPCWSTR asctime);
406
407 HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
408         INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
409         LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
410         DWORD dwInternalFlags);
411
412 HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
413         INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
414         LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
415         DWORD dwInternalFlags);
416
417 BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
418         struct sockaddr_in *psa);
419
420 void INTERNET_SetLastError(DWORD dwError);
421 DWORD INTERNET_GetLastError(void);
422 BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest);
423 LPSTR INTERNET_GetResponseBuffer(void);
424 LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen);
425
426 BOOLAPI FTP_FtpPutFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszLocalFile,
427     LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD dwContext);
428 BOOLAPI FTP_FtpSetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
429 BOOLAPI FTP_FtpCreateDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
430 INTERNETAPI HINTERNET WINAPI FTP_FtpFindFirstFileW(LPWININETFTPSESSIONW lpwfs,
431     LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD dwContext);
432 BOOL WINAPI FTP_FindNextFileW(LPWININETFTPFINDNEXTW lpwh, LPVOID lpvFindData);
433 BOOLAPI FTP_FtpGetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPWSTR lpszCurrentDirectory,
434         LPDWORD lpdwCurrentDirectory);
435 BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData);
436 BOOL FTP_FtpRenameFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszSrc, LPCWSTR lpszDest);
437 BOOL FTP_FtpRemoveDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
438 BOOL FTP_FtpDeleteFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName);
439 HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName,
440         DWORD fdwAccess, DWORD dwFlags, DWORD dwContext);
441 BOOLAPI FTP_FtpGetFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile,
442         BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags,
443         DWORD dwContext);
444
445 BOOLAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
446         DWORD dwHeaderLength, LPVOID lpOptional, DWORD dwOptionalLength,
447         DWORD dwContentLength, BOOL bEndRequest);
448 INTERNETAPI HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
449         LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion,
450         LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes,
451         DWORD dwFlags, DWORD dwContext);
452
453 VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
454                        DWORD dwInternetStatus, LPVOID lpvStatusInfo,
455                        DWORD dwStatusInfoLength);
456
457 VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
458                            DWORD dwInternetStatus, LPVOID lpvStatusInfo,
459                            DWORD dwStatusInfoLength);
460
461 LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW lpwhr, LPCWSTR header);
462
463 BOOL NETCON_connected(WININET_NETCONNECTION *connection);
464 BOOL NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
465 BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain,
466               int type, int protocol);
467 BOOL NETCON_close(WININET_NETCONNECTION *connection);
468 BOOL NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr,
469                     unsigned int addrlen);
470 BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname);
471 BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
472                 int *sent /* out */);
473 BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
474                 int *recvd /* out */);
475 BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
476 LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
477 BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
478
479 extern void URLCacheContainers_CreateDefaults(void);
480 extern void URLCacheContainers_DeleteAll(void);
481
482 #define MAX_REPLY_LEN           0x5B4
483
484 /* Used for debugging - maybe need to be shared in the Wine debugging code ? */
485 typedef struct
486 {
487     DWORD val;
488     const char* name;
489 } wininet_flag_info;
490
491 #endif /* _WINE_INTERNET_H_ */