- Clean up the mask drawing code.
[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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 /* used for netconnection.c stuff */
49 typedef struct
50 {
51     BOOL useSSL;
52     int socketFD;
53 #ifdef HAVE_OPENSSL_SSL_H
54     SSL *ssl_s;
55     int ssl_sock;
56 #endif
57 } WININET_NETCONNECTION;
58
59 inline static LPSTR WININET_strdup( LPCSTR str )
60 {
61     LPSTR ret = HeapAlloc( GetProcessHeap(), 0, strlen(str) + 1 );
62     if (ret) strcpy( ret, str );
63     return ret;
64 }
65
66 inline static LPWSTR WININET_strdupW( LPCWSTR str )
67 {
68     LPWSTR ret = HeapAlloc( GetProcessHeap(), 0, (strlenW(str) + 1)*sizeof(WCHAR) );
69     if (ret) strcpyW( ret, str );
70     return ret;
71 }
72
73 inline static LPWSTR WININET_strdup_AtoW( LPCSTR str )
74 {
75     int len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0);
76     LPWSTR ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
77     if (ret)
78         MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len);
79     return ret;
80 }
81
82 inline static LPSTR WININET_strdup_WtoA( LPCWSTR str )
83 {
84     int len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
85     LPSTR ret = HeapAlloc( GetProcessHeap(), 0, len );
86     if (ret)
87         WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL);
88     return ret;
89 }
90
91 inline static void WININET_find_data_WtoA(LPWIN32_FIND_DATAW dataW, LPWIN32_FIND_DATAA dataA)
92 {
93     dataA->dwFileAttributes = dataW->dwFileAttributes;
94     dataA->ftCreationTime   = dataW->ftCreationTime;
95     dataA->ftLastAccessTime = dataW->ftLastAccessTime;
96     dataA->ftLastWriteTime  = dataW->ftLastWriteTime;
97     dataA->nFileSizeHigh    = dataW->nFileSizeHigh;
98     dataA->nFileSizeLow     = dataW->nFileSizeLow;
99     dataA->dwReserved0      = dataW->dwReserved0;
100     dataA->dwReserved1      = dataW->dwReserved1;
101     WideCharToMultiByte(CP_ACP, 0, dataW->cFileName, -1, 
102         dataA->cFileName, sizeof(dataA->cFileName),
103         NULL, NULL);
104     WideCharToMultiByte(CP_ACP, 0, dataW->cAlternateFileName, -1, 
105         dataA->cAlternateFileName, sizeof(dataA->cAlternateFileName),
106         NULL, NULL);
107 }
108
109 typedef enum
110 {
111     WH_HINIT = INTERNET_HANDLE_TYPE_INTERNET,
112     WH_HFTPSESSION = INTERNET_HANDLE_TYPE_CONNECT_FTP,
113     WH_HGOPHERSESSION = INTERNET_HANDLE_TYPE_CONNECT_GOPHER,
114     WH_HHTTPSESSION = INTERNET_HANDLE_TYPE_CONNECT_HTTP,
115     WH_HFILE = INTERNET_HANDLE_TYPE_FTP_FILE,
116     WH_HFINDNEXT = INTERNET_HANDLE_TYPE_FTP_FIND,
117     WH_HHTTPREQ = INTERNET_HANDLE_TYPE_HTTP_REQUEST,
118 } WH_TYPE;
119
120 #define INET_OPENURL 0x0001
121 #define INET_CALLBACKW 0x0002
122
123 typedef struct _WININETHANDLEHEADER
124 {
125     WH_TYPE htype;
126     DWORD  dwFlags;
127     DWORD  dwContext;
128     DWORD  dwError;
129     DWORD  dwInternalFlags;
130     struct _WININETHANDLEHEADER *lpwhparent;
131 } WININETHANDLEHEADER, *LPWININETHANDLEHEADER;
132
133
134 typedef struct
135 {
136     WININETHANDLEHEADER hdr;
137     LPWSTR  lpszAgent;
138     LPWSTR  lpszProxy;
139     LPWSTR  lpszProxyBypass;
140     LPWSTR  lpszProxyUsername;
141     LPWSTR  lpszProxyPassword;
142     DWORD   dwAccessType;
143     INTERNET_STATUS_CALLBACK lpfnStatusCB;
144 } WININETAPPINFOW, *LPWININETAPPINFOW;
145
146
147 typedef struct
148 {
149     WININETHANDLEHEADER hdr;
150     LPWSTR  lpszServerName;
151     LPWSTR  lpszUserName;
152     INTERNET_PORT nServerPort;
153     struct sockaddr_in socketAddress;
154     struct hostent *phostent;
155 } WININETHTTPSESSIONW, *LPWININETHTTPSESSIONW;
156
157 #define HDR_ISREQUEST           0x0001
158 #define HDR_COMMADELIMITED      0x0002
159 #define HDR_SEMIDELIMITED       0x0004
160
161 typedef struct
162 {
163     LPWSTR lpszField;
164     LPWSTR lpszValue;
165     WORD wFlags;
166     WORD wCount;
167 } HTTPHEADERW, *LPHTTPHEADERW;
168
169
170 typedef struct
171 {
172     WININETHANDLEHEADER hdr;
173     LPWSTR lpszPath;
174     LPWSTR lpszVerb;
175     LPWSTR lpszHostName;
176     WININET_NETCONNECTION netConnection;
177     HTTPHEADERW StdHeaders[HTTP_QUERY_MAX+1];
178     HTTPHEADERW *pCustHeaders;
179     INT nCustHeaders;
180 } WININETHTTPREQW, *LPWININETHTTPREQW;
181
182
183 typedef struct
184 {
185     WININETHANDLEHEADER hdr;
186     BOOL session_deleted;
187     int nDataSocket;
188 } WININETFILE, *LPWININETFILE;
189
190
191 typedef struct
192 {
193     WININETHANDLEHEADER hdr;
194     int sndSocket;
195     int lstnSocket;
196     int pasvSocket; /* data socket connected by us in case of passive FTP */
197     LPWININETFILE download_in_progress;
198     struct sockaddr_in socketAddress;
199     struct sockaddr_in lstnSocketAddress;
200     struct hostent *phostent;
201     LPWSTR  lpszPassword;
202     LPWSTR  lpszUserName;
203 } WININETFTPSESSIONW, *LPWININETFTPSESSIONW;
204
205
206 typedef struct
207 {
208     BOOL bIsDirectory;
209     LPWSTR lpszName;
210     DWORD nSize;
211     struct tm tmLastModified;
212     unsigned short permissions;
213 } FILEPROPERTIESW, *LPFILEPROPERTIESW;
214
215
216 typedef struct
217 {
218     WININETHANDLEHEADER hdr;
219     int index;
220     DWORD size;
221     LPFILEPROPERTIESW lpafp;
222 } WININETFINDNEXTW, *LPWININETFINDNEXTW;
223
224 typedef enum
225 {
226     FTPPUTFILEW,
227     FTPSETCURRENTDIRECTORYW,
228     FTPCREATEDIRECTORYW,
229     FTPFINDFIRSTFILEW,
230     FTPGETCURRENTDIRECTORYW,
231     FTPOPENFILEW,
232     FTPGETFILEW,
233     FTPDELETEFILEW,
234     FTPREMOVEDIRECTORYW,
235     FTPRENAMEFILEW,
236     INTERNETFINDNEXTW,
237     HTTPSENDREQUESTW,
238     HTTPOPENREQUESTW,
239     SENDCALLBACK,
240     INTERNETOPENURLW,
241 } ASYNC_FUNC;
242
243 struct WORKREQ_FTPPUTFILEW
244 {
245     LPWSTR lpszLocalFile;
246     LPWSTR lpszNewRemoteFile;
247     DWORD  dwFlags;
248     DWORD  dwContext;
249 };
250
251 struct WORKREQ_FTPSETCURRENTDIRECTORYW
252 {
253     LPWSTR lpszDirectory;
254 };
255
256 struct WORKREQ_FTPCREATEDIRECTORYW
257 {
258     LPWSTR lpszDirectory;
259 };
260
261 struct WORKREQ_FTPFINDFIRSTFILEW
262 {
263     LPWSTR lpszSearchFile;
264     LPWIN32_FIND_DATAW lpFindFileData;
265     DWORD  dwFlags;
266     DWORD  dwContext;
267 };
268
269 struct WORKREQ_FTPGETCURRENTDIRECTORYW
270 {
271     LPWSTR lpszDirectory;
272     DWORD *lpdwDirectory;
273 };
274
275 struct WORKREQ_FTPOPENFILEW
276 {
277     LPWSTR lpszFilename;
278     DWORD  dwAccess;
279     DWORD  dwFlags;
280     DWORD  dwContext;
281 };
282
283 struct WORKREQ_FTPGETFILEW
284 {
285     LPWSTR lpszRemoteFile;
286     LPWSTR lpszNewFile;
287     BOOL   fFailIfExists;
288     DWORD  dwLocalFlagsAttribute;
289     DWORD  dwFlags;
290     DWORD  dwContext;
291 };
292
293 struct WORKREQ_FTPDELETEFILEW
294 {
295     LPWSTR lpszFilename;
296 };
297
298 struct WORKREQ_FTPREMOVEDIRECTORYW
299 {
300     LPWSTR lpszDirectory;
301 };
302
303 struct WORKREQ_FTPRENAMEFILEW
304 {
305     LPWSTR lpszSrcFile;
306     LPWSTR lpszDestFile;
307 };
308
309 struct WORKREQ_INTERNETFINDNEXTW
310 {
311     LPWIN32_FIND_DATAW lpFindFileData;
312 };
313
314 struct WORKREQ_HTTPOPENREQUESTW
315 {
316     LPWSTR lpszVerb;
317     LPWSTR lpszObjectName;
318     LPWSTR lpszVersion;
319     LPWSTR lpszReferrer;
320     LPCWSTR *lpszAcceptTypes;
321     DWORD  dwFlags;
322     DWORD  dwContext;
323 };
324
325 struct WORKREQ_HTTPSENDREQUESTW
326 {
327     LPWSTR lpszHeader;
328     DWORD  dwHeaderLength;
329     LPVOID lpOptional;
330     DWORD  dwOptionalLength;
331 };
332
333 struct WORKREQ_SENDCALLBACK
334 {
335     HINTERNET hHttpSession;
336     DWORD     dwContext;
337     DWORD     dwInternetStatus;
338     LPVOID    lpvStatusInfo;
339     DWORD     dwStatusInfoLength;
340 };
341
342 struct WORKREQ_INTERNETOPENURLW
343 {
344     HINTERNET hInternet;
345     LPWSTR     lpszUrl;
346     LPWSTR     lpszHeaders;
347     DWORD     dwHeadersLength;
348     DWORD     dwFlags;
349     DWORD     dwContext;
350 };
351
352 typedef struct WORKREQ
353 {
354     ASYNC_FUNC asyncall;
355     HINTERNET handle;
356
357     union {
358         struct WORKREQ_FTPPUTFILEW              FtpPutFileW;
359         struct WORKREQ_FTPSETCURRENTDIRECTORYW  FtpSetCurrentDirectoryW;
360         struct WORKREQ_FTPCREATEDIRECTORYW      FtpCreateDirectoryW;
361         struct WORKREQ_FTPFINDFIRSTFILEW        FtpFindFirstFileW;
362         struct WORKREQ_FTPGETCURRENTDIRECTORYW  FtpGetCurrentDirectoryW;
363         struct WORKREQ_FTPOPENFILEW             FtpOpenFileW;
364         struct WORKREQ_FTPGETFILEW              FtpGetFileW;
365         struct WORKREQ_FTPDELETEFILEW           FtpDeleteFileW;
366         struct WORKREQ_FTPREMOVEDIRECTORYW      FtpRemoveDirectoryW;
367         struct WORKREQ_FTPRENAMEFILEW           FtpRenameFileW;
368         struct WORKREQ_INTERNETFINDNEXTW        InternetFindNextW;
369         struct WORKREQ_HTTPOPENREQUESTW         HttpOpenRequestW;
370         struct WORKREQ_HTTPSENDREQUESTW         HttpSendRequestW;
371         struct WORKREQ_SENDCALLBACK             SendCallback;
372         struct WORKREQ_INTERNETOPENURLW         InternetOpenUrlW;
373     } u;
374
375     struct WORKREQ *next;
376     struct WORKREQ *prev;
377
378 } WORKREQUEST, *LPWORKREQUEST;
379
380 HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info );
381 LPWININETHANDLEHEADER WININET_GetObject( HINTERNET hinternet );
382 BOOL WININET_FreeHandle( HINTERNET hinternet );
383 HINTERNET WININET_FindHandle( LPWININETHANDLEHEADER info );
384
385 time_t ConvertTimeString(LPCWSTR asctime);
386
387 HINTERNET FTP_Connect(HINTERNET hInterent, LPCWSTR lpszServerName,
388         INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
389         LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
390         DWORD dwInternalFlags);
391
392 HINTERNET HTTP_Connect(HINTERNET hInterent, LPCWSTR lpszServerName,
393         INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
394         LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
395         DWORD dwInternalFlags);
396
397 BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
398         struct hostent **phe, struct sockaddr_in *psa);
399
400 void INTERNET_SetLastError(DWORD dwError);
401 DWORD INTERNET_GetLastError();
402 BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest);
403 LPSTR INTERNET_GetResponseBuffer();
404 LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen);
405
406 BOOL FTP_CloseSessionHandle(LPWININETFTPSESSIONW lpwfs);
407 BOOL FTP_CloseFindNextHandle(LPWININETFINDNEXTW lpwfn);
408 BOOL FTP_CloseFileTransferHandle(LPWININETFILE lpwfn);
409 BOOLAPI FTP_FtpPutFileW(HINTERNET hConnect, LPCWSTR lpszLocalFile,
410     LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD dwContext);
411 BOOLAPI FTP_FtpSetCurrentDirectoryW(HINTERNET hConnect, LPCWSTR lpszDirectory);
412 BOOLAPI FTP_FtpCreateDirectoryW(HINTERNET hConnect, LPCWSTR lpszDirectory);
413 INTERNETAPI HINTERNET WINAPI FTP_FtpFindFirstFileW(HINTERNET hConnect,
414     LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD dwContext);
415 BOOLAPI FTP_FtpGetCurrentDirectoryW(HINTERNET hFtpSession, LPWSTR lpszCurrentDirectory,
416         LPDWORD lpdwCurrentDirectory);
417 BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData);
418 BOOL FTP_FtpRenameFileW(HINTERNET hFtpSession, LPCWSTR lpszSrc, LPCWSTR lpszDest);
419 BOOL FTP_FtpRemoveDirectoryW(HINTERNET hFtpSession, LPCWSTR lpszDirectory);
420 BOOL FTP_FtpDeleteFileW(HINTERNET hFtpSession, LPCWSTR lpszFileName);
421 HINTERNET FTP_FtpOpenFileW(HINTERNET hFtpSession, LPCWSTR lpszFileName,
422         DWORD fdwAccess, DWORD dwFlags, DWORD dwContext);
423 BOOLAPI FTP_FtpGetFileW(HINTERNET hInternet, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile,
424         BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags,
425         DWORD dwContext);
426
427 BOOLAPI HTTP_HttpSendRequestW(HINTERNET hHttpRequest, LPCWSTR lpszHeaders,
428         DWORD dwHeaderLength, LPVOID lpOptional ,DWORD dwOptionalLength);
429 INTERNETAPI HINTERNET WINAPI HTTP_HttpOpenRequestW(HINTERNET hHttpSession,
430         LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion,
431         LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes,
432         DWORD dwFlags, DWORD dwContext);
433 void HTTP_CloseHTTPSessionHandle(LPWININETHTTPSESSIONW lpwhs);
434 void HTTP_CloseHTTPRequestHandle(LPWININETHTTPREQW lpwhr);
435
436 VOID SendAsyncCallback(LPWININETAPPINFOW hIC, HINTERNET hHttpSession,
437                              DWORD dwContext, DWORD dwInternetStatus, LPVOID
438                              lpvStatusInfo , DWORD dwStatusInfoLength);
439
440 VOID SendAsyncCallbackInt(LPWININETAPPINFOW hIC, HINTERNET hHttpSession,
441                              DWORD dwContext, DWORD dwInternetStatus, LPVOID
442                              lpvStatusInfo , DWORD dwStatusInfoLength);
443
444 BOOL HTTP_InsertProxyAuthorization( LPWININETHTTPREQW lpwhr,
445                        LPCWSTR username, LPCWSTR password );
446
447 BOOL NETCON_connected(WININET_NETCONNECTION *connection);
448 void NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
449 BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain,
450               int type, int protocol);
451 BOOL NETCON_close(WININET_NETCONNECTION *connection);
452 BOOL NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr,
453                     socklen_t addrlen);
454 BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
455                 int *sent /* out */);
456 BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
457                 int *recvd /* out */);
458 BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
459
460 #define MAX_REPLY_LEN           0x5B4
461
462 /* Used for debugging - maybe need to be shared in the Wine debugging code ? */
463 typedef struct
464 {
465     DWORD val;
466     const char* name;
467 } wininet_flag_info;
468
469 #endif /* _WINE_INTERNET_H_ */