Initial revision
[chise/xemacs-chise.git.1] / netinstall / netio.cc
diff --git a/netinstall/netio.cc b/netinstall/netio.cc
new file mode 100644 (file)
index 0000000..5d04d93
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2000, Red Hat, Inc.
+ *
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ *
+ *     A copy of the GNU General Public License can be found at
+ *     http://www.gnu.org/
+ *
+ * Written by DJ Delorie <dj@cygnus.com>
+ *
+ */
+
+/* The purpose of this file is to coordinate the various access
+   methods known to setup.  To add a new method, create a pair of
+   nio-*.[ch] files and add the logic to NetIO::open here */
+
+#include "win32.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "resource.h"
+#include "state.h"
+#include "msg.h"
+#include "netio.h"
+#include "nio-file.h"
+#include "nio-ie5.h"
+#include "nio-http.h"
+#include "nio-ftp.h"
+#include "dialog.h"
+#include "log.h"
+
+#include "port.h"
+
+NetIO::NetIO (char *Purl)
+{
+  set_url (Purl);
+}
+
+NetIO::~NetIO ()
+{
+  if (url)
+    free (url);
+  if (proto)
+    free (proto);
+  if (host)
+    free (host);
+  if (path)
+    free (path);
+}
+
+void
+NetIO::set_url (char *Purl)
+{
+  char *bp, *ep, c;
+
+  file_size = 0;
+  url = _strdup (Purl);
+  proto = 0;
+  host = 0;
+  port = 0;
+  path = 0;
+
+  bp = url;
+  ep = strstr (bp, "://");
+  if (!ep)
+    {
+      path = url;
+      return;
+    }
+
+  *ep = 0;
+  proto = _strdup (bp);
+  *ep = ':';
+  bp = ep+3;
+
+  ep = bp + strcspn (bp, ":/");
+  c = *ep;
+  *ep = 0;
+  host = _strdup (bp);
+  *ep = c;
+
+  if (*ep == ':')
+    {
+      port = atoi (ep+1);
+      ep = strchr (ep, '/');
+    }
+
+  if (*ep)
+    path = _strdup (ep);
+}
+
+int
+NetIO::ok ()
+{
+  return 0;
+}
+
+int
+NetIO::read (char *buf, int nbytes)
+{
+  return 0;
+}
+
+NetIO *
+NetIO::open (char *url)
+{
+  NetIO *rv = 0;
+  enum {http, ftp, file} proto;
+  if (strncmp (url, "http://", 7) == 0)
+    proto = http;
+  else if (strncmp (url, "ftp://", 6) == 0)
+    proto = ftp;
+  else
+    proto = file;
+
+  if (proto == file)
+    rv = new NetIO_File (url);
+  else if (net_method == IDC_NET_IE5)
+    rv = new NetIO_IE5 (url);
+  else if (net_method == IDC_NET_PROXY)
+    rv = new NetIO_HTTP (url);
+  else if (net_method == IDC_NET_DIRECT)
+    {
+      switch (proto)
+       {
+       case http:
+         rv = new NetIO_HTTP (url);
+         break;
+       case ftp:
+         rv = new NetIO_FTP (url);
+         break;
+       }
+    }
+
+  if (!rv->ok ())
+    {
+      delete rv;
+      return 0;
+    }
+
+  return rv;
+}
+
+
+static char **user, **passwd;
+static int loading = 0;
+
+static void
+check_if_enable_ok (HWND h)
+{
+  int e = 0;
+  if (*user && *passwd)
+    e = 1;
+  EnableWindow (GetDlgItem (h, IDOK), e);
+}
+
+static void
+load_dialog (HWND h)
+{
+  loading = 1;
+  eset (h, IDC_NET_USER, *user);
+  eset (h, IDC_NET_PASSWD, *passwd);
+  check_if_enable_ok (h);
+  loading = 0;
+}
+
+static void
+save_dialog (HWND h)
+{
+  *user = eget (h, IDC_NET_USER, *user);
+  *passwd = eget (h, IDC_NET_PASSWD, *passwd);
+}
+
+static BOOL
+auth_cmd (HWND h, int id, HWND hwndctl, UINT code)
+{
+  switch (id)
+    {
+
+    case IDC_NET_USER:
+    case IDC_NET_PASSWD:
+      if (code == EN_CHANGE && !loading)
+       {
+         save_dialog (h);
+         check_if_enable_ok (h);
+       }
+      break;
+
+    case IDOK:
+      save_dialog (h);
+      EndDialog (h, 0);
+      break;
+
+    case IDCANCEL:
+      EndDialog (h, 1);
+      exit_setup (1);
+      break;
+    }
+  return FALSE;
+}
+
+static BOOL CALLBACK
+auth_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
+{
+  switch (message)
+    {
+    case WM_INITDIALOG:
+      load_dialog (h);
+      return FALSE;
+    case WM_COMMAND:
+      return HANDLE_WM_COMMAND (h, wParam, lParam, auth_cmd);
+    }
+  return FALSE;
+}
+
+static int
+auth_common (HINSTANCE h, int id)
+{
+  return DialogBox (h, MAKEINTRESOURCE (id), 0, auth_proc);
+}
+
+int
+NetIO::get_auth ()
+{
+  user = &net_user;
+  passwd = &net_passwd;
+  return auth_common (hinstance, IDD_NET_AUTH);
+}
+
+int
+NetIO::get_proxy_auth ()
+{
+  user = &net_proxy_user;
+  passwd = &net_proxy_passwd;
+  return auth_common (hinstance, IDD_PROXY_AUTH);
+}