home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / cb / setup / cbuilder / data.z / WININET.PAS < prev    next >
Pascal/Delphi Source File  |  1997-02-28  |  47KB  |  1,028 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Delphi Run-time Library                         }
  5. {       Windows 32bit API Interface Unit                }
  6. {                                                       }
  7. {       Copyright (c) 1996 Borland International        }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit WinInet;
  12.  
  13. interface
  14.  
  15. uses Windows;
  16.  
  17. { Contains manifests, functions, types and prototypes for 
  18.   Microsoft Windows Internet Extensions }
  19.  
  20. { internet types }
  21.  
  22. type
  23.   HINTERNET = Pointer; 
  24.   PHINTERNET = ^HINTERNET; 
  25.  
  26.   INTERNET_PORT = Word; 
  27.   PINTERNET_PORT = ^INTERNET_PORT; 
  28.  
  29. { Internet APIs }
  30.  
  31. { manifests }
  32.  
  33. const
  34.   INTERNET_INVALID_PORT_NUMBER = 0;                 { use the protocol-specific default }
  35.  
  36.   INTERNET_DEFAULT_FTP_PORT = 21;                   { default for FTP servers }
  37.   INTERNET_DEFAULT_GOPHER_PORT = 70;                {    "     "  gopher " }
  38.   INTERNET_DEFAULT_HTTP_PORT = 80;                  {    "     "  HTTP   " }
  39.  
  40. { maximum field lengths (arbitrary) }
  41.  
  42.   INTERNET_MAX_HOST_NAME_LENGTH = 256; 
  43.   INTERNET_MAX_USER_NAME_LENGTH = 128; 
  44.   INTERNET_MAX_PASSWORD_LENGTH = 128; 
  45.   INTERNET_MAX_PORT_NUMBER_LENGTH = 5;              { INTERNET_PORT is unsigned short }
  46.   INTERNET_MAX_PORT_NUMBER_VALUE = 65535;           { maximum unsigned short value }
  47.   INTERNET_MAX_PATH_LENGTH = 1024; 
  48.   INTERNET_MAX_PROTOCOL_NAME = 'gopher';            { longest protocol name }
  49.   INTERNET_MAX_URL_LENGTH = ((SizeOf(INTERNET_MAX_PROTOCOL_NAME) - 1) 
  50.                             + SizeOf('://')
  51.                             + INTERNET_MAX_PATH_LENGTH);
  52.  
  53. { values returned by InternetQueryOption() with INTERNET_OPTION_KEEP_CONNECTION: }
  54.  
  55.   INTERNET_KEEP_ALIVE_UNKNOWN = -1; 
  56.   INTERNET_KEEP_ALIVE_ENABLED = 1; 
  57.   INTERNET_KEEP_ALIVE_DISABLED = 0; 
  58.  
  59. { flags returned by InternetQueryOption() with INTERNET_OPTION_REQUEST_FLAGS }
  60.  
  61.   INTERNET_REQFLAG_FROM_CACHE = $00000001; 
  62.   INTERNET_REQFLAG_ASYNC = $00000002; 
  63.  
  64. { flags common to open functions (not InternetOpen()): }
  65.  
  66.   INTERNET_FLAG_RELOAD = $80000000;                 { retrieve the original item }
  67.  
  68. { flags for InternetOpenUrl(): }
  69.  
  70.   INTERNET_FLAG_RAW_DATA = $40000000;               { receive the item as raw data }
  71.   INTERNET_FLAG_EXISTING_CONNECT = $20000000;       { do not create new connection object }
  72.  
  73. { flags for InternetOpen(): }
  74.  
  75.   INTERNET_FLAG_ASYNC = $10000000;                  { this request is asynchronous (where supported) }
  76.  
  77. { protocol-specific flags: }
  78.  
  79.   INTERNET_FLAG_PASSIVE = $08000000;                { used for FTP connections }
  80.  
  81. { additional cache flags }
  82.  
  83.   INTERNET_FLAG_DONT_CACHE = $04000000;             { don't add this item to the cache }
  84.   INTERNET_FLAG_MAKE_PERSISTENT = $02000000;        { make this item persistent in cache }
  85.  
  86. { flags field masks }
  87.  
  88.   INTERNET_FLAGS_MASK = INTERNET_FLAG_RELOAD 
  89.                                         or INTERNET_FLAG_RAW_DATA 
  90.                                         or INTERNET_FLAG_EXISTING_CONNECT 
  91.                                         or INTERNET_FLAG_ASYNC 
  92.                                         or INTERNET_FLAG_PASSIVE 
  93.                                         or INTERNET_FLAG_DONT_CACHE 
  94.                                         or INTERNET_FLAG_MAKE_PERSISTENT 
  95.                                         ; 
  96.  
  97.   INTERNET_OPTIONS_MASK =  not INTERNET_FLAGS_MASK; 
  98.  
  99. { INTERNET_NO_CALLBACK - if this value is presented as the dwContext parameter }
  100. { then no call-backs will be made for that API }
  101.  
  102.   INTERNET_NO_CALLBACK = 0; 
  103.  
  104. { structures/types }
  105.  
  106. { INTERNET_ASYNC_RESULT - this structure is returned to the application via }
  107. { the callback with INTERNET_STATUS_REQUEST_COMPLETE. It is not sufficient to }
  108. { just return the result of the async operation. If the API failed then the }
  109. { app cannot call GetLastError() because the thread context will be incorrect. }
  110. { Both the value returned by the async API and any resultant error code are }
  111. { made available. The app need not check dwError if dwResult indicates that }
  112. { the API succeeded (it will be ERROR_SUCCESS) }
  113.  
  114. type
  115.   PInternetAsyncResult = ^TInternetAsyncResult;
  116.   TInternetAsyncResult = packed record
  117.     dwResult: DWORD; { the HINTERNET, DWORD or BOOL return code from an async API }
  118.     dwError: DWORD; { dwError - the error code if the API failed }
  119.   end;
  120.  
  121. { prototypes }
  122.  
  123. function InternetOpenA(lpszCallerName: PAnsiChar; dwAccessType: DWORD; 
  124.   lpszServerName: PAnsiChar; nServerPort: INTERNET_PORT; 
  125.   dwFlags: DWORD): HINTERNET; stdcall;
  126. function InternetOpenW(lpszCallerName: PWideChar; dwAccessType: DWORD; 
  127.   lpszServerName: PWideChar; nServerPort: INTERNET_PORT; 
  128.   dwFlags: DWORD): HINTERNET; stdcall;
  129. function InternetOpen(lpszCallerName: PChar; dwAccessType: DWORD; 
  130.   lpszServerName: PChar; nServerPort: INTERNET_PORT; 
  131.   dwFlags: DWORD): HINTERNET; stdcall;
  132.  
  133. { access types for InternetOpen() }
  134. const
  135.   PRE_CONFIG_INTERNET_ACCESS = 0;       { use default }
  136.   LOCAL_INTERNET_ACCESS = 1;            { direct to Internet }
  137.   GATEWAY_INTERNET_ACCESS = 2;          { Internet via gateway }
  138.   CERN_PROXY_INTERNET_ACCESS = 3;       { Internet via CERN proxy }
  139.  
  140. function InternetCloseHandle(hInet: HINTERNET): BOOL; stdcall;
  141.  
  142. function InternetConnectA(hInet: HINTERNET; lpszServerName: PAnsiChar; 
  143.   nServerPort: INTERNET_PORT; lpszUsername: PAnsiChar; lpszPassword: PAnsiChar; 
  144.   dwService: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  145. function InternetConnectW(hInet: HINTERNET; lpszServerName: PWideChar; 
  146.   nServerPort: INTERNET_PORT; lpszUsername: PWideChar; lpszPassword: PWideChar; 
  147.   dwService: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  148. function InternetConnect(hInet: HINTERNET; lpszServerName: PChar; 
  149.   nServerPort: INTERNET_PORT; lpszUsername: PChar; lpszPassword: PChar; 
  150.   dwService: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  151.  
  152. { service types for InternetConnect() }
  153. const
  154.   INTERNET_SERVICE_FTP = 1; 
  155.   INTERNET_SERVICE_GOPHER = 2; 
  156.   INTERNET_SERVICE_HTTP = 3; 
  157.  
  158. function InternetOpenUrlA(hInet: HINTERNET; lpszUrl: PAnsiChar; 
  159.   lpszHeaders: PAnsiChar; dwHeadersLength: DWORD; dwFlags: DWORD; 
  160.   dwContext: DWORD): HINTERNET; stdcall;
  161. function InternetOpenUrlW(hInet: HINTERNET; lpszUrl: PWideChar; 
  162.   lpszHeaders: PWideChar; dwHeadersLength: DWORD; dwFlags: DWORD; 
  163.   dwContext: DWORD): HINTERNET; stdcall;
  164. function InternetOpenUrl(hInet: HINTERNET; lpszUrl: PChar; 
  165.   lpszHeaders: PChar; dwHeadersLength: DWORD; dwFlags: DWORD; 
  166.   dwContext: DWORD): HINTERNET; stdcall;
  167.  
  168. function InternetReadFile(hFile: HINTERNET; lpBuffer: Pointer; 
  169.   dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; stdcall;
  170.  
  171. function InternetWriteFile(hFile: HINTERNET; lpBuffer: Pointer; 
  172.   dwNumberOfBytesToWrite: DWORD; 
  173.   var lpdwNumberOfBytesWritten: DWORD): BOOL; stdcall;
  174.  
  175. function InternetFindNextFileA(hFind: HINTERNET; lpvFindData: Pointer): BOOL; stdcall;
  176. function InternetFindNextFileW(hFind: HINTERNET; lpvFindData: Pointer): BOOL; stdcall;
  177. function InternetFindNextFile(hFind: HINTERNET; lpvFindData: Pointer): BOOL; stdcall;
  178.  
  179. function InternetQueryOption(hInet: HINTERNET; dwOption: DWORD; 
  180.   lpBuffer: Pointer; var lpdwBufferLength: DWORD): BOOL; stdcall;
  181.  
  182. function InternetSetOption(hInet: HINTERNET; dwOption: DWORD; 
  183.   lpBuffer: Pointer; dwBufferLength: DWORD): BOOL; stdcall;
  184.  
  185. { options manifests for Internet(Query or Set)Option }
  186. const
  187.   INTERNET_OPTION_CALLBACK = 1; 
  188.   INTERNET_OPTION_CONNECT_TIMEOUT = 2; 
  189.   INTERNET_OPTION_CONNECT_RETRIES = 3; 
  190.   INTERNET_OPTION_CONNECT_BACKOFF = 4; 
  191.   INTERNET_OPTION_SEND_TIMEOUT = 5; 
  192.   INTERNET_OPTION_CONTROL_SEND_TIMEOUT       = INTERNET_OPTION_SEND_TIMEOUT; 
  193.   INTERNET_OPTION_RECEIVE_TIMEOUT = 6; 
  194.   INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT    = INTERNET_OPTION_RECEIVE_TIMEOUT; 
  195.   INTERNET_OPTION_DATA_SEND_TIMEOUT = 7; 
  196.   INTERNET_OPTION_DATA_RECEIVE_TIMEOUT = 8; 
  197.   INTERNET_OPTION_HANDLE_TYPE = 9; 
  198.   INTERNET_OPTION_CONTEXT_VALUE = 10; 
  199.   INTERNET_OPTION_NAME_RES_THREAD = 11; 
  200.   INTERNET_OPTION_READ_BUFFER_SIZE = 12; 
  201.   INTERNET_OPTION_WRITE_BUFFER_SIZE = 13; 
  202.   INTERNET_OPTION_GATEWAY_NAME = 14; 
  203.   INTERNET_OPTION_ASYNC_ID = 15; 
  204.   INTERNET_OPTION_ASYNC_PRIORITY = 16; 
  205.   INTERNET_OPTION_ASYNC_REQUEST_COUNT = 17; 
  206.   INTERNET_OPTION_MAXIMUM_WORKER_THREADS = 18; 
  207.   INTERNET_OPTION_ASYNC_QUEUE_DEPTH = 19; 
  208.   INTERNET_OPTION_WORKER_THREAD_TIMEOUT = 20; 
  209.   INTERNET_OPTION_PARENT_HANDLE = 21; 
  210.   INTERNET_OPTION_KEEP_CONNECTION = 22; 
  211.   INTERNET_OPTION_REQUEST_FLAGS = 23; 
  212.  
  213.   INTERNET_FIRST_OPTION                      = INTERNET_OPTION_CALLBACK; 
  214.   INTERNET_LAST_OPTION                       = INTERNET_OPTION_KEEP_CONNECTION; 
  215.  
  216. { values for INTERNET_OPTION_PRIORITY }
  217.  
  218.   INTERNET_PRIORITY_FOREGROUND = 1000; 
  219.  
  220. { handle types }
  221.  
  222.   INTERNET_HANDLE_TYPE_INTERNET = 1; 
  223.   INTERNET_HANDLE_TYPE_CONNECT_FTP = 2; 
  224.   INTERNET_HANDLE_TYPE_CONNECT_GOPHER = 3; 
  225.   INTERNET_HANDLE_TYPE_CONNECT_HTTP = 4; 
  226.   INTERNET_HANDLE_TYPE_FTP_FIND = 5; 
  227.   INTERNET_HANDLE_TYPE_FTP_FIND_HTML = 6; 
  228.   INTERNET_HANDLE_TYPE_FTP_FILE = 7; 
  229.   INTERNET_HANDLE_TYPE_FTP_FILE_HTML = 8; 
  230.   INTERNET_HANDLE_TYPE_GOPHER_FIND = 9; 
  231.   INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML = 10; 
  232.   INTERNET_HANDLE_TYPE_GOPHER_FILE = 11; 
  233.   INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML = 12; 
  234.   INTERNET_HANDLE_TYPE_HTTP_REQUEST = 13; 
  235.  
  236. function InternetGetLastResponseInfoA(var lpdwError: DWORD; lpszBuffer: PAnsiChar; 
  237.   var lpdwBufferLength: DWORD): BOOL; stdcall;
  238. function InternetGetLastResponseInfoW(var lpdwError: DWORD; lpszBuffer: PWideChar; 
  239.   var lpdwBufferLength: DWORD): BOOL; stdcall;
  240. function InternetGetLastResponseInfo(var lpdwError: DWORD; lpszBuffer: PChar; 
  241.   var lpdwBufferLength: DWORD): BOOL; stdcall;
  242.  
  243. { callback function for InternetSetStatusCallback }
  244. type
  245.   TFNInternetStatusCallback = TFarProc;
  246.   PFNInternetStatusCallback = ^TFNInternetStatusCallback;
  247.  
  248. function InternetSetStatusCallback(hInet: HINTERNET; 
  249.   lpfnInternetCallback: PFNInternetStatusCallback): PFNInternetStatusCallback; stdcall;
  250.  
  251. { status manifests for Internet status callback }
  252. const
  253.   INTERNET_STATUS_RESOLVING_NAME = 10; 
  254.   INTERNET_STATUS_NAME_RESOLVED = 11; 
  255.   INTERNET_STATUS_CONNECTING_TO_SERVER = 20; 
  256.   INTERNET_STATUS_CONNECTED_TO_SERVER = 21; 
  257.   INTERNET_STATUS_SENDING_REQUEST = 30; 
  258.   INTERNET_STATUS_REQUEST_SENT = 31; 
  259.   INTERNET_STATUS_RECEIVING_RESPONSE = 40; 
  260.   INTERNET_STATUS_RESPONSE_RECEIVED = 41; 
  261.   INTERNET_STATUS_CTL_RESPONSE_RECEIVED = 42;       { FTP-only: response on control channel }
  262.   INTERNET_STATUS_CLOSING_CONNECTION = 50; 
  263.   INTERNET_STATUS_CONNECTION_CLOSED = 51; 
  264.   INTERNET_STATUS_HANDLE_CREATED = 60; 
  265.   INTERNET_STATUS_REQUEST_COMPLETE = 100; 
  266.  
  267. { if the following value is returned by InternetSetStatusCallback, then }
  268. { probably an invalid (non-code) address was supplied for the callback }
  269.  
  270.   INTERNET_INVALID_STATUS_CALLBACK = (-1); 
  271.  
  272. function InternetCancelAsyncRequest(dwAsyncId: DWORD): BOOL; stdcall;
  273.  
  274. { FTP }
  275.  
  276. { manifests }
  277. const
  278.   FTP_TRANSFER_TYPE_UNKNOWN = $00000000; 
  279.   FTP_TRANSFER_TYPE_ASCII = $00000001; 
  280.   FTP_TRANSFER_TYPE_BINARY = $00000002; 
  281.  
  282.   FTP_TRANSFER_TYPE_MASK = $00000003; 
  283.  
  284. { prototypes }
  285.  
  286. function FtpFindFirstFileA(hFtpSession: HINTERNET; lpszSearchFile: PAnsiChar; 
  287.   var lpFindFileData: TWin32FindDataA; dwFlags: DWORD; 
  288.   dwContext: DWORD): HINTERNET; stdcall;
  289. function FtpFindFirstFileW(hFtpSession: HINTERNET; lpszSearchFile: PWideChar; 
  290.   var lpFindFileData: TWin32FindDataW; dwFlags: DWORD; 
  291.   dwContext: DWORD): HINTERNET; stdcall;
  292. function FtpFindFirstFile(hFtpSession: HINTERNET; lpszSearchFile: PChar; 
  293.   var lpFindFileData: TWin32FindData; dwFlags: DWORD; 
  294.   dwContext: DWORD): HINTERNET; stdcall;
  295.  
  296. function FtpGetFileA(hFtpSession: HINTERNET; lpszRemoteFile: PAnsiChar; 
  297.   lpszNewFile: PAnsiChar; fFailIfExists: BOOL; dwFlagsAndAttributes: DWORD; 
  298.   dwFlags: DWORD; dwContext: DWORD): BOOL stdcall;
  299. function FtpGetFileW(hFtpSession: HINTERNET; lpszRemoteFile: PWideChar; 
  300.   lpszNewFile: PWideChar; fFailIfExists: BOOL; dwFlagsAndAttributes: DWORD; 
  301.   dwFlags: DWORD; dwContext: DWORD): BOOL stdcall;
  302. function FtpGetFile(hFtpSession: HINTERNET; lpszRemoteFile: PChar; 
  303.   lpszNewFile: PChar; fFailIfExists: BOOL; dwFlagsAndAttributes: DWORD; 
  304.   dwFlags: DWORD; dwContext: DWORD): BOOL stdcall;
  305.  
  306. function FtpPutFileA(hFtpSession: HINTERNET; lpszLocalFile: PAnsiChar; 
  307.   lpszNewRemoteFile: PAnsiChar; dwFlags: DWORD; dwContext: DWORD): BOOL; stdcall;
  308. function FtpPutFileW(hFtpSession: HINTERNET; lpszLocalFile: PWideChar; 
  309.   lpszNewRemoteFile: PWideChar; dwFlags: DWORD; dwContext: DWORD): BOOL; stdcall;
  310. function FtpPutFile(hFtpSession: HINTERNET; lpszLocalFile: PChar; 
  311.   lpszNewRemoteFile: PChar; dwFlags: DWORD; dwContext: DWORD): BOOL; stdcall;
  312.  
  313. function FtpDeleteFileA(hFtpSession: HINTERNET; lpszFileName: PAnsiChar): BOOL; stdcall;
  314. function FtpDeleteFileW(hFtpSession: HINTERNET; lpszFileName: PWideChar): BOOL; stdcall;
  315. function FtpDeleteFile(hFtpSession: HINTERNET; lpszFileName: PChar): BOOL; stdcall;
  316.  
  317. function FtpRenameFileA(hFtpSession: HINTERNET; lpszExisting: PAnsiChar; 
  318.   lpszNew: PAnsiChar): BOOL; stdcall;
  319. function FtpRenameFileW(hFtpSession: HINTERNET; lpszExisting: PWideChar; 
  320.   lpszNew: PWideChar): BOOL; stdcall;
  321. function FtpRenameFile(hFtpSession: HINTERNET; lpszExisting: PChar; 
  322.   lpszNew: PChar): BOOL; stdcall;
  323.  
  324. function FtpOpenFileA(hFtpSession: HINTERNET; lpszFileName: PAnsiChar; 
  325.   dwAccess: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  326. function FtpOpenFileW(hFtpSession: HINTERNET; lpszFileName: PWideChar; 
  327.   dwAccess: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  328. function FtpOpenFile(hFtpSession: HINTERNET; lpszFileName: PChar; 
  329.   dwAccess: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  330.  
  331. function FtpCreateDirectoryA(hFtpSession: HINTERNET; lpszDirectory: PAnsiChar): BOOL; stdcall;
  332. function FtpCreateDirectoryW(hFtpSession: HINTERNET; lpszDirectory: PWideChar): BOOL; stdcall;
  333. function FtpCreateDirectory(hFtpSession: HINTERNET; lpszDirectory: PChar): BOOL; stdcall;
  334.  
  335. function FtpRemoveDirectoryA(hFtpSession: HINTERNET; lpszDirectory: PAnsiChar): BOOL; stdcall;
  336. function FtpRemoveDirectoryW(hFtpSession: HINTERNET; lpszDirectory: PWideChar): BOOL; stdcall;
  337. function FtpRemoveDirectory(hFtpSession: HINTERNET; lpszDirectory: PChar): BOOL; stdcall;
  338.  
  339. function FtpSetCurrentDirectoryA(hFtpSession: HINTERNET; lpszDirectory: PAnsiChar): BOOL; stdcall;
  340. function FtpSetCurrentDirectoryW(hFtpSession: HINTERNET; lpszDirectory: PWideChar): BOOL; stdcall;
  341. function FtpSetCurrentDirectory(hFtpSession: HINTERNET; lpszDirectory: PChar): BOOL; stdcall;
  342.  
  343. function FtpGetCurrentDirectoryA(hFtpSession: HINTERNET; 
  344.   lpszCurrentDirectory: PAnsiChar; var lpdwCurrentDirectory: DWORD): BOOL; stdcall;
  345. function FtpGetCurrentDirectoryW(hFtpSession: HINTERNET; 
  346.   lpszCurrentDirectory: PWideChar; var lpdwCurrentDirectory: DWORD): BOOL; stdcall;
  347. function FtpGetCurrentDirectory(hFtpSession: HINTERNET; 
  348.   lpszCurrentDirectory: PChar; var lpdwCurrentDirectory: DWORD): BOOL; stdcall;
  349.  
  350. function FtpCommandA(hFtpSession: HINTERNET; fExpectResponse: BOOL; 
  351.   dwFlags: DWORD; lpszCommand: PAnsiChar; dwContext: DWORD): BOOL; stdcall;
  352. function FtpCommandW(hFtpSession: HINTERNET; fExpectResponse: BOOL; 
  353.   dwFlags: DWORD; lpszCommand: PWideChar; dwContext: DWORD): BOOL; stdcall;
  354. function FtpCommand(hFtpSession: HINTERNET; fExpectResponse: BOOL; 
  355.   dwFlags: DWORD; lpszCommand: PChar; dwContext: DWORD): BOOL; stdcall;
  356.  
  357. { Gopher }
  358.  
  359. { manifests }
  360.  
  361. { string field lengths (in characters, not bytes) }
  362. const
  363.   MAX_GOPHER_DISPLAY_TEXT   = 128; 
  364.   MAX_GOPHER_SELECTOR_TEXT  = 256; 
  365.   MAX_GOPHER_HOST_NAME      = INTERNET_MAX_HOST_NAME_LENGTH; 
  366.   MAX_GOPHER_LOCATOR_LENGTH = 1                                  
  367.                               + MAX_GOPHER_DISPLAY_TEXT           
  368.                               + 1                                 
  369.                               + MAX_GOPHER_SELECTOR_TEXT          
  370.                               + 1                                 
  371.                               + MAX_GOPHER_HOST_NAME              
  372.                               + 1                                 
  373.                               + INTERNET_MAX_PORT_NUMBER_LENGTH   
  374.                               + 1                                 
  375.                               + 1                                 
  376.                               + 2; 
  377.  
  378. { structures/types }
  379.  
  380. { GOPHER_FIND_DATA - returns the results of a GopherFindFirstFile()/ }
  381. { InternetFindNextFile() request }
  382.  
  383. type
  384.   PGopherFindData = ^TGopherFindData;
  385.   TGopherFindData = packed record
  386.  
  387.     { DisplayString - points to the string to be displayed by the client (i.e. }
  388.     { the file or directory name) }
  389.     DisplayString: packed array[0..MAX_GOPHER_DISPLAY_TEXT-1] of WCHAR;
  390.  
  391.     GopherType: DWORD;  { GopherType - bitmap which describes the item returned. See below }
  392.  
  393.     { SizeLow and SizeHigh - (approximate) size of the item, if the gopher }
  394.     { server reports it }
  395.     SizeLow: DWORD;
  396.     SizeHigh: DWORD;
  397.  
  398.     { LastModificationTime - time in Win32 format that this item was last }
  399.     { modified, if the gopher server reports it }
  400.     LastModificationTime: TFileTime;
  401.  
  402.     { Locator - the gopher locator string returned from the server, or created }
  403.     { via GopherCreateLocator }
  404.     Locator: packed array[0..MAX_GOPHER_LOCATOR_LENGTH-1] of WCHAR;
  405.   end;
  406.  
  407. { manifests for GopherType }
  408. const
  409.   GOPHER_TYPE_TEXT_FILE = $00000001; 
  410.   GOPHER_TYPE_DIRECTORY = $00000002; 
  411.   GOPHER_TYPE_CSO = $00000004; 
  412.   GOPHER_TYPE_ERROR = $00000008; 
  413.   GOPHER_TYPE_MAC_BINHEX = $00000010; 
  414.   GOPHER_TYPE_DOS_ARCHIVE = $00000020; 
  415.   GOPHER_TYPE_UNIX_UUENCODED = $00000040; 
  416.   GOPHER_TYPE_INDEX_SERVER = $00000080; 
  417.   GOPHER_TYPE_TELNET = $00000100; 
  418.   GOPHER_TYPE_BINARY = $00000200; 
  419.   GOPHER_TYPE_REDUNDANT = $00000400; 
  420.   GOPHER_TYPE_TN3270 = $00000800; 
  421.   GOPHER_TYPE_GIF = $00001000; 
  422.   GOPHER_TYPE_IMAGE = $00002000; 
  423.   GOPHER_TYPE_BITMAP = $00004000; 
  424.   GOPHER_TYPE_MOVIE = $00008000; 
  425.   GOPHER_TYPE_SOUND = $00010000; 
  426.   GOPHER_TYPE_HTML = $00020000; 
  427.   GOPHER_TYPE_PDF = $00040000; 
  428.   GOPHER_TYPE_CALENDAR = $00080000; 
  429.   GOPHER_TYPE_INLINE = $00100000; 
  430.   GOPHER_TYPE_UNKNOWN = $20000000; 
  431.   GOPHER_TYPE_ASK = $40000000; 
  432.   GOPHER_TYPE_GOPHER_PLUS = $80000000; 
  433.  
  434. { Gopher Type functions }
  435.  
  436. function IS_GOPHER_FILE(GopherType: DWORD): BOOL;
  437. function IS_GOPHER_DIRECTORY(GopherType: DWORD): BOOL;
  438. function IS_GOPHER_PHONE_SERVER(GopherType: DWORD): BOOL;
  439. function IS_GOPHER_ERROR(GopherType: DWORD): BOOL;
  440. function IS_GOPHER_INDEX_SERVER(GopherType: DWORD): BOOL;
  441. function IS_GOPHER_TELNET_SESSION(GopherType: DWORD): BOOL;
  442. function IS_GOPHER_BACKUP_SERVER(GopherType: DWORD): BOOL;
  443. function IS_GOPHER_TN3270_SESSION(GopherType: DWORD): BOOL;
  444. function IS_GOPHER_ASK(GopherType: DWORD): BOOL;
  445. function IS_GOPHER_PLUS(GopherType: DWORD): BOOL;
  446. function IS_GOPHER_TYPE_KNOWN(GopherType: DWORD): BOOL;
  447.  
  448. { GOPHER_TYPE_FILE_MASK - use this to determine if a locator identifies a }
  449. { (known) file type }
  450. const
  451.   GOPHER_TYPE_FILE_MASK = GOPHER_TYPE_TEXT_FILE          
  452.                           or GOPHER_TYPE_MAC_BINHEX        
  453.                           or GOPHER_TYPE_DOS_ARCHIVE       
  454.                           or GOPHER_TYPE_UNIX_UUENCODED    
  455.                           or GOPHER_TYPE_BINARY            
  456.                           or GOPHER_TYPE_GIF               
  457.                           or GOPHER_TYPE_IMAGE             
  458.                           or GOPHER_TYPE_BITMAP            
  459.                           or GOPHER_TYPE_MOVIE             
  460.                           or GOPHER_TYPE_SOUND             
  461.                           or GOPHER_TYPE_HTML              
  462.                           or GOPHER_TYPE_PDF               
  463.                           or GOPHER_TYPE_CALENDAR          
  464.                           or GOPHER_TYPE_INLINE; 
  465.  
  466. { structured gopher attributes (as defined in gopher+ protocol document) }
  467. type
  468.   PGopherAdminAttributeType = ^TGopherAdminAttributeType;
  469.   TGopherAdminAttributeType = packed record 
  470.     Comment: LPCSTR;
  471.     EmailAddress: LPCSTR;
  472.   end;
  473.  
  474.   PGopherModDateAttributeType = ^TGopherModDateAttributeType;
  475.   TGopherModDateAttributeType = packed record 
  476.     DateAndTime: TFileTime;
  477.   end;
  478.  
  479.   PGopherTtlAttributeType = ^TGopherTtlAttributeType;
  480.   TGopherTtlAttributeType = packed record 
  481.     Ttl: DWORD;
  482.   end;
  483.  
  484.   PGopherScoreAttributeType = ^TGopherScoreAttributeType;
  485.   TGopherScoreAttributeType = packed record 
  486.     Score: Integer;
  487.   end;
  488.  
  489.   PGopherScoreRangeAttributeType = ^TGopherScoreRangeAttributeType;
  490.   TGopherScoreRangeAttributeType = packed record 
  491.     LowerBound: Integer;
  492.     UpperBound: Integer;
  493.   end;
  494.  
  495.   PGopherSiteAttributeType = ^TGopherSiteAttributeType;
  496.   TGopherSiteAttributeType = packed record 
  497.     Site: LPCSTR;
  498.   end;
  499.  
  500.   PGopherOrganizationAttributeType = ^TGopherOrganizationAttributeType;
  501.   TGopherOrganizationAttributeType = packed record 
  502.     Organization: LPCSTR;
  503.   end;
  504.  
  505.   PGopherLocationAttributeType = ^TGopherLocationAttributeType;
  506.   TGopherLocationAttributeType = packed record 
  507.     Location: LPCSTR;
  508.   end;
  509.  
  510.   PGopherGeographicalLocationAttributeType = ^TGopherGeographicalLocationAttributeType;
  511.   TGopherGeographicalLocationAttributeType = packed record 
  512.     DegreesNorth: Integer;
  513.     MinutesNorth: Integer;
  514.     SecondsNorth: Integer;
  515.     DegreesEast: Integer;
  516.     MinutesEast: Integer;
  517.     SecondsEast: Integer;
  518.   end;
  519.  
  520.   PGopherTimezoneAttributeType = ^TGopherTimezoneAttributeType;
  521.   TGopherTimezoneAttributeType = packed record 
  522.     Zone: Integer;
  523.   end;
  524.  
  525.   PGopherProviderAttributeType = ^TGopherProviderAttributeType;
  526.   TGopherProviderAttributeType = packed record 
  527.     Provider: LPCSTR;
  528.   end;
  529.  
  530.   PGopherVersionAttributeType = ^TGopherVersionAttributeType;
  531.   TGopherVersionAttributeType = packed record 
  532.     Version: LPCSTR;
  533.   end;
  534.  
  535.   PGopherAbstractAttributeType = ^TGopherAbstractAttributeType;
  536.   TGopherAbstractAttributeType = packed record 
  537.     ShortAbstract: LPCSTR;
  538.     AbstractFile: LPCSTR;
  539.   end;
  540.  
  541.   PGopherViewAttributeType = ^TGopherViewAttributeType;
  542.   TGopherViewAttributeType = packed record 
  543.     ContentType: LPCSTR;
  544.     Language: LPCSTR;
  545.     Size: DWORD;
  546.   end;
  547.  
  548.   PGopherVeronicaAttributeType = ^TGopherVeronicaAttributeType;
  549.   TGopherVeronicaAttributeType = packed record 
  550.     TreeWalk: BOOL;
  551.   end;
  552.  
  553.   PGopherAskAttributeType = ^TGopherAskAttributeType;
  554.   TGopherAskAttributeType = packed record 
  555.     QuestionType: LPCSTR;
  556.     QuestionText: LPCSTR;
  557.   end;
  558.  
  559. { GOPHER_UNKNOWN_ATTRIBUTE_TYPE - this is returned if we retrieve an attribute }
  560. { that is not specified in the current gopher/gopher+ documentation. It is up }
  561. { to the application to parse the information }
  562.  
  563.   PGopherUnknownAttributeType = ^TGopherUnknownAttributeType;
  564.   TGopherUnknownAttributeType = packed record 
  565.     Text: LPCSTR;
  566.   end;
  567.  
  568. { GOPHER_ATTRIBUTE_TYPE - returned in the user's buffer when an enumerated }
  569. { GopherGetAttribute call is made }
  570.  
  571.   PGopherAttributeType = ^TGopherAttributeType;
  572.   TGopherAttributeType = packed record 
  573.     CategoryId: DWORD;  { e.g. GOPHER_CATEGORY_ID_ADMIN }
  574.     AttributeId: DWORD; { e.g. GOPHER_ATTRIBUTE_ID_ADMIN }
  575.     case Integer of
  576.       0: (Admin: TGopherAdminAttributeType);
  577.       1: (ModDate: TGopherModDateAttributeType);
  578.       2: (Ttl: TGopherTtlAttributeType);
  579.       3: (Score: TGopherScoreAttributeType);
  580.       4: (ScoreRange: TGopherScoreRangeAttributeType);
  581.       5: (Site: TGopherSiteAttributeType);
  582.       6: (Organization: TGopherOrganizationAttributeType);
  583.       7: (Location: TGopherLocationAttributeType);
  584.       8: (GeographicalLocation: TGopherGeographicalLocationAttributeType);
  585.       9: (TimeZone: TGopherTimezoneAttributeType);
  586.       10: (Provider: TGopherProviderAttributeType);
  587.       11: (Version: TGopherVersionAttributeType);
  588.       12: (Abstract: TGopherAbstractAttributeType);
  589.       13: (View: TGopherViewAttributeType);
  590.       14: (Veronica: TGopherVeronicaAttributeType);
  591.       15: (Ask: TGopherAskAttributeType);
  592.       16: (Unknown: TGopherUnknownAttributeType);
  593.   end;
  594.  
  595. const
  596.   MAX_GOPHER_CATEGORY_NAME = 128;           { arbitrary }
  597.   MAX_GOPHER_ATTRIBUTE_NAME = 128;          {     " }
  598.   MIN_GOPHER_ATTRIBUTE_LENGTH = 256;        {     " }
  599.  
  600. { known gopher attribute categories. See below for ordinals }
  601.  
  602.   GOPHER_INFO_CATEGORY           = '+INFO'; 
  603.   GOPHER_ADMIN_CATEGORY          = '+ADMIN'; 
  604.   GOPHER_VIEWS_CATEGORY          = '+VIEWS'; 
  605.   GOPHER_ABSTRACT_CATEGORY       = '+ABSTRACT'; 
  606.   GOPHER_VERONICA_CATEGORY       = '+VERONICA'; 
  607.  
  608. { known gopher attributes. These are the attribute names as defined in the }
  609. { gopher+ protocol document }
  610.  
  611.   GOPHER_ADMIN_ATTRIBUTE         = 'Admin'; 
  612.   GOPHER_MOD_DATE_ATTRIBUTE      = 'Mod-Date'; 
  613.   GOPHER_TTL_ATTRIBUTE           = 'TTL'; 
  614.   GOPHER_SCORE_ATTRIBUTE         = 'Score'; 
  615.   GOPHER_RANGE_ATTRIBUTE         = 'Score-range'; 
  616.   GOPHER_SITE_ATTRIBUTE          = 'Site'; 
  617.   GOPHER_ORG_ATTRIBUTE           = 'Org'; 
  618.   GOPHER_LOCATION_ATTRIBUTE      = 'Loc'; 
  619.   GOPHER_GEOG_ATTRIBUTE          = 'Geog'; 
  620.   GOPHER_TIMEZONE_ATTRIBUTE      = 'TZ'; 
  621.   GOPHER_PROVIDER_ATTRIBUTE      = 'Provider'; 
  622.   GOPHER_VERSION_ATTRIBUTE       = 'Version'; 
  623.   GOPHER_ABSTRACT_ATTRIBUTE      = 'Abstract'; 
  624.   GOPHER_VIEW_ATTRIBUTE          = 'View'; 
  625.   GOPHER_TREEWALK_ATTRIBUTE      = 'treewalk'; 
  626.  
  627. { identifiers for attribute strings }
  628.  
  629.   GOPHER_ATTRIBUTE_ID_BASE = $abcccc00; 
  630.   GOPHER_CATEGORY_ID_ALL = GOPHER_ATTRIBUTE_ID_BASE + 1; 
  631.   GOPHER_CATEGORY_ID_INFO = GOPHER_ATTRIBUTE_ID_BASE + 2; 
  632.   GOPHER_CATEGORY_ID_ADMIN = GOPHER_ATTRIBUTE_ID_BASE + 3; 
  633.   GOPHER_CATEGORY_ID_VIEWS = GOPHER_ATTRIBUTE_ID_BASE + 4; 
  634.   GOPHER_CATEGORY_ID_ABSTRACT = GOPHER_ATTRIBUTE_ID_BASE + 5; 
  635.   GOPHER_CATEGORY_ID_VERONICA = GOPHER_ATTRIBUTE_ID_BASE + 6; 
  636.   GOPHER_CATEGORY_ID_ASK = GOPHER_ATTRIBUTE_ID_BASE + 7; 
  637.   GOPHER_CATEGORY_ID_UNKNOWN = GOPHER_ATTRIBUTE_ID_BASE + 8; 
  638.   GOPHER_ATTRIBUTE_ID_ALL = GOPHER_ATTRIBUTE_ID_BASE + 9; 
  639.   GOPHER_ATTRIBUTE_ID_ADMIN = GOPHER_ATTRIBUTE_ID_BASE + 10; 
  640.   GOPHER_ATTRIBUTE_ID_MOD_DATE = GOPHER_ATTRIBUTE_ID_BASE + 11; 
  641.   GOPHER_ATTRIBUTE_ID_TTL = GOPHER_ATTRIBUTE_ID_BASE + 12; 
  642.   GOPHER_ATTRIBUTE_ID_SCORE = GOPHER_ATTRIBUTE_ID_BASE + 13; 
  643.   GOPHER_ATTRIBUTE_ID_RANGE = GOPHER_ATTRIBUTE_ID_BASE + 14; 
  644.   GOPHER_ATTRIBUTE_ID_SITE = GOPHER_ATTRIBUTE_ID_BASE + 15; 
  645.   GOPHER_ATTRIBUTE_ID_ORG = GOPHER_ATTRIBUTE_ID_BASE + 16; 
  646.   GOPHER_ATTRIBUTE_ID_LOCATION = GOPHER_ATTRIBUTE_ID_BASE + 17; 
  647.   GOPHER_ATTRIBUTE_ID_GEOG = GOPHER_ATTRIBUTE_ID_BASE + 18; 
  648.   GOPHER_ATTRIBUTE_ID_TIMEZONE = GOPHER_ATTRIBUTE_ID_BASE + 19; 
  649.   GOPHER_ATTRIBUTE_ID_PROVIDER = GOPHER_ATTRIBUTE_ID_BASE + 20; 
  650.   GOPHER_ATTRIBUTE_ID_VERSION = GOPHER_ATTRIBUTE_ID_BASE + 21; 
  651.   GOPHER_ATTRIBUTE_ID_ABSTRACT = GOPHER_ATTRIBUTE_ID_BASE + 22; 
  652.   GOPHER_ATTRIBUTE_ID_VIEW = GOPHER_ATTRIBUTE_ID_BASE + 23; 
  653.   GOPHER_ATTRIBUTE_ID_TREEWALK = GOPHER_ATTRIBUTE_ID_BASE + 24; 
  654.   GOPHER_ATTRIBUTE_ID_UNKNOWN = GOPHER_ATTRIBUTE_ID_BASE + 25; 
  655.  
  656. { prototypes }
  657.  
  658. function GopherCreateLocatorA(lpszHost: PAnsiChar; nServerPort: INTERNET_PORT; 
  659.   lpszDisplayString: PAnsiChar; lpszSelectorString: PAnsiChar; dwGopherType: DWORD; 
  660.   lpszLocator: PAnsiChar; var lpdwBufferLength: DWORD): BOOL; stdcall;
  661. function GopherCreateLocatorW(lpszHost: PWideChar; nServerPort: INTERNET_PORT; 
  662.   lpszDisplayString: PWideChar; lpszSelectorString: PWideChar; dwGopherType: DWORD; 
  663.   lpszLocator: PWideChar; var lpdwBufferLength: DWORD): BOOL; stdcall;
  664. function GopherCreateLocator(lpszHost: PChar; nServerPort: INTERNET_PORT; 
  665.   lpszDisplayString: PChar; lpszSelectorString: PChar; dwGopherType: DWORD; 
  666.   lpszLocator: PChar; var lpdwBufferLength: DWORD): BOOL; stdcall;
  667.  
  668. function GopherGetLocatorTypeA(lpszLocator: PAnsiChar; 
  669.   var lpdwGopherType: DWORD): BOOL; stdcall;
  670. function GopherGetLocatorTypeW(lpszLocator: PWideChar; 
  671.   var lpdwGopherType: DWORD): BOOL; stdcall;
  672. function GopherGetLocatorType(lpszLocator: PChar; 
  673.   var lpdwGopherType: DWORD): BOOL; stdcall;
  674.  
  675. function GopherFindFirstFileA(hGopherSession: HINTERNET; lpszLocator: PAnsiChar; 
  676.   lpszSearchString: PAnsiChar; var lpFindData: TGopherFindData; dwFlags: DWORD; 
  677.   dwContext: DWORD): HINTERNET; stdcall;
  678. function GopherFindFirstFileW(hGopherSession: HINTERNET; lpszLocator: PWideChar; 
  679.   lpszSearchString: PWideChar; var lpFindData: TGopherFindData; dwFlags: DWORD; 
  680.   dwContext: DWORD): HINTERNET; stdcall;
  681. function GopherFindFirstFile(hGopherSession: HINTERNET; lpszLocator: PChar; 
  682.   lpszSearchString: PChar; var lpFindData: TGopherFindData; dwFlags: DWORD; 
  683.   dwContext: DWORD): HINTERNET; stdcall;
  684.  
  685. function GopherOpenFileA(hGopherSession: HINTERNET; lpszLocator: PAnsiChar; 
  686.   lpszView: PAnsiChar; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  687. function GopherOpenFileW(hGopherSession: HINTERNET; lpszLocator: PWideChar; 
  688.   lpszView: PWideChar; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  689. function GopherOpenFile(hGopherSession: HINTERNET; lpszLocator: PChar; 
  690.   lpszView: PChar; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall;
  691.  
  692. type
  693.   TFNGopherAttributeEnumerator = TFarProc;
  694.   PFNGopherAttributeEnumerator = ^TFNGopherAttributeEnumerator;
  695.  
  696. function GopherGetAttributeA(hGopherSession: HINTERNET; lpszLocator: PAnsiChar; 
  697.   lpszAttributeName: PAnsiChar; lpBuffer: Pointer; dwBufferLength: DWORD; 
  698.   var lpdwCharactersReturned: DWORD; lpfnEnumerator: PFNGopherAttributeEnumerator;
  699.   dwContext: DWORD): BOOL; stdcall;
  700. function GopherGetAttributeW(hGopherSession: HINTERNET; lpszLocator: PWideChar; 
  701.   lpszAttributeName: PWideChar; lpBuffer: Pointer; dwBufferLength: DWORD; 
  702.   var lpdwCharactersReturned: DWORD; lpfnEnumerator: PFNGopherAttributeEnumerator;
  703.   dwContext: DWORD): BOOL; stdcall;
  704. function GopherGetAttribute(hGopherSession: HINTERNET; lpszLocator: PChar; 
  705.   lpszAttributeName: PChar; lpBuffer: Pointer; dwBufferLength: DWORD; 
  706.   var lpdwCharactersReturned: DWORD; lpfnEnumerator: PFNGopherAttributeEnumerator;
  707.   dwContext: DWORD): BOOL; stdcall;
  708.  
  709. function GopherSendDataA(hGopherSession: HINTERNET; lpszLocator: PAnsiChar; 
  710.   lpszBuffer: PAnsiChar; dwNumberOfCharactersToSend: DWORD; 
  711.   var lpdwNumberOfCharactersSent: DWORD; dwContext: DWORD): BOOL; stdcall;
  712. function GopherSendDataW(hGopherSession: HINTERNET; lpszLocator: PWideChar; 
  713.   lpszBuffer: PWideChar; dwNumberOfCharactersToSend: DWORD; 
  714.   var lpdwNumberOfCharactersSent: DWORD; dwContext: DWORD): BOOL; stdcall;
  715. function GopherSendData(hGopherSession: HINTERNET; lpszLocator: PChar; 
  716.   lpszBuffer: PChar; dwNumberOfCharactersToSend: DWORD; 
  717.   var lpdwNumberOfCharactersSent: DWORD; dwContext: DWORD): BOOL; stdcall;
  718.  
  719. { HTTP }
  720.  
  721. { manifests }
  722. const
  723.   HTTP_TCPIP_PORT = 80; {  The default HTTP port for TCP/IP connections. }
  724.  
  725. { The default major/minor HTTP version numbers. }
  726.  
  727.   HTTP_MAJOR_VERSION = 1; 
  728.   HTTP_MINOR_VERSION = 0; 
  729.   HTTP_VERSION       = 'HTTP/1'; 
  730.  
  731. { HttpQueryInfo info levels. Generally, there is one info level }
  732. { for each potential RFC822/HTTP/MIME header that an HTTP server }
  733. { may send as part of a request response. }
  734.  
  735. { The HTTP_QUERY_RAW_HEADERS info level is provided for clients }
  736. { that choose to perform their own header parsing. }
  737.  
  738.   HTTP_QUERY_MIN = $0000; 
  739.   HTTP_QUERY_MIME_VERSION = $0000; 
  740.   HTTP_QUERY_CONTENT_TYPE = $0001; 
  741.   HTTP_QUERY_CONTENT_TRANSFER_ENCODING = $0002; 
  742.   HTTP_QUERY_CONTENT_ID = $0003; 
  743.   HTTP_QUERY_CONTENT_DESCRIPTION = $0004; 
  744.   HTTP_QUERY_CONTENT_LENGTH = $0005; 
  745.   HTTP_QUERY_CONTENT_LANGUAGE = $0006; 
  746.   HTTP_QUERY_ALLOW = $0007; 
  747.   HTTP_QUERY_PUBLIC = $0008; 
  748.   HTTP_QUERY_DATE = $0009; 
  749.   HTTP_QUERY_EXPIRES = $000A; 
  750.   HTTP_QUERY_LAST_MODIFIED = $000B; 
  751.   HTTP_QUERY_MESSAGE_ID = $000C; 
  752.   HTTP_QUERY_URI = $000D; 
  753.   HTTP_QUERY_DERIVED_FROM = $000E; 
  754.   HTTP_QUERY_COST = $000F; 
  755.   HTTP_QUERY_LINK = $0010; 
  756.   HTTP_QUERY_PRAGMA = $0011; 
  757.   HTTP_QUERY_VERSION = $0012; 
  758.   HTTP_QUERY_STATUS_CODE = $0013; 
  759.   HTTP_QUERY_STATUS_TEXT = $0014; 
  760.   HTTP_QUERY_RAW_HEADERS = $0015; 
  761.   HTTP_QUERY_RAW_HEADERS_CRLF = $0016; 
  762.   HTTP_QUERY_CONNECTION = $0017; 
  763.   HTTP_QUERY_MAX = $0017; 
  764.  
  765. {  HTTP Response Status Codes: }
  766.  
  767.   HTTP_STATUS_OK = 200;                     { request completed }
  768.   HTTP_STATUS_CREATED = 201;                { object created, reason = new URI }
  769.   HTTP_STATUS_ACCEPTED = 202;               { async completion (TBS) }
  770.   HTTP_STATUS_PARTIAL = 203;                { partial completion }
  771.  
  772.   HTTP_STATUS_MOVED = 301;                  { object permanently moved }
  773.   HTTP_STATUS_REDIRECT = 302;               { object temporarily moved }
  774.   HTTP_STATUS_REDIRECT_METHOD = 303;        { redirection w/ new access method }
  775.  
  776.   HTTP_STATUS_BAD_REQUEST = 400;            { invalid syntax }
  777.   HTTP_STATUS_DENIED = 401;                 { access denied }
  778.   HTTP_STATUS_PAYMENT_REQ = 402;            { payment required }
  779.   HTTP_STATUS_FORBIDDEN = 403;              { request forbidden }
  780.   HTTP_STATUS_NOT_FOUND = 404;              { object not found }
  781.  
  782.   HTTP_STATUS_SERVER_ERROR = 500;           { internal server error }
  783.   HTTP_STATUS_NOT_SUPPORTED = 501;          { required not supported }
  784.  
  785. { prototypes }
  786.  
  787. function HttpOpenRequestA(hHttpSession: HINTERNET; lpszVerb: PAnsiChar; 
  788.   lpszObjectName: PAnsiChar; lpszVersion: PAnsiChar; lpszReferrer: PAnsiChar; 
  789.   lplpszAcceptTypes: PAnsiChar; dwFlags: DWORD; 
  790.   dwContext: DWORD): HINTERNET; stdcall;
  791. function HttpOpenRequestW(hHttpSession: HINTERNET; lpszVerb: PWideChar; 
  792.   lpszObjectName: PWideChar; lpszVersion: PWideChar; lpszReferrer: PWideChar; 
  793.   lplpszAcceptTypes: PWideChar; dwFlags: DWORD; 
  794.   dwContext: DWORD): HINTERNET; stdcall;
  795. function HttpOpenRequest(hHttpSession: HINTERNET; lpszVerb: PChar; 
  796.   lpszObjectName: PChar; lpszVersion: PChar; lpszReferrer: PChar; 
  797.   lplpszAcceptTypes: PChar; dwFlags: DWORD; 
  798.   dwContext: DWORD): HINTERNET; stdcall;
  799.  
  800. function HttpAddRequestHeadersA(hHttpRequest: HINTERNET; lpszHeaders: PAnsiChar; 
  801.   dwHeadersLength: DWORD; dwReserved: DWORD): BOOL; stdcall;
  802. function HttpAddRequestHeadersW(hHttpRequest: HINTERNET; lpszHeaders: PWideChar; 
  803.   dwHeadersLength: DWORD; dwReserved: DWORD): BOOL; stdcall;
  804. function HttpAddRequestHeaders(hHttpRequest: HINTERNET; lpszHeaders: PChar; 
  805.   dwHeadersLength: DWORD; dwReserved: DWORD): BOOL; stdcall;
  806.  
  807. function HttpSendRequestA(hHttpRequest: HINTERNET; lpszHeaders: PAnsiChar; 
  808.   dwHeadersLength: DWORD; lpOptional: Pointer; 
  809.   dwOptionalLength: DWORD): BOOL; stdcall;
  810. function HttpSendRequestW(hHttpRequest: HINTERNET; lpszHeaders: PWideChar; 
  811.   dwHeadersLength: DWORD; lpOptional: Pointer; 
  812.   dwOptionalLength: DWORD): BOOL; stdcall;
  813. function HttpSendRequest(hHttpRequest: HINTERNET; lpszHeaders: PChar; 
  814.   dwHeadersLength: DWORD; lpOptional: Pointer; 
  815.   dwOptionalLength: DWORD): BOOL; stdcall;
  816.  
  817. function HttpQueryInfoA(hHttpRequest: HINTERNET; dwInfoLevel: DWORD; 
  818.   lpvBuffer: Pointer; var lpdwBufferLength: DWORD; 
  819.   var lpdwReserved: DWORD): BOOL; stdcall;
  820. function HttpQueryInfoW(hHttpRequest: HINTERNET; dwInfoLevel: DWORD; 
  821.   lpvBuffer: Pointer; var lpdwBufferLength: DWORD; 
  822.   var lpdwReserved: DWORD): BOOL; stdcall;
  823. function HttpQueryInfo(hHttpRequest: HINTERNET; dwInfoLevel: DWORD; 
  824.   lpvBuffer: Pointer; var lpdwBufferLength: DWORD; 
  825.   var lpdwReserved: DWORD): BOOL; stdcall;
  826.  
  827. { Internet API error returns }
  828. const
  829.   INTERNET_ERROR_BASE = 12000; 
  830.  
  831.   ERROR_INTERNET_OUT_OF_HANDLES = INTERNET_ERROR_BASE + 1; 
  832.   ERROR_INTERNET_TIMEOUT = INTERNET_ERROR_BASE + 2; 
  833.   ERROR_INTERNET_EXTENDED_ERROR = INTERNET_ERROR_BASE + 3; 
  834.   ERROR_INTERNET_INTERNAL_ERROR = INTERNET_ERROR_BASE + 4; 
  835.   ERROR_INTERNET_INVALID_URL = INTERNET_ERROR_BASE + 5; 
  836.   ERROR_INTERNET_UNRECOGNIZED_SCHEME = INTERNET_ERROR_BASE + 6; 
  837.   ERROR_INTERNET_NAME_NOT_RESOLVED = INTERNET_ERROR_BASE + 7; 
  838.   ERROR_INTERNET_PROTOCOL_NOT_FOUND = INTERNET_ERROR_BASE + 8; 
  839.   ERROR_INTERNET_INVALID_OPTION = INTERNET_ERROR_BASE + 9; 
  840.   ERROR_INTERNET_BAD_OPTION_LENGTH = INTERNET_ERROR_BASE + 10; 
  841.   ERROR_INTERNET_OPTION_NOT_SETTABLE = INTERNET_ERROR_BASE + 11; 
  842.   ERROR_INTERNET_SHUTDOWN = INTERNET_ERROR_BASE + 12; 
  843.   ERROR_INTERNET_INCORRECT_USER_NAME = INTERNET_ERROR_BASE + 13; 
  844.   ERROR_INTERNET_INCORRECT_PASSWORD = INTERNET_ERROR_BASE + 14; 
  845.   ERROR_INTERNET_LOGIN_FAILURE = INTERNET_ERROR_BASE + 15; 
  846.   ERROR_INTERNET_INVALID_OPERATION = INTERNET_ERROR_BASE + 16; 
  847.   ERROR_INTERNET_OPERATION_CANCELLED = INTERNET_ERROR_BASE + 17; 
  848.   ERROR_INTERNET_INCORRECT_HANDLE_TYPE = INTERNET_ERROR_BASE + 18; 
  849.  
  850.   ERROR_INTERNET_NOT_PROXY_REQUEST = INTERNET_ERROR_BASE + 20; 
  851.   ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND = INTERNET_ERROR_BASE + 21; 
  852.   ERROR_INTERNET_BAD_REGISTRY_PARAMETER = INTERNET_ERROR_BASE + 22; 
  853.   ERROR_INTERNET_NO_DIRECT_ACCESS = INTERNET_ERROR_BASE + 23; 
  854.   ERROR_INTERNET_NO_CONTEXT = INTERNET_ERROR_BASE + 24; 
  855.   ERROR_INTERNET_NO_CALLBACK = INTERNET_ERROR_BASE + 25; 
  856.   ERROR_INTERNET_REQUEST_PENDING = INTERNET_ERROR_BASE + 26; 
  857.  
  858. { FTP API errors }
  859.  
  860.   ERROR_FTP_TRANSFER_IN_PROGRESS = INTERNET_ERROR_BASE + 28; 
  861.   ERROR_FTP_DROPPED = INTERNET_ERROR_BASE + 29; 
  862.  
  863. { gopher API errors }
  864.  
  865.   ERROR_GOPHER_PROTOCOL_ERROR = INTERNET_ERROR_BASE + 30; 
  866.   ERROR_GOPHER_NOT_FILE = INTERNET_ERROR_BASE + 31; 
  867.   ERROR_GOPHER_DATA_ERROR = INTERNET_ERROR_BASE + 32; 
  868.   ERROR_GOPHER_END_OF_DATA = INTERNET_ERROR_BASE + 33; 
  869.   ERROR_GOPHER_INVALID_LOCATOR = INTERNET_ERROR_BASE + 34; 
  870.   ERROR_GOPHER_INCORRECT_LOCATOR_TYPE = INTERNET_ERROR_BASE + 35; 
  871.   ERROR_GOPHER_NOT_GOPHER_PLUS = INTERNET_ERROR_BASE + 36; 
  872.   ERROR_GOPHER_ATTRIBUTE_NOT_FOUND = INTERNET_ERROR_BASE + 37; 
  873.   ERROR_GOPHER_UNKNOWN_LOCATOR = INTERNET_ERROR_BASE + 38; 
  874.  
  875. { HTTP API errors }
  876.  
  877.   ERROR_HTTP_HEADER_NOT_FOUND = INTERNET_ERROR_BASE + 40; 
  878.   ERROR_HTTP_DOWNLEVEL_SERVER = INTERNET_ERROR_BASE + 41; 
  879.   ERROR_HTTP_INVALID_SERVER_RESPONSE = INTERNET_ERROR_BASE + 42; 
  880.  
  881. implementation
  882.  
  883. const
  884.   winetdll = 'wininet.dll';
  885.  
  886. function FtpCommandA;                   external winetdll name 'FtpCommandA';
  887. function FtpCommandW;                   external winetdll name 'FtpCommandW';
  888. function FtpCommand;                   external winetdll name 'FtpCommandA';
  889. function FtpCreateDirectoryA;           external winetdll name 'FtpCreateDirectoryA';
  890. function FtpCreateDirectoryW;           external winetdll name 'FtpCreateDirectoryW';
  891. function FtpCreateDirectory;           external winetdll name 'FtpCreateDirectoryA';
  892. function FtpDeleteFileA;                external winetdll name 'FtpDeleteFileA';
  893. function FtpDeleteFileW;                external winetdll name 'FtpDeleteFileW';
  894. function FtpDeleteFile;                external winetdll name 'FtpDeleteFileA';
  895. function FtpFindFirstFileA;             external winetdll name 'FtpFindFirstFileA';
  896. function FtpFindFirstFileW;             external winetdll name 'FtpFindFirstFileW';
  897. function FtpFindFirstFile;             external winetdll name 'FtpFindFirstFileA';
  898. function FtpGetCurrentDirectoryA;       external winetdll name 'FtpGetCurrentDirectoryA';
  899. function FtpGetCurrentDirectoryW;       external winetdll name 'FtpGetCurrentDirectoryW';
  900. function FtpGetCurrentDirectory;       external winetdll name 'FtpGetCurrentDirectoryA';
  901. function FtpGetFileA;                   external winetdll name 'FtpGetFileA';
  902. function FtpGetFileW;                   external winetdll name 'FtpGetFileW';
  903. function FtpGetFile;                   external winetdll name 'FtpGetFileA';
  904. function FtpOpenFileA;                  external winetdll name 'FtpOpenFileA';
  905. function FtpOpenFileW;                  external winetdll name 'FtpOpenFileW';
  906. function FtpOpenFile;                  external winetdll name 'FtpOpenFileA';
  907. function FtpPutFileA;                   external winetdll name 'FtpPutFileA';
  908. function FtpPutFileW;                   external winetdll name 'FtpPutFileW';
  909. function FtpPutFile;                   external winetdll name 'FtpPutFileA';
  910. function FtpRemoveDirectoryA;           external winetdll name 'FtpRemoveDirectoryA';
  911. function FtpRemoveDirectoryW;           external winetdll name 'FtpRemoveDirectoryW';
  912. function FtpRemoveDirectory;           external winetdll name 'FtpRemoveDirectoryA';
  913. function FtpRenameFileA;                external winetdll name 'FtpRenameFileA';
  914. function FtpRenameFileW;                external winetdll name 'FtpRenameFileW';
  915. function FtpRenameFile;                external winetdll name 'FtpRenameFileA';
  916. function FtpSetCurrentDirectoryA;       external winetdll name 'FtpSetCurrentDirectoryA';
  917. function FtpSetCurrentDirectoryW;       external winetdll name 'FtpSetCurrentDirectoryW';
  918. function FtpSetCurrentDirectory;       external winetdll name 'FtpSetCurrentDirectoryA';
  919. function GopherCreateLocatorA;          external winetdll name 'GopherCreateLocatorA';
  920. function GopherCreateLocatorW;          external winetdll name 'GopherCreateLocatorW';
  921. function GopherCreateLocator;          external winetdll name 'GopherCreateLocatorA';
  922. function GopherFindFirstFileA;          external winetdll name 'GopherFindFirstFileA';
  923. function GopherFindFirstFileW;          external winetdll name 'GopherFindFirstFileW';
  924. function GopherFindFirstFile;          external winetdll name 'GopherFindFirstFileA';
  925. function GopherGetAttributeA;           external winetdll name 'GopherGetAttributeA';
  926. function GopherGetAttributeW;           external winetdll name 'GopherGetAttributeW';
  927. function GopherGetAttribute;           external winetdll name 'GopherGetAttributeA';
  928. function GopherGetLocatorTypeA;         external winetdll name 'GopherGetLocatorTypeA';
  929. function GopherGetLocatorTypeW;         external winetdll name 'GopherGetLocatorTypeW';
  930. function GopherGetLocatorType;         external winetdll name 'GopherGetLocatorTypeA';
  931. function GopherOpenFileA;               external winetdll name 'GopherOpenFileA';
  932. function GopherOpenFileW;               external winetdll name 'GopherOpenFileW';
  933. function GopherOpenFile;               external winetdll name 'GopherOpenFileA';
  934. function GopherSendDataA;               external winetdll name 'GopherSendDataA';
  935. function GopherSendDataW;               external winetdll name 'GopherSendDataW';
  936. function GopherSendData;               external winetdll name 'GopherSendDataA';
  937. function HttpAddRequestHeadersA;        external winetdll name 'HttpAddRequestHeadersA';
  938. function HttpAddRequestHeadersW;        external winetdll name 'HttpAddRequestHeadersW';
  939. function HttpAddRequestHeaders;        external winetdll name 'HttpAddRequestHeadersA';
  940. function HttpOpenRequestA;              external winetdll name 'HttpOpenRequestA';
  941. function HttpOpenRequestW;              external winetdll name 'HttpOpenRequestW';
  942. function HttpOpenRequest;              external winetdll name 'HttpOpenRequestA';
  943. function HttpQueryInfoA;                external winetdll name 'HttpQueryInfoA';
  944. function HttpQueryInfoW;                external winetdll name 'HttpQueryInfoW';
  945. function HttpQueryInfo;                external winetdll name 'HttpQueryInfoA';
  946. function HttpSendRequestA;              external winetdll name 'HttpSendRequestA';
  947. function HttpSendRequestW;              external winetdll name 'HttpSendRequestW';
  948. function HttpSendRequest;              external winetdll name 'HttpSendRequestA';
  949. function InternetCancelAsyncRequest;      external winetdll name 'InternetCancelAsyncRequest';
  950. function InternetCloseHandle;             external winetdll name 'InternetCloseHandle';
  951. function InternetConnectA;              external winetdll name 'InternetConnectA';
  952. function InternetConnectW;              external winetdll name 'InternetConnectW';
  953. function InternetConnect;              external winetdll name 'InternetConnectA';
  954. function InternetFindNextFileA;         external winetdll name 'InternetFindNextFileA';
  955. function InternetFindNextFileW;         external winetdll name 'InternetFindNextFileW';
  956. function InternetFindNextFile;         external winetdll name 'InternetFindNextFileA';
  957. function InternetGetLastResponseInfoA;  external winetdll name 'InternetGetLastResponseInfoA';
  958. function InternetGetLastResponseInfoW;  external winetdll name 'InternetGetLastResponseInfoW';
  959. function InternetGetLastResponseInfo;  external winetdll name 'InternetGetLastResponseInfoA';
  960. function InternetOpenA;                 external winetdll name 'InternetOpenA';
  961. function InternetOpenW;                 external winetdll name 'InternetOpenW';
  962. function InternetOpen;                 external winetdll name 'InternetOpenA';
  963. function InternetOpenUrlA;              external winetdll name 'InternetOpenUrlA';
  964. function InternetOpenUrlW;              external winetdll name 'InternetOpenUrlW';
  965. function InternetOpenUrl;              external winetdll name 'InternetOpenUrlA';
  966. function InternetQueryOption;             external winetdll name 'InternetQueryOption';
  967. function InternetReadFile;                external winetdll name 'InternetReadFile';
  968. function InternetSetOption;               external winetdll name 'InternetSetOption';
  969. function InternetSetStatusCallback;       external winetdll name 'InternetSetStatusCallback';
  970. function InternetWriteFile;               external winetdll name 'InternetWriteFile';
  971.  
  972. function IS_GOPHER_FILE(GopherType: DWORD): BOOL;
  973. begin
  974.   Result := GopherType and GOPHER_TYPE_FILE_MASK = 0;
  975. end;
  976.  
  977. function IS_GOPHER_DIRECTORY(GopherType: DWORD): BOOL;
  978. begin
  979.   Result := GopherType and GOPHER_TYPE_DIRECTORY = 0;
  980. end;
  981.  
  982. function IS_GOPHER_PHONE_SERVER(GopherType: DWORD): BOOL;
  983. begin
  984.   Result := GopherType and GOPHER_TYPE_CSO = 0;
  985. end;
  986.  
  987. function IS_GOPHER_ERROR(GopherType: DWORD): BOOL;
  988. begin
  989.   Result := GopherType and GOPHER_TYPE_ERROR = 0;
  990. end;
  991.  
  992. function IS_GOPHER_INDEX_SERVER(GopherType: DWORD): BOOL;
  993. begin
  994.   Result := GopherType and GOPHER_TYPE_INDEX_SERVER = 0;
  995. end;
  996.  
  997. function IS_GOPHER_TELNET_SESSION(GopherType: DWORD): BOOL;
  998. begin
  999.   Result := GopherType and GOPHER_TYPE_TELNET = 0;
  1000. end;
  1001.  
  1002. function IS_GOPHER_BACKUP_SERVER(GopherType: DWORD): BOOL;
  1003. begin
  1004.   Result := GopherType and GOPHER_TYPE_REDUNDANT = 0;
  1005. end;
  1006.  
  1007. function IS_GOPHER_TN3270_SESSION(GopherType: DWORD): BOOL;
  1008. begin
  1009.   Result := GopherType and GOPHER_TYPE_TN3270 = 0;
  1010. end;
  1011.  
  1012. function IS_GOPHER_ASK(GopherType: DWORD): BOOL;
  1013. begin
  1014.   Result := GopherType and GOPHER_TYPE_ASK = 0;
  1015. end;
  1016.  
  1017. function IS_GOPHER_PLUS(GopherType: DWORD): BOOL;
  1018. begin
  1019.   Result := GopherType and GOPHER_TYPE_GOPHER_PLUS = 0;
  1020. end;
  1021.  
  1022. function IS_GOPHER_TYPE_KNOWN(GopherType: DWORD): BOOL;
  1023. begin
  1024.   Result := GopherType and GOPHER_TYPE_UNKNOWN = 0;
  1025. end;
  1026.  
  1027. end.
  1028.