|
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.
|