/* * Copyright (C) 2005 Alfresco, Inc. * * Licensed under the Mozilla Public License version 1.1 * with a permitted attribution clause. You may obtain a * copy of the License at * * http://www.alfresco.org/legal/license.txt * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific * language governing permissions and limitations under the * License. */ package org.alfresco.filesys.server.filesys; import java.io.Serializable; import java.util.Date; import org.alfresco.filesys.smb.SMBDate; /** * File information class. *
* The FileInfo class is returned by the DiskInterface.getFileInformation () and * SearchContext.nextFileInfo() methods. * * @see DiskInterface * @see SearchContext */ public class FileInfo implements Serializable { private static final long serialVersionUID = 5710753560656277110L; // Constants // // Set file information flags public static final int SetFileSize = 0x0001; public static final int SetAllocationSize = 0x0002; public static final int SetAttributes = 0x0004; public static final int SetModifyDate = 0x0008; public static final int SetCreationDate = 0x0010; public static final int SetAccessDate = 0x0020; public static final int SetChangeDate = 0x0040; public static final int SetGid = 0x0080; public static final int SetUid = 0x0100; public static final int SetMode = 0x0200; public static final int SetDeleteOnClose = 0x0400; // File name string protected String m_name; // 8.3 format file name protected String m_shortName; // Path string protected String m_path; // File size, in bytes protected long m_size; // File attributes bits protected int m_attr = -1; // File modification date/time private long m_modifyDate; // Creation date/time private long m_createDate; // Last access date/time (if available) private long m_accessDate; // Change date/time (for Un*x inode changes) private long m_changeDate; // Filesystem allocation size private long m_allocSize; // File identifier and parent directory id private int m_fileId = -1; private int m_dirId = -1; // User/group id private int m_gid = -1; private int m_uid = -1; // Unix mode private int m_mode = -1; // Delete file on close private boolean m_deleteOnClose; // File type private int m_fileType; // Set file information flags // // Used to indicate which values in the file information object are valid and should be used to set // the file information. private int m_setFlags; /** * Default constructor */ public FileInfo() { } /** * Construct an SMB file information object. * * @param fname File name string. * @param fsize File size, in bytes. * @param fattr File attributes. */ public FileInfo(String fname, long fsize, int fattr) { m_name = fname; m_size = fsize; m_attr = fattr; setAllocationSize(0); } /** * Construct an SMB file information object. * * @param fname File name string. * @param fsize File size, in bytes. * @param fattr File attributes. * @param ftime File time, in seconds since 1-Jan-1970 00:00:00 */ public FileInfo(String fname, long fsize, int fattr, int ftime) { m_name = fname; m_size = fsize; m_attr = fattr; m_modifyDate = new SMBDate(ftime).getTime(); setAllocationSize(0); } /** * Construct an SMB file information object. * * @param fname File name string. * @param fsize File size, in bytes. * @param fattr File attributes. * @param fdate SMB encoded file date. * @param ftime SMB encoded file time. */ public FileInfo(String fname, long fsize, int fattr, int fdate, int ftime) { m_name = fname; m_size = fsize; m_attr = fattr; if (fdate != 0 && ftime != 0) m_modifyDate = new SMBDate(fdate, ftime).getTime(); setAllocationSize(0); } /** * Construct an SMB file information object. * * @param fpath File path string. * @param fname File name string. * @param fsize File size, in bytes. * @param fattr File attributes. */ public FileInfo(String fpath, String fname, long fsize, int fattr) { m_path = fpath; m_name = fname; m_size = fsize; m_attr = fattr; setAllocationSize(0); } /** * Construct an SMB file information object. * * @param fpath File path string. * @param fname File name string. * @param fsize File size, in bytes. * @param fattr File attributes. * @param ftime File time, in seconds since 1-Jan-1970 00:00:00 */ public FileInfo(String fpath, String fname, long fsize, int fattr, int ftime) { m_path = fpath; m_name = fname; m_size = fsize; m_attr = fattr; m_modifyDate = new SMBDate(ftime).getTime(); setAllocationSize(0); } /** * Construct an SMB file information object. * * @param fpath File path string. * @param fname File name string. * @param fsize File size, in bytes. * @param fattr File attributes. * @param fdate SMB encoded file date. * @param ftime SMB encoded file time. */ public FileInfo(String fpath, String fname, long fsize, int fattr, int fdate, int ftime) { m_path = fpath; m_name = fname; m_size = fsize; m_attr = fattr; m_modifyDate = new SMBDate(fdate, ftime).getTime(); setAllocationSize(0); } /** * Return the files last access date/time. * * @return long */ public long getAccessDateTime() { return m_accessDate; } /** * Get the files allocated size. * * @return long */ public long getAllocationSize() { return m_allocSize; } /** * Get the files allocated size, as a 32bit value * * @return int */ public int getAllocationSizeInt() { return (int) (m_allocSize & 0x0FFFFFFFFL); } /** * Return the inode change date/time of the file. * * @return long */ public long getChangeDateTime() { return m_changeDate; } /** * Return the creation date/time of the file. * * @return long */ public long getCreationDateTime() { return m_createDate; } /** * Return the delete on close flag setting * * @return boolean */ public final boolean hasDeleteOnClose() { return m_deleteOnClose; } /** * Return the file attributes value. * * @return File attributes value. */ public int getFileAttributes() { return m_attr; } /** * Get the file name string * * @return File name string. */ public final String getFileName() { return m_name; } /** * Check if the short (8.3) file name is available * * @return boolean */ public final boolean hasShortName() { return m_shortName != null ? true : false; } /** * Get the short file name (8.3 format) * * @return String */ public final String getShortName() { return m_shortName; } /** * Get the files date/time of last write * * @return long */ public final long getModifyDateTime() { return m_modifyDate; } /** * Get the file path string. * * @return File path string, relative to the share. */ public final String getPath() { return m_path; } /** * Get the file size, in bytes. * * @return File size in bytes. */ public final long getSize() { return m_size; } /** * Get the file size in bytes, as a 32bit value * * @return File size in bytes, as an int */ public final int getSizeInt() { return (int) (m_size & 0x0FFFFFFFFL); } /** * Get the file identifier * * @return int */ public final int getFileId() { return m_fileId; } /** * Get the file identifier * * @return long */ public final long getFileIdLong() { return ((long) m_fileId) & 0xFFFFFFFFL; } /** * Get the parent directory identifier * * @return int */ public final int getDirectoryId() { return m_dirId; } /** * Get the parent directory identifier * * @return long */ public final long getDirectoryIdLong() { return ((long) m_dirId) & 0xFFFFFFFFL; } /** * Determine if the last access date/time is available. * * @return boolean */ public boolean hasAccessDateTime() { return m_accessDate == 0L ? false : true; } /** * Determine if the inode change date/time details are available. * * @return boolean */ public boolean hasChangeDateTime() { return m_changeDate == 0L ? false : true; } /** * Determine if the creation date/time details are available. * * @return boolean */ public boolean hasCreationDateTime() { return m_createDate == 0L ? false : true; } /** * Determine if the modify date/time details are available. * * @return boolean */ public boolean hasModifyDateTime() { return m_modifyDate == 0L ? false : true; } /** * Determine if the file attributes field has been set * * @return boolean */ public final boolean hasFileAttributes() { return m_attr != -1 ? true : false; } /** * Return the specified attribute status * * @param attr int */ public final boolean hasAttribute(int attr) { return (m_attr & attr) != 0 ? true : false; } /** * Return the directory file attribute status. * * @return true if the file is a directory, else false. */ public final boolean isDirectory() { return (m_attr & FileAttribute.Directory) != 0 ? true : false; } /** * Return the hidden file attribute status. * * @return true if the file is hidden, else false. */ public final boolean isHidden() { return (m_attr & FileAttribute.Hidden) != 0 ? true : false; } /** * Return the read-only file attribute status. * * @return true if the file is read-only, else false. */ public final boolean isReadOnly() { return (m_attr & FileAttribute.ReadOnly) != 0 ? true : false; } /** * Return the system file attribute status. * * @return true if the file is a system file, else false. */ public final boolean isSystem() { return (m_attr & FileAttribute.System) != 0 ? true : false; } /** * Return the archived attribute status * * @return boolean */ public final boolean isArchived() { return (m_attr & FileAttribute.Archive) != 0 ? true : false; } /** * Return the file type * * @return int */ public final int isFileType() { return m_fileType; } /** * Determine if the group id field has been set * * @return boolean */ public final boolean hasGid() { return m_gid != -1 ? true : false; } /** * Return the owner group id * * @return int */ public final int getGid() { return m_gid; } /** * Determine if the user id field has been set * * @return boolean */ public final boolean hasUid() { return m_uid != -1 ? true : false; } /** * Return the owner user id * * @return int */ public final int getUid() { return m_uid; } /** * Determine if the mode field has been set * * @return boolean */ public final boolean hasMode() { return m_mode != -1 ? true : false; } /** * Return the Unix mode * * @return int */ public final int getMode() { return m_mode; } /** * Reset all values to zero/null values. */ public final void resetInfo() { m_name = ""; m_path = null; m_size = 0L; m_allocSize = 0L; m_attr = 0; m_accessDate = 0L; m_createDate = 0L; m_modifyDate = 0L; m_changeDate = 0L; m_fileId = -1; m_dirId = -1; m_gid = -1; m_uid = -1; m_mode = -1; } /** * Copy the file information * * @param finfo FileInfo */ public final void copyFrom(FileInfo finfo) { m_name = finfo.getFileName(); m_path = finfo.getPath(); m_size = finfo.getSize(); m_allocSize = finfo.getAllocationSize(); m_attr = finfo.getFileAttributes(); m_accessDate = finfo.getAccessDateTime(); m_createDate = finfo.getCreationDateTime(); m_modifyDate = finfo.getModifyDateTime(); m_changeDate = finfo.getChangeDateTime(); m_fileId = finfo.getFileId(); m_dirId = finfo.getDirectoryId(); m_gid = finfo.getGid(); m_uid = finfo.getUid(); m_mode = finfo.getMode(); } /** * Set the files last access date/time. * * @param timesec long */ public void setAccessDateTime(long timesec) { // Create the access date/time m_accessDate = timesec; } /** * Set the files allocation size. * * @param siz long */ public void setAllocationSize(long siz) { m_allocSize = siz; } /** * Set the inode change date/time for the file. * * @param timesec long */ public void setChangeDateTime(long timesec) { // Set the inode change date/time m_changeDate = timesec; } /** * Set the creation date/time for the file. * * @param timesec long */ public void setCreationDateTime(long timesec) { // Set the creation date/time m_createDate = timesec; } /** * Set/clear the delete on close flag * * @param del boolean */ public final void setDeleteOnClose(boolean del) { m_deleteOnClose = del; } /** * Set the file attributes. * * @param attr int */ public final void setFileAttributes(int attr) { m_attr = attr; } /** * Set the file name. * * @param name java.lang.String */ public final void setFileName(String name) { m_name = name; } /** * Set the file size in bytes * * @param siz long */ public final void setFileSize(long siz) { m_size = siz; } /** * Set the modification date/time for the file. * * @param timesec long */ public void setModifyDateTime(long timesec) { // Set the date/time m_modifyDate = timesec; } /** * Set the file identifier * * @param id int */ public final void setFileId(int id) { m_fileId = id; } /** * Set the parent directory id * * @param id int */ public final void setDirectoryId(int id) { m_dirId = id; } /** * Set the short (8.3 format) file name * * @param name String */ public final void setShortName(String name) { m_shortName = name; } /** * Set the path * * @param path String */ public final void setPath(String path) { m_path = path; } /** * Set the file size. * * @param siz int */ public final void setSize(int siz) { m_size = siz; } /** * Set the file size. * * @param siz long */ public final void setSize(long siz) { m_size = siz; } /** * Set the owner group id * * @param id int */ public final void setGid(int id) { m_gid = id; } /** * Set the owner user id * * @param id int */ public final void setUid(int id) { m_uid = id; } /** * Set the file mode * * @param mode int */ public final void setMode(int mode) { m_mode = mode; } /** * Set the file type * * @param typ int */ public final void setFileType(int typ) { m_fileType = typ; } /** * Set the set file information flags to indicated which values are to be set * * @param setFlags int */ public final void setFileInformationFlags(int setFlags) { m_setFlags = setFlags; } /** * Determine if the specified set file information flags is enabled * * @param setFlag int * @return boolean */ public final boolean hasSetFlag(int flag) { if ((m_setFlags & flag) != 0) return true; return false; } /** * Return the set file information flags * * @return int */ public final int getSetFileInformationFlags() { return m_setFlags; } /** * Return the file information as a string. * * @return File information string. */ public String toString() { StringBuffer str = new StringBuffer(); // Append the path, and terminate with a trailing '\' if (m_path != null) { str.append(m_path); if (!m_path.endsWith("\\")) str.append("\\"); } // Append the file name str.append(m_name); // Space fill while (str.length() < 15) str.append(" "); // Append the attribute states if (isReadOnly()) str.append("R"); else str.append("-"); if (isHidden()) str.append("H"); else str.append("-"); if (isSystem()) str.append("S"); else str.append("-"); if (isDirectory()) str.append("D"); else str.append("-"); // Append the file size, in bytes str.append(" "); str.append(m_size); // Space fill while (str.length() < 30) str.append(" "); // Append the file write date/time, if available if (m_modifyDate != 0L) { str.append(" - "); str.append(new Date(m_modifyDate)); } // Append the short (8.3) file name, if available if (hasShortName()) { str.append(" ("); str.append(getShortName()); str.append(")"); } // Return the file information string return str.toString(); } }