package freenet.clients.fcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import freenet.support.SimpleFieldSet; import freenet.support.api.BucketFactory; import freenet.support.api.RandomAccessBucket; import freenet.support.io.BucketTools; import freenet.support.io.NullBucket; /** * Specialized DirPutFile for direct uploads. */ public class DirectDirPutFile extends DirPutFile { private final RandomAccessBucket data; private final long length; public static DirectDirPutFile create(String name, String contentTypeOverride, SimpleFieldSet subset, String identifier, boolean global, BucketFactory bf) throws MessageInvalidException { String s = subset.get("DataLength"); if(s == null) throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "UploadFrom=direct requires a DataLength for "+name, identifier, global); long length; RandomAccessBucket data; try { length = Long.parseLong(s); } catch (NumberFormatException e) { throw new MessageInvalidException(ProtocolErrorMessage.ERROR_PARSING_NUMBER, "Could not parse DataLength: "+e.toString(), identifier, global); } try { if(length == 0) data = new NullBucket(); else data = bf.makeBucket(length); } catch (IOException e) { throw new MessageInvalidException(ProtocolErrorMessage.INTERNAL_ERROR, "Internal error: could not allocate temp bucket: "+e.toString(), identifier, global); } String mimeType; if(contentTypeOverride == null) mimeType = DirPutFile.guessMIME(name); else mimeType = contentTypeOverride; return new DirectDirPutFile(name, mimeType, length, data); } private DirectDirPutFile(String name, String mimeType, long length, RandomAccessBucket data) { super(name, mimeType); this.length = length; this.data = data; } public long bytesToRead() { return length; } public void read(InputStream is) throws IOException { BucketTools.copyFrom(data, is, length); } public void write(OutputStream os) throws IOException { BucketTools.copyTo(data, os, length); } @Override public RandomAccessBucket getData() { return data; } }