]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
File (getAbsolutePath): Prefix drive specifier on Windows for paths starting with...
authorRanjit Mathew <rmathew@hotmail.com>
Sat, 1 Mar 2003 23:38:13 +0000 (23:38 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Sat, 1 Mar 2003 23:38:13 +0000 (23:38 +0000)
2003-03-01  Ranjit Mathew  <rmathew@hotmail.com>

* java/io/File (getAbsolutePath): Prefix drive specifier on
Windows for paths starting with a '\'.
(toURL): Make URL more consistent with what Sun's JDK returns.

* java/io/natFileWin32.cc (java::io::File::isAbsolute): Return
true only if the path is a UNC network path or it starts with a
drive specifier.

* java/net/URLStreamHandler.java (parseURL): Correct minor typo.
Be prepared to handle either '/' or '\\' in the file path for
Windows if using the "file" protocol.
Canonicalise the file path if using a relative path in the given
context and the "file" protocol.

From-SVN: r63635

libjava/ChangeLog
libjava/java/io/File.java
libjava/java/io/natFileWin32.cc
libjava/java/net/URLStreamHandler.java

index c340717c02e1d6fc3b0768d05bae7f17e57a69aa..a86821f246cb72c60f2999c981f302b71adb20d3 100644 (file)
@@ -1,3 +1,19 @@
+2003-03-01  Ranjit Mathew  <rmathew@hotmail.com>
+
+       * java/io/File (getAbsolutePath): Prefix drive specifier on
+       Windows for paths starting with a '\'.
+       (toURL): Make URL more consistent with what Sun's JDK returns.
+
+       * java/io/natFileWin32.cc (java::io::File::isAbsolute): Return
+       true only if the path is a UNC network path or it starts with a
+       drive specifier.
+
+       * java/net/URLStreamHandler.java (parseURL): Correct minor typo.
+       Be prepared to handle either '/' or '\\' in the file path for
+       Windows if using the "file" protocol.
+       Canonicalise the file path if using a relative path in the given
+       context and the "file" protocol.
+
 2003-03-01  Mohan Embar  <gnustuff@thisiscool.com>
 
        * java/lang/natWin32Process.cc (startProcess): Double-quote each
index 2086f1057aa3c06672f11820e1205812c73c8999..367fd44eb6923cb5d22a03681ccc3eb972295976 100644 (file)
@@ -1,6 +1,6 @@
 // File.java - File name
 
-/* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2003  Free Software Foundation, Inc.
 
    This file is part of libgcj.
 
@@ -153,12 +153,20 @@ public class File implements Serializable, Comparable
     this (dir == null ? null : dir.path, name);
   }
 
-  // FIXME  ???
   public String getAbsolutePath ()
   {
     if (isAbsolute ())
       return path;
-    return System.getProperty("user.dir") + separatorChar + path;
+    else if (separatorChar == '\\' 
+             && path.length () > 0 && path.charAt (0) == '\\')
+      {
+        // On Windows, even if the path starts with a '\\' it is not
+        // really absolute until we prefix the drive specifier from
+        // the current working directory to it.
+        return System.getProperty ("user.dir").substring (0, 2) + path;
+      }
+    else
+      return System.getProperty ("user.dir") + separatorChar + path;
   }
 
   /** @since 1.2 */
@@ -289,8 +297,14 @@ public class File implements Serializable, Comparable
 
   public URL toURL () throws MalformedURLException
   {
-    return new URL ("file://" + getAbsolutePath ()
-                   + (isDirectory() ? "/" : ""));
+    // On Win32, Sun's JDK returns URLs of the form "file:/c:/foo/bar.txt",
+    // while on UNIX, it returns URLs of the form "file:/foo/bar.txt". 
+    if (separatorChar == '\\')
+      return new URL ("file:/" + getAbsolutePath ().replace ('\\', '/')
+                     + (isDirectory() ? "/" : ""));
+    else
+      return new URL ("file:" + getAbsolutePath ()
+                     + (isDirectory() ? "/" : ""));
   }
 
   private final native boolean performMkdir ();
index 5245feb5a1e493dfbbb54db591eeff83a67b4a00..9029881e165018a06103d68537d9af2651921336 100644 (file)
@@ -119,9 +119,14 @@ java::io::File::getCanonicalPath (void)
 jboolean
 java::io::File::isAbsolute (void)
 {
-  if (path->length() > 0
-      && (path->charAt(0) == '/' || path->charAt(0) == '\\'))
+  // See if the path represents a Windows UNC network path.
+  if (path->length () > 1
+      && (path->charAt (0) == '\\') && (path->charAt (1) == '\\'))
     return true;
+
+  // Note that the path is not an absolute path even if it starts with
+  // a '/' or a '\' because it lacks a drive specifier.
+
   if (path->length() < 3)
     return false;
   // Hard-code A-Za-z because Windows (I think) can't use non-ASCII
index 7f866440f2f68fe5919ab3bd2e05fbb74f1cfd42..d3dd3ccf0f76b23b083ac5cf32cda988cb394c43 100644 (file)
@@ -1,5 +1,5 @@
 /* URLStreamHandler.java -- Abstract superclass for all protocol handlers
-   Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -39,6 +39,7 @@ exception statement from your version. */
 package java.net;
 
 import java.io.IOException;
+import java.io.File;
 
 /*
  * Written using on-line Java Platform 1.2 API Specification, as well
@@ -112,7 +113,7 @@ public abstract class URLStreamHandler
    * subclasses that implement protocols with URL's the follow a different 
    * syntax should override this method.  The lone exception is that if
    * the protocol name set in the URL is "file", this method will accept
-   * a an empty hostname (i.e., "file:///"), which is legal for that protocol
+   * an empty hostname (i.e., "file:///"), which is legal for that protocol
    *
    * @param url The URL object in which to store the results
    * @param spec The String-ized URL to parse
@@ -176,8 +177,32 @@ public abstract class URLStreamHandler
     else if (start < end)
       {
        // Context is available, but only override it if there is a new file.
-       file = file.substring(0, file.lastIndexOf('/'))
-               + '/' + spec.substring(start, end);
+        char sepChar = '/';
+        int lastSlash = file.lastIndexOf (sepChar);
+        if (lastSlash < 0 && File.separatorChar != sepChar
+            && url.getProtocol ().equals ("file"))
+          {
+            // On Windows, even '\' is allowed in a "file" URL.
+            sepChar = File.separatorChar;
+            lastSlash = file.lastIndexOf (sepChar);
+          }
+        
+        file = file.substring(0, lastSlash)
+                + sepChar + spec.substring (start, end);
+
+        if (url.getProtocol ().equals ("file"))
+          {
+            // For "file" URLs constructed relative to a context, we
+            // need to canonicalise the file path.
+            try
+              {
+                file = new File (file).getCanonicalPath ();
+              }
+            catch (IOException e)
+              {
+              }
+          }
+
        ref = null;
       }