FileDocCategorySizeDatePackage
BaseFileHandler.javaAPI DocphoneME MR2 API (J2ME)18498Wed May 02 18:00:28 BST 2007com.sun.midp.io.j2me.file

BaseFileHandler.java

/*
 *   
 *
 * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program 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 version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */

package com.sun.midp.io.j2me.file;

import java.io.IOException;
import java.util.Vector;

/**
 * Base file handler.
 */
interface BaseFileHandler {

    /**
     * Connect file handler to the abstract file target. This operation should
     * not trigger any access to the native filesystem.
     *
     * @param rootName The name of the root directory.
     *
     * @param absFile Full path to the file to be handled by this handler.
     *
     * @throws IllegalArgumentException if filename contains characters
     *         not allowed by the file system. This check should not involve
     *         any actual access to the filesystem.
     */
    public void connect(String rootName, String absFile);

    /**
     * Creates dedicated private working directory for the MIDlet suite.
     * Does nothing if specified root is not private root or the directory
     * already exists.
     *
     * @param rootName the name of file root
     */
    public void createPrivateDir(String rootName) throws IOException;

    /**
     * Open the file for reading, on the underlying file system. File name is
     * passed in the link#connect() method.
     *
     * @throws IOException if file is directory, file does not exists,
     *                     if file is already open for read or other
     *                     I/O error occurs
     */
    public void openForRead() throws IOException;

    /**
     * Closes for reading the file that was open by openForRead method.
     * If the file is already closed for reading this method does nothing.
     *
     * @throws IOException if file is directory, file does not exists or other
     *                     I/O error occurs
     */
    public void closeForRead() throws IOException;

    /**
     * Open the file for writing, on the underlying file system. File name is
     * passed in the link#connect() method.
     *
     * @throws IOException if file is directory, file does not exists,
     * i                   if file is already open for write or other
     *                     I/O error occurs
     */
    public void openForWrite() throws IOException;

    /**
     * Closes for writing the file that was open by openForWrite method.
     * If the file is already closed for writing this method does nothing.
     *
     * @throws IOException if file is directory, file does not exists or other
     *                     I/O error occurs
     */
    public void closeForWrite() throws IOException;

    /**
     * Closes the file for both reading and writing.
     * If the file is already closed for reading and writing this method does 
     * nothing.
     *
     * @throws IOException if file is directory, file does not exists or other
     *                     I/O error occurs
     */    
    public void closeForReadWrite() throws IOException;

    /**
     * Gets a filtered list of files and directories contained in a directory.
     * The directory is the handler's target as specified in
     * <code>create()</code>.
     *
     * @param   filter String against which all files and directories are
     *          matched for retrieval.  An asterisk ("*") can be used as a
     *          wildcard to represent 0 or more occurrences of any character.
     *          If null no filtering is performed
     * @param   includeHidden boolean indicating whether files marked as hidden
     *          should be included or not in the list of files and directories
     *          returned.
     * @return  An Enumeration of strings, denoting the files and directories
     *          in the directory matching the filter. Directories are denoted
     *          with a trailing slash "/" in their returned name.  The
     *          Enumeration has zero length if the directory is empty or no
     *		files and/or directories are found matching the given filter.
     *		Any current directory indication (".") and any parent directory
     *		indication ("..") is not included in the list of files and
     *		directories returned.
     * @throws  IOException if invoked on a file, the directory does not exist,
     *		the directory is not accessible, or an I/O error occurs.
     * @throws  IllegalArgumentException if filter contains any path
     *		specification or is an invalid filename for the platform
     *		(e.g. contains characters invalid for a filename on the
     *           platform).
     */
    public Vector list(String filter, boolean includeHidden)
                                                        throws IOException;

    /**
     * List filesystem roots available on the device. For the description of
     * the correct root format see <code>FileConnection</code> documentation.
     * @return array of roots
     */
    public Vector listRoots();

    /**
     * Create file corresponding to this file handler. The
     * file is created immediately on the actual file system upon invocation of
     * this method.  Files are created with zero length and data can be put
     * into the file through write method after opening the file.This method
     * does not create any directories specified in the file's path.
     *
     * @throws IOException if invoked on the existing file or unexpected error
     *                     occurs.
     */
    public void create() throws IOException;

    /**
     * Check is file or directory corresponding to this filehandler exists.
     *
     * @return true if file exists, otherwise false
     */
    public boolean exists();

    /**
     * Check is file corresponding to this filehandler exists and is a
     * directory.
     *
     * @return true if directory exists, otherwise false
     */
    public boolean isDirectory();

