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
Wrap
Text File
|
1995-08-11
|
6KB
|
231 lines
/*
* @(#)Handler.java 1.21 95/03/22 James Gosling
*
* Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
/*-
* ftp stream opener
*/
package net.www.protocol.ftp;
import java.io.*;
import net.ftp.*;
import net.UnknownHostException;
import net.www.protocol.http.Handler;
import java.util.StringTokenizer;
import net.www.html.*;
import java.util.Hashtable;
/** open an ftp input stream given a URL */
class Handler extends URLStreamHandler {
public synchronized InputStream openStream(URL u) {
FtpClient ftp;
net.www.protocol.http.Handler http;
if (FtpClient.useFtpProxy &&
FtpClient.ftpProxyHost != null &&
FtpClient.ftpProxyHost.length() > 0) {
http = new net.www.protocol.http.Handler(FtpClient.ftpProxyHost,
FtpClient.ftpProxyPort);
return http.openStreamInteractively(u);
}
try {
ftp = new FtpClient(u.host);
} catch(UnknownHostException e) {
//XXX: iftp seems specific to Sun. We should
// probably just fail here.
ftp = new IftpClient(u.host);
}
ftp.login("anonymous", "HotJavaVa2@");
u.setType(formatFromName(u.file));
InputStream is;
try {
ftp.binary();
is = ftp.get(u.file);
/* Try to get the size of the file in bytes. If that's
successful, then create a MeteredStream. */
try {
String response = ftp.getResponseString();
int offset;
if ((offset = response.indexOf(" bytes)")) != -1) {
int i = offset;
int c;
while (--i >= 0 && ((c = response.charAt(i)) >= '0'
&& c <= '9'))
;
i = Integer.parseInt(response.substring(i + 1, offset));
if (i > 0) {
is = new MeteredStream(is, i);
}
}
} catch (Exception e) {
e.printStackTrace();
/* do nothing, since all we were doing was trying to
get the size in bytes of the file */
}
} catch (FileNotFoundException e) {
u.setType(u.content_html);
ftp.cd(u.file);
/* if that worked, then make a directory listing
and build an html stream with all the files in
the directory */
ftp.ascii();
PipedOutputStream os = new PipedOutputStream();
is = new PipedInputStream(os);
new FtpDirectoryThread(ftp, u, ftp.list(), os).start();
}
return is;
}
}
class FtpDirectoryThread extends Thread {
static Hashtable images = new Hashtable();
static String fullImagePath(String name) {
return "doc:/demo/images/ftp/" + name + ".gif";
}
static {
images.put(URL.content_gif, fullImagePath("gif"));
images.put(URL.content_tiff, fullImagePath("tiff"));
images.put(URL.content_basic, fullImagePath("audio"));
images.put(URL.content_octet, fullImagePath("compress"));
images.put(URL.content_postscript, fullImagePath("ps"));
images.put(URL.content_plain, fullImagePath("text"));
}
FtpClient ftp;
PrintStream os;
InputStream is;
URL url;
FtpDirectoryThread(FtpClient ftp, URL url, InputStream is,
OutputStream os) {
this.ftp = ftp;
this.url = url;
this.is = is;
this.os = new PrintStream(new BufferedOutputStream(os));
}
/* drwxrwxr-x 30 jpayne staff 1024 Jun 20 1994 src */
public void run() {
try {
is = new BufferedInputStream(is);
byte data[] = new byte[512];
String file;
DataInputStream dis = new DataInputStream(is);
String urlString = url.toExternalForm();
String title;
if (!urlString.endsWith("/")) {
urlString += "/";
}
title = "Directory: " + url.file + "@" + url.host;
os.println("<html>\n<head>\n<title>"
+ title + "</title>\n</head>");
os.println("<body>");
os.println("<h2>" + title + "</h2>");
os.println("<pre>");
addFile('d', "<Parent Directory>", null,
new URL(null, urlString + "../"));
while ((file = dis.readLine()) != null) {
StringTokenizer t = new StringTokenizer(file, " ");
String mode;
String size;
String name;
try {
mode = t.nextToken();
t.nextToken();
t.nextToken();
t.nextToken();
size = t.nextToken();
t.nextToken();
t.nextToken();
t.nextToken();
name = t.nextToken();
if (name.equals(".") || name.equals("..")) {
continue;
} else {
addFile(mode.charAt(0) == 'd' ? 'd' : 'f',
name, size, new URL(null, urlString + name));
}
} catch (NoSuchElementException e) {
}
}
os.println("</pre></body>\n</html>");
} finally {
os.close();
is.close();
ftp.closeServer();
}
}
void addImage(String name) {
os.print("<img align=\"middle\" src=\"" + name + "\">");
}
String lookupImage(String contentType) {
return (String) images.get(contentType);
}
void addFile(int type, String name, String size, URL url) {
os.print(" ");
switch (type) {
case 'f':
url.setType(URLStreamHandler.formatFromName(url.file));
{
String image = lookupImage(url.content_type);
if (image == null) {
image = fullImagePath("file");
}
addImage(image);
}
break;
case 'd':
addImage(fullImagePath("directory"));
break;
}
os.print("\t<a href=\"" + url.toExternalForm() + "\">");
os.print(name);
if (type == 'd') {
os.print("/");
} else if (size != null) {
os.print(" (" + size + " bytes)");
}
os.print("</a>");
os.print("\n");
}
}