(A-compU+26612): New abstract node.
[chise/xemacs-chise.git.1] / netinstall / nio-ie5.cc
1 /*
2  * Copyright (c) 2000, Red Hat, Inc.
3  *
4  *     This program is free software; you can redistribute it and/or modify
5  *     it under the terms of the GNU General Public License as published by
6  *     the Free Software Foundation; either version 2 of the License, or
7  *     (at your option) any later version.
8  *
9  *     A copy of the GNU General Public License can be found at
10  *     http://www.gnu.org/
11  *
12  * Written by DJ Delorie <dj@cygnus.com>
13  *
14  */
15
16 /* The purpose of this file is to manage internet downloads using the
17    Internet Explorer version 5 DLLs.  To use this method, the user
18    must already have installed and configured IE5.  This module is
19    called from netio.cc, which is called from geturl.cc */
20
21 #include "win32.h"
22
23 #include "resource.h"
24 #include "state.h"
25 #include "dialog.h"
26 #include "msg.h"
27 #include "netio.h"
28 #include "nio-ie5.h"
29
30 static HINTERNET internet = 0;
31
32 NetIO_IE5::NetIO_IE5 (char *_url)
33   : NetIO (_url)
34 {
35   int resend = 0;
36
37   if (internet == 0)
38     {
39       HINSTANCE h = LoadLibrary ("wininet.dll");
40       if (!h)
41         {
42           note (IDS_WININET);
43           connection = 0;
44           return;
45         }
46       InternetAttemptConnect (0);
47       internet = InternetOpen ("Cygwin Setup", INTERNET_OPEN_TYPE_PRECONFIG,
48                                NULL, NULL, 0);
49     }
50
51   DWORD flags =
52     INTERNET_FLAG_DONT_CACHE |
53     INTERNET_FLAG_KEEP_CONNECTION |
54     INTERNET_FLAG_PRAGMA_NOCACHE |
55     INTERNET_FLAG_RELOAD |
56     INTERNET_FLAG_EXISTING_CONNECT |
57     INTERNET_FLAG_PASSIVE;
58
59   connection = InternetOpenUrl (internet, url, NULL, 0, flags, 0);
60
61  try_again:
62
63   if (net_user && net_passwd)
64     {
65       InternetSetOption (connection, INTERNET_OPTION_USERNAME,
66                          net_user, strlen (net_user));
67       InternetSetOption (connection, INTERNET_OPTION_PASSWORD,
68                          net_passwd, strlen (net_passwd));
69     }
70
71   if (net_proxy_user && net_proxy_passwd)
72     {
73       InternetSetOption (connection, INTERNET_OPTION_PROXY_USERNAME,
74                          net_proxy_user, strlen (net_proxy_user));
75       InternetSetOption (connection, INTERNET_OPTION_PROXY_PASSWORD,
76                          net_proxy_passwd, strlen (net_proxy_passwd));
77     }
78
79   if (resend)
80     if (!HttpSendRequest (connection, 0, 0, 0, 0))
81       connection = 0;
82
83   if (!connection)
84     {
85       if (GetLastError () == ERROR_INTERNET_EXTENDED_ERROR)
86         {
87           char buf[2000];
88           DWORD e, l=sizeof (buf);
89           InternetGetLastResponseInfo (&e, buf, &l);
90           MessageBox (0, buf, "Internet Error", 0);
91         }
92     }
93
94   DWORD type, type_s;
95   type_s = sizeof (type);
96   InternetQueryOption (connection, INTERNET_OPTION_HANDLE_TYPE,
97                        &type, &type_s);
98
99   switch (type)
100     {
101     case INTERNET_HANDLE_TYPE_HTTP_REQUEST:
102     case INTERNET_HANDLE_TYPE_CONNECT_HTTP:
103       type_s = sizeof (DWORD);
104       if (HttpQueryInfo (connection,
105                          HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
106                          &type, &type_s, NULL))
107         {
108           if (type == 401) /* authorization required */
109             {
110               flush_io();
111               get_auth ();
112               resend = 1;
113               goto try_again;
114             }
115           else if (type == 407) /* proxy authorization required */
116             {
117               flush_io();
118               get_proxy_auth ();
119               resend = 1;
120               goto try_again;
121             }
122           else if (type >= 300)
123             {
124               connection = 0;
125               return;
126             }
127         }
128     }
129 }
130
131 void
132 NetIO_IE5::flush_io ()
133 {
134   DWORD actual = 0;
135   char buf[1024];
136   do {
137     InternetReadFile (connection, buf, 1024, &actual);
138   } while (actual > 0);
139 }
140
141 NetIO_IE5::~NetIO_IE5 ()
142 {
143   if (connection)
144     InternetCloseHandle (connection);
145 }
146
147 int
148 NetIO_IE5::ok ()
149 {
150   return (connection == NULL) ? 0 : 1;
151 }
152
153 int
154 NetIO_IE5::read (char *buf, int nbytes)
155 {
156   DWORD actual;
157   if (InternetReadFile (connection, buf, nbytes, &actual))
158     return actual;
159   return -1;
160 }