Revision: 5886
          http://jnode.svn.sourceforge.net/jnode/?rev=5886&view=rev
Author:   galatnm
Date:     2012-02-14 16:05:35 +0000 (Tue, 14 Feb 2012)
Log Message:
-----------
HFS : Rewrite folder operations (in progress).

Modified Paths:
--------------
    trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusDirectory.java
    trunk/fs/src/fs/org/jnode/fs/hfsplus/SuperBlock.java
    trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java
    trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFolder.java
    trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java
    trunk/fs/src/test/org/jnode/fs/hfsplus/HfsPlusFileSystemTest.java

Added Paths:
-----------
    trunk/fs/src/test/org/jnode/fs/hfsplus/catalog/CatalogFolderTest.java

Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusDirectory.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusDirectory.java  2012-02-08 
11:49:43 UTC (rev 5885)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HfsPlusDirectory.java  2012-02-14 
16:05:35 UTC (rev 5886)
@@ -35,6 +35,7 @@
 import org.jnode.fs.hfsplus.catalog.CatalogFile;
 import org.jnode.fs.hfsplus.catalog.CatalogFolder;
 import org.jnode.fs.hfsplus.catalog.CatalogKey;
+import org.jnode.fs.hfsplus.catalog.CatalogLeafNode;
 import org.jnode.fs.hfsplus.catalog.CatalogNodeId;
 import org.jnode.fs.hfsplus.tree.LeafRecord;
 import org.jnode.fs.spi.FSEntryTable;
@@ -60,17 +61,16 @@
 
     @Override
     public FSEntry addDirectory(String name) throws IOException {
-        log.debug("<<< BEGIN addDirectory " + name + " >>>");
         if (getFileSystem().isReadOnly()) {
             throw new ReadOnlyFileSystemException();
         }
 
         if (getEntry(name) != null) {
-            throw new IOException("File or Directory already exists" + name);
+            throw new IOException("File or Directory already exists : " + 
name);
         }
         FSEntry newEntry = createDirectoryEntry(name);
         setFreeEntry(newEntry);
-        log.debug("<<< END addDirectory " + name + " >>>");
+        log.debug("Directory " + name + " added");
         return newEntry;
     }
 
@@ -231,16 +231,17 @@
         }
         Catalog catalog = ((HfsPlusFileSystem) getFileSystem()).getCatalog();
         SuperBlock volumeHeader = ((HfsPlusFileSystem) 
getFileSystem()).getVolumeHeader();
-        LeafRecord folderRecord =
+        CatalogLeafNode node =
                 catalog.createNode(name, this.folder.getFolderId(),
                         new CatalogNodeId(volumeHeader.getNextCatalogId()),
                         CatalogFolder.RECORD_TYPE_FOLDER_THREAD);
-        folder.setValence(folder.getValence() + 1);
+        folder.incrementValence();
 
-        HfsPlusEntry newEntry = new HfsPlusEntry((HfsPlusFileSystem) 
getFileSystem(), this, name, folderRecord);
+        HfsPlusEntry newEntry = new HfsPlusEntry((HfsPlusFileSystem) 
getFileSystem(), this, name, node.getNodeRecord(0));
         newEntry.setDirty();
-        volumeHeader.setFolderCount(volumeHeader.getFolderCount() + 1);
+        volumeHeader.incrementFolderCount();
         log.debug("New volume header :\n" + volumeHeader.toString());
+        volumeHeader.update();
 
         return newEntry;
     }

Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/SuperBlock.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/SuperBlock.java        2012-02-08 
11:49:43 UTC (rev 5885)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/SuperBlock.java        2012-02-14 
16:05:35 UTC (rev 5886)
@@ -426,6 +426,11 @@
     public final boolean isAttribute(final int maskBit) {
         return (((getAttributes() >> maskBit) & 0x1) != 0);
     }
