Revision: 5904
          http://jnode.svn.sourceforge.net/jnode/?rev=5904&view=rev
Author:   galatnm
Date:     2012-08-09 14:08:21 +0000 (Thu, 09 Aug 2012)
Log Message:
-----------
Initial Apple partition map support (patch from L. Quinane)

Added Paths:
-----------
    trunk/fs/descriptors/org.jnode.partitions.apm.xml
    trunk/fs/src/fs/org/jnode/partitions/apm/
    trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTable.java
    trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTableEntry.java
    trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTableType.java

Added: trunk/fs/descriptors/org.jnode.partitions.apm.xml
===================================================================
--- trunk/fs/descriptors/org.jnode.partitions.apm.xml                           
(rev 0)
+++ trunk/fs/descriptors/org.jnode.partitions.apm.xml   2012-08-09 14:08:21 UTC 
(rev 5904)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plugin SYSTEM "jnode.dtd">
+
+<plugin id="org.jnode.partitions.apm"
+        name="JNode APM partition table classes"
+        version="0.2.9-dev"
+        license-name="lgpl"
+        provider-name="JNode.org">
+        
+  <requires>
+    <import plugin="org.jnode.partitions"/>
+  </requires>
+        
+  <runtime>
+    <library name="jnode-fs.jar">
+      <export name="org.jnode.partitions.apm.*"/>
+    </library>
+  </runtime>
+        
+  <extension point="org.jnode.partitions.types">
+    <type class="org.jnode.partitions.apm.ApmPartitionTableType"/>
+  </extension>
+        
+</plugin>

Added: trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTable.java
===================================================================
--- trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTable.java             
                (rev 0)
+++ trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTable.java     
2012-08-09 14:08:21 UTC (rev 5904)
@@ -0,0 +1,101 @@
+/*
+ * $Id: $
+ *
+ * Copyright (C) 2003-2012 JNode.org
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; If not, write to the Free Software Foundation, 
Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+package org.jnode.partitions.apm;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.jnode.driver.Device;
+import org.jnode.partitions.PartitionTable;
+import org.jnode.partitions.PartitionTableType;
+import org.jnode.util.LittleEndian;
+
+/**
+ * The main Apple Partition Map (APM) partition table class.
+ *
+ * @author Luke Quinane
+ */
+public class ApmPartitionTable implements 
PartitionTable<ApmPartitionTableEntry> {
+
+    /** The type of partition table */
+    private final ApmPartitionTableType tableType;
+
+    /** The partition entries */
+    private final List<ApmPartitionTableEntry> partitions = new 
ArrayList<ApmPartitionTableEntry>();
+
+    /** My logger */
+    private static final Logger log = 
Logger.getLogger(ApmPartitionTable.class);
+
+    /**
+     * Create a new instance
+     *
+     * @param tableType the partition table type.
+     * @param first16KiB the first 16,384 bytes of the disk.
+     * @param device the drive device.
+     */
+    public ApmPartitionTable(ApmPartitionTableType tableType, byte[] 
first16KiB, Device device) {
+        this.tableType = tableType;
+
+        long entries = LittleEndian.getUInt32(first16KiB, 0x204);
+
+        for (int partitionNumber = 0; partitionNumber < entries; 
partitionNumber++) {
+            log.debug("try part " + partitionNumber);
+
+            int offset = 0x200 + (partitionNumber * 0x200);
+
+            ApmPartitionTableEntry entry = new ApmPartitionTableEntry(this, 
first16KiB, offset);
+
+            if (entry.isValid())
+            {
+                partitions.add(entry);
+            }
+        }
+    }
+
+    /**
+     * Checks if the given boot sector contain a APM partition table.
+     *
+     * @param first16KiB the first 16,384 bytes of the disk.
+     * @return {@code true} if the boot sector contains a APM partition table.
+     */
+    public static boolean containsPartitionTable(byte[] first16KiB) {
+        if ((first16KiB[0x200] & 0xFF) != 0x50) {
+            return false;
+        }
+        if ((first16KiB[0x201] & 0xFF) != 0x4d) {
+            return false;
+        }
+        return true;
+    }
+
+    public Iterator<ApmPartitionTableEntry> iterator() {
+        return Collections.unmodifiableList(partitions).iterator();
+    }
+
+    /**
+     * @see org.jnode.partitions.PartitionTable#getType()
+     */
+    public PartitionTableType getType() {
+        return tableType;
+    }
+}

Added: trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTableEntry.java
===================================================================
--- trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTableEntry.java        
                        (rev 0)
