X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fde%2Ftodesbaum%2Futil%2Ffreenet%2Ffcp2%2FClientPutComplexDir.java;h=12d963d7b53768b94a3c949b6446ee6973996d74;hb=7bd75673638ec38307005f5cef154116dab30491;hp=2feec7257b808d66506d565e9e61a18be8a099ae;hpb=e4f461213da0e30faf9e9eb2e97626abff320618;p=jSite.git diff --git a/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java b/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java index 2feec72..12d963d 100644 --- a/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java +++ b/src/de/todesbaum/util/freenet/fcp2/ClientPutComplexDir.java @@ -1,5 +1,5 @@ /* - * todesbaum-lib - + * todesbaum-lib - * Copyright (C) 2006 David Roden * * This program is free software; you can redistribute it and/or modify @@ -19,18 +19,22 @@ 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$ */ @@ -38,13 +42,13 @@ public class ClientPutComplexDir extends ClientPutDir { /** The file entries of this directory. */ private List fileEntries = new ArrayList(); - + /** Whether this request has payload. */ 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,36 @@ public class ClientPutComplexDir extends ClientPutDir { * @param fileEntry The file entry to add to the directory */ public void addFileEntry(FileEntry fileEntry) { - fileEntries.add(fileEntry); + if (fileEntry instanceof DirectFileEntry) { + 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); + } + } + } else { + fileEntries.add(fileEntry); + } } /** @@ -82,7 +115,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 +145,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; } }