Initial revision
[chise/xemacs-chise.git] / netinstall / netio.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 coordinate the various access
17    methods known to setup.  To add a new method, create a pair of
18    nio-*.[ch] files and add the logic to NetIO::open here */
19
20 #include "win32.h"
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 #include "resource.h"
26 #include "state.h"
27 #include "msg.h"
28 #include "netio.h"
29 #include "nio-file.h"
30 #include "nio-ie5.h"
31 #include "nio-http.h"
32 #include "nio-ftp.h"
33 #include "dialog.h"
34 #include "log.h"
35
36 #include "port.h"
37
38 NetIO::NetIO (char *Purl)
39 {
40   set_url (Purl);
41 }
42
43 NetIO::~NetIO ()
44 {
45   if (url)
46     free (url);
47   if (proto)
48     free (proto);
49   if (host)
50     free (host);
51   if (path)
52     free (path);
53 }
54
55 void
56 NetIO::set_url (char *Purl)
57 {
58   char *bp, *ep, c;
59
60   file_size = 0;
61   url = _strdup (Purl);
62   proto = 0;
63   host = 0;
64   port = 0;
65   path = 0;
66
67   bp = url;
68   ep = strstr (bp, "://");
69   if (!ep)
70     {
71       path = url;
72       return;
73     }
74
75   *ep = 0;
76   proto = _strdup (bp);
77   *ep = ':';
78   bp = ep+3;
79
80   ep = bp + strcspn (bp, ":/");
81   c = *ep;
82   *ep = 0;
83   host = _strdup (bp);
84   *ep = c;
85
86   if (*ep == ':')
87     {
88       port = atoi (ep+1);
89       ep = strchr (ep, '/');
90     }
91
92   if (*ep)
93     path = _strdup (ep);
94 }
95
96 int
97 NetIO::ok ()
98 {
99   return 0;
100 }
101
102 int
103 NetIO::read (char *buf, int nbytes)
104 {
105   return 0;
106 }
107
108 NetIO *
109 NetIO::open (char *url)
110 {
111   NetIO *rv = 0;
112   enum {http, ftp, file} proto;
113   if (strncmp (url, "http://", 7) == 0)
114     proto = http;
115   else if (strncmp (url, "ftp://", 6) == 0)
116     proto = ftp;
117   else
118     proto = file;
119
120   if (proto == file)
121     rv = new NetIO_File (url);
122   else if (net_method == IDC_NET_IE5)
123     rv = new NetIO_IE5 (url);
124   else if (net_method == IDC_NET_PROXY)
125     rv = new NetIO_HTTP (url);
126   else if (net_method == IDC_NET_DIRECT)
127     {
128       switch (proto)
129         {
130         case http:
131           rv = new NetIO_HTTP (url);
132           break;
133         case ftp:
134           rv = new NetIO_FTP (url);
135           break;
136         }
137     }
138
139   if (!rv->ok ())
140     {
141       delete rv;
142       return 0;
143     }
144
145   return rv;
146 }
147
148
149 static char **user, **passwd;
150 static int loading = 0;
151
152 static void
153 check_if_enable_ok (HWND h)
154 {
155   int e = 0;
156   if (*user && *passwd)
157     e = 1;
158   EnableWindow (GetDlgItem (h, IDOK), e);
159 }
160
161 static void
162 load_dialog (HWND h)
163 {
164   loading = 1;
165   eset (h, IDC_NET_USER, *user);
166   eset (h, IDC_NET_PASSWD, *passwd);
167   check_if_enable_ok (h);
168   loading = 0;
169 }
170
171 static void
172 save_dialog (HWND h)
173 {
174   *user = eget (h, IDC_NET_USER, *user);
175   *passwd = eget (h, IDC_NET_PASSWD, *passwd);
176 }
177
178 static BOOL
179 auth_cmd (HWND h, int id, HWND hwndctl, UINT code)
180 {
181   switch (id)
182     {
183
184     case IDC_NET_USER:
185     case IDC_NET_PASSWD:
186       if (code == EN_CHANGE && !loading)
187         {
188           save_dialog (h);
189           check_if_enable_ok (h);
190         }
191       break;
192
193     case IDOK:
194       save_dialog (h);
195       EndDialog (h, 0);
196       break;
197
198     case IDCANCEL:
199       EndDialog (h, 1);
200       exit_setup (1);
201       break;
202     }
203   return FALSE;
204 }
205
206 static BOOL CALLBACK
207 auth_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
208 {
209   switch (message)
210     {
211     case WM_INITDIALOG:
212       load_dialog (h);
213       return FALSE;
214     case WM_COMMAND:
215       return HANDLE_WM_COMMAND (h, wParam, lParam, auth_cmd);
216     }
217   return FALSE;
218 }
219
220 static int
221 auth_common (HINSTANCE h, int id)
222 {
223   return DialogBox (h, MAKEINTRESOURCE (id), 0, auth_proc);
224 }
225
226 int
227 NetIO::get_auth ()
228 {
229   user = &net_user;
230   passwd = &net_passwd;
231   return auth_common (hinstance, IDD_NET_AUTH);
232 }
233
234 int
235 NetIO::get_proxy_auth ()
236 {
237   user = &net_proxy_user;
238   passwd = &net_proxy_passwd;
239   return auth_common (hinstance, IDD_PROXY_AUTH);
240 }