|
From: <ga...@us...> - 2012-01-25 15:46:41
|
Revision: 5882
http://jnode.svn.sourceforge.net/jnode/?rev=5882&view=rev
Author: galatnm
Date: 2012-01-25 15:46:30 +0000 (Wed, 25 Jan 2012)
Log Message:
-----------
Fixes from luke concerning HFS+ extends management.
Modified Paths:
--------------
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/catalog/Catalog.java
trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java
trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java
Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFile.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFile.java 2011-12-22 15:30:32 UTC (rev 5881)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusFile.java 2012-01-25 15:46:30 UTC (rev 5882)
@@ -22,11 +22,9 @@
import java.io.IOException;
import java.nio.ByteBuffer;
-
import org.jnode.fs.FSFile;
import org.jnode.fs.FileSystem;
import org.jnode.fs.hfsplus.catalog.CatalogFile;
-import org.jnode.fs.hfsplus.extent.ExtentDescriptor;
public class HfsPlusFile implements FSFile {
@@ -57,12 +55,7 @@
@Override
public final void read(final long fileOffset, final ByteBuffer dest) throws IOException {
HfsPlusFileSystem fs = (HfsPlusFileSystem) getFileSystem();
- for (ExtentDescriptor d : file.getDatas().getExtents()) {
- if (!d.isEmpty()) {
- long firstOffset = (long) d.getStartOffset(fs.getVolumeHeader().getBlockSize());
- fs.getApi().read(firstOffset, dest);
- }
- }
+ file.getDatas().read(fs,fileOffset,dest);
}
@Override
Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusForkData.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusForkData.java 2011-12-22 15:30:32 UTC (rev 5881)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusForkData.java 2012-01-25 15:46:30 UTC (rev 5882)
@@ -20,6 +20,8 @@
package org.jnode.fs.hfsplus;
+import java.io.IOException;
+import java.nio.ByteBuffer;
import org.jnode.fs.hfsplus.extent.ExtentDescriptor;
import org.jnode.util.BigEndian;
@@ -111,7 +113,32 @@
public ExtentDescriptor getExtent(int index) {
return extents[index];
}
+ /**
+ * Read a block of data
+ *
+ * @param fileSystem the associated file system.
+ * @param offset the offset to read from.
+ * @param buffer the buffer to read into.
+ * @throws java.io.IOException if an error occurs.
+ */
+ public void read(HfsPlusFileSystem fileSystem, long offset, ByteBuffer buffer) throws IOException {
+ for (ExtentDescriptor extentDescriptor : extents) {
+ if (buffer.remaining() > 0 && !extentDescriptor.isEmpty()) {
+ long length = extentDescriptor.getSize(fileSystem.getVolumeHeader().getBlockSize());
+ if (offset != 0 && length < offset) {
+ offset -= length;
+ } else {
+
+ long firstOffset = extentDescriptor.getStartOffset(fileSystem.getVolumeHeader().getBlockSize());
+ fileSystem.getApi().read(firstOffset + offset, buffer);
+
+ offset = 0;
+ }
+ }
+ }
+ }
+
/**
*
* @param index
Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2011-12-22 15:30:32 UTC (rev 5881)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2012-01-25 15:46:30 UTC (rev 5882)
@@ -24,13 +24,12 @@
import java.nio.ByteBuffer;
import java.util.LinkedList;
import java.util.List;
-
import org.apache.log4j.Logger;
import org.jnode.fs.hfsplus.HFSPlusParams;
import org.jnode.fs.hfsplus.HfsPlusFileSystem;
+import org.jnode.fs.hfsplus.HfsPlusForkData;
import org.jnode.fs.hfsplus.HfsUnicodeString;
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;
@@ -52,7 +51,7 @@
*/
private BTHeaderRecord bthr;
- private int catalogHeaderNodeOffset;
+ private HfsPlusForkData catalogFile;
private ByteBuffer buffer;
@@ -66,13 +65,12 @@
log.info("Load B-Tree catalog file.");
this.fs = fs;
SuperBlock sb = fs.getVolumeHeader();
- ExtentDescriptor firstExtent = sb.getCatalogFile().getExtent(0);
- catalogHeaderNodeOffset = firstExtent.getStartOffset(sb.getBlockSize());
- if (!firstExtent.isEmpty()) {
- buffer =
- ByteBuffer.allocate(NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH +
+ catalogFile = sb.getCatalogFile();
+
+ if(!catalogFile.getExtent(0).isEmpty()) {
+ buffer = ByteBuffer.allocate(NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH +
BTHeaderRecord.BT_HEADER_RECORD_LENGTH);
- fs.getApi().read(catalogHeaderNodeOffset, buffer);
+ catalogFile.read(fs, 0, buffer);
buffer.rewind();
byte[] data = ByteBufferUtils.toArray(buffer);
log.info("Load catalog node descriptor.");
@@ -150,7 +148,7 @@
*/
public void update() throws IOException {
SuperBlock vh = fs.getVolumeHeader();
- int offset = vh.getCatalogFile().getExtent(0).getStartOffset(vh.getBlockSize());
+ long offset = vh.getCatalogFile().getExtent(0).getStartOffset(vh.getBlockSize());
fs.getApi().write(offset, this.getBytes());
}
@@ -197,8 +195,7 @@
LeafRecord lr = null;
int nodeSize = bthr.getNodeSize();
ByteBuffer nodeData = ByteBuffer.allocate(nodeSize);
- fs.getApi().read(catalogHeaderNodeOffset + (getBTHeaderRecord().getRootNode() * nodeSize),
- nodeData);
+ catalogFile.read(fs, (bthr.getRootNode()*nodeSize), nodeData);
nodeData.rewind();
byte[] data = ByteBufferUtils.toArray(nodeData);
NodeDescriptor nd = new NodeDescriptor(nodeData.array(), 0);
@@ -206,9 +203,9 @@
while (nd.isIndexNode()) {
CatalogIndexNode node = new CatalogIndexNode(data, nodeSize);
IndexRecord record = (IndexRecord) node.find(parentID);
- currentOffset = catalogHeaderNodeOffset + (record.getIndex() * nodeSize);
+ currentOffset = record.getIndex() * nodeSize;
nodeData = ByteBuffer.allocate(nodeSize);
- fs.getApi().read(currentOffset, nodeData);
+ catalogFile.read(fs, currentOffset, nodeData);
nodeData.rewind();
data = ByteBufferUtils.toArray(nodeData);
nd = new NodeDescriptor(nodeData.array(), 0);
@@ -248,7 +245,7 @@
int currentNodeNumber = nodeNumber;
int nodeSize = getBTHeaderRecord().getNodeSize();
ByteBuffer nodeData = ByteBuffer.allocate(nodeSize);
- fs.getApi().read(catalogHeaderNodeOffset + (currentNodeNumber * nodeSize), nodeData);
+ catalogFile.read(fs, (currentNodeNumber * nodeSize), nodeData);
byte[] datas = nodeData.array();
NodeDescriptor nd = new NodeDescriptor(datas, 0);
if (nd.isIndexNode()) {
@@ -286,7 +283,7 @@
int currentNodeNumber = getBTHeaderRecord().getRootNode();
int nodeSize = getBTHeaderRecord().getNodeSize();
ByteBuffer nodeData = ByteBuffer.allocate(nodeSize);
- fs.getApi().read(catalogHeaderNodeOffset + (currentNodeNumber * nodeSize), nodeData);
+ catalogFile.read(fs, (currentNodeNumber * nodeSize), nodeData);
NodeDescriptor nd = new NodeDescriptor(nodeData.array(), 0);
int currentOffset = 0;
CatalogKey cKey = new CatalogKey(parentID, nodeName);
@@ -294,9 +291,9 @@
CatalogIndexNode node = new CatalogIndexNode(nodeData.array(), nodeSize);
IndexRecord record = node.find(cKey);
currentNodeNumber = record.getIndex();
- currentOffset = catalogHeaderNodeOffset + record.getIndex() * nodeSize;
+ currentOffset = record.getIndex() * nodeSize;
nodeData = ByteBuffer.allocate(nodeSize);
- fs.getApi().read(currentOffset, buffer);
+ catalogFile.read(fs, currentOffset, buffer);
node = new CatalogIndexNode(nodeData.array(), nodeSize);
}
LeafRecord lr = null;
Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java 2011-12-22 15:30:32 UTC (rev 5881)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentDescriptor.java 2012-01-25 15:46:30 UTC (rev 5882)
@@ -89,8 +89,8 @@
* @param nodeSize the size of a node.
* @return offset of the extent.
*/
- public int getStartOffset(int nodeSize) {
- return startBlock * nodeSize;
+ public long getStartOffset(int nodeSize) {
+ return (long)startBlock * nodeSize;
}
/**
@@ -108,8 +108,8 @@
* @param nodeSize the size of a node.
* @return size of the extent.
*/
- public int getSize(int nodeSize) {
- return blockCount * nodeSize;
+ public long getSize(int nodeSize) {
+ return (long)blockCount * nodeSize;
}
/**
Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java 2011-12-22 15:30:32 UTC (rev 5881)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/BTHeaderRecord.java 2012-01-25 15:46:30 UTC (rev 5882)
@@ -93,12 +93,12 @@
lastLeafNode = BigEndian.getInt32(data, 14);
nodeSize = BigEndian.getInt16(data, 18);
maxKeyLength = BigEndian.getInt16(data, 20);
- totalNodes = BigEndian.getInt16(data, 24);
- freeNodes = BigEndian.getInt16(data, 28);
- clumpSize = BigEndian.getInt16(data, 32);
- treeType = BigEndian.getInt16(data, 36);
- keyCompareType = BigEndian.getInt16(data, 37);
- attributes = BigEndian.getInt32(data, 39);
+ totalNodes = BigEndian.getInt32(data, 22);
+ freeNodes = BigEndian.getInt32(data, 26);
+ clumpSize = BigEndian.getInt32(data, 32);
+ treeType = BigEndian.getInt8(data,36);
+ keyCompareType = BigEndian.getInt8(data,36);
+ attributes = BigEndian.getInt32(data, 38);
}
public byte[] getBytes() {
@@ -114,8 +114,8 @@
BigEndian.setInt32(data, 26, freeNodes);
BigEndian.setInt32(data, 32, clumpSize);
BigEndian.setInt8(data, 36, treeType);
- BigEndian.setInt8(data, 38, keyCompareType);
- BigEndian.setInt32(data, 39, attributes);
+ BigEndian.setInt8(data, 37, keyCompareType);
+ BigEndian.setInt32(data, 38, attributes);
return data;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|