| // System.java - System-specific info. | |
| /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation | |
| This file is part of libgcj. | |
| This software is copyrighted work licensed under the terms of the | |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for | |
| details. */ | |
| package java.lang; | |
| import java.io.FileDescriptor; | |
| import java.io.FileInputStream; | |
| import java.io.FileOutputStream; | |
| import java.io.FilterInputStream; | |
| import java.io.InputStream; | |
| import java.io.PrintStream; | |
| import java.io.BufferedInputStream; | |
| import java.io.BufferedOutputStream; | |
| import java.util.Properties; | |
| import java.util.PropertyPermission; | |
| import java.util.TimeZone; | |
| /** | |
| * @author Tom Tromey <tromey@cygnus.com> | |
| * @date August 27, 1998 | |
| */ | |
| /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 | |
| * "The Java Language Specification", ISBN 0-201-63451-1 | |
| * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. | |
| * Status: 1.1. Some 1.2 methods missing. Properties code not fully | |
| * implemented. | |
| */ | |
| public final class System | |
| { | |
| public static native void arraycopy (Object src, int srcOffset, | |
| Object dst, int dstOffset, | |
| int count); | |
| public static native long currentTimeMillis (); | |
| // FIXME: When merging with Classpath, remember to remove the call to | |
| // getDefaultTimeZoneId from java.util.Timezone. | |
| private static native String getSystemTimeZone (); | |
| // Get the System Timezone as reported by the OS. It should be in | |
| // the form PST8PDT so we'll need to parse it and check that it's valid. | |
| // The result is used to set the user.timezone property in init_properties. | |
| // FIXME: Using the code from Classpath for generating the System | |
| // Timezone IMO is suboptimal because it ignores whether the rules for | |
| // DST match up. | |
| private static String getDefaultTimeZoneId () | |
| { | |
| String sysTimeZoneId = getSystemTimeZone (); | |
| // Check if this is a valid timezone. Make sure the IDs match | |
| // since getTimeZone returns GMT if no match is found. | |
| TimeZone tz = TimeZone.getTimeZone (sysTimeZoneId); | |
| if (tz.getID ().equals (sysTimeZoneId)) | |
| return sysTimeZoneId; | |
| // Check if the base part of sysTimeZoneId is a valid timezone that | |
| // matches with daylight usage and rawOffset. Make sure the IDs match | |
| // since getTimeZone returns GMT if no match is found. | |
| // First find start of GMT offset info and any Daylight zone name. | |
| int startGMToffset = 0; | |
| int sysTimeZoneIdLength = sysTimeZoneId.length(); | |
| for (int i = 0; i < sysTimeZoneIdLength && startGMToffset == 0; i++) | |
| { | |
| if (Character.isDigit (sysTimeZoneId.charAt (i))) | |
| startGMToffset = i; | |
| } | |
| int startDaylightZoneName = 0; | |
| boolean usesDaylight = false; | |
| for (int i = sysTimeZoneIdLength - 1; | |
| i >= 0 && !Character.isDigit (sysTimeZoneId.charAt (i)); --i) | |
| { | |
| startDaylightZoneName = i; | |
| } | |
| if (startDaylightZoneName > 0) | |
| usesDaylight = true; | |
| int GMToffset = Integer.parseInt (startDaylightZoneName == 0 ? | |
| sysTimeZoneId.substring (startGMToffset) : | |
| sysTimeZoneId.substring (startGMToffset, startDaylightZoneName)); | |
| // Offset could be in hours or seconds. Convert to millis. | |
| if (GMToffset < 24) | |
| GMToffset *= 60 * 60; | |
| GMToffset *= -1000; | |
| String tzBasename = sysTimeZoneId.substring (0, startGMToffset); | |
| tz = TimeZone.getTimeZone (tzBasename); | |
| if (tz.getID ().equals (tzBasename) && tz.getRawOffset () == GMToffset) | |
| { | |
| boolean tzUsesDaylight = tz.useDaylightTime (); | |
| if (usesDaylight && tzUsesDaylight || !usesDaylight && !tzUsesDaylight) | |
| return tzBasename; | |
| } | |
| // If no match, see if a valid timezone has the same attributes as this | |
| // and then use it instead. | |
| String[] IDs = TimeZone.getAvailableIDs (GMToffset); | |
| for (int i = 0; i < IDs.length; ++i) | |
| { | |
| // FIXME: The daylight savings rules may not match the rules | |
| // for the desired zone. | |
| boolean IDusesDaylight = | |
| TimeZone.getTimeZone (IDs[i]).useDaylightTime (); | |
| if (usesDaylight && IDusesDaylight || !usesDaylight && !IDusesDaylight) | |
| return IDs[i]; | |
| } | |
| // If all else fails, return null. | |
| return null; | |
| } | |
| public static void exit (int status) | |
| { | |
| Runtime.getRuntime().exit(status); | |
| } | |
| public static void gc () | |
| { | |
| Runtime.getRuntime().gc(); | |
| } | |
| // Marked deprecated in 1.1. We implement what the JCL book says. | |
| public static String getenv (String name) | |
| { | |
| throw new Error (); | |
| } | |
| private static native void init_properties (); | |
| public static Properties getProperties () | |
| { | |
| if (secman != null) | |
| secman.checkPropertiesAccess(); | |
| if (properties == null) | |
| init_properties (); | |
| return properties; | |
| } | |
| public static String getProperty (String property) | |
| { | |
| if (secman != null) | |
| secman.checkPropertyAccess(property); | |
| if (properties == null) | |
| init_properties (); | |
| return properties.getProperty(property); | |
| } | |
| public static String getProperty (String property, String defval) | |
| { | |
| if (secman != null) | |
| secman.checkPropertyAccess(property); | |
| if (properties == null) | |
| init_properties (); | |
| return properties.getProperty(property, defval); | |
| } | |
| public static SecurityManager getSecurityManager () | |
| { | |
| return secman; | |
| } | |
| public static native int identityHashCode (Object obj); | |
| public static void load (String pathname) | |
| { | |
| Runtime.getRuntime().load(pathname); | |
| } | |
| public static void loadLibrary (String libname) | |
| { | |
| Runtime.getRuntime().loadLibrary(libname); | |
| } | |
| public static void runFinalization () | |
| { | |
| Runtime.getRuntime().runFinalization(); | |
| } | |
| // Marked as deprecated in 1.2. | |
| public static void runFinalizersOnExit (boolean run) | |
| { | |
| Runtime.getRuntime().runFinalizersOnExit(run); | |
| } | |
| private static void checkSetIO () | |
| { | |
| // In 1.1, we are supposed to call checkExec, but the argument is | |
| // not specified. In 1.2, we are supposed to use checkPermission, | |
| // which doesn't exist in 1.1. | |
| if (secman != null) | |
| secman.checkExec(""); | |
| } | |
| public static native void setErr (PrintStream newErr); | |
| public static native void setIn (InputStream newIn); | |
| public static native void setOut (PrintStream newOut); | |
| public static void setProperties (Properties props) | |
| { | |
| if (secman != null) | |
| secman.checkPropertiesAccess(); | |
| synchronized (System.class) | |
| { | |
| properties = props; | |
| } | |
| } | |
| public static String setProperty (String key, String value) | |
| { | |
| if (secman != null) | |
| secman.checkPermission (new PropertyPermission (key, "write")); | |
| if (properties == null) | |
| init_properties (); | |
| return (String) properties.setProperty (key, value); | |
| } | |
| // TODO 1.2. | |
| // public static String mapLibraryName (String libname); | |
| public static void setSecurityManager (SecurityManager s) | |
| { | |
| if (secman != null) | |
| secman.checkPermission(new RuntimePermission("setSecurityManager")); | |
| secman = s; | |
| } | |
| // Public data. | |
| public static final InputStream in = new BufferedInputStream (new FileInputStream (FileDescriptor.in)); | |
| public static final PrintStream out = new PrintStream (new BufferedOutputStream (new FileOutputStream (FileDescriptor.out)), true); | |
| public static final PrintStream err = new PrintStream (new BufferedOutputStream (new FileOutputStream (FileDescriptor.err)), true); | |
| // Don't allow System objects to be made. | |
| private System () | |
| { | |
| } | |
| // Private data. | |
| private static SecurityManager secman = null; | |
| private static Properties properties = null; | |
| } |