Author: saces
Date: 2009-04-20 20:42:06 +0000 (Mon, 20 Apr 2009)
New Revision: 27118

Modified:
   trunk/freenet/src/freenet/client/Metadata.java
Log:
add new doc type 'ARCHIVE_METADATA_REDIRECT'(5)
used for metadata redirects inside containers ->".metadata-N"

Modified: trunk/freenet/src/freenet/client/Metadata.java
===================================================================
--- trunk/freenet/src/freenet/client/Metadata.java      2009-04-20 20:33:53 UTC 
(rev 27117)
+++ trunk/freenet/src/freenet/client/Metadata.java      2009-04-20 20:42:06 UTC 
(rev 27118)
@@ -67,6 +67,7 @@
        static final byte SIMPLE_MANIFEST = 2;
        public static final byte ARCHIVE_MANIFEST = 3;
        public static final byte ARCHIVE_INTERNAL_REDIRECT = 4;
+       public static final byte ARCHIVE_METADATA_REDIRECT = 5;
        
        // 2 bytes of flags
        /** Is a splitfile */
@@ -373,7 +374,7 @@
                        if(logMINOR) Logger.minor(this, "End of manifest"); // 
Make it easy to search for it!
                }
                
-               if(documentType == ARCHIVE_INTERNAL_REDIRECT) {
+               if((documentType == ARCHIVE_INTERNAL_REDIRECT) || (documentType 
== ARCHIVE_METADATA_REDIRECT)) {
                        int len = dis.readShort();
                        if(logMINOR) Logger.minor(this, "Reading archive 
internal redirect length "+len);
                        byte[] buf = new byte[len];
@@ -536,6 +537,21 @@
                } else
                        throw new IllegalArgumentException();
        }
+       
+       /**
+        * Create a Metadata redircet object that points to resolved metadata 
inside container.
+        * docType = ARCHIVE_METADATA_REDIRECT
+        * @param name the filename in the archive to read from, must be 
".metadata-N" scheme.
+        */
+       private Metadata(byte docType, String name) {
+               hashCode = super.hashCode();
+               noMIME = true;
+               if(docType == ARCHIVE_METADATA_REDIRECT) {
+                       documentType = docType;
+                       nameInArchive = name;
+               } else
+                       throw new IllegalArgumentException();
+       }
 
        /**
         * Create another kind of simple Metadata object (a redirect or similar 
object).
@@ -895,9 +911,13 @@
                                        byte[] data = meta.writeToByteArray();
                                        if(data.length > MAX_SIZE_IN_MANIFEST) {
                                                FreenetURI uri = 
meta.resolvedURI;
+                                               String n = meta.resolvedName;
                                                if(uri != null) {
                                                        meta = new 
Metadata(SIMPLE_REDIRECT, null, null, uri, null);
                                                        data = 
meta.writeToByteArray();
+                                               } else if (n != null) {
+                                                       meta = new 
Metadata(ARCHIVE_METADATA_REDIRECT, n);
+                                                       data = 
meta.writeToByteArray();
                                                } else {
                                                        kill = true;
                                                        if(unresolvedMetadata 
== null)
@@ -923,7 +943,7 @@
                        }
                }
                
-               if(documentType == ARCHIVE_INTERNAL_REDIRECT) {
+               if((documentType == ARCHIVE_INTERNAL_REDIRECT) || (documentType 
== ARCHIVE_METADATA_REDIRECT)) {
                        byte[] data = nameInArchive.getBytes("UTF-8");
                        if(data.length > Short.MAX_VALUE) throw new 
IllegalArgumentException("Archive internal redirect name too long");
                        dos.writeShort(data.length);
@@ -936,7 +956,8 @@
         */
        public boolean haveFlags() {
                return ((documentType == SIMPLE_REDIRECT) || (documentType == 
MULTI_LEVEL_METADATA)
-                               || (documentType == ARCHIVE_MANIFEST) || 
(documentType == ARCHIVE_INTERNAL_REDIRECT));
+                               || (documentType == ARCHIVE_MANIFEST) || 
(documentType == ARCHIVE_INTERNAL_REDIRECT)
+                               || (documentType == ARCHIVE_METADATA_REDIRECT));
        }
 
        /**

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to