home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / www / protocol / ftp / handler.java
Text File  |  1995-08-11  |  6KB  |  231 lines

  1. /*
  2.  * @(#)Handler.java    1.21 95/03/22 James Gosling
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. /*-
  21.  *    ftp stream opener
  22.  */
  23.  
  24. package net.www.protocol.ftp;
  25.  
  26. import java.io.*;
  27. import net.ftp.*;
  28. import net.UnknownHostException;
  29. import net.www.protocol.http.Handler;
  30. import java.util.StringTokenizer;
  31. import net.www.html.*;
  32. import java.util.Hashtable;
  33.  
  34. /** open an ftp input stream given a URL */
  35. class Handler extends URLStreamHandler {
  36.     public synchronized InputStream openStream(URL u) {
  37.     FtpClient            ftp;
  38.     net.www.protocol.http.Handler    http;
  39.  
  40.     if (FtpClient.useFtpProxy &&
  41.         FtpClient.ftpProxyHost != null &&
  42.         FtpClient.ftpProxyHost.length() > 0) {
  43.         http = new net.www.protocol.http.Handler(FtpClient.ftpProxyHost,
  44.                              FtpClient.ftpProxyPort);
  45.         return http.openStreamInteractively(u);
  46.     }
  47.  
  48.     try {
  49.         ftp = new FtpClient(u.host);
  50.     } catch(UnknownHostException e) {
  51.         //XXX: iftp seems specific to Sun. We should
  52.         // probably just fail here.
  53.         ftp = new IftpClient(u.host);
  54.     }
  55.  
  56.     ftp.login("anonymous", "HotJavaVa2@");
  57.  
  58.     u.setType(formatFromName(u.file));
  59.     InputStream is;
  60.  
  61.     try {
  62.         ftp.binary();
  63.         is = ftp.get(u.file);
  64.  
  65.         /* Try to get the size of the file in bytes.  If that's
  66.            successful, then create a MeteredStream. */
  67.         try {
  68.         String  response = ftp.getResponseString();
  69.         int        offset;
  70.  
  71.         if ((offset = response.indexOf(" bytes)")) != -1) {
  72.             int i = offset;
  73.             int c;
  74.  
  75.             while (--i >= 0 && ((c = response.charAt(i)) >= '0'
  76.                     && c <= '9'))
  77.             ;
  78.             i = Integer.parseInt(response.substring(i + 1, offset));
  79.             if (i > 0) {
  80.             is = new MeteredStream(is, i);
  81.             }
  82.         }
  83.         } catch (Exception e) {
  84.         e.printStackTrace();
  85.         /* do nothing, since all we were doing was trying to
  86.            get the size in bytes of the file */
  87.         }
  88.     } catch (FileNotFoundException e) {
  89.         u.setType(u.content_html);
  90.         ftp.cd(u.file);
  91.         /* if that worked, then make a directory listing
  92.            and build an html stream with all the files in
  93.            the directory */
  94.         ftp.ascii();
  95.  
  96.         PipedOutputStream   os = new PipedOutputStream();
  97.  
  98.         is = new PipedInputStream(os);
  99.         new FtpDirectoryThread(ftp, u, ftp.list(), os).start();
  100.     }
  101.     return is;
  102.     }
  103. }
  104.  
  105. class FtpDirectoryThread extends Thread {
  106.     static Hashtable    images = new Hashtable();
  107.     static String fullImagePath(String name) {
  108.     return "doc:/demo/images/ftp/" + name + ".gif";
  109.     }
  110.  
  111.     static {
  112.     images.put(URL.content_gif, fullImagePath("gif"));
  113.     images.put(URL.content_tiff, fullImagePath("tiff"));
  114.     images.put(URL.content_basic, fullImagePath("audio"));
  115.     images.put(URL.content_octet, fullImagePath("compress"));
  116.     images.put(URL.content_postscript, fullImagePath("ps"));
  117.     images.put(URL.content_plain, fullImagePath("text"));
  118.     }
  119.  
  120.     FtpClient        ftp;
  121.     PrintStream        os;
  122.     InputStream        is;
  123.     URL            url;
  124.  
  125.     FtpDirectoryThread(FtpClient ftp, URL url, InputStream is,
  126.                OutputStream os) {
  127.     this.ftp = ftp;
  128.     this.url = url;
  129.     this.is = is;
  130.     this.os = new PrintStream(new BufferedOutputStream(os));
  131.     }
  132.  
  133.     /* drwxrwxr-x  30 jpayne   staff       1024 Jun 20  1994 src */
  134.  
  135.     public void run() {
  136.     try {
  137.         is = new BufferedInputStream(is);
  138.  
  139.         byte        data[] = new byte[512];
  140.         String        file;
  141.         DataInputStream dis = new DataInputStream(is);
  142.         String        urlString = url.toExternalForm();
  143.         String        title;
  144.  
  145.         if (!urlString.endsWith("/")) {
  146.         urlString += "/";
  147.         }
  148.         title = "Directory: " + url.file + "@" + url.host;
  149.  
  150.         os.println("<html>\n<head>\n<title>"
  151.                + title + "</title>\n</head>");
  152.         os.println("<body>");
  153.         os.println("<h2>" + title + "</h2>");
  154.         os.println("<pre>");
  155.  
  156.         addFile('d', "<Parent Directory>", null,
  157.             new URL(null, urlString + "../"));
  158.         while ((file = dis.readLine()) != null) {
  159.         StringTokenizer    t = new StringTokenizer(file, " ");
  160.         String    mode;
  161.         String    size;
  162.         String    name;
  163.  
  164.         try {
  165.             mode = t.nextToken();
  166.             t.nextToken();
  167.             t.nextToken();
  168.             t.nextToken();
  169.             size = t.nextToken();
  170.             t.nextToken();
  171.             t.nextToken();
  172.             t.nextToken();
  173.             name = t.nextToken();
  174.             if (name.equals(".") || name.equals("..")) {
  175.             continue;
  176.             } else {
  177.             addFile(mode.charAt(0) == 'd' ? 'd' : 'f',
  178.                 name, size, new URL(null, urlString + name));
  179.             }
  180.         } catch (NoSuchElementException e) {
  181.         }
  182.         }
  183.         os.println("</pre></body>\n</html>");
  184.     } finally {
  185.         os.close();
  186.         is.close();
  187.         ftp.closeServer();
  188.     }
  189.     }
  190.  
  191.     void addImage(String name) {
  192.     os.print("<img align=\"middle\" src=\"" + name + "\">");
  193.     }
  194.  
  195.     String lookupImage(String contentType) {
  196.     return (String) images.get(contentType);
  197.     }
  198.  
  199.     void addFile(int type, String name, String size, URL url) {
  200.     os.print("  ");
  201.     switch (type) {
  202.     case 'f':
  203.         url.setType(URLStreamHandler.formatFromName(url.file));
  204.         {
  205.         String    image = lookupImage(url.content_type);
  206.  
  207.         if (image == null) {
  208.             image = fullImagePath("file");
  209.         }
  210.  
  211.         addImage(image);
  212.         }
  213.         break;
  214.  
  215.     case 'd':
  216.         addImage(fullImagePath("directory"));
  217.         break;
  218.     }
  219.     os.print("\t<a href=\"" + url.toExternalForm() + "\">");
  220.     os.print(name);
  221.     if (type == 'd') {
  222.         os.print("/");
  223.     } else if (size != null) {
  224.         os.print(" (" + size + " bytes)");
  225.     }
  226.     os.print("</a>");
  227.     os.print("\n");
  228.     }
  229. }
  230.  
  231.