X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fde%2Ftodesbaum%2Futil%2Ffreenet%2Ffcp2%2FClientPutComplexDir.java;h=237cb1c79f2d3c3a1f2c9f8853cdf758af721493;hb=b80ec05dc6609b273b111469af0ec040f8ea0b42;hp=08c8a530e263c93eed8589bf451e61ebca2ca69a;hpb=6f1a8216cfba28add0ef365b46a08d16d4eb87fe;p=jSite.git diff --git a/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java b/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java index 08c8a53..237cb1c 100644 --- a/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java +++ b/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java @@ -19,20 +19,24 @@ package de.todesbaum.util.freenet.fcp2; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.SequenceInputStream; import java.io.Writer; import java.util.ArrayList; import java.util.List; -import java.util.Vector; + +import de.todesbaum.util.io.Closer; /** * Implementation of the ClientPutComplexDir command. This * command can be used to insert directories that do not exist on disk. * * @author David Roden <droden@gmail.com> - * @version $Id: ClientPutComplexDir.java 356 2006-03-24 15:13:38Z bombe $ + * @version $Id$ */ public class ClientPutComplexDir extends ClientPutDir { @@ -43,7 +47,7 @@ public class ClientPutComplexDir extends ClientPutDir { private boolean hasPayload = false; /** The input streams for the payload. */ - private List payloadInputStreams = new ArrayList(); + private File payloadFile; /** The total number of bytes of the payload. */ private long payloadLength = 0; @@ -62,7 +66,32 @@ public class ClientPutComplexDir extends ClientPutDir { * @param fileEntry The file entry to add to the directory */ public void addFileEntry(FileEntry fileEntry) { - fileEntries.add(fileEntry); + if (payloadFile == null){ + try { + payloadFile = File.createTempFile("payload", ".dat"); + payloadFile.deleteOnExit(); + } catch (IOException e) { + } + } + if (payloadFile != null) { + InputStream payloadInputStream = ((DirectFileEntry) fileEntry).getDataInputStream(); + FileOutputStream payloadOutputStream = null; + try { + payloadOutputStream = new FileOutputStream(payloadFile, true); + byte[] buffer = new byte[65536]; + int read = 0; + while ((read = payloadInputStream.read(buffer)) != -1) { + payloadOutputStream.write(buffer, 0, read); + } + payloadOutputStream.flush(); + fileEntries.add(fileEntry); + } catch (IOException ioe1) { + /* hmm, ignore? */ + } finally { + Closer.close(payloadOutputStream); + Closer.close(payloadInputStream); + } + } } /** @@ -82,7 +111,6 @@ public class ClientPutComplexDir extends ClientPutDir { hasPayload = true; writer.write("Files." + fileIndex + ".DataLength=" + ((DirectFileEntry) fileEntry).getDataLength() + LINEFEED); payloadLength += ((DirectFileEntry) fileEntry).getDataLength(); - payloadInputStreams.add(((DirectFileEntry) fileEntry).getDataInputStream()); } else if (fileEntry instanceof DiskFileEntry) { writer.write("Files." + fileIndex + ".Filename=" + ((DiskFileEntry) fileEntry).getFilename() + LINEFEED); } else if (fileEntry instanceof RedirectFileEntry) { @@ -113,9 +141,14 @@ public class ClientPutComplexDir extends ClientPutDir { */ @Override protected InputStream getPayload() { - /* grr. use Vector here because it returns an Enumeration. */ - Vector inputStreams = new Vector(payloadInputStreams); - return new SequenceInputStream(inputStreams.elements()); + if (payloadFile != null) { + try { + return new FileInputStream(payloadFile); + } catch (FileNotFoundException e) { + /* shouldn't occur. */ + } + } + return null; } }