mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			381 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			381 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Java
		
	
	
	
/* VMFile.java -- Class for methods natively accessing files
 | 
						|
   Copyright (C) 2004, 2006, 2010  Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath 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, or (at your option)
 | 
						|
any later version.
 | 
						|
 | 
						|
GNU Classpath is distributed in the hope that it will be useful, but
 | 
						|
WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
02110-1301 USA.
 | 
						|
 | 
						|
Linking this library statically or dynamically with other modules is
 | 
						|
making a combined work based on this library.  Thus, the terms and
 | 
						|
conditions of the GNU General Public License cover the whole
 | 
						|
combination.
 | 
						|
 | 
						|
As a special exception, the copyright holders of this library give you
 | 
						|
permission to link this library with independent modules to produce an
 | 
						|
executable, regardless of the license terms of these independent
 | 
						|
modules, and to copy and distribute the resulting executable under
 | 
						|
terms of your choice, provided that you also meet, for each linked
 | 
						|
independent module, the terms and conditions of the license of that
 | 
						|
module.  An independent module is a module which is not derived from
 | 
						|
or based on this library.  If you modify this library, you may extend
 | 
						|
this exception to your version of the library, but you are not
 | 
						|
obligated to do so.  If you do not wish to do so, delete this
 | 
						|
exception statement from your version. */
 | 
						|
 | 
						|
 | 
						|
package java.io;
 | 
						|
 | 
						|
import java.net.MalformedURLException;
 | 
						|
import java.net.URL;
 | 
						|
 | 
						|
import gnu.classpath.Configuration;
 | 
						|
import gnu.java.io.PlatformHelper;
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * @author Michael Koch (konqueror@gmx.de)
 | 
						|
 */
 | 
						|