    /**
     * Deletes the file or directory associated with this handler.
     * The file or directory is deleted immediately on
     * the actual file system upon invocation of this method. Previously open
     * native file should be closed.The
     * handler instance object remains connected and available for use.
     *
     * @throws  IOException If the target is a directory and it is not empty,
     *      the connection target does not exist or is unaccessible, or
     *      an unspecified error occurs preventing deletion of the target.
     */
    public void delete() throws IOException;

    /**
     * Renames the selected file or directory to a new name in the same
     * directory.  The file or directory is renamed immediately on the actual
     * file system upon invocation of this method. No file or directory by the
     * original name exists after this method call. Previously open native file
     * should be closed. The handler
     * instance object remains connected and available for use,
     * referring now to the file or directory by its new name.
     *
     * @param   newName The new name of the file or directory.  The name must
     *          be the full qualified name of the new file
     * @throws  IOException if the connection's target does not exist, the
     *          connection's target is not accessible, a file or directory
     *          already exists by the <code>newName</code>, or
     *          <code>newName</code> is an invalid filename for the platform
     *          (e.g. contains characters invalid in a filename on
     *          the platform).
     */
    public void rename(String newName) throws IOException;

    /**
     * Truncates the file, discarding all data from the given byte offset to
     * the current end of the file.  If the byte offset provided is greater
     * than or equal to the file's current byte count, the method returns
     * without changing the file.
     *
     * @param   byteOffset the offset into the file from which truncation
     *          occurs.
     * @throws  IOException if invoked on a directory or the file does not
     *          exist or is not accessible.
     */
    public void truncate(long byteOffset) throws IOException;

    /**
     * Determines the size of a file on the file system. The size of a file
     * always represents the number of bytes contained in the file; there is
     * no pre-allocated but empty space in a file. Users should perform an
     * explicit <code>flush()</code> on any open output streams to the file
     * prior to invoking this method to ensure accurate results.
     *
     * @return  The size in bytes of the selected file, or -1 if the
     *          file does not exist or is not accessible.
     * @throws  IOException if the method is invoked on a directory.
     */
    public long fileSize() throws IOException;

    /**
     * Determines the size in bytes on a file system of all of the files
     * that are contained in a directory.
     *
     * @param   includeSubDirs if <code>true</code>, size calculation will
     *          include all subdirectories' size.
     * @return  The size in bytes occupied by the files included in the
     *          directory, or -1 if the directory does not exist or is
     *          not accessible.
     * @throws  IOException if some error occures while accessing the directory.
     */
    public long directorySize(boolean includeSubDirs) throws IOException;

    /**
     * Check if file corresponding to this filehandler exists and has a 
     * read permission.
     *
     * @return true if file has read permission, otherwise false
     */
    public boolean canRead();

    /**
     * Check is file corresponding to this filehandler exists and has a
     * write permission.
     *
     * @return true if file has write permission, otherwise false
     */
    public boolean canWrite();

    /**
     * Check is file corresponding to this filehandler exists and is
     * hidden.
     *
     * @return true if file is hidden, otherwise false
     */
    public boolean isHidden();

    /**
     * Sets the file or directory readable attribute to the
     * indicated value.  The readable attribute for the file on the actual
     * file system is set immediately upon invocation of this method. If the
     * file system doesn't support a settable read attribute, this method is
     * ignored and <code>canRead()</code> always returns true.
     *
     * @param   readable The new state of the readable flag of the
     *          selected file.
     * @throws	IOException if the connection's target does not exist or is not
     *		accessible.
     * @see     #canRead
     */
    public void setReadable(boolean readable) throws IOException;

    /**
     * Sets the file or directory associated with this file handler writable
     * attribute to the
     * indicated value.  The writable attribute for the file on the actual
     * file system is set immediately upon invocation of the method. If the
     * file system doesn't support a settable write attribute, this method is
     * ignored and <code>canWrite()</code> always returns true.
     *
     * @param   writable The new state of the writable flag of the selected
     *                   file.
     * @throws  IOException if the connection's target does not exist or is not
     *          accessible.
     * @see     #canWrite
     */
    public void setWritable(boolean writable) throws IOException;

