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;
}
}