final class VMFile
 | 
						|
{
 | 
						|
 | 
						|
  // FIXME: We support only case sensitive filesystems currently.
 | 
						|
  static final boolean IS_CASE_SENSITIVE = true;
 | 
						|
  static final boolean IS_DOS_8_3 = false;
 | 
						|
 | 
						|
  static
 | 
						|
  {
 | 
						|
    if (Configuration.INIT_LOAD_LIBRARY)
 | 
						|
      {
 | 
						|
        System.loadLibrary("javaio");
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  private VMFile() {} // Prohibits instantiation.
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method does the actual work of getting the last file
 | 
						|
   * modification time.  It also does the existence check to avoid the
 | 
						|
   * overhead of a call to exists().
 | 
						|
   */
 | 
						|
  static native long lastModified(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method sets the permissions to make the file read only.
 | 
						|
   *
 | 
						|
   * @return true if file exists and the operation completed successfully
 | 
						|
   */
 | 
						|
  static native boolean setReadOnly(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method is used to create a temporary file.
 | 
						|
   */
 | 
						|
  static native boolean create(String path) throws IOException;
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native function actually produces the list of files in this
 | 
						|
   * directory.
 | 
						|
   *
 | 
						|
   * @return null if dirpath does not exist or is not a directory;
 | 
						|
   * null or empty array if the directory is unreadable; an array of
 | 
						|
   * file names in the directory otherwise.
 | 
						|
   */
 | 
						|
  static native synchronized String[] list(String dirpath);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method actually performs the rename.
 | 
						|
   */
 | 
						|
  static native boolean renameTo(String targetpath, String destpath);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method actually determines the length of the file and
 | 
						|
   * handles the existence check.
 | 
						|
   */
 | 
						|
  static native long length(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method does the actual checking of file existence.
 | 
						|
   */
 | 
						|
  static native boolean exists(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method handles the actual deleting of the file.
 | 
						|
   */
 | 
						|
  static native boolean delete(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method does the actual setting of the modification time.
 | 
						|
   */
 | 
						|
  static native boolean setLastModified(String path, long time);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method actually creates the directory.
 | 
						|
   */
 | 
						|
  static native boolean mkdir(String dirpath);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Gets the total bytes of the filesystem named by path.
 | 
						|
   */
 | 
						|
  static native long getTotalSpace(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Gets the total free bytes of the filesystem named by path.
 | 
						|
   */
 | 
						|
  static native long getFreeSpace(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Gets the available bytes of the filesystem named by path.
 | 
						|
   */
 | 
						|
  static native long getUsableSpace(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set the read permission of the file.
 | 
						|
   */
 | 
						|
  static synchronized native boolean setReadable(String path,
 | 
						|
                                                 boolean readable,
 | 
						|
                                                 boolean ownerOnly);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set the write permission of the file.
 | 
						|
   */
 | 
						|
  static synchronized native boolean setWritable(String path,
 | 
						|
                                                 boolean writable,
 | 
						|
                                                 boolean ownerOnly);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set the execute permission of the file.
 | 
						|
   */
 | 
						|
  static synchronized native boolean setExecutable(String path,
 | 
						|
                                                   boolean executable,
 | 
						|
                                                   boolean ownerOnly);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method does the actual check of whether or not a file
 | 
						|
   * is a plain file or not.  It also handles the existence check to
 | 
						|
   * eliminate the overhead of a call to exists().
 | 
						|
   */
 | 
						|
  static native boolean isFile(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method checks file permissions for writing.
 | 
						|
   */
 | 
						|
  static synchronized native boolean canWrite(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This methods checks if a directory can be written to.
 | 
						|
   */
 | 
						|
  static native boolean canWriteDirectory(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method checks file permissions for reading.
 | 
						|
   * It also handles the existence check to eliminate the overhead of
 | 
						|
   * a call to exists().
 | 
						|
   */
 | 
						|
  static synchronized native boolean canRead(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This native method checks file permissions for execution.
 | 
						|
   * It also handles the existence check to eliminate the overhead of
 | 
						|
   * a call to exists().
 | 
						|
   */
 | 
						|
  static synchronized native boolean canExecute(String path);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method does the actual check of whether or not a file is a
 | 
						|
   * directory or not.  It also handles the existence check to eliminate
 | 
						|
   * the overhead of a call to exists().
 | 
						|
   */
 | 
						|
  static native boolean isDirectory(String dirpath);
 | 
						|
 | 
						|
  /**
 | 
						|
   * This methods checks if a directory can be written to.
 | 
						|
   */
 | 
						|
  static boolean canWriteDirectory(File path)
 | 
						|
  {
 | 
						|
    return canWriteDirectory(path.getAbsolutePath());
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method returns an array of filesystem roots.  Some operating systems
 | 
						|
   * have volume oriented filesystem.  This method provides a mechanism for
 | 
						|
   * determining which volumes exist.  GNU systems use a single hierarchical
 | 
						|
   * filesystem, so will have only one "/" filesystem root.
 | 
						|
   *
 | 
						|
   * @return An array of <code>File</code> objects for each filesystem root
 | 
						|
   * available.
 | 
						|
   *
 | 
						|
   * @since 1.2
 | 
						|
   */
 | 
						|
  static File[] listRoots()
 | 
						|
  {
 | 
						|
        File[] roots = new File[1];
 | 
						|
        roots[0] = new File("/");
 | 
						|
        return roots;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method tests whether or not this file represents a "hidden" file.
 | 
						|
   * On GNU systems, a file is hidden if its name begins with a "."
 | 
						|
   * character.  Files with these names are traditionally not shown with
 | 
						|
   * directory listing tools.
 | 
						|
   *
 | 
						|
   * @return <code>true</code> if the file is hidden, <code>false</code>
 | 
						|
   * otherwise.
 | 
						|
   *
 | 
						|
   * @since 1.2
 | 
						|
   */
 | 
						|
  static boolean isHidden(String path)
 | 
						|
  {
 | 
						|
        // FIXME: this only works on UNIX
 | 
						|
        return getName(path).startsWith(".");
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method returns the name of the file.  This is everything in the
 | 
						|
   * complete path of the file after the last instance of the separator
 | 
						|
   * string.
 | 
						|
   *
 | 
						|
   * @return The file name
 | 
						|
   */
 | 
						|
  static String getName(String path)
 | 
						|
  {
 | 
						|
        int pos = PlatformHelper.lastIndexOfSeparator(path);
 | 
						|
        if (pos == -1)
 | 
						|
          return path;
 | 
						|
 | 
						|
        if (PlatformHelper.endWithSeparator(path))
 | 
						|
          return "";
 | 
						|
 | 
						|
        return path.substring(pos + File.separator.length());
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the path as an absolute path name. The value returned is the
 | 
						|
   * current directory plus the separatory string plus the path of the file.
 | 
						|
   * The current directory is determined from the <code>user.dir</code> system
 | 
						|
   * property.
 | 
						|
   *
 | 
						|
   * @param path the path to convert to absolute path
 | 
						|
   *
 | 
						|
   * @return the absolute path that corresponds to <code>path</code>
 | 
						|
   */
 | 
						|
  static String getAbsolutePath(String path)
 | 
						|
  {
 | 
						|
    if (File.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 if (File.separatorChar == '\\'
 | 
						|
             && path.length() > 1 && path.charAt (1) == ':'
 | 
						|
             && ((path.charAt (0) >= 'a' && path.charAt (0) <= 'z')
 | 
						|
             || (path.charAt (0) >= 'A' && path.charAt (0) <= 'Z')))
 | 
						|
      {
 | 
						|
        // On Windows, a process has a current working directory for
 | 
						|
        // each drive and a path like "G:foo\bar" would mean the
 | 
						|
        // absolute path "G:\wombat\foo\bar" if "\wombat" is the
 | 
						|
        // working directory on the G drive.
 | 
						|
        String drvDir = null;
 | 
						|
        try
 | 
						|
          {
 | 
						|
            drvDir = new File (path.substring (0, 2)).getCanonicalPath();
 | 
						|
          }
 | 
						|
        catch (IOException e)
 | 
						|
          {
 | 
						|
            drvDir = path.substring (0, 2) + "\\";
 | 
						|
          }
 | 
						|
 | 
						|
        // Note: this would return "C:\\." for the path "C:.", if "\"
 | 
						|
        // is the working folder on the C drive, but this is
 | 
						|
        // consistent with what Sun's JRE 1.4.1.01 actually returns!
 | 
						|
        if (path.length() > 2)
 | 
						|
          return drvDir + '\\' + path.substring (2, path.length());
 | 
						|
        else
 | 
						|
          return drvDir;
 | 
						|
      }
 | 
						|
    else if (path.equals(""))
 | 
						|
      return System.getProperty ("user.dir");
 | 
						|
    else
 | 
						|
      return System.getProperty ("user.dir") + File.separatorChar + path;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * This method returns true if the path represents an absolute file
 | 
						|
   * path and false if it does not.  The definition of an absolute path varies
 | 
						|
   * by system.  As an example, on GNU systems, a path is absolute if it starts
 | 
						|
   * with a "/".
 | 
						|
   *
 | 
						|
   * @param path the path to check
 | 
						|
   *
 | 
						|
   * @return <code>true</code> if path represents an absolute file name,
 | 
						|
   *         <code>false</code> otherwise.
 | 
						|
   */
 | 
						|
  static boolean isAbsolute(String path)
 | 
						|
  {
 | 
						|
    if (File.separatorChar == '\\')
 | 
						|
        return path.startsWith(File.separator + File.separator)
 | 
						|
               || (path.length() > 2
 | 
						|
                   && ((path.charAt(0) >= 'a' && path.charAt(0) <= 'z')
 | 
						|
                       || (path.charAt(0) >= 'A' && path.charAt(0) <= 'Z'))
 | 
						|
                       && path.charAt(1) == ':'
 | 
						|
                       && path.charAt(2) == '\\');
 | 
						|
    else
 | 
						|
      return path.startsWith(File.separator);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns a <code>URL</code> with the <code>file:</code>
 | 
						|
   * protocol that represents this file.  The exact form of this URL is
 | 
						|
   * system dependent.
 | 
						|
   *
 | 
						|
   * @param file the file to convert to URL
 | 
						|
   *
 | 
						|
   * @return a <code>URL</code> for this object.
 | 
						|
   *
 | 
						|
   * @throws MalformedURLException if the URL cannot be created
 | 
						|
   *         successfully.
 | 
						|
   */
 | 
						|
  static URL toURL(File file)
 | 
						|
    throws MalformedURLException
 | 
						|
  {
 | 
						|
    // 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 (File.separatorChar == '\\')
 | 
						|
      return new URL ("file:/" + file.getAbsolutePath().replace ('\\', '/')
 | 
						|
                      + (file.isDirectory() ? "/" : ""));
 | 
						|
    else
 | 
						|
      return new URL ("file:" + file.getAbsolutePath()
 | 
						|
                      + (file.isDirectory() ? "/" : ""));
 | 
						|
  }
 | 
						|
 | 
						|
   /**
 | 
						|
   * This method returns a canonical representation of the pathname of
 | 
						|
   * this file.  The actual form of the canonical representation is
 | 
						|
   * system-dependent.  On the GNU system, conversion to canonical
 | 
						|
   * form involves the removal of redundant separators, references to
 | 
						|
   * "." and "..", and symbolic links.
 | 
						|
   * <p>
 | 
						|
   * Note that this method, unlike the other methods which return path
 | 
						|
   * names, can throw an IOException.  This is because native method
 | 
						|
   * might be required in order to resolve the canonical path.
 | 
						|
   *
 | 
						|
   * @exception IOException If an error occurs
 | 
						|
   */
 | 
						|
  static native String toCanonicalForm(String path) throws IOException;
 | 
						|
}
 |