    /**
     * Sets the hidden attribute of the file associated with this file handler
     * to the value provided.  The attribute is applied to the file on the
     * actual file system immediately upon invocation of this method if the
     * file system
     * and platform support it. If the file system doesn't support a hidden
     * attribute, this method is ignored and <code>isHidden()</code> always
     * returns false.  Since the exact definition of hidden is
     * system-dependent,
     * this method only works on file systems that support a settable file
     * attribute. For example, on Win32 and FAT file systems, a file may be
     * considered hidden if it has been marked as such in the file's
     * attributes; therefore this method is applicable.  However on UNIX
     * systems a file may be considered to be hidden if its name begins with a
     * period character ('.'). In the UNIX case, this method may be ignored and
     * the method to make a file hidden may be the <code>rename()</code>
     * method.
     *
     * @param   hidden The new state of the hidden flag of the selected file.
     * @throws  IOException if the connection's target does not exist or is not
     *          accessible.
     * @see     #isHidden
     */
    public void setHidden(boolean hidden) throws IOException;

    /**
     * Returns the time that the file denoted by this file handler
     * was last modified.
     *
     * @return time when the file was last modified.
     */
    public long lastModified();

    /**
     * Creates a directory corresponding to the directory
     * string provided in the connect() method.
     * The directory is created immediately on the actual
     * file system upon invocation of this method.  Directories in the
     * specified path are not recursively created and must be explicitly
     * created before subdirectories can be created.
     *
     * @throws  IOException if invoked on an existing directory or on any file
     *          (<code>create()</code> is used to create files), the target
     *		file system is not accessible, or an unspecified error occurs
     *		preventing creation of the directory.
     */
    public void mkdir() throws IOException;

    /**
     * Reads up to <code>len</code> bytes of data from the input stream into
     * an array of bytes, blocks until at least one byte is available.
     *
     * @param      b     the buffer into which the data is read.
     * @param      off   the start offset in array <code>b</code>
     *                   at which the data is written.
     * @param      len   the maximum number of bytes to read.
     * @return     the total number of bytes read into the buffer, or
     *             <code>-1</code> if there is no more data because the end of
     *             the stream has been reached.
     * @exception  IOException  if an I/O error occurs.
     */
    public int read(byte b[], int off, int len) throws IOException;

    /**
     * Writes <code>len</code> bytes from the specified byte array
     * starting at offset <code>off</code> to this output stream.
     * <p>
     * Polling the native code is done here to allow for simple
     * asynchronous native code to be written. Not all implementations
     * work this way (they block in the native code) but the same
     * Java code works for both.
     *
     * @param      b     the data.
     * @param      off   the start offset in the data.
     * @param      len   the number of bytes to write.
     * @return     number of bytes written
     * @exception  IOException  if an I/O error occurs. In particular,
     *             an <code>IOException</code> is thrown if the output
     *             stream is closed.
     */
    public int write(byte b[], int off, int len) throws IOException;

    /**
     * Forces any buffered output bytes to be written out.
     * The general contract of <code>flush</code> is
     * that calling it is an indication that, if any bytes previously
     * written that have been buffered by the connection,
     * should immediately be written to their intended destination.
     * <p>
     * The <code>flush</code> method of <code>ConnectionBaseAdapter</code>
     * does nothing.
     *
     * @exception  IOException  if an I/O error occurs.
     */
    public void flush() throws IOException;

    /**
     * Sets the location for the next write operation.
     * @param offset location for next write
     * @throws IOException if an error occurs
     */
    public void positionForWrite(long offset) throws IOException;

    /**
     * Determines the free memory that is available on the file system the file
     * or directory resides on. This may only be an estimate and may vary based
     * on platform-specific file system blocking and metadata information.
     *
     * @return  The available size in bytes on a file system, or -1 if an
     *          error occurs.
     */
    public long availableSize();

    /**
     * Determines the total size of the file system the connection's target
     * resides on.
     *
     * @return  The total size of the file system in bytes, or -1 if an
     *          error occurs.
     */
    public long totalSize();

    /**
     * Returns a string that contains all characters forbidden for the use on
     * the given platform except "/" (forward slash) which is always considered
     * illegal. If there are no such characters an empty string is returned.
     * @return string of characters not allowed in file names
     */
    public String illegalFileNameChars();

    /**
     * Determines the used memory of a file system the connection's target
     * resides on.  This may only be an estimate and may vary based
     * on platform-specific file system blocking and metadata information.
     *
     * @return  The used size of bytes on a file system, or -1 if an
     *          error occurs.
     */
    public long usedSize();

    /**
     * Close file associated with this handler. Open file and all system
     * resources should be released by this call. Handler object can be
     * reused by subsequent call to connect().
     *
     * @throws IOException if I/O error occurs
     */
    public void close() throws IOException;
}