/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support.api;
import java.io.Serializable;
import freenet.client.async.ClientContext;
import freenet.client.DefaultMIMETypes;
import freenet.keys.FreenetURI;
import freenet.support.io.ResumeFailedException;
/**
* Represents an element in a manifest. Fed to *ManifestPutter. An element can be a file or a
* redirect.
*/
public class ManifestElement implements Serializable {
private static final long serialVersionUID = 1L;
/** Filename */
final String name;
/** Full name in the container it is inserted as part of. */
public final String fullName;
/** Data to be inserted. Can be null, if the insert has completed. */
final RandomAccessBucket data;
/** MIME type override. null => use default for filename */
public final String mimeOverride;
/** Original size of the bucket. Can be set explicitly even if data == null. */
final long dataSize;
/** Redirect target */
public final FreenetURI targetURI;
/** Construct a ManifestElement for a file. */
public ManifestElement(String name2, String fullName2, RandomAccessBucket data2, String mimeOverride2, long size) {
this.name = name2;
this.fullName = fullName2;
this.data = data2;
assert(data != null);
this.mimeOverride = mimeOverride2;
this.dataSize = size;
this.targetURI = null;
}
public ManifestElement(String name2, RandomAccessBucket data2, String mimeOverride2, long size2) {
this.name = name2;
this.fullName = name2;
this.data = data2;
this.mimeOverride = mimeOverride2;
this.dataSize = size2;
this.targetURI = null;
}
/** Copy and change name */
public ManifestElement(ManifestElement me, String newName) {
this.name = newName;
this.fullName = me.fullName;
this.data = me.data;
this.mimeOverride = me.mimeOverride;
this.dataSize = me.dataSize;
this.targetURI = me.targetURI;
}
/** Copy and change full name */
public ManifestElement(ManifestElement me, String newName, String newFullName) {
this.name = newName;
this.fullName = newFullName;
assert(fullName != null);
this.data = me.data;
this.mimeOverride = me.mimeOverride;
this.dataSize = me.dataSize;
this.targetURI = me.targetURI;
}
/** Construct a ManifestElement for a redirect */
public ManifestElement(String name2, FreenetURI targetURI2, String mimeOverride2) {
this.name = name2;
this.fullName = name2;
this.data = null;
this.mimeOverride = mimeOverride2;
this.dataSize = -1;
this.targetURI = targetURI2;
assert(targetURI != null);
}
public ManifestElement(String name2, String fullName2, String mimeOverride2,
FreenetURI targetURI2) {
this.name = name2;
this.fullName = fullName2;
this.mimeOverride = mimeOverride2;
this.targetURI = targetURI2;
this.data = null;
this.dataSize = -1;
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(Object o) {
if(this == o) return true;
if(o instanceof ManifestElement) {
if(((ManifestElement)o).name.equals(name)) return true;
}
return false;
}
public void freeData() {
if(data != null) {
data.free();
}
}
public String getName() {
return name;
}
public String getMimeTypeOverride() {
return mimeOverride;
}
/**
* A MIME type to feed into ClientMetadata.
*/
public String getMimeType() {
String mimeType = mimeOverride;
if((mimeOverride == null) && (name != null))
mimeType = DefaultMIMETypes.guessMIMEType(name, true);
return mimeType;
}
public RandomAccessBucket getData() {
return data;
}
public long getSize() {
return dataSize;
}
public FreenetURI getTargetURI() {
return targetURI;
}
public void onResume(ClientContext context) throws ResumeFailedException {
if(data != null) data.onResume(context);
}
}