+++ trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTableEntry.java        
2012-08-09 14:08:21 UTC (rev 5904)
@@ -0,0 +1,117 @@
+/*
+ * $Id: $
+ *
+ * Copyright (C) 2003-2012 JNode.org
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; If not, write to the Free Software Foundation, 
Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+package org.jnode.partitions.apm;
+
+import java.nio.charset.Charset;
+import org.jnode.partitions.PartitionTableEntry;
+import org.jnode.partitions.ibm.IBMPartitionTable;
+import org.jnode.util.BigEndian;
+import org.jnode.util.LittleEndian;
+import org.jnode.util.NumberUtils;
+
+/**
+ * A APM partition table entry.
+ *
+ * @author Luke Quinane
+ */
+public class ApmPartitionTableEntry implements PartitionTableEntry {
+
+    /** The first 16KiB of the drive. */
+    private final byte[] first16KiB;
+
+    /** The offset to this partition table entry. */
+    private final int offset;
+
+    /**
+     * Creates a new entry.
+     *
+     * @param parent the parent table.
+     * @param first16KiB the first 16,384 bytes of the disk.
+     * @param offset the offset of this entry in the table.
+     */
+    public ApmPartitionTableEntry(ApmPartitionTable parent, byte[] first16KiB, 
int offset) {
+        this.first16KiB = first16KiB;
+        this.offset = offset;
+    }
+
+    public boolean isValid() {
+        return first16KiB.length > offset + 128 && !isEmpty();
+    }
+
+    /**
+     * @see org.jnode.partitions.PartitionTableEntry#getChildPartitionTable()
+     */
+    public IBMPartitionTable getChildPartitionTable() {
+        throw new UnsupportedOperationException("No child partitions.");
+    }
+
+    /**
+     * @see org.jnode.partitions.PartitionTableEntry#hasChildPartitionTable()
+     */
+    public boolean hasChildPartitionTable() {
+        return false;
+    }
+
+    public boolean isEmpty() {
+        return "Apple_Scratch".equals(getType());
+    }
+
+    public long getStartOffset() {
+        return BigEndian.getInt32(first16KiB, offset + 0x8) * 0x200L;
+    }
+
+    public long getEndOffset() {
+        return getStartOffset() + (BigEndian.getInt32(first16KiB, offset + 
0xc) + 1) * 0x200L;
+    }
+
+    public String getName() {
+        byte[] nameBytes = new byte[31];
+        System.arraycopy(first16KiB, offset + 0x10, nameBytes, 0, 
nameBytes.length);
+        return new String(nameBytes, 
Charset.forName("ASCII")).replace("\u0000", "");
+    }
+
+    public String getType() {
+        byte[] nameBytes = new byte[31];
+        System.arraycopy(first16KiB, offset + 0x30, nameBytes, 0, 
nameBytes.length);
+        return new String(nameBytes, 
Charset.forName("ASCII")).replace("\u0000", "");
+    }
+
+    public String dump() {
+        StringBuilder b = new StringBuilder();
+        for (int i = 0; i < 128; i++) {
+            b.append(NumberUtils.hex(LittleEndian.getUInt8(first16KiB, offset 
+ i), 2));
+            b.append(' ');
+        }
+        return b.toString();
+    }
+
+    /**
+     * @see Object#toString()
+     */
+    public String toString() {
+        StringBuilder builder = new StringBuilder(32);
+        builder.append('[').append(getName()).append(' ');
+        builder.append("t:").append(getType()).append(' ');
+        builder.append("s:").append(getStartOffset()).append(' ');
+        builder.append("e:").append(getEndOffset()).append(']');
+        return builder.toString();
+    }
+}

Added: trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTableType.java
===================================================================
--- trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTableType.java         
                (rev 0)
+++ trunk/fs/src/fs/org/jnode/partitions/apm/ApmPartitionTableType.java 
2012-08-09 14:08:21 UTC (rev 5904)
@@ -0,0 +1,47 @@
+/*
+ * $Id: $
+ *
+ * Copyright (C) 2003-2012 JNode.org
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; If not, write to the Free Software Foundation, 
Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+package org.jnode.partitions.apm;
+
+import org.jnode.driver.Device;
+import org.jnode.driver.block.BlockDeviceAPI;
+import org.jnode.partitions.PartitionTable;
+import org.jnode.partitions.PartitionTableException;
+import org.jnode.partitions.PartitionTableType;
+
+/**
+ * Apple Partition Map (APM) partition table type.
+ *
+ * @author Luke Quinane
+ */
+public class ApmPartitionTableType implements PartitionTableType {
+
+    public PartitionTable<?> create(byte[] firstSector, Device device) throws 
PartitionTableException {
+        return new ApmPartitionTable(this, firstSector, device);
+    }
+
+    public String getName() {
+        return "APM";
+    }
+
+    public boolean supports(byte[] first16KiB, BlockDeviceAPI devApi) {
+        return ApmPartitionTable.containsPartitionTable(first16KiB);
+    }
+}

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Jnode-svn-commits mailing list
Jnode-svn-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits

Reply via email to