From: <ga...@us...> - 2008-01-31 15:28:15
|
Revision: 3740 http://jnode.svn.sourceforge.net/jnode/?rev=3740&view=rev Author: galatnm Date: 2008-01-31 07:28:12 -0800 (Thu, 31 Jan 2008) Log Message: ----------- Initial release. Added Paths: ----------- trunk/fs/src/fs/org/jnode/fs/hfsplus/ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusEntry.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusFile.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusForkData.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusObject.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUnicodeString.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUtils.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusConstants.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystem.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java trunk/fs/src/fs/org/jnode/fs/hfsplus/JournalInfoBlock.java trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFile.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFolder.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentIndexNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentKey.java trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentLeafNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeDescriptor.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/RecordData.java Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,43 @@ +package org.jnode.fs.hfsplus; + +import java.io.IOException; + +import org.jnode.fs.FSEntry; +import org.jnode.fs.hfsplus.tree.LeafNode; +import org.jnode.fs.spi.AbstractFSDirectory; +import org.jnode.fs.spi.FSEntryTable; + +public class HFSPlusDirectory extends AbstractFSDirectory { + + private LeafNode record; + + public HFSPlusDirectory(HfsPlusFileSystem fs, LeafNode record){ + super(fs); + this.record = record; + } + + @Override + protected FSEntry createDirectoryEntry(String name) throws IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + protected FSEntry createFileEntry(String name) throws IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + protected FSEntryTable readEntries() throws IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + protected void writeEntries(FSEntryTable entries) throws IOException { + // TODO Auto-generated method stub + + } + +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusEntry.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusEntry.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusEntry.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,27 @@ +package org.jnode.fs.hfsplus; + +import org.jnode.fs.FSDirectory; +import org.jnode.fs.hfsplus.tree.LeafRecord; +import org.jnode.fs.spi.AbstractFSEntry; +import org.jnode.fs.spi.FSEntryTable; + +public class HFSPlusEntry extends AbstractFSEntry { + + public HFSPlusEntry(HfsPlusFileSystem fs, FSEntryTable table, + FSDirectory parent, String name, LeafRecord record) { + super(fs, table, parent, name, getFSEntryType(name, record)); + } + + static private int getFSEntryType(String name, LeafRecord record) { + int mode = record.getType(); + if("/".equals(name)) + return AbstractFSEntry.ROOT_ENTRY; + else if(mode == HfsPlusConstants.RECORD_TYPE_FOLDER) + return AbstractFSEntry.DIR_ENTRY; + else if(mode == HfsPlusConstants.RECORD_TYPE_FILE) + return AbstractFSEntry.FILE_ENTRY; + else + return AbstractFSEntry.OTHER_ENTRY; + } + +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusFile.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusFile.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusFile.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,47 @@ +package org.jnode.fs.hfsplus; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import org.jnode.fs.hfsplus.tree.LeafRecord; +import org.jnode.fs.spi.AbstractFSFile; + +public class HFSPlusFile extends AbstractFSFile { + + private LeafRecord record; + + public HFSPlusFile(HfsPlusFileSystem fs, LeafRecord record){ + super(fs); + this.record = record; + } + + @Override + public void flush() throws IOException { + // TODO Auto-generated method stub + + } + + @Override + public long getLength() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public void read(long fileOffset, ByteBuffer dest) throws IOException { + // TODO Auto-generated method stub + + } + + @Override + public void write(long fileOffset, ByteBuffer src) throws IOException { + // TODO Auto-generated method stub + + } + + public void setLength(long length) throws IOException { + // TODO Auto-generated method stub + + } + +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusForkData.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusForkData.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusForkData.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,51 @@ +package org.jnode.fs.hfsplus; + +import org.apache.log4j.Logger; +import org.jnode.fs.hfsplus.extent.ExtentDescriptor; +import org.jnode.util.BigEndian; + +public class HFSPlusForkData { + public final static int FORK_DATA_LENGTH = 80; + private static final int EXTENT_OFFSET = 16; + + private final Logger log = Logger.getLogger(getClass()); + + private byte data[]; + + public HFSPlusForkData(byte[] src, int offset){ + data = new byte[FORK_DATA_LENGTH]; + System.arraycopy(src, offset, data, 0, FORK_DATA_LENGTH); + } + + public long getTotalSize(){ + return BigEndian.getInt64(data, 0); + } + + public int getClumpSize(){ + return BigEndian.getInt32(data, 8); + } + + public int getTotalBlocks(){ + return BigEndian.getInt32(data, 12); + } + + public ExtentDescriptor[] getExtents(){ + ExtentDescriptor[] list = new ExtentDescriptor[8]; + for (int i = 0; i < 8; i++) { + list[i] = new ExtentDescriptor(data, EXTENT_OFFSET+(i*ExtentDescriptor.EXTENT_DESCRIPTOR_LENGTH)); + } + return list; + } + + public String toString(){ + StringBuffer s = new StringBuffer(); + s.append("Total size : " ).append(getTotalSize()).append("\n"); + s.append("Clump size : " ).append(getClumpSize()).append("\n"); + s.append("Total Blocks : " ).append(getTotalBlocks()).append("\n"); + ExtentDescriptor[] list = getExtents(); + for (int i = 0; i < list.length; i++) { + s.append("Extent[" + i + "]: " + list[i].toString()); + } + return s.toString(); + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusForkData.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusObject.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusObject.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusObject.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,22 @@ +package org.jnode.fs.hfsplus; + +import org.jnode.fs.FSObject; +import org.jnode.fs.FileSystem; +import org.jnode.fs.nfs.nfs2.NFS2FileSystem; + +public class HFSPlusObject implements FSObject { + + private HfsPlusFileSystem fs; + + public HFSPlusObject(HfsPlusFileSystem fileSystem) { + this.fs = fileSystem; + } + + public FileSystem getFileSystem() { + return fs; + } + + public boolean isValid() { + return false; + } +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUnicodeString.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUnicodeString.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUnicodeString.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,26 @@ +package org.jnode.fs.hfsplus; + +import org.jnode.util.BigEndian; + + +public class HFSUnicodeString { + private byte[] data; + + public HFSUnicodeString(byte[] src, int offset){ + data = new byte[src.length]; + System.arraycopy(src, offset, data, 0, src.length); + } + + public int getLength(){ + return BigEndian.getInt16(data, 0); + } + + public String getUnicodeString(){ + char[] result = new char[(getLength())/2]; + for(int i = 1; i < result.length; ++i){ + result[i] = BigEndian.getChar(data, i*2); + } + return new String(result); + } + +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUnicodeString.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUtils.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUtils.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUtils.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,31 @@ +package org.jnode.fs.hfsplus; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +public class HFSUtils { + public static final long DIFF_TO_JAVA_DATE_IN_MILLIS = 2082844800000L; + /** + * + * @param time time in second since midnight, January 1, 1904, GMT. + * @return + */ + public static Calendar decodeDate(int time){ + Calendar ref = Calendar.getInstance(); + ref.setTime(new Date((time*1000)-DIFF_TO_JAVA_DATE_IN_MILLIS)); + return ref; + } + /** + * + * @param time + * @param dateFormat + * @return + */ + public static String printDate(int time, String dateFormat){ + Calendar ref = decodeDate(time); + SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); + return sdf.format(ref.getTime()); + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSUtils.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusConstants.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusConstants.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusConstants.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,34 @@ +package org.jnode.fs.hfsplus; + +public class HfsPlusConstants { + + public static final int HFSPLUS_SUPER_MAGIC = 0x482b; + + public static final int HFSPLUS_MIN_VERSION = 4; /* HFS+ */ + public static final int HFSPLUS_CURRENT_VERSION = 5; /* HFSX */ + /* HFS+ volume attributes */ + public static final int HFSPLUS_VOL_UNMNT_BIT = 8; + public static final int HFSPLUS_VOL_SPARE_BLK_BIT = 9; + public static final int HFSPLUS_VOL_NOCACHE_BIT = 10; + public static final int HFSPLUS_VOL_INCNSTNT_BIT = 11; + public static final int HFSPLUS_VOL_NODEID_REUSED_BIT = 12; + public static final int HFSPLUS_VOL_JOURNALED_BIT = 13; + public static final int HFSPLUS_VOL_SOFTLOCK_BIT = 15; + /* */ + public static final int BT_LEAF_NODE = -1; + public static final int BT_INDEX_NODE = 0; + public static final int BT_HEADER_NODE = 1; + public static final int BT_MAP_NODE = 2; + /* Types */ + public static final int RECORD_TYPE_FOLDER = 0x0001; + public static final int RECORD_TYPE_FILE = 0x0002; + public static final int RECORD_TYPE_FOLDER_THREAD = 0x0003; + public static final int RECORD_TYPE_FILE_THREAD = 0x0004; + + public static final int kJIJournalInFSMask = 0x00000001; + public static final int kJIJournalOnOtherDeviceMask = 0x00000002; + public static final int kJIJournalNeedInitMask = 0x00000004; + + public static final byte EK_DATA_FORK = (byte)0x00; + public static final byte EK_RESOURCE_FORK = (byte)0xFF; +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusConstants.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystem.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystem.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystem.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,69 @@ +package org.jnode.fs.hfsplus; + +import java.io.IOException; + +import org.apache.log4j.Logger; +import org.jnode.driver.Device; +import org.jnode.fs.FSDirectory; +import org.jnode.fs.FSEntry; +import org.jnode.fs.FSFile; +import org.jnode.fs.FileSystemException; +import org.jnode.fs.hfsplus.catalog.Catalog; +import org.jnode.fs.hfsplus.catalog.CatalogNodeId; +import org.jnode.fs.hfsplus.tree.LeafRecord; +import org.jnode.fs.spi.AbstractFileSystem; + + +public class HfsPlusFileSystem extends AbstractFileSystem<HFSPlusEntry> { + + private final Logger log = Logger.getLogger(getClass()); + + private Superblock sb; + + public HfsPlusFileSystem(Device device, boolean readOnly) throws FileSystemException { + super(device, readOnly); + } + + public void read() throws FileSystemException { + sb = new Superblock(this); + log.debug("Superblock informations :\n" + sb.toString()); + } + + @Override + protected FSDirectory createDirectory(FSEntry entry) throws IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + protected FSFile createFile(FSEntry entry) throws IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + protected HFSPlusEntry createRootEntry() throws IOException { + Catalog cf = new Catalog(sb, this); + int currentOffset = cf.init(); + LeafRecord record = cf.getRecord(CatalogNodeId.HFSPLUS_POR_CNID, currentOffset); + if(record != null) { + record.toString(); + return new HFSPlusEntry(this,null,null,"/",record); + } + log.debug("Root entry : No record found."); + return null; + } + + public long getFreeSpace() { + return sb.getFreeBlocks() * sb.getBlockSize(); + } + + public long getTotalSpace() { + return sb.getTotalBlocks() * sb.getBlockSize(); + } + + public long getUsableSpace() { + // TODO Auto-generated method stub + return 0; + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystem.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,46 @@ +package org.jnode.fs.hfsplus; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import org.jnode.driver.Device; +import org.jnode.driver.block.FSBlockDeviceAPI; +import org.jnode.fs.BlockDeviceFileSystemType; +import org.jnode.fs.FileSystemException; +import org.jnode.partitions.PartitionTableEntry; +import org.jnode.partitions.ibm.IBMPartitionTableEntry; +import org.jnode.partitions.ibm.IBMPartitionTypes; +import org.jnode.util.BigEndian; + +public class HfsPlusFileSystemType implements BlockDeviceFileSystemType<HfsPlusFileSystem> { + public static final Class<HfsPlusFileSystemType> ID = HfsPlusFileSystemType.class; + public HfsPlusFileSystem create(Device device, boolean readOnly) + throws FileSystemException { + HfsPlusFileSystem fs = new HfsPlusFileSystem(device, readOnly); + fs.read(); + return fs; + } + + public String getName() { + return "HFS+"; + } + + public boolean supports(PartitionTableEntry pte, byte[] firstSector, + FSBlockDeviceAPI devApi) { + if(pte!=null) { + if (pte instanceof IBMPartitionTableEntry) + if (((IBMPartitionTableEntry)pte).getSystemIndicator() != IBMPartitionTypes.PARTTYPE_LINUXNATIVE) + return false; + } + //need to check the magic + ByteBuffer magic = ByteBuffer.allocate(2); + try{ + devApi.read(1024, magic); + } catch(IOException e) { + return false; + } + int magicNumber = BigEndian.getInt16(magic.array(), 0); + return (magicNumber == HfsPlusConstants.HFSPLUS_SUPER_MAGIC); + } + +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFileSystemType.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/JournalInfoBlock.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/JournalInfoBlock.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/JournalInfoBlock.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,27 @@ +package org.jnode.fs.hfsplus; + +import org.jnode.util.BigEndian; + +public class JournalInfoBlock { + private byte[] data; + public JournalInfoBlock(byte[] src){ + data = new byte[180]; + System.arraycopy(src, 0, data, 0, 180); + } + + public int getFlag(){ + return BigEndian.getInt32(data, 0); + } + + public long getOffset(){ + return BigEndian.getInt64(data, 36); + } + + public long getSize(){ + return BigEndian.getInt64(data, 44); + } + + public String toString(){ + return "Journal : " + getOffset() + "::" + getSize(); + } +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,198 @@ +package org.jnode.fs.hfsplus; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.jnode.fs.FileSystemException; +import org.jnode.util.BigEndian; +import org.jnode.util.NumberUtils; +/** + * HFS+ volume header definition. + * + * @author Fabien L. + * + */ +public class Superblock extends HFSPlusObject { + /** */ + private final Logger log = Logger.getLogger(getClass()); + /** */ + public static final int SUPERBLOCK_LENGTH = 1024; + /** Data bytes array that contains superblock informations */ + private byte data[]; + + public Superblock(HfsPlusFileSystem fs) throws FileSystemException { + super(fs); + log.setLevel(Level.INFO); + try { + ByteBuffer b = ByteBuffer.allocate(SUPERBLOCK_LENGTH); + //skip the first 1024 bytes (bootsector) and read the superblock + fs.getApi().read(1024, b); + data = new byte[SUPERBLOCK_LENGTH]; + System.arraycopy(b.array(), 0, data, 0, SUPERBLOCK_LENGTH); + if(getMagic() != HfsPlusConstants.HFSPLUS_SUPER_MAGIC) + throw new FileSystemException("Not hfs+ superblock ("+getMagic()+": bad magic)"); + } catch (IOException e) { + throw new FileSystemException(e); + } + } + + public int getMagic() { + return BigEndian.getInt16(data, 0); + } + + public int getVersion() { + return BigEndian.getInt16(data, 2); + } + + public int getAttributes(){ + return BigEndian.getInt32(data, 4); + } + /** + * Get string representation of attribute. + * + * @return + */ + public String getAttributesAsString(){ + String s = ""; + s = s + ((isAttribute(HfsPlusConstants.HFSPLUS_VOL_UNMNT_BIT))?" kHFSVolumeUnmountedBit":""); + s = s + ((isAttribute(HfsPlusConstants.HFSPLUS_VOL_INCNSTNT_BIT))?" kHFSBootVolumeInconsistentBit":""); + s = s + ((isAttribute(HfsPlusConstants.HFSPLUS_VOL_JOURNALED_BIT))?" kHFSVolumeJournaledBit":""); + return s; + } + /** + * Check if a specific attribute is set. + * + * @param maskBit See constants. + * + * @return true if attribute is set. + */ + public boolean isAttribute(int maskBit){ + return (((getAttributes() >> maskBit) & 0x1) != 0); + } + + public int getLastMountedVersion(){ + return BigEndian.getInt32(data, 8); + } + + public int getJournalInfoBlock(){ + return BigEndian.getInt32(data, 12); + } + + public int getCreateDate(){ + return BigEndian.getInt32(data, 16); + } + + public int getModifyDate(){ + return BigEndian.getInt32(data, 20); + } + + public int getBackupDate(){ + return BigEndian.getInt32(data, 24); + } + + public int getCheckedDate(){ + return BigEndian.getInt32(data, 28); + } + // + public int getFileCount(){ + return BigEndian.getInt32(data, 32); + } + public int getFolderCount(){ + return BigEndian.getInt32(data, 36); + } + // + public int getBlockSize(){ + return BigEndian.getInt32(data, 40); + } + public int getTotalBlocks(){ + return BigEndian.getInt32(data, 44); + } + public int getFreeBlocks(){ + return BigEndian.getInt32(data, 48); + } + // + public int getNextAllocation(){ + return BigEndian.getInt32(data, 52); + } + public long getRsrcClumpSize(){ + return BigEndian.getInt32(data, 56); + } + public int getDataClumpSize(){ + return BigEndian.getInt32(data, 60); + } + + public int getNextCatalogId(){ + return BigEndian.getInt32(data, 64); + } + + public int getWriteCount(){ + return BigEndian.getInt32(data, 68); + } + + public long getEncodingsBmp(){ + return BigEndian.getInt64(data, 72); + } + + public byte[] getFinderInfo(){ + byte[] result=new byte[32]; + System.arraycopy(data, 80, result, 0, 32); + return result; + } + + public HFSPlusForkData getAllocationFile(){ + return new HFSPlusForkData(data,112); + } + + public HFSPlusForkData getExtentsFile(){ + return new HFSPlusForkData(data,192); + } + + public HFSPlusForkData getCatalogFile(){ + return new HFSPlusForkData(data,272); + } + + public HFSPlusForkData getAttributesFile(){ + return new HFSPlusForkData(data,352); + } + + public HFSPlusForkData getStartupFile(){ + return new HFSPlusForkData(data,432); + } + + + public String toString(){ + StringBuffer buffer = new StringBuffer(); + buffer.append("Magic :").append(NumberUtils.hex(getMagic(),4)).append("\n"); + buffer.append("Version :").append(getVersion()).append("\n").append("\n"); + buffer.append("Attributes :").append(getAttributesAsString()).append("\n").append("\n"); + + buffer.append("Create date :").append(HFSUtils.printDate(getCreateDate(),"EEE MMM d HH:mm:ss yyyy")).append("\n"); + buffer.append("Modify date :").append(HFSUtils.printDate(getModifyDate(),"EEE MMM d HH:mm:ss yyyy")).append("\n"); + buffer.append("Backup date :").append(HFSUtils.printDate(getBackupDate(),"EEE MMM d HH:mm:ss yyyy")).append("\n"); + buffer.append("Checked date :").append(HFSUtils.printDate(getCheckedDate(),"EEE MMM d HH:mm:ss yyyy")).append("\n").append("\n"); + + buffer.append("File count :").append(getFileCount()).append("\n"); + buffer.append("Folder count :").append(getFolderCount()).append("\n").append("\n"); + buffer.append("Block size :").append(getBlockSize()).append("\n"); + buffer.append("Total blocks :").append(getTotalBlocks()).append("\n"); + buffer.append("Free blocks :").append(getFreeBlocks()).append("\n").append("\n"); + buffer.append("Next catalog ID :").append(getNextCatalogId()).append("\n"); + buffer.append("Write count :").append(getWriteCount()).append("\n"); + buffer.append("Encoding bmp :").append(getEncodingsBmp()).append("\n"); + buffer.append("Finder Infos :").append(getFinderInfo()).append("\n").append("\n"); + buffer.append("Finder Infos :").append(getJournalInfoBlock()).append("\n").append("\n"); + buffer.append("Allocation file").append("\n"); + buffer.append(getAllocationFile().toString()).append("\n"); + buffer.append("Extents file").append("\n"); + buffer.append(getExtentsFile().toString()).append("\n"); + buffer.append("Catalog file").append("\n"); + buffer.append(getCatalogFile().toString()).append("\n"); + buffer.append("Attributes file").append("\n"); + buffer.append(getAttributesFile().toString()).append("\n"); + buffer.append("Startup file").append("\n"); + buffer.append(getStartupFile().toString()).append("\n"); + return buffer.toString(); + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,86 @@ +package org.jnode.fs.hfsplus.catalog; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import org.apache.log4j.Logger; +import org.jnode.fs.hfsplus.HfsPlusConstants; +import org.jnode.fs.hfsplus.HfsPlusFileSystem; +import org.jnode.fs.hfsplus.Superblock; +import org.jnode.fs.hfsplus.extent.ExtentDescriptor; +import org.jnode.fs.hfsplus.tree.BTHeaderRecord; +import org.jnode.fs.hfsplus.tree.IndexRecord; +import org.jnode.fs.hfsplus.tree.LeafRecord; +import org.jnode.fs.hfsplus.tree.NodeDescriptor; +import org.jnode.fs.spi.AbstractFileSystem; + +public class Catalog { + private final Logger log = Logger.getLogger(getClass()); + /** */ + private AbstractFileSystem<?> fs; + /** */ + private Superblock header; + /** */ + private NodeDescriptor btnd; + /** */ + private BTHeaderRecord bthr; + + public Catalog(Superblock header, HfsPlusFileSystem fs){ + this.header = header; + this.fs = fs; + } + + public int init() throws IOException { + int offset = 0; + ExtentDescriptor current = header.getCatalogFile().getExtents()[0]; + if(current.getStartBlock() != 0 && current.getBlockCount() != 0){ + ByteBuffer buffer = ByteBuffer.allocate(14); + offset = current.getStartBlock()*header.getBlockSize(); + fs.getApi().read(offset, buffer); + btnd = new NodeDescriptor(buffer.array()); + log.debug("BTNodeDescriptor informations :\n" + btnd.toString()); + offset = offset + 14; + buffer = ByteBuffer.allocate(106); + fs.getApi().read(offset, buffer); + bthr = new BTHeaderRecord(buffer.array()); + log.debug("BTHeaderRec informations :\n" + bthr.toString()); + offset = offset + 106; + offset = current.getStartBlock()*header.getBlockSize(); + } + return offset; + } + + public NodeDescriptor getBTNodeDescriptor() { + return btnd; + } + + public BTHeaderRecord getBTHeaderRecord() { + return bthr; + } + + public LeafRecord getRecord(CatalogNodeId parentID, int currentOffset) throws IOException{ + int currentNodeNumber = getBTHeaderRecord().getRootNode(); + int currentNodeSize = getBTHeaderRecord().getNodeSize(); + ByteBuffer buffer = ByteBuffer.allocate(currentNodeSize); + fs.getApi().read(currentOffset + (currentNodeNumber*currentNodeSize), buffer); + NodeDescriptor currentBtnd = new NodeDescriptor(buffer.array()); + log.debug("Current node descriptor :\n" + currentBtnd.toString()); + while(currentBtnd.getKind() == HfsPlusConstants.BT_INDEX_NODE) { + CatalogIndexNode currentIndexNode = new CatalogIndexNode(currentBtnd, buffer.array(), currentNodeSize); + IndexRecord record = currentIndexNode.find(parentID); + currentNodeNumber = record.getIndex(); + currentOffset = currentNodeNumber*currentNodeSize; + buffer = ByteBuffer.allocate(currentNodeSize); + fs.getApi().read(currentOffset, buffer); + currentBtnd = new NodeDescriptor(buffer.array()); + } + if(currentBtnd.getKind() == HfsPlusConstants.BT_LEAF_NODE) { + CatalogLeafNode leaf = new CatalogLeafNode(currentBtnd, buffer.array(), currentNodeSize); + LeafRecord lr = leaf.find(parentID); + log.debug("Leaf record :\n" + lr.toString()); + return lr; + } + return null; + } + +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFile.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFile.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFile.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,10 @@ +package org.jnode.fs.hfsplus.catalog; + +public class CatalogFile { + private byte[] data; + + public CatalogFile(byte[] src){ + data = new byte[248]; + System.arraycopy(src, 0, data, 0, 248); + } +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFolder.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFolder.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFolder.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,10 @@ +package org.jnode.fs.hfsplus.catalog; + +public class CatalogFolder { + private byte[] data; + + public CatalogFolder(byte[] src){ + data = new byte[88]; + System.arraycopy(src, 0, data, 0, 88); + } +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,32 @@ +package org.jnode.fs.hfsplus.catalog; + +import org.jnode.fs.hfsplus.tree.IndexNode; +import org.jnode.fs.hfsplus.tree.IndexRecord; +import org.jnode.fs.hfsplus.tree.Key; +import org.jnode.fs.hfsplus.tree.NodeDescriptor; + +public class CatalogIndexNode extends IndexNode { + public CatalogIndexNode(NodeDescriptor descriptor, byte[] nodeData, int nodeSize){ + super(descriptor, nodeData, nodeSize); + for(int i = 0; i < records.length; ++i) { + int currentOffset = offsets[i]; + Key currentKey = new CatalogKey(nodeData, currentOffset); + records[i] = new IndexRecord(currentKey, nodeData, currentOffset); + } + } + /** + * + * @param parentId + * @return + */ + public IndexRecord find(CatalogNodeId parentId){ + for(IndexRecord rec : records) { + Key key = rec.getKey(); + if(key instanceof CatalogKey) { + if(((CatalogKey)key).getParentId().getId() == parentId.getId()) + return rec; + } + } + return null; + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,49 @@ +package org.jnode.fs.hfsplus.catalog; + +import org.jnode.fs.hfsplus.HFSUnicodeString; +import org.jnode.fs.hfsplus.tree.AbstractKey; +import org.jnode.util.BigEndian; + +public class CatalogKey extends AbstractKey { + private int keyLength; + private CatalogNodeId parentID; + private String nodeName; + + public CatalogKey(byte[] src, int offset){ + byte[] ck = new byte[2]; + System.arraycopy(src, offset, ck, 0, 2); + keyLength = BigEndian.getInt16(ck, 0); + ck = new byte[4]; + System.arraycopy(src, offset+2, ck, 0, 4); + parentID = new CatalogNodeId(ck,0); + if(keyLength > 6){ + ck = new byte[keyLength-6]; + System.arraycopy(src, offset+6, ck, 0, keyLength - 6); + nodeName = new HFSUnicodeString(ck,0).getUnicodeString(); + } + } + + public int getKeyLength(){ + return keyLength; + } + + public int getLength(){ + return keyLength; + } + + public CatalogNodeId getParentId(){ + return parentID; + } + + public String getNodeName(){ + return nodeName; + } + + public String toString(){ + StringBuffer s = new StringBuffer(); + s.append("Key length:").append(getKeyLength()).append("\t"); + s.append("Parent ID :").append(getParentId().getId()).append("\t"); + s.append("Node name :").append(getNodeName()).append("\n"); + return s.toString(); + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,33 @@ +package org.jnode.fs.hfsplus.catalog; + +import org.apache.log4j.Logger; +import org.jnode.fs.hfsplus.tree.Key; +import org.jnode.fs.hfsplus.tree.LeafNode; +import org.jnode.fs.hfsplus.tree.LeafRecord; +import org.jnode.fs.hfsplus.tree.NodeDescriptor; + +public class CatalogLeafNode extends LeafNode { + + private final Logger log = Logger.getLogger(getClass()); + + public CatalogLeafNode(NodeDescriptor descriptor, byte[] nodeData, int nodeSize){ + super(descriptor, nodeData, nodeSize); + for(int i = 0; i < records.length; ++i) { + int currentOffset = offsets[i]; + Key key = new CatalogKey(nodeData, currentOffset); + records[i] = new LeafRecord(key ,nodeData, currentOffset); + log.debug("Record["+ i +"]:" + records[i].toString()); + } + } + + public LeafRecord find(CatalogNodeId parentId){ + for(LeafRecord rec : records) { + Key key = rec.getKey(); + if(key instanceof CatalogKey) { + if(((CatalogKey)key).getParentId().getId() == parentId.getId()) + return rec; + } + } + return null; + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,32 @@ +package org.jnode.fs.hfsplus.catalog; + +import org.jnode.util.BigEndian; + +public class CatalogNodeId { + byte[] cnid; + public CatalogNodeId(byte[] src, int offset){ + cnid = new byte[4]; + System.arraycopy(src, offset, cnid, 0, 4); + } + + public CatalogNodeId(int nodeId){ + cnid = new byte[4]; + BigEndian.setInt32(cnid, 0, nodeId); + } + + public static final CatalogNodeId HFSPLUS_POR_CNID = new CatalogNodeId(1); /* Parent Of the Root */ + public static final CatalogNodeId HFSPLUS_ROOT_CNID = new CatalogNodeId(2); /* ROOT directory */ + public static final CatalogNodeId HFSPLUS_EXT_CNID = new CatalogNodeId(3); /* EXTents B-tree */ + public static final CatalogNodeId HFSPLUS_CAT_CNID = new CatalogNodeId(4); /* CATalog B-tree */ + public static final CatalogNodeId HFSPLUS_BAD_CNID = new CatalogNodeId(5); /* BAD blocks file */ + public static final CatalogNodeId HFSPLUS_ALLOC_CNID = new CatalogNodeId(6); /* ALLOCation file */ + public static final CatalogNodeId HFSPLUS_START_CNID = new CatalogNodeId(7); /* STARTup file */ + public static final CatalogNodeId HFSPLUS_ATTR_CNID = new CatalogNodeId(8); /* ATTRibutes file */ + public static final CatalogNodeId HFSPLUS_EXCH_CNID = new CatalogNodeId(15); /* ExchangeFiles temp id */ + public static final CatalogNodeId HFSPLUS_FIRSTUSER_CNID = new CatalogNodeId(16); /* first available user id */ + + public int getId(){ + return BigEndian.getInt32(cnid, 0); + } + +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,27 @@ +package org.jnode.fs.hfsplus.extent; + +import org.jnode.util.BigEndian; + +public class ExtentDescriptor { + + public final static int EXTENT_DESCRIPTOR_LENGTH = 8; + + private byte data[]; + + public ExtentDescriptor(byte[] src, int offset){ + data = new byte[EXTENT_DESCRIPTOR_LENGTH]; + System.arraycopy(src, offset, data, 0, EXTENT_DESCRIPTOR_LENGTH); + } + + public int getStartBlock(){ + return BigEndian.getInt32(data, 0); + } + + public int getBlockCount(){ + return BigEndian.getInt32(data, 4); + } + + public String toString(){ + return "Start block : " + getStartBlock() + "\tBlock count : " + getBlockCount() + "\n"; + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentIndexNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentIndexNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentIndexNode.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,17 @@ +package org.jnode.fs.hfsplus.extent; + +import org.jnode.fs.hfsplus.tree.IndexNode; +import org.jnode.fs.hfsplus.tree.IndexRecord; +import org.jnode.fs.hfsplus.tree.Key; +import org.jnode.fs.hfsplus.tree.NodeDescriptor; + +public class ExtentIndexNode extends IndexNode { + public ExtentIndexNode(NodeDescriptor descriptor, byte[] nodeData, int nodeSize){ + super(descriptor, nodeData, nodeSize); + for(int i = 0; i < records.length; ++i) { + int currentOffset = offsets[i]; + Key currentKey = new ExtentKey(nodeData, currentOffset); + records[i] = new IndexRecord(currentKey, nodeData, currentOffset); + } + } +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentKey.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentKey.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentKey.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,42 @@ +package org.jnode.fs.hfsplus.extent; + +import org.jnode.fs.hfsplus.catalog.CatalogNodeId; +import org.jnode.fs.hfsplus.tree.AbstractKey; +import org.jnode.util.BigEndian; + +public class ExtentKey extends AbstractKey { + public final static int EXTENT_KEY_LENGTH = 12; + byte[] ek; + + public ExtentKey(byte[] src, int offset){ + ek = new byte[EXTENT_KEY_LENGTH]; + System.arraycopy(src, offset, ek, 0, EXTENT_KEY_LENGTH); + } + + @Override + public int getKeyLength() { + return BigEndian.getInt16(ek, 0); + } + + public int getForkType(){ + return BigEndian.getInt8(ek, 2); + } + + public int getPad(){ + return BigEndian.getInt8(ek, 3); + } + + public CatalogNodeId getCatalogNodeId(){ + return new CatalogNodeId(ek,4); + } + + public int getStartBlock(){ + return BigEndian.getInt32(ek, 8); + } + + @Override + public int getLength() { + return EXTENT_KEY_LENGTH; + } + +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentLeafNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentLeafNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentLeafNode.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,17 @@ +package org.jnode.fs.hfsplus.extent; + +import org.jnode.fs.hfsplus.tree.Key; +import org.jnode.fs.hfsplus.tree.LeafNode; +import org.jnode.fs.hfsplus.tree.LeafRecord; +import org.jnode.fs.hfsplus.tree.NodeDescriptor; + +public class ExtentLeafNode extends LeafNode { + public ExtentLeafNode(NodeDescriptor descriptor, byte[] nodeData, int nodeSize){ + super(descriptor, nodeData, nodeSize); + for(int i = 0; i < records.length; ++i) { + int currentOffset = offsets[i]; + Key currentKey = new ExtentKey(nodeData, currentOffset); + records[i] = new LeafRecord(currentKey, nodeData, currentOffset); + } + } +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,6 @@ +package org.jnode.fs.hfsplus.tree; + +public abstract class AbstractKey implements Key{ + public abstract int getKeyLength(); + public abstract int getLength(); +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,43 @@ +package org.jnode.fs.hfsplus.tree; + +import org.jnode.util.BigEndian; + +public class BTHeaderRecord { + public final static int BT_HEADER_RECORD_LENGTH = 106; + byte[] data; + + public BTHeaderRecord(byte[] src){ + data = new byte[BT_HEADER_RECORD_LENGTH]; + System.arraycopy(src, 0, data, 0, BT_HEADER_RECORD_LENGTH); + } + + public int getTreeDepth(){ + return BigEndian.getInt16(data, 0); + } + + public int getRootNode(){ + return BigEndian.getInt32(data, 2); + } + + public int getLeafRecords(){ + return BigEndian.getInt32(data, 6); + } + public int getFirstLeafNode(){ + return BigEndian.getInt32(data, 10); + } + public int getLastLeafNode(){ + return BigEndian.getInt32(data, 14); + } + public int getNodeSize(){ + return BigEndian.getInt16(data, 18); + } + + public String toString(){ + StringBuffer s = new StringBuffer(); + s.append("Root node :" + getRootNode() + "\n"); + s.append("First leaf :" + getFirstLeafNode() + "\n"); + s.append("Last leaf :" + getLastLeafNode() + "\n"); + s.append("node size :" + getNodeSize() + "\n"); + return s.toString(); + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,34 @@ +package org.jnode.fs.hfsplus.tree; + +import org.jnode.util.BigEndian; + + +public class IndexNode { + protected NodeDescriptor descriptor; + protected int[] offsets; + protected IndexRecord[] records; + /** + * + * @param descriptor + * @param nodeData + * @param nodeSize + */ + public IndexNode(NodeDescriptor descriptor, byte[] nodeData, int nodeSize){ + this.descriptor = descriptor; + offsets = new int[descriptor.getNumRecords()+1]; + for(int i = 0; i < offsets.length; ++i) { + offsets[i] = BigEndian.getInt16(nodeData, nodeSize-((i+1)*2)); + } + records = new IndexRecord[offsets.length-1]; + } + + public NodeDescriptor getDescriptor() { + return descriptor; + } + public int[] getOffsets() { + return offsets; + } + public IndexRecord[] getRecords() { + return records; + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,27 @@ +package org.jnode.fs.hfsplus.tree; + +import org.jnode.util.BigEndian; + +public class IndexRecord { + private Key key; + private final byte[] index; + /** + * + * @param key + * @param nodeData + * @param offset + */ + public IndexRecord(Key key,byte[] nodeData, int offset){ + this.key = key; + index = new byte[4]; + System.arraycopy(nodeData, offset+key.getLength(), index, 0, 4); + } + + public Key getKey(){ + return key; + } + + public int getIndex(){ + return BigEndian.getInt32(index, 0); + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,6 @@ +package org.jnode.fs.hfsplus.tree; + +public interface Key { + public int getKeyLength(); + public int getLength(); +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,33 @@ +package org.jnode.fs.hfsplus.tree; + +import org.jnode.util.BigEndian; + +public class LeafNode { + protected NodeDescriptor descriptor; + protected int[] offsets; + protected LeafRecord[] records; + /** + * + * @param descriptor + * @param nodeData + * @param nodeSize + */ + public LeafNode(NodeDescriptor descriptor, byte[] nodeData, int nodeSize){ + this.descriptor = descriptor; + offsets = new int[descriptor.getNumRecords()+1]; + for(int i = 0; i < offsets.length; ++i) { + offsets[i] = BigEndian.getInt16(nodeData, nodeSize-((i+1)*2)); + } + records = new LeafRecord[offsets.length-1]; + } + + public NodeDescriptor getDescriptor() { + return descriptor; + } + public int[] getOffsets() { + return offsets; + } + public LeafRecord[] getRecords() { + return records; + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,26 @@ +package org.jnode.fs.hfsplus.tree; + +import org.jnode.util.BigEndian; + +public class LeafRecord { + private Key key; + private final byte[] data; + + public LeafRecord(Key key, byte[] nodeData, int offset){ + this.key = key; + data = new byte[2]; + System.arraycopy(nodeData, offset+key.getKeyLength(), data, 0, 2); + } + + public Key getKey(){ + return key; + } + + public int getType(){ + return BigEndian.getInt16(data, 0); + } + + public String toString(){ + return "Type : " + getType() + "\nKey : " + getKey().toString() + "\n"; + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,5 @@ +package org.jnode.fs.hfsplus.tree; + +public class Node { + +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeDescriptor.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeDescriptor.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeDescriptor.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,43 @@ +package org.jnode.fs.hfsplus.tree; + +import org.jnode.util.BigEndian; + +public class NodeDescriptor { + public final static int BT_NODE_DESCRIPTOR_LENGTH = 14; + byte[] data; + + public NodeDescriptor(byte[] src){ + data = new byte[BT_NODE_DESCRIPTOR_LENGTH]; + System.arraycopy(src, 0, data, 0, BT_NODE_DESCRIPTOR_LENGTH); + } + + public int getFLink(){ + return BigEndian.getInt32(data, 0); + } + + public int getBLink(){ + return BigEndian.getInt32(data, 4); + } + + public int getKind(){ + return BigEndian.getInt8(data, 8); + } + + public int getHeight(){ + return BigEndian.getInt8(data, 9); + } + + public int getNumRecords(){ + return BigEndian.getInt16(data, 10); + } + + public String toString(){ + StringBuffer s = new StringBuffer(); + s.append("FLink :" + getFLink()+ "\n"); + s.append("BLink :" + getBLink() + "\n"); + s.append("Kind :" + getKind() + "\n"); + s.append("height:" + getHeight() + "\n"); + s.append("#rec :" + getNumRecords() + "\n"); + return s.toString(); + } +} Property changes on: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeDescriptor.java ___________________________________________________________________ Name: svn:executable + * Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/RecordData.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/RecordData.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/RecordData.java 2008-01-31 15:28:12 UTC (rev 3740) @@ -0,0 +1,7 @@ +package org.jnode.fs.hfsplus.tree; + +public class RecordData { + public void Record(byte[] node, int recordOffset, int recordSize){ + + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |