mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-02 17:35:18 +00:00
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2005 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
300 lines
9.4 KiB
Java
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());
|
|
}
|
|
} |