2005-12-08 07:13:07 +00:00

300 lines
9.4 KiB
Java

/*
* 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.smb.server;
import org.alfresco.filesys.server.filesys.DiskInfo;
import org.alfresco.filesys.server.filesys.SrvDiskInfo;
import org.alfresco.filesys.server.filesys.VolumeInfo;
import org.alfresco.filesys.smb.NTTime;
import org.alfresco.filesys.util.DataBuffer;
import org.alfresco.filesys.util.DataPacker;
/**
* Disk information packer class.
*/
class DiskInfoPacker
{
// Disk information levels
public static final int InfoStandard = 1;
public static final int InfoVolume = 2;
public static final int InfoFsVolume = 0x102;
public static final int InfoFsSize = 0x103;
public static final int InfoFsDevice = 0x104;
public static final int InfoFsAttribute = 0x105;
public static final int InfoCifsUnix = 0x200;
public static final int InfoMacFsInfo = 0x301;
public static final int InfoFullFsSize = 0x3EF;
// Mac support flags
public static final int MacAccessControl = 0x0010;
public static final int MacGetSetComments = 0x0020;
public static final int MacDesktopDbCalls = 0x0040;
public static final int MacUniqueIds = 0x0080;
public static final int MacNoStreamsOrMacSupport = 0x0100;
/**
* Class constructor.
*/
public DiskInfoPacker()
{
super();
}
/**
* Pack the standard disk information, InfoStandard.
*
* @param info SMBDiskInfo to be packed.
* @param buf Buffer to pack the data into.
*/
public final static void packStandardInfo(DiskInfo info, DataBuffer buf)
{
// Information format :-
// ULONG File system identifier, always 0 ?
// ULONG Sectors per allocation unit.
// ULONG Total allocation units.
// ULONG Total available allocation units.
// USHORT Number of bytes per sector.
// Pack the file system identifier, 0 = NT file system
buf.putZeros(4);
// buf.putInt(999);
// Pack the disk unit information
buf.putInt(info.getBlocksPerAllocationUnit());
buf.putInt((int) info.getTotalUnits());
buf.putInt((int) info.getFreeUnits());
buf.putShort(info.getBlockSize());
}
/**
* Pack the volume label information, InfoVolume.
*
* @param info Volume information
* @param buf Buffer to pack data into.
* @param uni Use Unicode strings if true, else use ASCII strings
*/
public final static void packVolumeInfo(VolumeInfo info, DataBuffer buf, boolean uni)
{
// Information format :-
// ULONG Volume serial number
// UCHAR Volume label length
// STRING Volume label
// Pack the volume serial number
buf.putInt(info.getSerialNumber());
// Pack the volume label length and string
buf.putByte(info.getVolumeLabel().length());
buf.putString(info.getVolumeLabel(), uni);
}
/**
* Pack the filesystem size information, InfoFsSize
*
* @param info Disk size information
* @param buf Buffer to pack data into.
*/
public final static void packFsSizeInformation(SrvDiskInfo info, DataBuffer buf)
{
// Information format :-
// ULONG Disk size (in units)
// ULONG Free size (in units)
// UINT Unit size in blocks
// UINT Block size in bytes
buf.putLong(info.getTotalUnits());
buf.putLong(info.getFreeUnits());
buf.putInt(info.getBlocksPerAllocationUnit());
buf.putInt(info.getBlockSize());
}
/**
* Pack the filesystem volume information, InfoFsVolume
*
* @param info Volume information
* @param buf Buffer to pack data into.
* @param uni Use Unicode strings if true, else use ASCII strings
*/
public final static void packFsVolumeInformation(VolumeInfo info, DataBuffer buf, boolean uni)
{
// Information format :-
// ULONG Volume creation date/time (NT 64bit time fomat)
// UINT Volume serial number
// UINT Volume label length
// SHORT Reserved
// STRING Volume label (no null)
if (info.hasCreationDateTime())
buf.putLong(NTTime.toNTTime(info.getCreationDateTime()));
else
buf.putZeros(8);
if (info.hasSerialNumber())
buf.putInt(info.getSerialNumber());
else
buf.putZeros(4);
int len = info.getVolumeLabel().length();
if (uni)
len *= 2;
buf.putInt(len);
buf.putZeros(2); // reserved
buf.putString(info.getVolumeLabel(), uni, false);
}
/**
* Pack the filesystem device information, InfoFsDevice
*
* @param typ Device type
* @param devChar Device characteristics
* @param buf Buffer to pack data into.
*/
public final static void packFsDevice(int typ, int devChar, DataBuffer buf)
{
// Information format :-
// UINT Device type
// UINT Characteristics
buf.putInt(typ);
buf.putInt(devChar);
}
/**
* Pack the filesystem attribute information, InfoFsAttribute
*
* @param attr Attribute flags
* @param maxName Maximum file name component length
* @param fsType File system type name
* @param uni Unicode strings required
* @param buf Buffer to pack data into.
*/
public final static void packFsAttribute(int attr, int maxName, String fsType, boolean uni, DataBuffer buf)
{
// Information format :-
// UINT Attribute flags
// UINT Maximum filename component length (usually 255)
// UINT Filesystem type length
// STRING Filesystem type string
buf.putInt(attr);
buf.putInt(maxName);
if (uni)
buf.putInt(fsType.length() * 2);
else
buf.putInt(fsType.length());
buf.putString(fsType, uni, false);
}
/**
* Pack the Mac filesystem information, InfoMacFsInfo
*
* @param diskInfo SMBDiskInfo to be packed.
* @param volInfo Volume information to be packed
* @param ntfs Filesystem supports NTFS streams
* @param buf Buffer to pack the data into.
*/
public final static void packMacFsInformation(DiskInfo diskInfo, VolumeInfo volInfo, boolean ntfs, DataBuffer buf)
{
// Information format :-
// LARGE_INTEGER Volume creation time (NT format)
// LARGE_INTEGER Volume modify time (NT format)
// LARGE_INTEGER Volume backup time (NT format)
// ULONG Allocation blocks
// ULONG Allocation block size (multiple of 512)
// ULONG Free blocks on the volume
// UCHAR[32] Finder info
// LONG Number of files in root directory (zero if unknown)
// LONG Number of directories in the root directory (zero if unknown)
// LONG Number of files on the volume (zero if unknown)
// LONG Number of directories on the volume (zero if unknown)
// LONG Mac support flags (big endian)
// Pack the volume creation time
if (volInfo.hasCreationDateTime())
{
long ntTime = NTTime.toNTTime(volInfo.getCreationDateTime());
buf.putLong(ntTime);
buf.putLong(ntTime);
buf.putLong(ntTime);
}
else
buf.putZeros(24);
// Pack the number of allocation blocks, block size and free block count
buf.putInt((int) diskInfo.getTotalUnits());
buf.putInt(diskInfo.getBlockSize() * diskInfo.getBlocksPerAllocationUnit());
buf.putInt((int) diskInfo.getFreeUnits());
// Pack the finder information area
buf.putZeros(32);
// Pack the file/directory counts
buf.putInt(0);
buf.putInt(0);
buf.putInt(0);
buf.putInt(0);
// Pack the Mac support flags
DataPacker.putIntelInt(ntfs ? 0 : MacNoStreamsOrMacSupport, buf.getBuffer(), buf.getPosition());
buf.setPosition(buf.getPosition() + 4);
}
/**
* Pack the filesystem size information, InfoFsSize
*
* @param userLimit User free units
* @param info Disk size information
* @param buf Buffer to pack data into.
*/
public final static void packFullFsSizeInformation(long userLimit, SrvDiskInfo info, DataBuffer buf)
{
// Information format :-
// ULONG Disk size (in units)
// ULONG User free size (in units)
// ULONG Free size (in units)
// UINT Unit size in blocks
// UINT Block size in bytes
buf.putLong(info.getTotalUnits());
buf.putLong(userLimit);
buf.putLong(info.getFreeUnits());
buf.putInt(info.getBlocksPerAllocationUnit());
buf.putInt(info.getBlockSize());
}
}