/* 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.clients.fcp; import freenet.client.ClientMetadata; import freenet.client.DefaultMIMETypes; import freenet.support.LogThresholdCallback; import freenet.support.Logger; import freenet.support.SimpleFieldSet; import freenet.support.Logger.LogLevel; import freenet.support.api.BucketFactory; import freenet.support.api.ManifestElement; import freenet.support.api.RandomAccessBucket; /** * A request to upload a file to a manifest. * A ClientPutComplexDir will contain many of these. */ abstract class DirPutFile { final String name; ClientMetadata meta; private static volatile boolean logMINOR; static { Logger.registerLogThresholdCallback(new LogThresholdCallback(){ @Override public void shouldUpdate(){ logMINOR = Logger.shouldLog(LogLevel.MINOR, this); } }); } protected DirPutFile(String name, String mimeType) { this.name = name; meta = new ClientMetadata(mimeType); } protected static String guessMIME(String name) { // Guess it just from the name return DefaultMIMETypes.guessMIMEType(name, true); } /** * Create a DirPutFile from a SimpleFieldSet. */ public static DirPutFile create(SimpleFieldSet subset, String identifier, boolean global, BucketFactory bf) throws MessageInvalidException { String name = subset.get("Name"); if(name == null) throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "Missing field Name", identifier, global); String contentTypeOverride = subset.get("Metadata.ContentType"); if(contentTypeOverride != null && (!contentTypeOverride.equals("")) && !DefaultMIMETypes.isPlausibleMIMEType(contentTypeOverride)) { throw new MessageInvalidException(ProtocolErrorMessage.BAD_MIME_TYPE, "Bad MIME type in Metadata.ContentType", identifier, global); } String type = subset.get("UploadFrom"); if((type == null) || type.equalsIgnoreCase("direct")) { return DirectDirPutFile.create(name, contentTypeOverride, subset, identifier, global, bf); } else if(type.equalsIgnoreCase("disk")) { return DiskDirPutFile.create(name, contentTypeOverride, subset, identifier, global); } else if(type.equalsIgnoreCase("redirect")) { return RedirectDirPutFile.create(name, contentTypeOverride, subset, identifier, global); } else { throw new MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "Unsupported or unknown UploadFrom: "+type, identifier, global); } } public String getName() { return name; } public String getMIMEType() { return meta.getMIMEType(); } public abstract RandomAccessBucket getData(); public ManifestElement getElement() { String n = name; int idx = n.lastIndexOf('/'); if(idx != -1) n = n.substring(idx+1); if(logMINOR) Logger.minor(this, "Element name: "+name+" -> "+n); return new ManifestElement(n, getData(), getMIMEType(), getData().size()); } }