Make functions static.
[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 #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     int ssl_sock;
65     char *peek_msg;
66     char *peek_msg_mem;
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_HFINDNEXT = 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     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;
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     LPWSTR  lpszServerName;
169     LPWSTR  lpszUserName;
170     INTERNET_PORT nServerPort;
171     struct sockaddr_in socketAddress;
172     struct hostent *phostent;
173 } WININETHTTPSESSIONW, *LPWININETHTTPSESSIONW;
174
175 #define HDR_ISREQUEST           0x0001
176 #define HDR_COMMADELIMITED      0x0002
177 #define HDR_SEMIDELIMITED       0x0004
178
179 typedef struct
180 {
181     LPWSTR lpszField;
182     LPWSTR lpszValue;
183     WORD wFlags;
184     WORD wCount;
185 } HTTPHEADERW, *LPHTTPHEADERW;
186
187
188 typedef struct
189 {
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;
199
200
201 typedef struct
202 {
203     WININETHANDLEHEADER hdr;
204     BOOL session_deleted;
205     int nDataSocket;
206 } WININETFILE, *LPWININETFILE;
207
208
209 typedef struct
210 {
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;
222
223
224 typedef struct
225 {
226     BOOL bIsDirectory;
227     LPWSTR lpszName;
228     DWORD nSize;
229     struct tm tmLastModified;
230     unsigned short permissions;
231 } FILEPROPERTIESW, *LPFILEPROPERTIESW;
232
233
234 typedef struct
235 {
236     WININETHANDLEHEADER hdr;
237     DWORD index;
238     DWORD size;
239     LPFILEPROPERTIESW lpafp;
240 } WININETFINDNEXTW, *LPWININETFINDNEXTW;
241
242 typedef enum
243 {
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;
260
261 struct WORKREQ_FTPPUTFILEW
262 {
263     LPWSTR lpszLocalFile;
264     LPWSTR lpszNewRemoteFile;
265     DWORD  dwFlags;
266     DWORD  dwContext;
267 };
268
269 struct WORKREQ_FTPSETCURRENTDIRECTORYW
270 {
271     LPWSTR lpszDirectory;
272 };
273
274 struct WORKREQ_FTPCREATEDIRECTORYW
275 {
276     LPWSTR lpszDirectory;
277 };
278
279 struct WORKREQ_FTPFINDFIRSTFILEW
280 {
281     LPWSTR lpszSearchFile;
282     LPWIN32_FIND_DATAW lpFindFileData;
283     DWORD  dwFlags;
284     DWORD  dwContext;
285 };
286
287 struct WORKREQ_FTPGETCURRENTDIRECTORYW
288 {
289     LPWSTR lpszDirectory;
290     DWORD *lpdwDirectory;
291 };
292
293 struct WORKREQ_FTPOPENFILEW
294 {
295     LPWSTR lpszFilename;
296     DWORD  dwAccess;
297     DWORD  dwFlags;
298     DWORD  dwContext;
299 };
300
301 struct WORKREQ_FTPGETFILEW
302 {
303     LPWSTR lpszRemoteFile;
304     LPWSTR lpszNewFile;
305     BOOL   fFailIfExists;
306     DWORD  dwLocalFlagsAttribute;
307     DWORD  dwFlags;
308     DWORD  dwContext;
309 };
310
311 struct WORKREQ_FTPDELETEFILEW
312 {
313     LPWSTR lpszFilename;
314 };
315
316 struct WORKREQ_FTPREMOVEDIRECTORYW
317 {
318     LPWSTR lpszDirectory;
319 };
320
321 struct WORKREQ_FTPRENAMEFILEW
322 {
323     LPWSTR lpszSrcFile;
324     LPWSTR lpszDestFile;
325 };
326
327 struct WORKREQ_INTERNETFINDNEXTW
328 {
329     LPWIN32_FIND_DATAW lpFindFileData;
330 };
331
332 struct WORKREQ_HTTPOPENREQUESTW
333 {
334     LPWSTR lpszVerb;
335     LPWSTR lpszObjectName;
336     LPWSTR lpszVersion;
337     LPWSTR lpszReferrer;
338     LPCWSTR *lpszAcceptTypes;
339     DWORD  dwFlags;
340     DWORD  dwContext;
341 };
342
343 struct WORKREQ_HTTPSENDREQUESTW
344 {
345     LPWSTR lpszHeader;
346     DWORD  dwHeaderLength;
347     LPVOID lpOptional;
348     DWORD  dwOptionalLength;
349 };
350
351 struct WORKREQ_SENDCALLBACK
352 {
353     DWORD     dwContext;
354     DWORD     dwInternetStatus;
355     LPVOID    lpvStatusInfo;
356     DWORD     dwStatusInfoLength;
357 };
358
359 struct WORKREQ_INTERNETOPENURLW
360 {
361     HINTERNET hInternet;
362     LPWSTR     lpszUrl;
363     LPWSTR     lpszHeaders;
364     DWORD     dwHeadersLength;
365     DWORD     dwFlags;
366     DWORD     dwContext;
367 };
368
369 typedef struct WORKREQ
370 {
371     ASYNC_FUNC asyncall;
372     WININETHANDLEHEADER *hdr;
373
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;
391
392     struct WORKREQ *next;
393     struct WORKREQ *prev;
394
395 } WORKREQUEST, *LPWORKREQUEST;
396
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 );
403
404 time_t ConvertTimeString(LPCWSTR asctime);
405
406 HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
407         INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
408         LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
409         DWORD dwInternalFlags);
410
411 HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
412         INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
413         LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
414         DWORD dwInternalFlags);
415
416 BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
417         struct hostent **phe, struct sockaddr_in *psa);
418
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);
424
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);
442
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);
449
450 VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
451                        DWORD dwInternetStatus, LPVOID lpvStatusInfo,
452                        DWORD dwStatusInfoLength);
453
454 VOID SendSyncCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
455                       DWORD dwInternetStatus, LPVOID lpvStatusInfo,
456                       DWORD dwStatusInfoLength);
457
458 BOOL NETCON_connected(WININET_NETCONNECTION *connection);
459 void NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
460 BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain,
461               int type, int protocol);
462 BOOL NETCON_close(WININET_NETCONNECTION *connection);
463 BOOL NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr,
464                     unsigned int addrlen);
465 BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
466                 int *sent /* out */);
467 BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
468                 int *recvd /* out */);
469 BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
470
471 extern void URLCacheContainers_CreateDefaults(void);
472 extern void URLCacheContainers_DeleteAll(void);
473
474 #define MAX_REPLY_LEN           0x5B4
475
476 /* Used for debugging - maybe need to be shared in the Wine debugging code ? */
477 typedef struct
478 {
479     DWORD val;
480     const char* name;
481 } wininet_flag_info;
482
483 extern void dump_INTERNET_FLAGS(DWORD dwFlags) ;
484
485 #endif /* _WINE_INTERNET_H_ */