From: <ga...@us...> - 2009-03-27 10:16:07
|
Revision: 5161 http://jnode.svn.sourceforge.net/jnode/?rev=5161&view=rev Author: galatnm Date: 2009-03-27 10:15:56 +0000 (Fri, 27 Mar 2009) Log Message: ----------- Correct writing of node records. Modified Paths: -------------- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2009-03-26 15:30:57 UTC (rev 5160) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2009-03-27 10:15:56 UTC (rev 5161) @@ -143,6 +143,7 @@ } /** + * Create a new node in the catalog B-Tree. * * @param filename * @param parentId @@ -150,26 +151,26 @@ * @param nodeType * @return */ - public LeafRecord createNode(String filename, CatalogNodeId parentId, CatalogNodeId nodeId, int nodeType) throws IOException { + public LeafRecord createNode(String filename, CatalogNodeId parentId, CatalogNodeId nodeId, + int nodeType) throws IOException { HFSUnicodeString name = new HFSUnicodeString(filename); LeafRecord record = this.getRecord(parentId, name); - if(record == null){ + if (record == null) { NodeDescriptor nd = new NodeDescriptor(0, 0, NodeDescriptor.BT_LEAF_NODE, 1, 2); - CatalogNode node = new CatalogNode(nd, 4096); + CatalogNode node = new CatalogNode(nd, 8192); CatalogKey key = new CatalogKey(parentId, name); - CatalogThread thread = - new CatalogThread(nodeType, parentId, name); + CatalogThread thread = new CatalogThread(nodeType, parentId, name); record = new LeafRecord(key, thread.getBytes()); node.addNodeRecord(record); - if(nodeType == CatalogFolder.RECORD_TYPE_FOLDER_THREAD){ - CatalogFolder newFolder = new CatalogFolder(0, nodeId); - key = new CatalogKey(parentId, name); - record = new LeafRecord(key, newFolder.getBytes()); + if (nodeType == CatalogFolder.RECORD_TYPE_FOLDER) { + CatalogFolder folder = new CatalogFolder(0, nodeId); + key = new CatalogKey(parentId, name); + record = new LeafRecord(key, folder.getBytes()); } else { - //TODO + // TODO } } else { - //TODO + // TODO } return record; } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java 2009-03-26 15:30:57 UTC (rev 5160) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java 2009-03-27 10:15:56 UTC (rev 5161) @@ -25,7 +25,9 @@ import java.util.List; import org.jnode.fs.hfsplus.tree.AbstractNode; +import org.jnode.fs.hfsplus.tree.IndexRecord; import org.jnode.fs.hfsplus.tree.Key; +import org.jnode.fs.hfsplus.tree.LeafRecord; import org.jnode.fs.hfsplus.tree.NodeDescriptor; import org.jnode.fs.hfsplus.tree.NodeRecord; import org.jnode.util.BigEndian; @@ -55,9 +57,21 @@ this.size = nodeSize; this.records = new ArrayList<NodeRecord>(this.descriptor.getNumRecords()); this.offsets = new ArrayList<Integer>(this.descriptor.getNumRecords() + 1); + int offset; + for(int i = 0; i < this.descriptor.getNumRecords() + 1; i++){ + offset = BigEndian.getInt16(nodeData, size - ((i + 1) * 2)); + offsets.add(Integer.valueOf(offset)); + } + CatalogKey key; for(int i = 0; i < this.descriptor.getNumRecords(); i++){ - offsets.add(BigEndian.getInt16(nodeData, size - ((i + 1) * 2))); - //TODO Get record data. + offset = offsets.get(i); + key = new CatalogKey(nodeData, offset); + if(isIndexNode()){ + records.add(new IndexRecord(key,nodeData, offset)); + } else { + int recordSize = offsets.get(i+1) - offset; + records.add(new LeafRecord(key,nodeData, offset, recordSize)); + } } } @@ -107,8 +121,7 @@ LinkedList<NodeRecord> result = new LinkedList<NodeRecord>(); NodeRecord largestMatchingRecord = null; CatalogKey largestMatchingKey = null; - for (int index = 0; index < this.getNodeDescriptor().getNumRecords(); index++) { - NodeRecord record = this.getNodeRecord(index); + for (NodeRecord record : records) { CatalogKey key = (CatalogKey) record.getKey(); if (key.getParentId().getId() < parentId.getId() && (largestMatchingKey == null || key.compareTo(largestMatchingKey) > 0)) { Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java 2009-03-26 15:30:57 UTC (rev 5160) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java 2009-03-27 10:15:56 UTC (rev 5161) @@ -22,6 +22,8 @@ import java.util.List; +import org.jnode.util.BigEndian; + public abstract class AbstractNode implements Node { protected NodeDescriptor descriptor; protected List<NodeRecord> records; @@ -59,6 +61,17 @@ public byte[] getBytes() { byte[] datas = new byte[size]; + System.arraycopy(descriptor.getBytes(), 0, datas, 0, NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH); + int offsetIndex = 0; + int offset; + for(NodeRecord record : records){ + offset = offsets.get(offsetIndex); + System.arraycopy(record.getBytes(), 0, datas, offset, record.getSize()); + BigEndian.setInt16(datas, size - ((offsetIndex + 1) * 2), offset); + offsetIndex++; + } + offset = offsets.get(offsets.size() - 1); + BigEndian.setInt16(datas, size - ((offsetIndex + 1) * 2), offset); return datas; } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java 2009-03-26 15:30:57 UTC (rev 5160) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java 2009-03-27 10:15:56 UTC (rev 5161) @@ -26,6 +26,12 @@ /** A node number that represent a child node of the index node. */ private int index; + public IndexRecord(final byte[] nodeData, final int offset) { + this.recordData = new byte[4]; + System.arraycopy(nodeData, offset + key.getKeyLength(), recordData, 0, 4); + index = BigEndian.getInt32(recordData, 0); + } + /** * * @param key This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |