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