/******************************************************************************* * Copyright (c) 2000, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.update.configuration; import java.io.File; import java.util.ArrayList; import org.eclipse.update.internal.core.UpdateCore; import org.eclipse.update.internal.core.Volume; /** * Utility class providing local file system information. * The class attempts to load a native library implementation * of its methods. If successful, the method calls are delegated * to the native implementation. Otherwise a default non-native * implementation is used. * * <p> * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> * @see ILocalSystemInfoListener * @since 2.0 * @deprecated The org.eclipse.update component has been replaced by Equinox p2. * This API will be deleted in a future release. See bug 311590 for details. */ public class LocalSystemInfo { /** * Indicates the amount of available free space is not known * * @see LocalSystemInfo#getFreeSpace(File) * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final long SIZE_UNKNOWN = -1; /** * Indicates the volume type is not known * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_UNKNOWN = -1; /** * Indicates the volume could not be determined from path * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_INVALID_PATH = -2; /** * Indicates the volume is removable (other than floppy disk) * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_REMOVABLE = 1; /** * Indicates the volume is fixed (hard drive) * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_FIXED = 2; /** * Indicates a remote (network) volume * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_REMOTE = 3; /** * Indicates a cdrom volume (compact disc) * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_CDROM = 4; /** * Indicates a ramdisk volume (memory) * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_RAMDISK = 5; /** * Indicates the volume is removable (floppy disk 5 1/4) * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_FLOPPY_5 = 6; /** * Indicates the volume is removable (floppy disk 3 1/2) * * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_FLOPPY_3 = 7; /** * Indicates a new volume has been added * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_ADDED = 0; /** * Indicates a volume has been removed * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_REMOVED = 1; /** * Indicates a volume has been changed * @since 2.0 * <p> * <b>Note:</b> This field is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static final int VOLUME_CHANGED = 2; private static ArrayList listeners = new ArrayList(); private static boolean hasNatives = false; static { try { System.loadLibrary("update"); //$NON-NLS-1$ hasNatives = true; } catch (UnsatisfiedLinkError e) { UpdateCore.warn("Unable to load native library 'update'."); //$NON-NLS-1$ hasNatives = false; } } /** * Determines available free space on a volume. * Returns the amount of free space available to this * user on the volume containing the specified path. The * method takes into account any space quotas or other * native mechanisms that may restrict space usage * on a given volume. * @param path file path. May contain path elements beyond * the volume "root" * @return the amount of free space available (in units * of Kbyte), or an indication the size is not known * @see LocalSystemInfo#SIZE_UNKNOWN * @since 2.0 * <p> * <b>Note:</b> This method is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static long getFreeSpace(File path) { if (hasNatives) { try { long bytes = nativeGetFreeSpace(path); return (bytes!=0)?bytes/1024:0; } catch (UnsatisfiedLinkError e) { } } return SIZE_UNKNOWN; } /** * Lists the file system volume. * @return array of volume representing mount * points, or <code>null</code> if none found * @since 2.0 * <p> * <b>Note:</b> This method is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static IVolume[] getVolumes() { String[] mountPoints = listMountPoints(); Volume[] vol = new Volume[0]; if (mountPoints!=null){ vol = new Volume[mountPoints.length]; for (int i = 0; i < mountPoints.length; i++) { File root = new File(mountPoints[i]); String label = getLabel(root); int type = getType(root); long size = getFreeSpace(root); vol[i] = new Volume(root,label,type,size); vol[i].markReadOnly(); } } else { UpdateCore.warn("Unable to find mount points"); //$NON-NLS-1$ // fallback File [] roots = File.listRoots(); if (roots.length == 1) { // just one root - skip it File root = roots[0]; roots = root.listFiles(); } vol = new Volume[roots.length]; for (int i = 0; i < roots.length; i++) { vol[i] = new Volume(roots[i],null,LocalSystemInfo.VOLUME_UNKNOWN,LocalSystemInfo.SIZE_UNKNOWN); vol[i].markReadOnly(); } } return vol; } /** * Add local system change listener. * Allows a listener to be added for monitoring changes * in the local system information. The listener is notified * each time there are relevant volume changes * detected. This specifically includes changes to the * list of volumes as a result of removable drive/ media * operations (eg. CD insertion, removal), and changes to volume * mount structure. * @param listener change listener * @since 2.0 * <p> * <b>Note:</b> This method is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static void addInfoListener(ILocalSystemInfoListener listener) { if (!listeners.contains(listener)) listeners.add(listener); } /** * Remove local system change listener * @param listener change listener * @since 2.0 * <p> * <b>Note:</b> This method is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static void removeInfoListener(ILocalSystemInfoListener listener) { listeners.remove(listener); } /** * Notify listeners of change. * * @param volume the volume representing the * change file system structure. Any current paths beyond * the specified "root" file of the volume are assumed to be invalidated. * @param changeType type of the change that occured. * @see LocalSystemInfo#VOLUME_ADDED * @see LocalSystemInfo#VOLUME_REMOVED * @see LocalSystemInfo#VOLUME_CHANGED * <p> * <b>Note:</b> This method is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> */ public static void fireSystemInfoChanged(IVolume volume, int changeType) { for (int i=0; i< listeners.size(); i++) { ((ILocalSystemInfoListener)listeners.get(i)).systemInfoChanged(volume,changeType); } } /* * Determines volume label. * Returns the label of the volume containing the specified * path. * @param path file path. May contain path elements beyond * the volume "root" * @return volume label (as string), or <code>null</code> if * the label cannot be determined. * @since 2.0 */ private static String getLabel(File path) { if (hasNatives) { try { return nativeGetLabel(path); } catch (UnsatisfiedLinkError e) { } } return null; } /* * Determines volume type. * Returns the type of the volume containing the specified * path. * @param path file path. May contain path elements beyond * the volume "root" * @return volume type * @see LocalSystemInfo#VOLUME_UNKNOWN * @see LocalSystemInfo#VOLUME_INVALID_PATH * @see LocalSystemInfo#VOLUME_REMOVABLE * @see LocalSystemInfo#VOLUME_FIXED * @see LocalSystemInfo#VOLUME_REMOTE * @see LocalSystemInfo#VOLUME_CDROM * @see LocalSystemInfo#VOLUME_FLOPPY_3 * @see LocalSystemInfo#VOLUME_FLOPPY_5 * @since 2.0 */ private static int getType(File path) { if (hasNatives) { try { return nativeGetType(path); } catch (UnsatisfiedLinkError e) { } } return VOLUME_UNKNOWN; } /* * Lists the file system mount points. * @return array of absolute file paths representing mount * points, or <code>null</code> if none found * @since 2.0 */ private static String[] listMountPoints() { if (hasNatives) { try { String[] mountPoints = nativeListMountPoints(); return mountPoints; } catch (UnsatisfiedLinkError e) { } } return null; } /* * Native implementations. */ private static native long nativeGetFreeSpace(File path); private static native String nativeGetLabel(File path); private static native int nativeGetType(File path); private static native String[] nativeListMountPoints(); }