+    
+    public void incrementFolderCount(){
+       this.setFolderCount(this.getFolderCount() + 1);
+    }
+               
 
     public byte[] getBytes() {
         return data;

Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java   2012-02-08 
11:49:43 UTC (rev 5885)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java   2012-02-14 
16:05:35 UTC (rev 5886)
@@ -126,7 +126,7 @@
         LeafRecord record = new LeafRecord(ck, folder.getBytes());
         rootNode.addNodeRecord(record);
         // Second record (thread)
-        CatalogKey tck = new CatalogKey(CatalogNodeId.HFSPLUS_ROOT_CNID, name);
+        CatalogKey tck = new CatalogKey(CatalogNodeId.HFSPLUS_POR_CNID, name);
         CatalogThread ct =
                 new CatalogThread(CatalogFolder.RECORD_TYPE_FOLDER_THREAD,
                         CatalogNodeId.HFSPLUS_ROOT_CNID, new 
HfsUnicodeString(""));
@@ -161,28 +161,40 @@
      * @param nodeType
      * @return the new node instance
      */
-    public LeafRecord createNode(String filename, CatalogNodeId parentId, 
CatalogNodeId nodeId,
+    public CatalogLeafNode createNode(String filename, CatalogNodeId parentId, 
CatalogNodeId nodeId,
             int nodeType) throws IOException {
+       CatalogLeafNode node;
         HfsUnicodeString name = new HfsUnicodeString(filename);
         LeafRecord record = this.getRecord(parentId, name);
         if (record == null) {
             NodeDescriptor nd = new NodeDescriptor(0, 0, 
NodeDescriptor.BT_LEAF_NODE, 1, 2);
-            CatalogLeafNode node = new CatalogLeafNode(nd, 8192);
+            node = new CatalogLeafNode(nd, 8192);
+            // Normal record
             CatalogKey key = new CatalogKey(parentId, name);
-            CatalogThread thread = new CatalogThread(nodeType, parentId, name);
-            record = new LeafRecord(key, thread.getBytes());
-            node.addNodeRecord(record);
             if (nodeType == CatalogFolder.RECORD_TYPE_FOLDER) {
-                CatalogFolder folder = new CatalogFolder(0, nodeId);
+                CatalogFolder folder = new CatalogFolder(0, parentId);
                 key = new CatalogKey(parentId, name);
                 record = new LeafRecord(key, folder.getBytes());
+                node.addNodeRecord(record);
             } else {
-                // TODO
+                // Catalog file
             }
+            // Thread record
+            key = new CatalogKey(parentId, name);
+            int threadType;
+            if (nodeType == CatalogFolder.RECORD_TYPE_FOLDER) {
+               threadType = CatalogFolder.RECORD_TYPE_FOLDER_THREAD;
+            } else {
+               threadType = CatalogFile.RECORD_TYPE_FILE_THREAD;
+            }
+            CatalogThread thread = new CatalogThread(threadType, nodeId, name);
+            record = new LeafRecord(key, thread.getBytes());
+            node.addNodeRecord(record);
+            
         } else {
-            // TODO
+            throw new IOException("Leaf record for parent (" + 
parentId.getId() + ") doesn't exist.");
         }
-        return record;
+        return node;
     }
 
     /**

Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFolder.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFolder.java     
2012-02-08 11:49:43 UTC (rev 5885)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogFolder.java     
2012-02-14 16:05:35 UTC (rev 5886)
@@ -148,4 +148,8 @@
         this.attrModDate = attrModDate;
     }
     
+    public void incrementValence(){
+       this.setValence(this.getValence() + 1);
+    }
+    
 }

Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java
===================================================================
--- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java   2012-02-08 
11:49:43 UTC (rev 5885)
+++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java   2012-02-14 
16:05:35 UTC (rev 5886)
@@ -36,7 +36,7 @@
     public LeafRecord(final Key key, final byte[] nodeData, final int offset, 
final int recordDataSize) {
         this.key = key;
         this.recordData = new byte[recordDataSize];
-        System.arraycopy(nodeData, offset + key.getKeyLength(), 
this.recordData, 0, recordDataSize);
+        System.arraycopy(nodeData, offset + (key.getKeyLength()-2), 
this.recordData, 0, recordDataSize);
         type = BigEndian.getInt16(this.recordData, 0);
     }
 

Modified: trunk/fs/src/test/org/jnode/fs/hfsplus/HfsPlusFileSystemTest.java
===================================================================
--- trunk/fs/src/test/org/jnode/fs/hfsplus/HfsPlusFileSystemTest.java   
2012-02-08 11:49:43 UTC (rev 5885)
+++ trunk/fs/src/test/org/jnode/fs/hfsplus/HfsPlusFileSystemTest.java   
2012-02-14 16:05:35 UTC (rev 5886)
@@ -80,7 +80,16 @@
         fs.read();
         fs.createRootEntry();
         FSDirectory root = fs.getRootEntry().getDirectory();
+        assertFalse("Must be empty", root.iterator().hasNext());
         root.addDirectory("test");
+        fs.flush();
+        fs.close();
+        fs = new HfsPlusFileSystemType().create(device, false);
+        fs.read();
+        assertEquals(1,fs.getVolumeHeader().getFolderCount());
+        fs.createRootEntry();
+        root = fs.getRootEntry().getDirectory();
+        assertTrue("Must contains one directory", root.iterator().hasNext());
     }
 
     private Device createTestDisk(boolean formatted) throws IOException {

Added: trunk/fs/src/test/org/jnode/fs/hfsplus/catalog/CatalogFolderTest.java
===================================================================
--- trunk/fs/src/test/org/jnode/fs/hfsplus/catalog/CatalogFolderTest.java       
                        (rev 0)
+++ trunk/fs/src/test/org/jnode/fs/hfsplus/catalog/CatalogFolderTest.java       
2012-02-14 16:05:35 UTC (rev 5886)
@@ -0,0 +1,30 @@
+package org.jnode.fs.hfsplus.catalog;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class CatalogFolderTest {
+
+       @Test
+       public void testCatalogFolderIntCatalogNodeId() {
+               CatalogFolder folder = new 
CatalogFolder(0,CatalogNodeId.HFSPLUS_ROOT_CNID);
+               assertNotNull(folder);
+               assertEquals(0, folder.getValence());
+               assertEquals(2,folder.getFolderId().getId());
+               folder = new CatalogFolder(folder.getBytes());
+               assertNotNull(folder);
+               assertEquals(0, folder.getValence());
+               assertEquals(2,folder.getFolderId().getId());
+               
+       }
+       
+       @Test
+       public void testCatalogFolder(){
+               CatalogFolder folder = new CatalogFolder(new byte[]{0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 2, -53, 96, 7, 78, -53, 96, 7, 78, -53, 96, 7, 78, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 2, 0, 9, 0, 116, 0, 101, 0, 115, 
0, 116, 0, 100, 0, 114, 0, 105, 0, 118, 0, 101, 0, 3});
+               assertNotNull(folder);
+               assertEquals(0, folder.getValence());
+               assertEquals(2,folder.getFolderId().getId());
+       }
+
+}

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


------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Jnode-svn-commits mailing list
Jnode-svn-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits

Reply via email to