1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Stewart Gordon
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC core/sys/windows/_wininet.d)
9  */
10 module nulib.system.win32.wininet;
11 
12 
13 version (ANSI) {} else version = Unicode;
14 pragma(lib, "wininet");
15 
16 // FIXME: check types and grouping of constants
17 
18 import nulib.system.win32.winbase, nulib.system.win32.windef;
19 
20 // From Winineti.h
21 enum {
22     INTERNET_FLAG_BGUPDATE         = 0x00000008,
23 }
24 
25 enum {
26     INTERNET_INVALID_PORT_NUMBER =    0,
27     INTERNET_DEFAULT_FTP_PORT    =   21,
28     INTERNET_DEFAULT_GOPHER_PORT =   70,
29     INTERNET_DEFAULT_HTTP_PORT   =   80,
30     INTERNET_DEFAULT_HTTPS_PORT  =  443,
31     INTERNET_DEFAULT_SOCKS_PORT  = 1080
32 }
33 
34 enum size_t
35     MAX_CACHE_ENTRY_INFO_SIZE       =  4096,
36     INTERNET_MAX_HOST_NAME_LENGTH   =   256,
37     INTERNET_MAX_USER_NAME_LENGTH   =   128,
38     INTERNET_MAX_PASSWORD_LENGTH    =   128,
39     INTERNET_MAX_PORT_NUMBER_LENGTH =     5,
40     INTERNET_MAX_PORT_NUMBER_VALUE  = 65535,
41     INTERNET_MAX_PATH_LENGTH        =  2048,
42     INTERNET_MAX_SCHEME_LENGTH      =    32,
43     INTERNET_MAX_URL_LENGTH         = INTERNET_MAX_SCHEME_LENGTH
44                                       + "://".length
45                                       + INTERNET_MAX_PATH_LENGTH;
46 
47 enum : DWORD {
48     INTERNET_KEEP_ALIVE_UNKNOWN  = DWORD.max,
49     INTERNET_KEEP_ALIVE_DISABLED = 0,
50     INTERNET_KEEP_ALIVE_ENABLED
51 }
52 
53 enum {
54     INTERNET_REQFLAG_FROM_CACHE           = 0x00000001,
55     INTERNET_REQFLAG_ASYNC                = 0x00000002,
56     INTERNET_REQFLAG_VIA_PROXY            = 0x00000004,
57     INTERNET_REQFLAG_NO_HEADERS           = 0x00000008,
58     INTERNET_REQFLAG_PASSIVE              = 0x00000010,
59     INTERNET_REQFLAG_CACHE_WRITE_DISABLED = 0x00000040,
60     INTERNET_REQFLAG_NET_TIMEOUT          = 0x00000080,
61 }
62 
63 enum {
64     INTERNET_FLAG_IDN_DIRECT = 0x00000001,
65     INTERNET_FLAG_IDN_PROXY  = 0x00000002
66 }
67 
68 enum DWORD
69     INTERNET_FLAG_RELOAD                   = 0x80000000,
70     INTERNET_FLAG_RAW_DATA                 = 0x40000000,
71     INTERNET_FLAG_EXISTING_CONNECT         = 0x20000000,
72     INTERNET_FLAG_ASYNC                    = 0x10000000,
73     INTERNET_FLAG_PASSIVE                  = 0x08000000,
74     INTERNET_FLAG_NO_CACHE_WRITE           = 0x04000000,
75     INTERNET_FLAG_DONT_CACHE               = INTERNET_FLAG_NO_CACHE_WRITE,
76     INTERNET_FLAG_MAKE_PERSISTENT          = 0x02000000,
77     INTERNET_FLAG_FROM_CACHE               = 0x01000000,
78     INTERNET_FLAG_OFFLINE                  = INTERNET_FLAG_FROM_CACHE,
79     INTERNET_FLAG_SECURE                   = 0x00800000,
80     INTERNET_FLAG_KEEP_CONNECTION          = 0x00400000,
81     INTERNET_FLAG_NO_AUTO_REDIRECT         = 0x00200000,
82     INTERNET_FLAG_READ_PREFETCH            = 0x00100000,
83     INTERNET_FLAG_NO_COOKIES               = 0x00080000,
84     INTERNET_FLAG_NO_AUTH                  = 0x00040000,
85     INTERNET_FLAG_RESTRICTED_ZONE          = 0x00020000,
86     INTERNET_FLAG_CACHE_IF_NET_FAIL        = 0x00010000,
87     INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP  = 0x00008000,
88     INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS = 0x00004000,
89     INTERNET_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000,
90     INTERNET_FLAG_IGNORE_CERT_CN_INVALID   = 0x00001000,
91     INTERNET_FLAG_RESYNCHRONIZE            = 0x00000800,
92     INTERNET_FLAG_HYPERLINK                = 0x00000400,
93     INTERNET_FLAG_NO_UI                    = 0x00000200,
94     INTERNET_FLAG_PRAGMA_NOCACHE           = 0x00000100,
95     INTERNET_FLAG_CACHE_ASYNC              = 0x00000080,
96     INTERNET_FLAG_FORMS_SUBMIT             = 0x00000040,
97     INTERNET_FLAG_FWD_BACK                 = 0x00000020,
98     INTERNET_FLAG_NEED_FILE                = 0x00000010,
99     INTERNET_FLAG_MUST_CACHE_REQUEST       = INTERNET_FLAG_NEED_FILE,
100     INTERNET_FLAG_TRANSFER_ASCII           = FTP_TRANSFER_TYPE_ASCII,
101     INTERNET_FLAG_TRANSFER_BINARY          = FTP_TRANSFER_TYPE_BINARY,
102 
103     SECURITY_INTERNET_MASK                 = INTERNET_FLAG_IGNORE_CERT_CN_INVALID   |
104                                              INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
105                                              INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
106                                              INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP,
107 
108     SECURITY_SET_MASK                      = SECURITY_INTERNET_MASK,
109 
110     INTERNET_FLAGS_MASK                    = INTERNET_FLAG_RELOAD
111                                             | INTERNET_FLAG_RAW_DATA
112                                             | INTERNET_FLAG_EXISTING_CONNECT
113                                             | INTERNET_FLAG_ASYNC
114                                             | INTERNET_FLAG_PASSIVE
115                                             | INTERNET_FLAG_NO_CACHE_WRITE
116                                             | INTERNET_FLAG_MAKE_PERSISTENT
117                                             | INTERNET_FLAG_FROM_CACHE
118                                             | INTERNET_FLAG_SECURE
119                                             | INTERNET_FLAG_KEEP_CONNECTION
120                                             | INTERNET_FLAG_NO_AUTO_REDIRECT
121                                             | INTERNET_FLAG_READ_PREFETCH
122                                             | INTERNET_FLAG_NO_COOKIES
123                                             | INTERNET_FLAG_NO_AUTH
124                                             | INTERNET_FLAG_CACHE_IF_NET_FAIL
125                                             | SECURITY_INTERNET_MASK
126                                             | INTERNET_FLAG_RESYNCHRONIZE
127                                             | INTERNET_FLAG_HYPERLINK
128                                             | INTERNET_FLAG_NO_UI
129                                             | INTERNET_FLAG_PRAGMA_NOCACHE
130                                             | INTERNET_FLAG_CACHE_ASYNC
131                                             | INTERNET_FLAG_FORMS_SUBMIT
132                                             | INTERNET_FLAG_NEED_FILE
133                                             | INTERNET_FLAG_RESTRICTED_ZONE
134                                             | INTERNET_FLAG_TRANSFER_BINARY
135                                             | INTERNET_FLAG_TRANSFER_ASCII
136                                             | INTERNET_FLAG_FWD_BACK
137                                             | INTERNET_FLAG_BGUPDATE,
138 
139     INTERNET_ERROR_MASK_INSERT_CDROM                      = 0x1,
140     INTERNET_ERROR_MASK_COMBINED_SEC_CERT                 = 0x2,
141     INTERNET_ERROR_MASK_NEED_MSN_SSPI_PKG                 = 0X4,
142     INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY = 0x8,
143 
144     INTERNET_OPTIONS_MASK                  = ~INTERNET_FLAGS_MASK;
145 
146 enum INTERNET_NO_CALLBACK = 0;
147 enum INTERNET_RFC1123_FORMAT = 0;
148 enum size_t INTERNET_RFC1123_BUFSIZE = 30;
149 
150 enum DWORD
151     ICU_ESCAPE             = 0x80000000,
152     ICU_USERNAME           = 0x40000000,
153     ICU_NO_ENCODE          = 0x20000000,
154     ICU_DECODE             = 0x10000000,
155     ICU_NO_META            = 0x08000000,
156     ICU_ENCODE_SPACES_ONLY = 0x04000000,
157     ICU_BROWSER_MODE       = 0x02000000;
158 
159 enum {
160     INTERNET_OPEN_TYPE_PRECONFIG = 0,
161     INTERNET_OPEN_TYPE_DIRECT    = 1,
162     INTERNET_OPEN_TYPE_PROXY     = 3,
163     PRE_CONFIG_INTERNET_ACCESS   = INTERNET_OPEN_TYPE_PRECONFIG,
164     LOCAL_INTERNET_ACCESS        = INTERNET_OPEN_TYPE_DIRECT,
165     GATEWAY_INTERNET_ACCESS      = 2,
166     CERN_PROXY_INTERNET_ACCESS   = INTERNET_OPEN_TYPE_PROXY,
167 }
168 
169 enum ISO_GLOBAL      = 1;
170 enum ISO_REGISTRY    = 2;
171 enum ISO_VALID_FLAGS = ISO_GLOBAL | ISO_REGISTRY;
172 
173 enum {
174     INTERNET_OPTION_CALLBACK                    =  1,
175     INTERNET_OPTION_CONNECT_TIMEOUT,
176     INTERNET_OPTION_CONNECT_RETRIES,
177     INTERNET_OPTION_CONNECT_BACKOFF,
178     INTERNET_OPTION_SEND_TIMEOUT,
179     INTERNET_OPTION_CONTROL_SEND_TIMEOUT        = INTERNET_OPTION_SEND_TIMEOUT,
180     INTERNET_OPTION_RECEIVE_TIMEOUT,
181     INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT  = INTERNET_OPTION_RECEIVE_TIMEOUT,
182     INTERNET_OPTION_DATA_SEND_TIMEOUT,
183     INTERNET_OPTION_DATA_RECEIVE_TIMEOUT,
184     INTERNET_OPTION_HANDLE_TYPE                 = 9,
185     INTERNET_OPTION_LISTEN_TIMEOUT              = 11,
186     INTERNET_OPTION_READ_BUFFER_SIZE,
187     INTERNET_OPTION_WRITE_BUFFER_SIZE,       // = 13
188     INTERNET_OPTION_ASYNC_ID                    = 15,
189     INTERNET_OPTION_ASYNC_PRIORITY,          // = 16
190     INTERNET_OPTION_PARENT_HANDLE               = 21,
191     INTERNET_OPTION_KEEP_CONNECTION,
192     INTERNET_OPTION_REQUEST_FLAGS,
193     INTERNET_OPTION_EXTENDED_ERROR,          // = 24
194     INTERNET_OPTION_OFFLINE_MODE                = 26,
195     INTERNET_OPTION_CACHE_STREAM_HANDLE,
196     INTERNET_OPTION_USERNAME,
197     INTERNET_OPTION_PASSWORD,
198     INTERNET_OPTION_ASYNC,
199     INTERNET_OPTION_SECURITY_FLAGS,
200     INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT,
201     INTERNET_OPTION_DATAFILE_NAME,
202     INTERNET_OPTION_URL,
203     INTERNET_OPTION_SECURITY_CERTIFICATE,
204     INTERNET_OPTION_SECURITY_KEY_BITNESS,
205     INTERNET_OPTION_REFRESH,
206     INTERNET_OPTION_PROXY,
207     INTERNET_OPTION_SETTINGS_CHANGED,
208     INTERNET_OPTION_VERSION,
209     INTERNET_OPTION_USER_AGENT,
210     INTERNET_OPTION_END_BROWSER_SESSION,
211     INTERNET_OPTION_PROXY_USERNAME,
212     INTERNET_OPTION_PROXY_PASSWORD,          // = 44
213     INTERNET_OPTION_CONTEXT_VALUE          = 45,
214     INTERNET_OPTION_CONNECT_LIMIT          = 46,
215     INTERNET_OPTION_SECURITY_SELECT_CLIENT_CERT= 47,
216     INTERNET_OPTION_POLICY                 = 48,
217     INTERNET_OPTION_DISCONNECTED_TIMEOUT   = 49,
218     INTERNET_OPTION_CONNECTED_STATE        = 50,
219     INTERNET_OPTION_IDLE_STATE             = 51,
220     INTERNET_OPTION_OFFLINE_SEMANTICS      = 52,
221     INTERNET_OPTION_SECONDARY_CACHE_KEY    = 53,
222     INTERNET_OPTION_CALLBACK_FILTER        = 54,
223     INTERNET_OPTION_CONNECT_TIME           = 55,
224     INTERNET_OPTION_SEND_THROUGHPUT        = 56,
225     INTERNET_OPTION_RECEIVE_THROUGHPUT     = 57,
226     INTERNET_OPTION_REQUEST_PRIORITY       = 58,
227     INTERNET_OPTION_HTTP_VERSION           = 59,
228     INTERNET_OPTION_RESET_URLCACHE_SESSION = 60,
229     INTERNET_OPTION_ERROR_MASK             = 62,
230     INTERNET_OPTION_FROM_CACHE_TIMEOUT     = 63,
231     INTERNET_OPTION_BYPASS_EDITED_ENTRY    = 64,
232     INTERNET_OPTION_HTTP_DECODING          = 65,
233     INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO = 67,
234     INTERNET_OPTION_CODEPAGE               = 68,
235     INTERNET_OPTION_CACHE_TIMESTAMPS       = 69,
236     INTERNET_OPTION_DISABLE_AUTODIAL       = 70,
237     INTERNET_OPTION_MAX_CONNS_PER_SERVER    = 73,
238     INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER= 74,
239     INTERNET_OPTION_PER_CONNECTION_OPTION  = 75,
240     INTERNET_OPTION_DIGEST_AUTH_UNLOAD            = 76,
241     INTERNET_OPTION_IGNORE_OFFLINE          = 77,
242     INTERNET_OPTION_IDENTITY                = 78,
243     INTERNET_OPTION_REMOVE_IDENTITY         = 79,
244     INTERNET_OPTION_ALTER_IDENTITY          = 80,
245     INTERNET_OPTION_SUPPRESS_BEHAVIOR       = 81,
246     INTERNET_OPTION_AUTODIAL_MODE           = 82,
247     INTERNET_OPTION_AUTODIAL_CONNECTION     = 83,
248     INTERNET_OPTION_CLIENT_CERT_CONTEXT     = 84,
249     INTERNET_OPTION_AUTH_FLAGS              = 85,
250     INTERNET_OPTION_COOKIES_3RD_PARTY       = 86,
251     INTERNET_OPTION_DISABLE_PASSPORT_AUTH   = 87,
252     INTERNET_OPTION_SEND_UTF8_SERVERNAME_TO_PROXY        = 88,
253     INTERNET_OPTION_EXEMPT_CONNECTION_LIMIT = 89,
254     INTERNET_OPTION_ENABLE_PASSPORT_AUTH    = 90,
255     INTERNET_OPTION_HIBERNATE_INACTIVE_WORKER_THREADS      = 91,
256     INTERNET_OPTION_ACTIVATE_WORKER_THREADS                = 92,
257     INTERNET_OPTION_RESTORE_WORKER_THREAD_DEFAULTS         = 93,
258     INTERNET_OPTION_SOCKET_SEND_BUFFER_LENGTH              = 94,
259     INTERNET_OPTION_PROXY_SETTINGS_CHANGED                 = 95,
260     INTERNET_OPTION_DATAFILE_EXT                           = 96,
261     INTERNET_OPTION_CODEPAGE_PATH               = 100,
262     INTERNET_OPTION_CODEPAGE_EXTRA              = 101,
263     INTERNET_OPTION_IDN                         = 102,
264     INTERNET_OPTION_MAX_CONNS_PER_PROXY         = 103,
265     INTERNET_OPTION_SUPPRESS_SERVER_AUTH        = 104,
266     INTERNET_OPTION_SERVER_CERT_CHAIN_CONTEXT   = 105,
267     INTERNET_OPTION_ENABLE_REDIRECT_CACHE_READ  = 122,
268     INTERNET_OPTION_COMPRESSED_CONTENT_LENGTH   = 147,
269     INTERNET_OPTION_ENABLE_HTTP_PROTOCOL        = 148,
270     INTERNET_OPTION_HTTP_PROTOCOL_USED          = 149,
271     INTERNET_OPTION_ENCODE_EXTRA                = 155,
272     INTERNET_OPTION_HSTS                        = 157,
273     INTERNET_OPTION_ENTERPRISE_CONTEXT          = 159,
274     INTERNET_OPTION_CONNECTION_FILTER           = 162,
275     INTERNET_OPTION_REFERER_TOKEN_BINDING_HOSTNAME         = 163,
276     INTERNET_OPTION_TOKEN_BINDING_PUBLIC_KEY    = 181,
277     INTERNET_OPTION_COOKIES_SAME_SITE_LEVEL     = 187,
278     INTERNET_FIRST_OPTION                  = INTERNET_OPTION_CALLBACK,
279     INTERNET_LAST_OPTION                   = INTERNET_OPTION_COOKIES_SAME_SITE_LEVEL,
280 }
281 
282 enum INTERNET_PRIORITY_FOREGROUND = 1000;
283 
284 enum {
285     INTERNET_HANDLE_TYPE_INTERNET = 1,
286     INTERNET_HANDLE_TYPE_CONNECT_FTP,
287     INTERNET_HANDLE_TYPE_CONNECT_GOPHER,
288     INTERNET_HANDLE_TYPE_CONNECT_HTTP,
289     INTERNET_HANDLE_TYPE_FTP_FIND,
290     INTERNET_HANDLE_TYPE_FTP_FIND_HTML,
291     INTERNET_HANDLE_TYPE_FTP_FILE,
292     INTERNET_HANDLE_TYPE_FTP_FILE_HTML,
293     INTERNET_HANDLE_TYPE_GOPHER_FIND,
294     INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML,
295     INTERNET_HANDLE_TYPE_GOPHER_FILE,
296     INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML,
297     INTERNET_HANDLE_TYPE_HTTP_REQUEST
298 }
299 
300 enum DWORD
301     SECURITY_FLAG_SECURE                   = 0x00000001,
302     SECURITY_FLAG_SSL                      = 0x00000002,
303     SECURITY_FLAG_SSL3                     = 0x00000004,
304     SECURITY_FLAG_PCT                      = 0x00000008,
305     SECURITY_FLAG_PCT4                     = 0x00000010,
306     SECURITY_FLAG_IETFSSL4                 = 0x00000020,
307     SECURITY_FLAG_IGNORE_REVOCATION        = 0x00000080,
308     SECURITY_FLAG_IGNORE_UNKNOWN_CA        = 0x00000100,
309     SECURITY_FLAG_IGNORE_WRONG_USAGE       = 0x00000200,
310     SECURITY_FLAG_40BIT                    = 0x10000000,
311     SECURITY_FLAG_128BIT                   = 0x20000000,
312     SECURITY_FLAG_56BIT                    = 0x40000000,
313     SECURITY_FLAG_UNKNOWNBIT               = 0x80000000,
314     SECURITY_FLAG_NORMALBITNESS            = SECURITY_FLAG_40BIT,
315     SECURITY_FLAG_IGNORE_CERT_CN_INVALID   = INTERNET_FLAG_IGNORE_CERT_CN_INVALID,
316     SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = INTERNET_FLAG_IGNORE_CERT_DATE_INVALID,
317     SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS,
318     SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP  = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP;
319 
320 enum {
321     INTERNET_SERVICE_FTP = 1,
322     INTERNET_SERVICE_GOPHER,
323     INTERNET_SERVICE_HTTP
324 }
325 
326 enum {
327     INTERNET_STATUS_RESOLVING_NAME        =  10,
328     INTERNET_STATUS_NAME_RESOLVED         =  11,
329     INTERNET_STATUS_CONNECTING_TO_SERVER  =  20,
330     INTERNET_STATUS_CONNECTED_TO_SERVER   =  21,
331     INTERNET_STATUS_SENDING_REQUEST       =  30,
332     INTERNET_STATUS_REQUEST_SENT          =  31,
333     INTERNET_STATUS_RECEIVING_RESPONSE    =  40,
334     INTERNET_STATUS_RESPONSE_RECEIVED     =  41,
335     INTERNET_STATUS_CTL_RESPONSE_RECEIVED =  42,
336     INTERNET_STATUS_PREFETCH              =  43,
337     INTERNET_STATUS_CLOSING_CONNECTION    =  50,
338     INTERNET_STATUS_CONNECTION_CLOSED     =  51,
339     INTERNET_STATUS_HANDLE_CREATED        =  60,
340     INTERNET_STATUS_HANDLE_CLOSING        =  70,
341     INTERNET_STATUS_REQUEST_COMPLETE      = 100,
342     INTERNET_STATUS_REDIRECT              = 110
343 }
344 
345 enum {
346     FTP_TRANSFER_TYPE_UNKNOWN = 0,
347     FTP_TRANSFER_TYPE_ASCII   = 1,
348     FTP_TRANSFER_TYPE_BINARY  = 2,
349     FTP_TRANSFER_TYPE_MASK    = 3
350 }
351 
352 enum size_t
353     MAX_GOPHER_DISPLAY_TEXT   = 128,
354     MAX_GOPHER_SELECTOR_TEXT  = 256,
355     MAX_GOPHER_HOST_NAME      = INTERNET_MAX_HOST_NAME_LENGTH,
356     MAX_GOPHER_LOCATOR_LENGTH
357       = 1 + MAX_GOPHER_DISPLAY_TEXT + 1 + MAX_GOPHER_SELECTOR_TEXT + 1
358         + MAX_GOPHER_HOST_NAME + 1 + INTERNET_MAX_PORT_NUMBER_LENGTH + 4;
359 
360 enum DWORD
361     GOPHER_TYPE_TEXT_FILE      = 0x00000001,
362     GOPHER_TYPE_DIRECTORY      = 0x00000002,
363     GOPHER_TYPE_CSO            = 0x00000004,
364     GOPHER_TYPE_ERROR          = 0x00000008,
365     GOPHER_TYPE_MAC_BINHEX     = 0x00000010,
366     GOPHER_TYPE_DOS_ARCHIVE    = 0x00000020,
367     GOPHER_TYPE_UNIX_UUENCODED = 0x00000040,
368     GOPHER_TYPE_INDEX_SERVER   = 0x00000080,
369     GOPHER_TYPE_TELNET         = 0x00000100,
370     GOPHER_TYPE_BINARY         = 0x00000200,
371     GOPHER_TYPE_REDUNDANT      = 0x00000400,
372     GOPHER_TYPE_TN3270         = 0x00000800,
373     GOPHER_TYPE_GIF            = 0x00001000,
374     GOPHER_TYPE_IMAGE          = 0x00002000,
375     GOPHER_TYPE_BITMAP         = 0x00004000,
376     GOPHER_TYPE_MOVIE          = 0x00008000,
377     GOPHER_TYPE_SOUND          = 0x00010000,
378     GOPHER_TYPE_HTML           = 0x00020000,
379     GOPHER_TYPE_PDF            = 0x00040000,
380     GOPHER_TYPE_CALENDAR       = 0x00080000,
381     GOPHER_TYPE_INLINE         = 0x00100000,
382     GOPHER_TYPE_UNKNOWN        = 0x20000000,
383     GOPHER_TYPE_ASK            = 0x40000000,
384     GOPHER_TYPE_GOPHER_PLUS    = 0x80000000,
385     GOPHER_TYPE_FILE_MASK      = 0x001FF271;
386 
387 BOOL IS_GOPHER_FILE(DWORD t) {
388     return !!(t & GOPHER_TYPE_FILE_MASK);
389 }
390 
391 BOOL IS_GOPHER_DIRECTORY(DWORD t) {
392     return !!(t & GOPHER_TYPE_DIRECTORY);
393 }
394 
395 BOOL IS_GOPHER_PHONE_SERVER(DWORD t) {
396     return !!(t & GOPHER_TYPE_CSO);
397 }
398 
399 BOOL IS_GOPHER_ERROR(DWORD t) {
400     return !!(t & GOPHER_TYPE_ERROR);
401 }
402 
403 BOOL IS_GOPHER_INDEX_SERVER(DWORD t) {
404     return !!(t & GOPHER_TYPE_INDEX_SERVER);
405 }
406 
407 BOOL IS_GOPHER_TELNET_SESSION(DWORD t) {
408     return !!(t & GOPHER_TYPE_TELNET);
409 }
410 
411 BOOL IS_GOPHER_BACKUP_SERVER(DWORD t) {
412     return !!(t & GOPHER_TYPE_REDUNDANT);
413 }
414 
415 BOOL IS_GOPHER_TN3270_SESSION(DWORD t) {
416     return !!(t & GOPHER_TYPE_TN3270);
417 }
418 
419 BOOL IS_GOPHER_ASK(DWORD t) {
420     return !!(t & GOPHER_TYPE_ASK);
421 }
422 
423 BOOL IS_GOPHER_PLUS(DWORD t) {
424     return !!(t & GOPHER_TYPE_GOPHER_PLUS);
425 }
426 
427 BOOL IS_GOPHER_TYPE_KNOWN(DWORD t) {
428     return !(t & GOPHER_TYPE_UNKNOWN);
429 }
430 
431 enum size_t
432     MAX_GOPHER_CATEGORY_NAME    = 128,
433     MAX_GOPHER_ATTRIBUTE_NAME   = 128,
434     MIN_GOPHER_ATTRIBUTE_LENGTH = 256;
435 
436 const TCHAR[]
437     GOPHER_INFO_CATEGORY      = "+INFO",
438     GOPHER_ADMIN_CATEGORY     = "+ADMIN",
439     GOPHER_VIEWS_CATEGORY     = "+VIEWS",
440     GOPHER_ABSTRACT_CATEGORY  = "+ABSTRACT",
441     GOPHER_VERONICA_CATEGORY  = "+VERONICA",
442     GOPHER_ADMIN_ATTRIBUTE    = "Admin",
443     GOPHER_MOD_DATE_ATTRIBUTE = "Mod-Date",
444     GOPHER_TTL_ATTRIBUTE      = "TTL",
445     GOPHER_SCORE_ATTRIBUTE    = "Score",
446     GOPHER_RANGE_ATTRIBUTE    = "Score-range",
447     GOPHER_SITE_ATTRIBUTE     = "Site",
448     GOPHER_ORG_ATTRIBUTE      = "Org",
449     GOPHER_LOCATION_ATTRIBUTE = "Loc",
450     GOPHER_GEOG_ATTRIBUTE     = "Geog",
451     GOPHER_TIMEZONE_ATTRIBUTE = "TZ",
452     GOPHER_PROVIDER_ATTRIBUTE = "Provider",
453     GOPHER_VERSION_ATTRIBUTE  = "Version",
454     GOPHER_ABSTRACT_ATTRIBUTE = "Abstract",
455     GOPHER_VIEW_ATTRIBUTE     = "View",
456     GOPHER_TREEWALK_ATTRIBUTE = "treewalk";
457 
458 enum : DWORD {
459     GOPHER_ATTRIBUTE_ID_BASE = 0xABCCCC00,
460     GOPHER_CATEGORY_ID_ALL,
461     GOPHER_CATEGORY_ID_INFO,
462     GOPHER_CATEGORY_ID_ADMIN,
463     GOPHER_CATEGORY_ID_VIEWS,
464     GOPHER_CATEGORY_ID_ABSTRACT,
465     GOPHER_CATEGORY_ID_VERONICA,
466     GOPHER_CATEGORY_ID_ASK,
467     GOPHER_CATEGORY_ID_UNKNOWN,
468     GOPHER_ATTRIBUTE_ID_ALL,
469     GOPHER_ATTRIBUTE_ID_ADMIN,
470     GOPHER_ATTRIBUTE_ID_MOD_DATE,
471     GOPHER_ATTRIBUTE_ID_TTL,
472     GOPHER_ATTRIBUTE_ID_SCORE,
473     GOPHER_ATTRIBUTE_ID_RANGE,
474     GOPHER_ATTRIBUTE_ID_SITE,
475     GOPHER_ATTRIBUTE_ID_ORG,
476     GOPHER_ATTRIBUTE_ID_LOCATION,
477     GOPHER_ATTRIBUTE_ID_GEOG,
478     GOPHER_ATTRIBUTE_ID_TIMEZONE,
479     GOPHER_ATTRIBUTE_ID_PROVIDER,
480     GOPHER_ATTRIBUTE_ID_VERSION,
481     GOPHER_ATTRIBUTE_ID_ABSTRACT,
482     GOPHER_ATTRIBUTE_ID_VIEW,
483     GOPHER_ATTRIBUTE_ID_TREEWALK,
484     GOPHER_ATTRIBUTE_ID_UNKNOWN
485 }
486 
487 enum HTTP_MAJOR_VERSION   = 1;
488 enum HTTP_MINOR_VERSION   = 0;
489 const TCHAR[] HTTP_VERSION = "HTTP/1.0";
490 
491 enum : DWORD {
492     HTTP_QUERY_MIME_VERSION,
493     HTTP_QUERY_CONTENT_TYPE,
494     HTTP_QUERY_CONTENT_TRANSFER_ENCODING,
495     HTTP_QUERY_CONTENT_ID,
496     HTTP_QUERY_CONTENT_DESCRIPTION,
497     HTTP_QUERY_CONTENT_LENGTH,
498     HTTP_QUERY_CONTENT_LANGUAGE,
499     HTTP_QUERY_ALLOW,
500     HTTP_QUERY_PUBLIC,
501     HTTP_QUERY_DATE,
502     HTTP_QUERY_EXPIRES,
503     HTTP_QUERY_LAST_MODIFIED,
504     HTTP_QUERY_MESSAGE_ID,
505     HTTP_QUERY_URI,
506     HTTP_QUERY_DERIVED_FROM,
507     HTTP_QUERY_COST,
508     HTTP_QUERY_LINK,
509     HTTP_QUERY_PRAGMA,
510     HTTP_QUERY_VERSION,
511     HTTP_QUERY_STATUS_CODE,
512     HTTP_QUERY_STATUS_TEXT,
513     HTTP_QUERY_RAW_HEADERS,
514     HTTP_QUERY_RAW_HEADERS_CRLF,
515     HTTP_QUERY_CONNECTION,
516     HTTP_QUERY_ACCEPT,
517     HTTP_QUERY_ACCEPT_CHARSET,
518     HTTP_QUERY_ACCEPT_ENCODING,
519     HTTP_QUERY_ACCEPT_LANGUAGE,
520     HTTP_QUERY_AUTHORIZATION,
521     HTTP_QUERY_CONTENT_ENCODING,
522     HTTP_QUERY_FORWARDED,
523     HTTP_QUERY_FROM,
524     HTTP_QUERY_IF_MODIFIED_SINCE,
525     HTTP_QUERY_LOCATION,
526     HTTP_QUERY_ORIG_URI,
527     HTTP_QUERY_REFERER,
528     HTTP_QUERY_RETRY_AFTER,
529     HTTP_QUERY_SERVER,
530     HTTP_QUERY_TITLE,
531     HTTP_QUERY_USER_AGENT,
532     HTTP_QUERY_WWW_AUTHENTICATE,
533     HTTP_QUERY_PROXY_AUTHENTICATE,
534     HTTP_QUERY_ACCEPT_RANGES,
535     HTTP_QUERY_SET_COOKIE,
536     HTTP_QUERY_COOKIE,
537     HTTP_QUERY_REQUEST_METHOD,
538     HTTP_QUERY_MAX    = 45,
539     HTTP_QUERY_CUSTOM = 65535
540 }
541 
542 enum DWORD
543     HTTP_QUERY_FLAG_REQUEST_HEADERS = 0x80000000,
544     HTTP_QUERY_FLAG_SYSTEMTIME      = 0x40000000,
545     HTTP_QUERY_FLAG_NUMBER          = 0x20000000,
546     HTTP_QUERY_FLAG_COALESCE        = 0x10000000,
547     HTTP_QUERY_MODIFIER_FLAGS_MASK  = 0xF0000000,
548     HTTP_QUERY_HEADER_MASK          = ~HTTP_QUERY_MODIFIER_FLAGS_MASK;
549 
550 enum {
551     HTTP_STATUS_OK                 = 200,
552     HTTP_STATUS_CREATED,
553     HTTP_STATUS_ACCEPTED,
554     HTTP_STATUS_PARTIAL,
555     HTTP_STATUS_NO_CONTENT,     // = 204
556     HTTP_STATUS_AMBIGUOUS          = 300,
557     HTTP_STATUS_MOVED,
558     HTTP_STATUS_REDIRECT,
559     HTTP_STATUS_REDIRECT_METHOD,
560     HTTP_STATUS_NOT_MODIFIED,   // = 304
561     HTTP_STATUS_BAD_REQUEST        = 400,
562     HTTP_STATUS_DENIED,
563     HTTP_STATUS_PAYMENT_REQ,
564     HTTP_STATUS_FORBIDDEN,
565     HTTP_STATUS_NOT_FOUND,
566     HTTP_STATUS_BAD_METHOD,
567     HTTP_STATUS_NONE_ACCEPTABLE,
568     HTTP_STATUS_PROXY_AUTH_REQ,
569     HTTP_STATUS_REQUEST_TIMEOUT,
570     HTTP_STATUS_CONFLICT,
571     HTTP_STATUS_GONE,
572     HTTP_STATUS_AUTH_REFUSED,   // = 411
573     HTTP_STATUS_SERVER_ERROR       = 500,
574     HTTP_STATUS_NOT_SUPPORTED,
575     HTTP_STATUS_BAD_GATEWAY,
576     HTTP_STATUS_SERVICE_UNAVAIL,
577     HTTP_STATUS_GATEWAY_TIMEOUT // = 504
578 }
579 
580 enum {
581     INTERNET_PREFETCH_PROGRESS,
582     INTERNET_PREFETCH_COMPLETE,
583     INTERNET_PREFETCH_ABORTED
584 }
585 
586 enum FLAGS_ERROR_UI_FILTER_FOR_ERRORS    = 0x01;
587 enum FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS = 0x02;
588 enum FLAGS_ERROR_UI_FLAGS_GENERATE_DATA  = 0x04;
589 enum FLAGS_ERROR_UI_FLAGS_NO_UI          = 0x08;
590 
591 enum DWORD
592     HTTP_ADDREQ_INDEX_MASK                   = 0x0000FFFF,
593     HTTP_ADDREQ_FLAGS_MASK                   = 0xFFFF0000,
594     HTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON = 0x01000000,
595     HTTP_ADDREQ_FLAG_ADD_IF_NEW              = 0x10000000,
596     HTTP_ADDREQ_FLAG_ADD                     = 0x20000000,
597     HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA     = 0x40000000,
598     HTTP_ADDREQ_FLAG_COALESCE          = HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA,
599     HTTP_ADDREQ_FLAG_REPLACE                 = 0x80000000;
600 
601 enum {
602     INTERNET_ERROR_BASE                       = 12000,
603     ERROR_INTERNET_OUT_OF_HANDLES,
604     ERROR_INTERNET_TIMEOUT,
605     ERROR_INTERNET_EXTENDED_ERROR,
606     ERROR_INTERNET_INTERNAL_ERROR,
607     ERROR_INTERNET_INVALID_URL,
608     ERROR_INTERNET_UNRECOGNIZED_SCHEME,
609     ERROR_INTERNET_NAME_NOT_RESOLVED,
610     ERROR_INTERNET_PROTOCOL_NOT_FOUND,
611     ERROR_INTERNET_INVALID_OPTION,
612     ERROR_INTERNET_BAD_OPTION_LENGTH,
613     ERROR_INTERNET_OPTION_NOT_SETTABLE,
614     ERROR_INTERNET_SHUTDOWN,
615     ERROR_INTERNET_INCORRECT_USER_NAME,
616     ERROR_INTERNET_INCORRECT_PASSWORD,
617     ERROR_INTERNET_LOGIN_FAILURE,
618     ERROR_INTERNET_INVALID_OPERATION,
619     ERROR_INTERNET_OPERATION_CANCELLED,
620     ERROR_INTERNET_INCORRECT_HANDLE_TYPE,
621     ERROR_INTERNET_INCORRECT_HANDLE_STATE,
622     ERROR_INTERNET_NOT_PROXY_REQUEST,
623     ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND,
624     ERROR_INTERNET_BAD_REGISTRY_PARAMETER,
625     ERROR_INTERNET_NO_DIRECT_ACCESS,
626     ERROR_INTERNET_NO_CONTEXT,
627     ERROR_INTERNET_NO_CALLBACK,
628     ERROR_INTERNET_REQUEST_PENDING,
629     ERROR_INTERNET_INCORRECT_FORMAT,
630     ERROR_INTERNET_ITEM_NOT_FOUND,
631     ERROR_INTERNET_CANNOT_CONNECT,
632     ERROR_INTERNET_CONNECTION_ABORTED,
633     ERROR_INTERNET_CONNECTION_RESET,
634     ERROR_INTERNET_FORCE_RETRY,
635     ERROR_INTERNET_INVALID_PROXY_REQUEST,
636     ERROR_INTERNET_NEED_UI,                // = INTERNET_ERROR_BASE +  34
637     ERROR_INTERNET_HANDLE_EXISTS              = INTERNET_ERROR_BASE +  36,
638     ERROR_INTERNET_SEC_CERT_DATE_INVALID,
639     ERROR_INTERNET_SEC_CERT_CN_INVALID,
640     ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR,
641     ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR,
642     ERROR_INTERNET_MIXED_SECURITY,
643     ERROR_INTERNET_CHG_POST_IS_NON_SECURE,
644     ERROR_INTERNET_POST_IS_NON_SECURE,
645     ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
646     ERROR_INTERNET_INVALID_CA,
647     ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP,
648     ERROR_INTERNET_ASYNC_THREAD_FAILED,
649     ERROR_INTERNET_REDIRECT_SCHEME_CHANGE, // = INTERNET_ERROR_BASE +  48
650 
651     ERROR_FTP_TRANSFER_IN_PROGRESS            = INTERNET_ERROR_BASE + 110,
652     ERROR_FTP_DROPPED,                     // = INTERNET_ERROR_BASE + 111
653     ERROR_GOPHER_PROTOCOL_ERROR               = INTERNET_ERROR_BASE + 130,
654     ERROR_GOPHER_NOT_FILE,
655     ERROR_GOPHER_DATA_ERROR,
656     ERROR_GOPHER_END_OF_DATA,
657     ERROR_GOPHER_INVALID_LOCATOR,
658     ERROR_GOPHER_INCORRECT_LOCATOR_TYPE,
659     ERROR_GOPHER_NOT_GOPHER_PLUS,
660     ERROR_GOPHER_ATTRIBUTE_NOT_FOUND,
661     ERROR_GOPHER_UNKNOWN_LOCATOR,          // = INTERNET_ERROR_BASE + 138,
662     ERROR_HTTP_HEADER_NOT_FOUND               = INTERNET_ERROR_BASE + 150,
663     ERROR_HTTP_DOWNLEVEL_SERVER,
664     ERROR_HTTP_INVALID_SERVER_RESPONSE,
665     ERROR_HTTP_INVALID_HEADER,
666     ERROR_HTTP_INVALID_QUERY_REQUEST,
667     ERROR_HTTP_HEADER_ALREADY_EXISTS,
668     ERROR_HTTP_REDIRECT_FAILED,
669     ERROR_INTERNET_SECURITY_CHANNEL_ERROR,
670     ERROR_INTERNET_UNABLE_TO_CACHE_FILE,
671     ERROR_INTERNET_TCPIP_NOT_INSTALLED,
672     ERROR_HTTP_NOT_REDIRECTED,             // = INTERNET_ERROR_BASE + 160
673     // why?
674     INTERNET_ERROR_LAST                  = ERROR_INTERNET_TCPIP_NOT_INSTALLED
675 }
676 
677 
678 enum NORMAL_CACHE_ENTRY     = 0x000001;
679 enum STABLE_CACHE_ENTRY     = 0x000002;
680 enum STICKY_CACHE_ENTRY     = 0x000004;
681 enum SPARSE_CACHE_ENTRY     = 0x010000;
682 enum OCX_CACHE_ENTRY        = 0x020000;
683 enum COOKIE_CACHE_ENTRY     = 0x100000;
684 enum URLHISTORY_CACHE_ENTRY = 0x200000;
685 
686 enum CACHE_ENTRY_ATTRIBUTE_FC  = 0x0004;
687 enum CACHE_ENTRY_HITRATE_FC    = 0x0010;
688 enum CACHE_ENTRY_MODTIME_FC    = 0x0040;
689 enum CACHE_ENTRY_EXPTIME_FC    = 0x0080;
690 enum CACHE_ENTRY_ACCTIME_FC    = 0x0100;
691 enum CACHE_ENTRY_SYNCTIME_FC   = 0x0200;
692 enum CACHE_ENTRY_HEADERINFO_FC = 0x0400;
693 
694 enum {
695     WININET_API_FLAG_ASYNC       = 1,
696     WININET_API_FLAG_SYNC        = 4,
697     WININET_API_FLAG_USE_CONTEXT = 8
698 }
699 
700 // FIXME: how should these really be grouped?
701 enum {
702     IRF_ASYNC       = WININET_API_FLAG_ASYNC,
703     IRF_SYNC        = WININET_API_FLAG_SYNC,
704     IRF_USE_CONTEXT = WININET_API_FLAG_USE_CONTEXT,
705 }
706 enum IRF_NO_WAIT = 8;
707 
708 enum {
709     HSR_ASYNC = WININET_API_FLAG_ASYNC,
710     HSR_SYNC = WININET_API_FLAG_SYNC,
711     HSR_USE_CONTEXT = WININET_API_FLAG_USE_CONTEXT,
712 }
713 
714 enum HSR_INITIATE =  8;
715 enum HSR_DOWNLOAD = 16;
716 enum HSR_CHUNKED  = 32;
717 
718 enum INTERNET_DIAL_UNATTENDED              = 0x8000;
719 enum INTERNET_DIALSTATE_DISCONNECTED       = 1;
720 enum INTERENT_GOONLINE_REFRESH             = 1;
721 enum INTERENT_GOONLINE_MASK                = 1;
722 enum INTERNET_AUTODIAL_FORCE_ONLINE        = 1;
723 enum INTERNET_AUTODIAL_FORCE_UNATTENDED    = 2;
724 enum INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 4;
725 enum INTERNET_CONNECTION_MODEM             = 0x01;
726 enum INTERNET_CONNECTION_LAN               = 0x02;
727 enum INTERNET_CONNECTION_PROXY             = 0x04;
728 enum INTERNET_CONNECTION_MODEM_BUSY        = 0x08;
729 enum INTERNET_RAS_INSTALLED                = 0x10;
730 enum INTERNET_CONNECTION_OFFLINE           = 0x20;
731 enum INTERNET_CONNECTION_CONFIGURED        = 0x40;
732 
733 enum {
734     CACHEGROUP_SEARCH_ALL   = 0,
735     CACHEGROUP_SEARCH_BYURL = 1
736 }
737 
738 enum {
739     INTERNET_CACHE_GROUP_ADD    = 0,
740     INTERNET_CACHE_GROUP_REMOVE = 1
741 }
742 
743 alias HINTERNET = HANDLE;
744 // mixin DECLARE_HANDLE!("HINTERNET"); // doesn't work - bug
745 /*struct HINTERNET {
746     HANDLE h;
747     alias this = h;
748 }*/
749 alias LPHINTERNET = HINTERNET*;
750 
751 alias GROUPID = LONGLONG;
752 alias INTERNET_PORT = WORD;
753 alias LPINTERNET_PORT = WORD*;
754 
755 enum INTERNET_SCHEME {
756     INTERNET_SCHEME_PARTIAL = -2,
757     INTERNET_SCHEME_UNKNOWN,
758     INTERNET_SCHEME_DEFAULT,
759     INTERNET_SCHEME_FTP,
760     INTERNET_SCHEME_GOPHER,
761     INTERNET_SCHEME_HTTP,
762     INTERNET_SCHEME_HTTPS,
763     INTERNET_SCHEME_FILE,
764     INTERNET_SCHEME_NEWS,
765     INTERNET_SCHEME_MAILTO,
766     INTERNET_SCHEME_SOCKS,
767     INTERNET_SCHEME_JAVASCRIPT,
768     INTERNET_SCHEME_VBSCRIPT,
769     INTERNET_SCHEME_RES,
770     INTERNET_SCHEME_FIRST = INTERNET_SCHEME_FTP,
771     INTERNET_SCHEME_LAST = INTERNET_SCHEME_RES
772 }
773 alias LPINTERNET_SCHEME = INTERNET_SCHEME*;
774 
775 struct INTERNET_ASYNC_RESULT {
776     DWORD_PTR dwResult;
777     DWORD dwError;
778 }
779 alias LPINTERNET_ASYNC_RESULT = INTERNET_ASYNC_RESULT*;
780 
781 struct INTERNET_DIAGNOSTIC_SOCKET_INFO {
782     DWORD_PTR Socket;
783     DWORD     SourcePort;
784     DWORD     DestPort;
785     DWORD     Flags;
786 }
787 alias LPINTERNET_DIAGNOSTIC_SOCKET_INFO = INTERNET_DIAGNOSTIC_SOCKET_INFO*;
788 
789 struct INTERNET_PREFETCH_STATUS {
790     DWORD dwStatus;
791     DWORD dwSize;
792 }
793 alias LPINTERNET_PREFETCH_STATUS = INTERNET_PREFETCH_STATUS*;
794 
795 struct INTERNET_PROXY_INFO {
796     DWORD dwAccessType;
797     LPCTSTR lpszProxy;
798     LPCTSTR lpszProxyBypass;
799 }
800 alias LPINTERNET_PROXY_INFO = INTERNET_PROXY_INFO*;
801 
802 struct INTERNET_PER_CONN_OPTIONA {
803     DWORD   dwOption;
804     union {
805         DWORD    dwValue;
806         LPSTR    pszValue;
807         FILETIME ftValue;
808     }
809 }
810 alias LPINTERNET_PER_CONN_OPTIONA = INTERNET_PER_CONN_OPTIONA*;
811 
812 struct INTERNET_PER_CONN_OPTIONW {
813     DWORD   dwOption;
814     union {
815         DWORD    dwValue;
816         LPWSTR   pszValue;
817         FILETIME ftValue;
818     }
819 }
820 alias LPINTERNET_PER_CONN_OPTIONW = INTERNET_PER_CONN_OPTIONW*;
821 
822 struct INTERNET_PER_CONN_OPTION_LISTA {
823     DWORD   dwSize;
824     LPSTR   pszConnection;
825     DWORD   dwOptionCount;
826     DWORD   dwOptionError;
827     LPINTERNET_PER_CONN_OPTIONA  pOptions;
828 }
829 alias LPINTERNET_PER_CONN_OPTION_LISTA = INTERNET_PER_CONN_OPTION_LISTA*;
830 
831 struct INTERNET_PER_CONN_OPTION_LISTW {
832     DWORD   dwSize;
833     LPWSTR  pszConnection;
834     DWORD   dwOptionCount;
835     DWORD   dwOptionError;
836     LPINTERNET_PER_CONN_OPTIONW  pOptions;
837 }
838 alias LPINTERNET_PER_CONN_OPTION_LISTW = INTERNET_PER_CONN_OPTION_LISTW*;
839 
840 enum {
841     INTERNET_PER_CONN_FLAGS                        = 1,
842     INTERNET_PER_CONN_PROXY_SERVER                 = 2,
843     INTERNET_PER_CONN_PROXY_BYPASS                 = 3,
844     INTERNET_PER_CONN_AUTOCONFIG_URL               = 4,
845     INTERNET_PER_CONN_AUTODISCOVERY_FLAGS          = 5,
846     INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL     = 6,
847     INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS = 7,
848     INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME  = 8,
849     INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL   = 9,
850     INTERNET_PER_CONN_FLAGS_UI                     = 10,
851 }
852 
853 enum {
854     PROXY_TYPE_DIRECT                              = 0x00000001,
855     PROXY_TYPE_PROXY                               = 0x00000002,
856     PROXY_TYPE_AUTO_PROXY_URL                      = 0x00000004,
857     PROXY_TYPE_AUTO_DETECT                         = 0x00000008,
858 }
859 
860 enum {
861     AUTO_PROXY_FLAG_USER_SET                       = 0x00000001,
862     AUTO_PROXY_FLAG_ALWAYS_DETECT                  = 0x00000002,
863     AUTO_PROXY_FLAG_DETECTION_RUN                  = 0x00000004,
864     AUTO_PROXY_FLAG_MIGRATED                       = 0x00000008,
865     AUTO_PROXY_FLAG_DONT_CACHE_PROXY_RESULT        = 0x00000010,
866     AUTO_PROXY_FLAG_CACHE_INIT_RUN                 = 0x00000020,
867     AUTO_PROXY_FLAG_DETECTION_SUSPECT              = 0x00000040,
868 }
869 
870 struct INTERNET_VERSION_INFO {
871     DWORD dwMajorVersion;
872     DWORD dwMinorVersion;
873 }
874 alias LPINTERNET_VERSION_INFO = INTERNET_VERSION_INFO*;
875 
876 struct URL_COMPONENTSA {
877     DWORD           dwStructSize = URL_COMPONENTSA.sizeof;
878     LPSTR           lpszScheme;
879     DWORD           dwSchemeLength;
880     INTERNET_SCHEME nScheme;
881     LPSTR           lpszHostName;
882     DWORD           dwHostNameLength;
883     INTERNET_PORT   nPort;
884     LPSTR           lpszUserName;
885     DWORD           dwUserNameLength;
886     LPSTR           lpszPassword;
887     DWORD           dwPasswordLength;
888     LPSTR           lpszUrlPath;
889     DWORD           dwUrlPathLength;
890     LPSTR           lpszExtraInfo;
891     DWORD           dwExtraInfoLength;
892 }
893 alias LPURL_COMPONENTSA = URL_COMPONENTSA*;
894 
895 struct URL_COMPONENTSW {
896     DWORD  dwStructSize = URL_COMPONENTSW.sizeof;
897     LPWSTR lpszScheme;
898     DWORD  dwSchemeLength;
899     INTERNET_SCHEME nScheme;
900     LPWSTR lpszHostName;
901     DWORD  dwHostNameLength;
902     INTERNET_PORT nPort;
903     LPWSTR lpszUserName;
904     DWORD  dwUserNameLength;
905     LPWSTR lpszPassword;
906     DWORD  dwPasswordLength;
907     LPWSTR lpszUrlPath;
908     DWORD  dwUrlPathLength;
909     LPWSTR lpszExtraInfo;
910     DWORD  dwExtraInfoLength;
911 }
912 alias LPURL_COMPONENTSW = URL_COMPONENTSW*;
913 
914 struct INTERNET_CERTIFICATE_INFO {
915     FILETIME ftExpiry;
916     FILETIME ftStart;
917     LPTSTR   lpszSubjectInfo;
918     LPTSTR   lpszIssuerInfo;
919     LPTSTR   lpszProtocolName;
920     LPTSTR   lpszSignatureAlgName;
921     LPTSTR   lpszEncryptionAlgName;
922     DWORD    dwKeySize;
923 }
924 alias LPINTERNET_CERTIFICATE_INFO = INTERNET_CERTIFICATE_INFO*;
925 
926 extern (Windows) alias void function(HINTERNET, DWORD_PTR, DWORD, PVOID, DWORD)
927   INTERNET_STATUS_CALLBACK;
928 alias LPINTERNET_STATUS_CALLBACK = INTERNET_STATUS_CALLBACK*;
929 
930 enum INTERNET_INVALID_STATUS_CALLBACK
931   = cast(INTERNET_STATUS_CALLBACK) -1;
932 
933 struct GOPHER_FIND_DATAA {
934     CHAR[MAX_GOPHER_DISPLAY_TEXT+1] DisplayString = 0;
935     DWORD    GopherType;
936     DWORD    SizeLow;
937     DWORD    SizeHigh;
938     FILETIME LastModificationTime;
939     CHAR[MAX_GOPHER_LOCATOR_LENGTH+1] Locator = 0;
940 }
941 alias LPGOPHER_FIND_DATAA = GOPHER_FIND_DATAA*;
942 
943 struct GOPHER_FIND_DATAW {
944     WCHAR[MAX_GOPHER_DISPLAY_TEXT+1] DisplayString = 0;
945     DWORD    GopherType;
946     DWORD    SizeLow;
947     DWORD    SizeHigh;
948     FILETIME LastModificationTime;
949     WCHAR[MAX_GOPHER_LOCATOR_LENGTH+1] Locator = 0;
950 }
951 alias LPGOPHER_FIND_DATAW = GOPHER_FIND_DATAW*;
952 
953 struct GOPHER_ADMIN_ATTRIBUTE_TYPE {
954     LPCTSTR Comment;
955     LPCTSTR EmailAddress;
956 }
957 alias LPGOPHER_ADMIN_ATTRIBUTE_TYPE = GOPHER_ADMIN_ATTRIBUTE_TYPE*;
958 
959 struct GOPHER_MOD_DATE_ATTRIBUTE_TYPE {
960     FILETIME DateAndTime;
961 }
962 alias LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE = GOPHER_MOD_DATE_ATTRIBUTE_TYPE*;
963 
964 struct GOPHER_TTL_ATTRIBUTE_TYPE {
965     DWORD Ttl;
966 }
967 alias LPGOPHER_TTL_ATTRIBUTE_TYPE = GOPHER_TTL_ATTRIBUTE_TYPE*;
968 
969 struct GOPHER_SCORE_ATTRIBUTE_TYPE {
970     INT Score;
971 }
972 alias LPGOPHER_SCORE_ATTRIBUTE_TYPE = GOPHER_SCORE_ATTRIBUTE_TYPE*;
973 
974 struct GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE {
975     INT LowerBound;
976     INT UpperBound;
977 }
978 alias LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE = GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE*;
979 
980 struct GOPHER_SITE_ATTRIBUTE_TYPE {
981     LPCTSTR Site;
982 }
983 alias LPGOPHER_SITE_ATTRIBUTE_TYPE = GOPHER_SITE_ATTRIBUTE_TYPE*;
984 
985 struct GOPHER_ORGANIZATION_ATTRIBUTE_TYPE {
986     LPCTSTR Organization;
987 }
988 alias LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPE = GOPHER_ORGANIZATION_ATTRIBUTE_TYPE*;
989 
990 struct GOPHER_LOCATION_ATTRIBUTE_TYPE {
991     LPCTSTR Location;
992 }
993 alias LPGOPHER_LOCATION_ATTRIBUTE_TYPE = GOPHER_LOCATION_ATTRIBUTE_TYPE*;
994 
995 struct GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE {
996     INT DegreesNorth;
997     INT MinutesNorth;
998     INT SecondsNorth;
999     INT DegreesEast;
1000     INT MinutesEast;
1001     INT SecondsEast;
1002 }
1003 alias GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE*
1004   LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE;
1005 
1006 struct GOPHER_TIMEZONE_ATTRIBUTE_TYPE {
1007     INT Zone;
1008 }
1009 alias LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE = GOPHER_TIMEZONE_ATTRIBUTE_TYPE*;
1010 
1011 struct GOPHER_PROVIDER_ATTRIBUTE_TYPE {
1012     LPCTSTR Provider;
1013 }
1014 alias LPGOPHER_PROVIDER_ATTRIBUTE_TYPE = GOPHER_PROVIDER_ATTRIBUTE_TYPE*;
1015 
1016 struct GOPHER_VERSION_ATTRIBUTE_TYPE {
1017     LPCTSTR Version;
1018 }
1019 alias LPGOPHER_VERSION_ATTRIBUTE_TYPE = GOPHER_VERSION_ATTRIBUTE_TYPE*;
1020 
1021 struct GOPHER_ABSTRACT_ATTRIBUTE_TYPE {
1022     LPCTSTR ShortAbstract;
1023     LPCTSTR AbstractFile;
1024 }
1025 alias LPGOPHER_ABSTRACT_ATTRIBUTE_TYPE = GOPHER_ABSTRACT_ATTRIBUTE_TYPE*;
1026 
1027 struct GOPHER_VIEW_ATTRIBUTE_TYPE {
1028     LPCTSTR ContentType;
1029     LPCTSTR Language;
1030     DWORD   Size;
1031 }
1032 alias LPGOPHER_VIEW_ATTRIBUTE_TYPE = GOPHER_VIEW_ATTRIBUTE_TYPE*;
1033 
1034 struct GOPHER_VERONICA_ATTRIBUTE_TYPE {
1035     BOOL TreeWalk;
1036 }
1037 alias LPGOPHER_VERONICA_ATTRIBUTE_TYPE = GOPHER_VERONICA_ATTRIBUTE_TYPE*;
1038 
1039 struct GOPHER_ASK_ATTRIBUTE_TYPE {
1040     LPCTSTR QuestionType;
1041     LPCTSTR QuestionText;
1042 }
1043 alias LPGOPHER_ASK_ATTRIBUTE_TYPE = GOPHER_ASK_ATTRIBUTE_TYPE*;
1044 
1045 struct GOPHER_UNKNOWN_ATTRIBUTE_TYPE {
1046     LPCTSTR Text;
1047 }
1048 alias LPGOPHER_UNKNOWN_ATTRIBUTE_TYPE = GOPHER_UNKNOWN_ATTRIBUTE_TYPE*;
1049 
1050 struct GOPHER_ATTRIBUTE_TYPE {
1051     DWORD CategoryId;
1052     DWORD AttributeId;
1053     union {
1054         GOPHER_ADMIN_ATTRIBUTE_TYPE                 Admin;
1055         GOPHER_MOD_DATE_ATTRIBUTE_TYPE              ModDate;
1056         GOPHER_TTL_ATTRIBUTE_TYPE                   Ttl;
1057         GOPHER_SCORE_ATTRIBUTE_TYPE                 Score;
1058         GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE           ScoreRange;
1059         GOPHER_SITE_ATTRIBUTE_TYPE                  Site;
1060         GOPHER_ORGANIZATION_ATTRIBUTE_TYPE          Organization;
1061         GOPHER_LOCATION_ATTRIBUTE_TYPE              Location;
1062         GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE GeographicalLocation;
1063         GOPHER_TIMEZONE_ATTRIBUTE_TYPE              TimeZone;
1064         GOPHER_PROVIDER_ATTRIBUTE_TYPE              Provider;
1065         GOPHER_VERSION_ATTRIBUTE_TYPE               Version;
1066         GOPHER_ABSTRACT_ATTRIBUTE_TYPE              Abstract;
1067         GOPHER_VIEW_ATTRIBUTE_TYPE                  View;
1068         GOPHER_VERONICA_ATTRIBUTE_TYPE              Veronica;
1069         GOPHER_ASK_ATTRIBUTE_TYPE                   Ask;
1070         GOPHER_UNKNOWN_ATTRIBUTE_TYPE               Unknown;
1071     } /+AttributeType;+/
1072 }
1073 alias LPGOPHER_ATTRIBUTE_TYPE = GOPHER_ATTRIBUTE_TYPE*;
1074 
1075 extern (Windows)
1076 alias BOOL function(LPGOPHER_ATTRIBUTE_TYPE, DWORD)
1077   GOPHER_ATTRIBUTE_ENUMERATOR;
1078 
1079 struct INTERNET_CACHE_ENTRY_INFOA {
1080     DWORD    dwStructSize = INTERNET_CACHE_ENTRY_INFOA.sizeof;
1081     LPSTR    lpszSourceUrlName;
1082     LPSTR    lpszLocalFileName;
1083     DWORD    CacheEntryType;
1084     DWORD    dwUseCount;
1085     DWORD    dwHitRate;
1086     DWORD    dwSizeLow;
1087     DWORD    dwSizeHigh;
1088     FILETIME LastModifiedTime;
1089     FILETIME ExpireTime;
1090     FILETIME LastAccessTime;
1091     FILETIME LastSyncTime;
1092     PBYTE    lpHeaderInfo;
1093     DWORD    dwHeaderInfoSize;
1094     LPSTR    lpszFileExtension;
1095     DWORD    dwReserved;
1096 }
1097 alias LPINTERNET_CACHE_ENTRY_INFOA = INTERNET_CACHE_ENTRY_INFOA*;
1098 
1099 struct INTERNET_CACHE_ENTRY_INFOW {
1100     DWORD    dwStructSize = INTERNET_CACHE_ENTRY_INFOW.sizeof;
1101     LPWSTR   lpszSourceUrlName;
1102     LPWSTR   lpszLocalFileName;
1103     DWORD    CacheEntryType;
1104     DWORD    dwUseCount;
1105     DWORD    dwHitRate;
1106     DWORD    dwSizeLow;
1107     DWORD    dwSizeHigh;
1108     FILETIME LastModifiedTime;
1109     FILETIME ExpireTime;
1110     FILETIME LastAccessTime;
1111     FILETIME LastSyncTime;
1112     PBYTE    lpHeaderInfo;
1113     DWORD    dwHeaderInfoSize;
1114     LPWSTR   lpszFileExtension;
1115     DWORD    dwReserved;
1116 }
1117 alias LPINTERNET_CACHE_ENTRY_INFOW = INTERNET_CACHE_ENTRY_INFOW*;
1118 
1119 struct INTERNET_BUFFERSA {
1120     DWORD              dwStructSize = INTERNET_BUFFERSA.sizeof;
1121     INTERNET_BUFFERSA* Next;
1122     LPCSTR             lpcszHeader;
1123     DWORD              dwHeadersLength;
1124     DWORD              dwHeadersTotal;
1125     LPVOID             lpvBuffer;
1126     DWORD              dwBufferLength;
1127     DWORD              dwBufferTotal;
1128     DWORD              dwOffsetLow;
1129     DWORD              dwOffsetHigh;
1130 }
1131 alias LPINTERNET_BUFFERSA = INTERNET_BUFFERSA*;
1132 
1133 struct INTERNET_BUFFERSW {
1134     DWORD              dwStructSize = INTERNET_BUFFERSW.sizeof;
1135     INTERNET_BUFFERSW* Next;
1136     LPCWSTR            lpcszHeader;
1137     DWORD              dwHeadersLength;
1138     DWORD              dwHeadersTotal;
1139     LPVOID             lpvBuffer;
1140     DWORD              dwBufferLength;
1141     DWORD              dwBufferTotal;
1142     DWORD              dwOffsetLow;
1143     DWORD              dwOffsetHigh;
1144 }
1145 alias LPINTERNET_BUFFERSW = INTERNET_BUFFERSW*;
1146 
1147 enum size_t
1148     GROUP_OWNER_STORAGE_SIZE =   4,
1149     GROUPNAME_MAX_LENGTH     = 120;
1150 
1151 struct INTERNET_CACHE_GROUP_INFOA {
1152     DWORD dwGroupSize;
1153     DWORD dwGroupFlags;
1154     DWORD dwGroupType;
1155     DWORD dwDiskUsage;
1156     DWORD dwDiskQuota;
1157     DWORD[GROUP_OWNER_STORAGE_SIZE] dwOwnerStorage;
1158     CHAR[GROUPNAME_MAX_LENGTH]      szGroupName = 0;
1159 }
1160 alias LPINTERNET_CACHE_GROUP_INFOA = INTERNET_CACHE_GROUP_INFOA*;
1161 
1162 struct INTERNET_CACHE_GROUP_INFOW {
1163     DWORD dwGroupSize;
1164     DWORD dwGroupFlags;
1165     DWORD dwGroupType;
1166     DWORD dwDiskUsage;
1167     DWORD dwDiskQuota;
1168     DWORD[GROUP_OWNER_STORAGE_SIZE] dwOwnerStorage;
1169     WCHAR[GROUPNAME_MAX_LENGTH]     szGroupName = 0;
1170 }
1171 alias LPINTERNET_CACHE_GROUP_INFOW = INTERNET_CACHE_GROUP_INFOW*;
1172 
1173 extern (Windows) {
1174     BOOL InternetTimeFromSystemTime(SYSTEMTIME*, DWORD, LPSTR, DWORD);
1175     BOOL InternetTimeToSystemTime(LPCSTR, SYSTEMTIME*, DWORD);
1176     BOOL InternetDebugGetLocalTime(SYSTEMTIME*, PDWORD);
1177     BOOL InternetCrackUrlA(LPCSTR, DWORD, DWORD, LPURL_COMPONENTSA);
1178     BOOL InternetCrackUrlW(LPCWSTR, DWORD, DWORD, LPURL_COMPONENTSW);
1179     BOOL InternetCreateUrlA(LPURL_COMPONENTSA, DWORD, LPSTR, PDWORD);
1180     BOOL InternetCreateUrlW(LPURL_COMPONENTSW, DWORD, LPWSTR, PDWORD);
1181     BOOL InternetCanonicalizeUrlA(LPCSTR, LPSTR, PDWORD, DWORD);
1182     BOOL InternetCanonicalizeUrlW(LPCWSTR, LPWSTR, PDWORD, DWORD);
1183     BOOL InternetCheckConnectionA(LPCSTR, DWORD, DWORD);
1184     BOOL InternetCheckConnectionW(LPCWSTR, DWORD, DWORD);
1185     BOOL InternetCombineUrlA(LPCSTR, LPCSTR, LPSTR, PDWORD, DWORD);
1186     BOOL InternetCombineUrlW(LPCWSTR, LPCWSTR, LPWSTR, PDWORD, DWORD);
1187     HINTERNET InternetOpenA(LPCSTR, DWORD, LPCSTR, LPCSTR, DWORD);
1188     HINTERNET InternetOpenW(LPCWSTR, DWORD, LPCWSTR, LPCWSTR, DWORD);
1189     BOOL InternetCloseHandle(HINTERNET);
1190     HINTERNET InternetConnectA(HINTERNET, LPCSTR, INTERNET_PORT, LPCSTR,
1191       LPCSTR, DWORD, DWORD, DWORD_PTR);
1192     HINTERNET InternetConnectW(HINTERNET, LPCWSTR, INTERNET_PORT, LPCWSTR,
1193       LPCWSTR, DWORD, DWORD, DWORD_PTR);
1194     HINTERNET InternetOpenUrlA(HINTERNET, LPCSTR, LPCSTR, DWORD, DWORD,
1195       DWORD_PTR);
1196     HINTERNET InternetOpenUrlW(HINTERNET, LPCWSTR, LPCWSTR, DWORD, DWORD,
1197       DWORD_PTR);
1198     BOOL InternetReadFile(HINTERNET, PVOID, DWORD, PDWORD);
1199     DWORD InternetSetFilePointer(HINTERNET, LONG, PVOID, DWORD, DWORD_PTR);
1200     BOOL InternetWriteFile(HINTERNET, LPCVOID, DWORD, PDWORD);
1201     BOOL InternetQueryDataAvailable(HINTERNET, PDWORD, DWORD, DWORD_PTR);
1202     BOOL InternetFindNextFileA(HINTERNET, PVOID);
1203     BOOL InternetFindNextFileW(HINTERNET, PVOID);
1204     BOOL InternetQueryOptionA(HINTERNET, DWORD, PVOID, PDWORD);
1205     BOOL InternetQueryOptionW(HINTERNET, DWORD, PVOID, PDWORD);
1206     BOOL InternetSetOptionA(HINTERNET, DWORD, PVOID, DWORD);
1207     BOOL InternetSetOptionW(HINTERNET, DWORD, PVOID, DWORD);
1208     BOOL InternetSetOptionExA(HINTERNET, DWORD, PVOID, DWORD, DWORD);
1209     BOOL InternetSetOptionExW(HINTERNET, DWORD, PVOID, DWORD, DWORD);
1210     BOOL InternetGetLastResponseInfoA(PDWORD, LPSTR, PDWORD);
1211     BOOL InternetGetLastResponseInfoW(PDWORD, LPWSTR, PDWORD);
1212     INTERNET_STATUS_CALLBACK InternetSetStatusCallback(HINTERNET,
1213       INTERNET_STATUS_CALLBACK);
1214     DWORD FtpGetFileSize(HINTERNET, LPDWORD);
1215     HINTERNET FtpFindFirstFileA(HINTERNET, LPCSTR, LPWIN32_FIND_DATAA, DWORD,
1216       DWORD_PTR);
1217     HINTERNET FtpFindFirstFileW(HINTERNET, LPCWSTR, LPWIN32_FIND_DATAW, DWORD,
1218       DWORD_PTR);
1219     BOOL FtpGetFileA(HINTERNET, LPCSTR, LPCSTR, BOOL, DWORD, DWORD, DWORD_PTR);
1220     BOOL FtpGetFileW(HINTERNET, LPCWSTR, LPCWSTR, BOOL, DWORD, DWORD, DWORD_PTR);
1221     BOOL FtpPutFileA(HINTERNET, LPCSTR, LPCSTR, DWORD, DWORD_PTR);
1222     BOOL FtpPutFileW(HINTERNET, LPCWSTR, LPCWSTR, DWORD, DWORD_PTR);
1223     BOOL FtpDeleteFileA(HINTERNET, LPCSTR);
1224     BOOL FtpDeleteFileW(HINTERNET, LPCWSTR);
1225     BOOL FtpRenameFileA(HINTERNET, LPCSTR, LPCSTR);
1226     BOOL FtpRenameFileW(HINTERNET, LPCWSTR, LPCWSTR);
1227     HINTERNET FtpOpenFileA(HINTERNET, LPCSTR, DWORD, DWORD, DWORD_PTR);
1228     HINTERNET FtpOpenFileW(HINTERNET, LPCWSTR, DWORD, DWORD, DWORD_PTR);
1229     BOOL FtpCreateDirectoryA(HINTERNET, LPCSTR);
1230     BOOL FtpCreateDirectoryW(HINTERNET, LPCWSTR);
1231     BOOL FtpRemoveDirectoryA(HINTERNET, LPCSTR);
1232     BOOL FtpRemoveDirectoryW(HINTERNET, LPCWSTR);
1233     BOOL FtpSetCurrentDirectoryA(HINTERNET, LPCSTR);
1234     BOOL FtpSetCurrentDirectoryW(HINTERNET, LPCWSTR);
1235     BOOL FtpGetCurrentDirectoryA(HINTERNET, LPSTR, PDWORD);
1236     BOOL FtpGetCurrentDirectoryW(HINTERNET, LPWSTR, PDWORD);
1237     BOOL FtpCommandA(HINTERNET, BOOL, DWORD, LPCSTR, DWORD_PTR, HINTERNET*);
1238     BOOL FtpCommandW(HINTERNET, BOOL, DWORD, LPCWSTR, DWORD_PTR, HINTERNET*);
1239     BOOL GopherCreateLocatorA(LPCSTR, INTERNET_PORT, LPCSTR, LPCSTR, DWORD,
1240       LPSTR, PDWORD);
1241     BOOL GopherCreateLocatorW(LPCWSTR, INTERNET_PORT, LPCWSTR, LPCWSTR, DWORD,
1242       LPWSTR, PDWORD);
1243     BOOL GopherGetLocatorTypeA(LPCSTR, PDWORD);
1244     BOOL GopherGetLocatorTypeW(LPCWSTR, PDWORD);
1245     HINTERNET GopherFindFirstFileA(HINTERNET, LPCSTR, LPCSTR,
1246       LPGOPHER_FIND_DATAA, DWORD, DWORD_PTR);
1247     HINTERNET GopherFindFirstFileW(HINTERNET, LPCWSTR, LPCWSTR,
1248       LPGOPHER_FIND_DATAW, DWORD, DWORD_PTR);
1249     HINTERNET GopherOpenFileA(HINTERNET, LPCSTR, LPCSTR, DWORD, DWORD_PTR);
1250     HINTERNET GopherOpenFileW(HINTERNET, LPCWSTR, LPCWSTR, DWORD, DWORD_PTR);
1251     BOOL GopherGetAttributeA(HINTERNET, LPCSTR, LPCSTR, LPBYTE, DWORD,
1252       PDWORD, GOPHER_ATTRIBUTE_ENUMERATOR, DWORD_PTR);
1253     BOOL GopherGetAttributeW(HINTERNET, LPCWSTR, LPCWSTR, LPBYTE, DWORD,
1254       PDWORD, GOPHER_ATTRIBUTE_ENUMERATOR, DWORD_PTR);
1255     HINTERNET HttpOpenRequestA(HINTERNET, LPCSTR, LPCSTR, LPCSTR, LPCSTR,
1256       LPCSTR*, DWORD, DWORD_PTR);
1257     HINTERNET HttpOpenRequestW(HINTERNET, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR,
1258       LPCWSTR*, DWORD, DWORD_PTR);
1259     BOOL HttpAddRequestHeadersA(HINTERNET, LPCSTR, DWORD, DWORD);
1260     BOOL HttpAddRequestHeadersW(HINTERNET, LPCWSTR, DWORD, DWORD);
1261     BOOL HttpSendRequestA(HINTERNET, LPCSTR, DWORD, PVOID, DWORD);
1262     BOOL HttpSendRequestW(HINTERNET, LPCWSTR, DWORD, PVOID, DWORD);
1263     BOOL HttpQueryInfoA(HINTERNET, DWORD, PVOID, PDWORD, PDWORD);
1264     BOOL HttpQueryInfoW(HINTERNET, DWORD, PVOID, PDWORD, PDWORD);
1265     BOOL InternetSetCookieA(LPCSTR, LPCSTR, LPCSTR);
1266     BOOL InternetSetCookieW(LPCWSTR, LPCWSTR, LPCWSTR);
1267     BOOL InternetGetCookieA(LPCSTR, LPCSTR, LPSTR, PDWORD);
1268     BOOL InternetGetCookieW(LPCWSTR, LPCWSTR, LPWSTR, PDWORD);
1269     DWORD InternetAttemptConnect(DWORD);
1270     DWORD InternetErrorDlg(HWND, HINTERNET, DWORD, DWORD, PVOID*);
1271     DWORD InternetConfirmZoneCrossing(HWND, LPSTR, LPSTR, BOOL);
1272     BOOL CreateUrlCacheEntryA(LPCSTR, DWORD, LPCSTR, LPSTR, DWORD);
1273     BOOL CreateUrlCacheEntryW(LPCWSTR, DWORD, LPCWSTR, LPWSTR, DWORD);
1274     BOOL CommitUrlCacheEntryA(LPCSTR, LPCSTR, FILETIME, FILETIME, DWORD,
1275       LPBYTE, DWORD, LPCSTR, DWORD);
1276     BOOL CommitUrlCacheEntryW(LPCWSTR, LPCWSTR, FILETIME, FILETIME, DWORD,
1277       LPBYTE, DWORD, LPCWSTR, DWORD);
1278     BOOL RetrieveUrlCacheEntryFileA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA,
1279       PDWORD, DWORD);
1280     BOOL RetrieveUrlCacheEntryFileW(LPCWSTR, LPINTERNET_CACHE_ENTRY_INFOW,
1281       PDWORD, DWORD);
1282     BOOL UnlockUrlCacheEntryFile(LPCSTR, DWORD);
1283     HANDLE RetrieveUrlCacheEntryStreamA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA,
1284       PDWORD, BOOL, DWORD);
1285     HANDLE RetrieveUrlCacheEntryStreamW(LPCWSTR, LPINTERNET_CACHE_ENTRY_INFOW,
1286       PDWORD, BOOL, DWORD);
1287     BOOL ReadUrlCacheEntryStream(HANDLE, DWORD, PVOID, PDWORD, DWORD);
1288     BOOL UnlockUrlCacheEntryStream(HANDLE, DWORD);
1289     BOOL GetUrlCacheEntryInfoA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA, PDWORD);
1290     BOOL GetUrlCacheEntryInfoW(LPCWSTR, LPINTERNET_CACHE_ENTRY_INFOW, PDWORD);
1291     BOOL SetUrlCacheEntryInfoA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA, DWORD);
1292     BOOL SetUrlCacheEntryInfoW(LPCWSTR, LPINTERNET_CACHE_ENTRY_INFOW, DWORD);
1293     HANDLE FindFirstUrlCacheEntryA(LPCSTR, LPINTERNET_CACHE_ENTRY_INFOA,
1294       PDWORD);
1295     HANDLE FindFirstUrlCacheEntryW(LPCWSTR, LPINTERNET_CACHE_ENTRY_INFOW,
1296       PDWORD);
1297     BOOL FindNextUrlCacheEntryA(HANDLE, LPINTERNET_CACHE_ENTRY_INFOA, PDWORD);
1298     BOOL FindNextUrlCacheEntryW(HANDLE, LPINTERNET_CACHE_ENTRY_INFOW, PDWORD);
1299     BOOL FindCloseUrlCache(HANDLE);
1300     BOOL DeleteUrlCacheEntry(LPCSTR);
1301     DWORD AuthenticateUser(PVOID*, LPSTR, LPSTR, DWORD, LPSTR, DWORD, LPSTR,
1302       LPSTR);
1303     BOOL HttpSendRequestExA(HINTERNET, LPINTERNET_BUFFERSA,
1304       LPINTERNET_BUFFERSA, DWORD, DWORD_PTR);
1305     BOOL HttpSendRequestExW(HINTERNET, LPINTERNET_BUFFERSW,
1306       LPINTERNET_BUFFERSW, DWORD, DWORD_PTR);
1307     BOOL HttpEndRequestA(HINTERNET, LPINTERNET_BUFFERSA, DWORD, DWORD_PTR);
1308     BOOL HttpEndRequestW(HINTERNET, LPINTERNET_BUFFERSW, DWORD, DWORD_PTR);
1309     DWORD InternetDial(HWND, LPTSTR, DWORD, LPDWORD, DWORD);
1310     DWORD InternetHangUp(DWORD_PTR, DWORD);
1311     BOOL InternetGoOnline(LPTSTR, HWND, DWORD);
1312     BOOL InternetAutodial(DWORD, DWORD);
1313     BOOL InternetAutodialHangup(DWORD);
1314     BOOL InternetGetConnectedState(LPDWORD, DWORD);
1315     BOOL InternetSetDialState(LPCTSTR, DWORD, DWORD);
1316     BOOL InternetReadFileExA(HINTERNET, LPINTERNET_BUFFERSA, DWORD, DWORD_PTR);
1317     BOOL InternetReadFileExW(HINTERNET, LPINTERNET_BUFFERSW, DWORD, DWORD_PTR);
1318     GROUPID CreateUrlCacheGroup(DWORD, LPVOID);
1319     BOOL DeleteUrlCacheGroup(GROUPID, DWORD, LPVOID);
1320     HANDLE FindFirstUrlCacheGroup(DWORD, DWORD, LPVOID, DWORD, GROUPID*,
1321       LPVOID);
1322     BOOL FindNextUrlCacheGroup(HANDLE, GROUPID*, LPVOID);
1323     BOOL GetUrlCacheGroupAttributeA(GROUPID, DWORD, DWORD,
1324       LPINTERNET_CACHE_GROUP_INFOA, LPDWORD, LPVOID);
1325     BOOL GetUrlCacheGroupAttributeW(GROUPID, DWORD, DWORD,
1326       LPINTERNET_CACHE_GROUP_INFOW, LPDWORD, LPVOID);
1327     BOOL SetUrlCacheGroupAttributeA(GROUPID, DWORD, DWORD,
1328       LPINTERNET_CACHE_GROUP_INFOA, LPVOID);
1329     BOOL SetUrlCacheGroupAttributeW(GROUPID, DWORD, DWORD,
1330       LPINTERNET_CACHE_GROUP_INFOW, LPVOID);
1331 }
1332 
1333 version (Unicode) {
1334     alias INTERNET_PER_CONN_OPTION = INTERNET_PER_CONN_OPTIONW;
1335     alias LPINTERNET_PER_CONN_OPTION = LPINTERNET_PER_CONN_OPTIONW;
1336     alias INTERNET_PER_CONN_OPTION_LIST = INTERNET_PER_CONN_OPTION_LISTW;
1337     alias LPINTERNET_PER_CONN_OPTION_LIST = LPINTERNET_PER_CONN_OPTION_LISTW;
1338     alias URL_COMPONENTS = URL_COMPONENTSW;
1339     alias LPURL_COMPONENTS = LPURL_COMPONENTSW;
1340     alias GOPHER_FIND_DATA = GOPHER_FIND_DATAW;
1341     alias LPGOPHER_FIND_DATA = LPGOPHER_FIND_DATAW;
1342     alias INTERNET_CACHE_ENTRY_INFO = INTERNET_CACHE_ENTRY_INFOW;
1343     alias LPINTERNET_CACHE_ENTRY_INFO = LPINTERNET_CACHE_ENTRY_INFOW;
1344     alias INTERNET_BUFFERS = INTERNET_BUFFERSW;
1345     alias INTERNET_CACHE_GROUP_INFO = INTERNET_CACHE_GROUP_INFOW;
1346     alias LPINTERNET_CACHE_GROUP_INFO = LPINTERNET_CACHE_GROUP_INFOW;
1347     alias InternetCrackUrl = InternetCrackUrlW;
1348     alias InternetCreateUrl = InternetCreateUrlW;
1349     alias InternetCanonicalizeUrl = InternetCanonicalizeUrlW;
1350     alias InternetCheckConnection = InternetCheckConnectionW;
1351     alias InternetCombineUrl = InternetCombineUrlW;
1352     alias InternetOpen = InternetOpenW;
1353     alias InternetConnect = InternetConnectW;
1354     alias InternetOpenUrl = InternetOpenUrlW;
1355     alias InternetFindNextFile = InternetFindNextFileW;
1356     alias InternetQueryOption = InternetQueryOptionW;
1357     alias InternetSetOption = InternetSetOptionW;
1358     alias InternetSetOptionEx = InternetSetOptionExW;
1359     alias InternetGetLastResponseInfo = InternetGetLastResponseInfoW;
1360     alias InternetReadFileEx = InternetReadFileExW;
1361     alias FtpFindFirstFile = FtpFindFirstFileW;
1362     alias FtpGetFile = FtpGetFileW;
1363     alias FtpPutFile = FtpPutFileW;
1364     alias FtpDeleteFile = FtpDeleteFileW;
1365     alias FtpRenameFile = FtpRenameFileW;
1366     alias FtpOpenFile = FtpOpenFileW;
1367     alias FtpCreateDirectory = FtpCreateDirectoryW;
1368     alias FtpRemoveDirectory = FtpRemoveDirectoryW;
1369     alias FtpSetCurrentDirectory = FtpSetCurrentDirectoryW;
1370     alias FtpGetCurrentDirectory = FtpGetCurrentDirectoryW;
1371     alias FtpCommand = FtpCommandW;
1372     alias GopherGetLocatorType = GopherGetLocatorTypeW;
1373     alias GopherCreateLocator = GopherCreateLocatorW;
1374     alias GopherFindFirstFile = GopherFindFirstFileW;
1375     alias GopherOpenFile = GopherOpenFileW;
1376     alias GopherGetAttribute = GopherGetAttributeW;
1377     alias HttpSendRequest = HttpSendRequestW;
1378     alias HttpOpenRequest = HttpOpenRequestW;
1379     alias HttpAddRequestHeaders = HttpAddRequestHeadersW;
1380     alias HttpQueryInfo = HttpQueryInfoW;
1381     alias InternetSetCookie = InternetSetCookieW;
1382     alias InternetGetCookie = InternetGetCookieW;
1383     alias CreateUrlCacheEntry = CreateUrlCacheEntryW;
1384     alias RetrieveUrlCacheEntryStream = RetrieveUrlCacheEntryStreamW;
1385     alias FindNextUrlCacheEntry = FindNextUrlCacheEntryW;
1386     alias CommitUrlCacheEntry = CommitUrlCacheEntryW;
1387     alias GetUrlCacheEntryInfo = GetUrlCacheEntryInfoW;
1388     alias SetUrlCacheEntryInfo = SetUrlCacheEntryInfoW;
1389     alias FindFirstUrlCacheEntry = FindFirstUrlCacheEntryW;
1390     alias RetrieveUrlCacheEntryFile = RetrieveUrlCacheEntryFileW;
1391     alias HttpSendRequestEx = HttpSendRequestExW;
1392     alias HttpEndRequest = HttpEndRequestW;
1393     alias GetUrlCacheGroupAttribute = GetUrlCacheGroupAttributeW;
1394     alias SetUrlCacheGroupAttribute = SetUrlCacheGroupAttributeW;
1395 } else {
1396     alias INTERNET_PER_CONN_OPTION = INTERNET_PER_CONN_OPTIONA;
1397     alias LPINTERNET_PER_CONN_OPTION = LPINTERNET_PER_CONN_OPTIONA;
1398     alias INTERNET_PER_CONN_OPTION_LIST = INTERNET_PER_CONN_OPTION_LISTA;
1399     alias LPINTERNET_PER_CONN_OPTION_LIST = LPINTERNET_PER_CONN_OPTION_LISTA;
1400     alias URL_COMPONENTS = URL_COMPONENTSA;
1401     alias LPURL_COMPONENTS = LPURL_COMPONENTSA;
1402     alias GOPHER_FIND_DATA = GOPHER_FIND_DATAA;
1403     alias LPGOPHER_FIND_DATA = LPGOPHER_FIND_DATAA;
1404     alias INTERNET_CACHE_ENTRY_INFO = INTERNET_CACHE_ENTRY_INFOA;
1405     alias LPINTERNET_CACHE_ENTRY_INFO = LPINTERNET_CACHE_ENTRY_INFOA;
1406     alias INTERNET_BUFFERS = INTERNET_BUFFERSA;
1407     alias INTERNET_CACHE_GROUP_INFO = INTERNET_CACHE_GROUP_INFOA;
1408     alias LPINTERNET_CACHE_GROUP_INFO = LPINTERNET_CACHE_GROUP_INFOA;
1409     alias GopherGetAttribute = GopherGetAttributeA;
1410     alias InternetCrackUrl = InternetCrackUrlA;
1411     alias InternetCreateUrl = InternetCreateUrlA;
1412     alias InternetCanonicalizeUrl = InternetCanonicalizeUrlA;
1413     alias InternetCheckConnection = InternetCheckConnectionA;
1414     alias InternetCombineUrl = InternetCombineUrlA;
1415     alias InternetOpen = InternetOpenA;
1416     alias InternetConnect = InternetConnectA;
1417     alias InternetOpenUrl = InternetOpenUrlA;
1418     alias InternetFindNextFile = InternetFindNextFileA;
1419     alias InternetQueryOption = InternetQueryOptionA;
1420     alias InternetSetOption = InternetSetOptionA;
1421     alias InternetSetOptionEx = InternetSetOptionExA;
1422     alias InternetGetLastResponseInfo = InternetGetLastResponseInfoA;
1423     alias InternetReadFileEx = InternetReadFileExA;
1424     alias FtpFindFirstFile = FtpFindFirstFileA;
1425     alias FtpGetFile = FtpGetFileA;
1426     alias FtpPutFile = FtpPutFileA;
1427     alias FtpDeleteFile = FtpDeleteFileA;
1428     alias FtpRenameFile = FtpRenameFileA;
1429     alias FtpOpenFile = FtpOpenFileA;
1430     alias FtpCreateDirectory = FtpCreateDirectoryA;
1431     alias FtpRemoveDirectory = FtpRemoveDirectoryA;
1432     alias FtpSetCurrentDirectory = FtpSetCurrentDirectoryA;
1433     alias FtpGetCurrentDirectory = FtpGetCurrentDirectoryA;
1434     alias FtpCommand = FtpCommandA;
1435     alias GopherGetLocatorType = GopherGetLocatorTypeA;
1436     alias GopherCreateLocator = GopherCreateLocatorA;
1437     alias GopherFindFirstFile = GopherFindFirstFileA;
1438     alias GopherOpenFile = GopherOpenFileA;
1439     alias HttpSendRequest = HttpSendRequestA;
1440     alias HttpOpenRequest = HttpOpenRequestA;
1441     alias HttpAddRequestHeaders = HttpAddRequestHeadersA;
1442     alias HttpQueryInfo = HttpQueryInfoA;
1443     alias InternetSetCookie = InternetSetCookieA;
1444     alias InternetGetCookie = InternetGetCookieA;
1445     alias CreateUrlCacheEntry = CreateUrlCacheEntryA;
1446     alias RetrieveUrlCacheEntryStream = RetrieveUrlCacheEntryStreamA;
1447     alias FindNextUrlCacheEntry = FindNextUrlCacheEntryA;
1448     alias CommitUrlCacheEntry = CommitUrlCacheEntryA;
1449     alias GetUrlCacheEntryInfo = GetUrlCacheEntryInfoA;
1450     alias SetUrlCacheEntryInfo = SetUrlCacheEntryInfoA;
1451     alias FindFirstUrlCacheEntry = FindFirstUrlCacheEntryA;
1452     alias RetrieveUrlCacheEntryFile = RetrieveUrlCacheEntryFileA;
1453     alias HttpSendRequestEx = HttpSendRequestExA;
1454     alias HttpEndRequest = HttpEndRequestA;
1455     alias GetUrlCacheGroupAttribute = GetUrlCacheGroupAttributeA;
1456     alias SetUrlCacheGroupAttribute = SetUrlCacheGroupAttributeA;
1457 }
1458 
1459 alias LPINTERNET_BUFFERS = INTERNET_BUFFERS*;