diff options
author | Guilhem Lavaux <guilhem@kaffe.org> | 2004-04-23 06:44:08 +0000 |
---|---|---|
committer | Guilhem Lavaux <guilhem@kaffe.org> | 2004-04-23 06:44:08 +0000 |
commit | b87863519d0b31a1a03031904c4e425ac68fcad4 (patch) | |
tree | e0ec4815a5f656251499e3c88e1c6f28d0464cef /gnu/java/net/protocol/file/Handler.java | |
parent | 854fe1d47fc629e901a2118484b8c7925f5c5771 (diff) | |
download | classpath-b87863519d0b31a1a03031904c4e425ac68fcad4.tar.gz |
* gnu/java/net/protocol/file/Handler.java:
Imported GCJ implementation. The URL parsing is completely handled
by URLStreamHandler now.
Diffstat (limited to 'gnu/java/net/protocol/file/Handler.java')
-rw-r--r-- | gnu/java/net/protocol/file/Handler.java | 248 |
1 files changed, 1 insertions, 247 deletions
diff --git a/gnu/java/net/protocol/file/Handler.java b/gnu/java/net/protocol/file/Handler.java index 1d55113bf..d3c68e128 100644 --- a/gnu/java/net/protocol/file/Handler.java +++ b/gnu/java/net/protocol/file/Handler.java @@ -1,5 +1,5 @@ /* Handler.java -- "file" protocol handler for java.net - Copyright (C) 1998, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -37,7 +37,6 @@ exception statement from your version. */ package gnu.java.net.protocol.file; -import gnu.java.io.PlatformHelper; import java.io.IOException; import java.net.URL; import java.net.URLConnection; @@ -77,259 +76,14 @@ public class Handler extends URLStreamHandler String host = url.getHost(); if ((host != null) && (! host.equals(""))) { - throw new IOException("ftp protocol handler not yet implemented."); - /* // Reset the protocol (and implicitly the handler) for this URL. // Then have the URL attempt the connection again, as it will // get the changed handler the next time around. setURL (url, "ftp", url.getHost(), url.getPort(), url.getFile(), url.getRef()); - // Until the ftp protocol handler is written, this will cause - // a NullPointerException. return url.openConnection(); - */ } return new Connection(url); } - - /** - * This method overrides URLStreamHandler's for parsing url of protocol "file" - * - * @param url The URL object in which to store the results - * @param url_string The String-ized URL to parse - * @param start The position in the string to start scanning from - * @param end The position in the string to stop scanning - */ - protected void parseURL (URL url, String url_string, int start, int end) - { - // This method does not throw an exception or return a value. Thus our - // strategy when we encounter an error in parsing is to return without - // doing anything. - - // Bunches of things should be true. Make sure. - if (end < start) - return; - if (end - start < 2) - return; - if (start > url_string.length()) - return; - if (end > url_string.length()) - end = url_string.length(); // This should be safe - - // Turn end into an offset from the end of the string instead of - // the beginning - end = url_string.length() - end; - - // Skip remains of protocol - url_string = url_string.substring (start); - - if ( !url.getProtocol().equals ("file")) - return; - - // Normalize the file separator - url_string = url_string.replace - (System.getProperty ("file.separator").charAt (0), '/'); - - // Deal with the case: file:///d|/dir/dir/file and file:///d%7C/dir/dir/file - url_string = url_string.replace ('|', ':'); - int i; - - if ((i = url_string.toUpperCase().indexOf ("%7C")) >= 0) - url_string = url_string.substring (0, i) + ":" + url_string.substring (i + 3); - - boolean needContext = url.getFile() != null; - // Skip the leading "//" - if (url_string.startsWith ("//")) - { - url_string = url_string.substring (2); - needContext = false; - } - - // Declare some variables - String host = null; - int port = -1; - String file = null; - String anchor = null; - String prefix = "/"; //root path prefix of a file: could be "/", and for some windows file: "drive:/" - - if (!needContext) - { - boolean hostpart = true; //whether host part presents - - // Deal with the UNC case: //server/file - if (url_string.startsWith ("//")) - { - hostpart = true; - url_string = url_string.substring (2); - } - else - { - // If encounter another "/", it's end of a null host part or beginning of root path - if (url_string.startsWith ("/")) - { - hostpart = false; - // url_string = url_string.substring (1); - } - } - - // If another "/" or "drive:/" or "drive:\\" encounters, - if ((i = PlatformHelper.beginWithRootPathPrefix (url_string)) > 0) - { - hostpart = false; - // Skip root path prefix - prefix = url_string.substring (0, i); - url_string = url_string.substring(i); - } - - if (hostpart) - { - // Process host and port - int slash_index = url_string.indexOf ("/"); - int colon_index = url_string.indexOf (":"); - - if (slash_index > (url_string.length() - end)) - return; - else if (slash_index == -1) - slash_index = url_string.length() - end; - - if ((colon_index == -1) - || (colon_index > slash_index)) - { - host = url_string.substring (0, slash_index); - } - else - { - host = url_string.substring (0, colon_index); - String port_str = url_string.substring (colon_index + 1, - slash_index); - - try - { - port = Integer.parseInt(port_str); - } - catch (NumberFormatException e) - { - return; - } - } - - if (slash_index < (url_string.length() - 1)) - url_string = url_string.substring (slash_index + 1); - else - url_string = ""; - } - } - - // Process file and anchor - if (needContext) - { - host = url.getHost(); - port = url.getPort(); - - if ((i = PlatformHelper.beginWithRootPathPrefix (url_string)) > 0) - { //url string is an absolute path - file = url.getFile(); - int j = PlatformHelper.beginWithRootPathPrefix (file); - - if (j >= i) - file = file.substring (0, j) + url_string.substring (i); - else - file = url_string; - } - else - { - file = url.getFile(); - - /* - // Is the following necessary? - java.io.File f = new java.io.File(file); - if(f.isDirectory() && !PlatformHelper.endWithSeparator(file)){ - file += "/"; - } - */ - - int idx = file.lastIndexOf ("/"); - - if (idx == -1) //no context path, make relative url - file = url_string; - else if (idx == (file.length() - 1)) - //just concatenate two parts - file = file + url_string; - else - file = file.substring (0, idx + 1) + url_string; - } - } - else - file = prefix + url_string; - - if (end == 0) - { - anchor = null; - } - else - { - // Only set anchor if end char is a '#'. Otherwise assume we're - // just supposed to stop scanning for some reason - if (file.charAt (file.length() - end) == '#') - { - int len = file.length(); - anchor = file.substring ( len - end + 1, len); - file = file.substring (0, len - end); - } - else - anchor = null; - } - - file = PlatformHelper.toCanonicalForm (file, '/'); - - if (host == null) - { - host = ""; - } - - // Now set the values - setURL (url, url.getProtocol(), host, port, file, anchor); - } - - /** - * This method overrides URLStreamHandler's as a specialized - * and more efficient toExternalForm - * - * @param url The URL object whose external form will be returned - */ - protected String toExternalForm (URL url) - { - StringBuffer sb = new StringBuffer (PlatformHelper.INITIAL_MAX_PATH); - sb.append ("file:"); - String prefix = url.getHost(); - - if (prefix != null - && prefix.length() > 0) - { - sb.append (prefix); - int port = url.getPort(); - - if (port > 0) - { - sb.append (':'); - sb.append (port); - } - } - - String file = url.getFile(); - if (file != null) - sb.append (file); - else - sb.append ('/'); - - String anchor = url.getRef(); - if (anchor != null) - { - sb.append ('#'); - sb.append (anchor); - } - - return sb.toString(); - } } // class Handler |