Revision: 5617
          http://jnode.svn.sourceforge.net/jnode/?rev=5617&view=rev
Author:   galatnm
Date:     2009-07-22 13:28:52 +0000 (Wed, 22 Jul 2009)

Log Message:
-----------
Check remaining space when insert a record in a node.

Modified Paths:
--------------
    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/Node.java

Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java       
2009-07-22 10:07:29 UTC (rev 5616)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java       
2009-07-22 13:28:52 UTC (rev 5617)
@@ -42,8 +42,8 @@
     public CatalogNode(NodeDescriptor descriptor, final int nodeSize) {
         this.descriptor = descriptor;
         this.size = nodeSize;
-        this.records = new 
ArrayList<NodeRecord>(this.descriptor.getNumRecords());
-        this.offsets = new ArrayList<Integer>(this.descriptor.getNumRecords() 
+ 1);
+        this.records = new ArrayList<NodeRecord>(descriptor.getNumRecords());
+        this.offsets = new ArrayList<Integer>(descriptor.getNumRecords() + 1);
         
this.offsets.add(Integer.valueOf(NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH));
     }
 

Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java 2009-07-22 
10:07:29 UTC (rev 5616)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java 2009-07-22 
13:28:52 UTC (rev 5617)
@@ -52,13 +52,40 @@
     public abstract NodeRecord getNodeRecord(int index);
 
     @Override
-    public void addNodeRecord(NodeRecord record) {
+    public boolean addNodeRecord(NodeRecord record) {
+        int freeSpace = getFreeSize();
+        if(freeSpace < record.getSize() + 2){
+            return false;
+        }
         Integer lastOffset = offsets.get(offsets.size() - 1);
         Integer newOffset = lastOffset + record.getSize();
         offsets.add(newOffset);
         records.add(record);
+        return true;
     }
-
+    
+    public boolean check(int treeHeigth){
+        // Node type is correct.
+        if(this.getNodeDescriptor().getKind() < NodeDescriptor.BT_LEAF_NODE || 
this.getNodeDescriptor().getKind() > NodeDescriptor.BT_MAP_NODE){
+            return false;
+        }
+        
+        if(this.getNodeDescriptor().getHeight() > treeHeigth){
+            return false;
+        }
+        return true;
+    }
+    
+    /**
+     * Return amount of free space remaining.
+     * @return remaining free space.
+     */
+    protected int getFreeSize(){
+        int freeOffset = offsets.get(offsets.size() - 1);
+        int freeSize = size - freeOffset - (descriptor.getNumRecords() << 1) - 
OFFSET_SIZE;
+        return freeSize;
+    }
+    
     public byte[] getBytes() {
         byte[] datas = new byte[size];
         System.arraycopy(descriptor.getBytes(), 0, datas, 0, 
NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH);

Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java 2009-07-22 10:07:29 UTC 
(rev 5616)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java 2009-07-22 13:28:52 UTC 
(rev 5617)
@@ -17,16 +17,29 @@
  * 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.fs.hfsplus.tree;
 
+public interface Node {
 
+    public final static int OFFSET_SIZE = 2;
 
-public interface Node {
     public NodeDescriptor getNodeDescriptor();
+
     public boolean isIndexNode();
+
     public boolean isLeafNode();
+
     public int getRecordOffset(int index);
+
     public NodeRecord getNodeRecord(int index);
-    public void addNodeRecord(NodeRecord record);
+
+    /**
+     * Insert a record in the node.
+     * 
+     * @param record The record to insert.
+     * @return True if record is correctly inserted, false if there is not
+     *         enough place to insert the record.
+     */
+    public boolean addNodeRecord(NodeRecord record);
 }


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

------------------------------------------------------------------------------
_______________________________________________
Jnode-svn-commits mailing list
Jnode-svn-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits

Reply via email to