X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fde%2Ftodesbaum%2Futil%2Ffreenet%2Ffcp2%2FConnection.java;h=c4cb66909daaf895b818c5f3d514f11c1b5fa5b4;hb=953de352675a4ad91fe307d816a4ea7780c94274;hp=15757d0d13f3852f92e0224bb96e3c9cc1b27f17;hpb=6f1a8216cfba28add0ef365b46a08d16d4eb87fe;p=jSite.git diff --git a/src/de/todesbaum/util/freenet/fcp2/Connection.java b/src/de/todesbaum/util/freenet/fcp2/Connection.java index 15757d0..c4cb669 100644 --- a/src/de/todesbaum/util/freenet/fcp2/Connection.java +++ b/src/de/todesbaum/util/freenet/fcp2/Connection.java @@ -1,6 +1,5 @@ /* - * todesbaum-lib - - * Copyright (C) 2006 David Roden + * jSite - Connection.java - Copyright © 2006–2012 David Roden * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,15 +30,17 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; +import de.todesbaum.util.io.Closer; import de.todesbaum.util.io.LineInputStream; import de.todesbaum.util.io.StreamCopier; +import de.todesbaum.util.io.StreamCopier.ProgressListener; import de.todesbaum.util.io.TempFileInputStream; /** * A physical connection to a Freenet node. - * + * * @author David Roden <droden@gmail.com> - * @version $Id: Connection.java 413 2006-03-29 12:22:31Z bombe $ + * @version $Id$ */ public class Connection { @@ -70,9 +71,12 @@ public class Connection { /** The NodeHello message sent by the node on connect. */ protected Message nodeHello; + /** The temp directory to use. */ + private String tempDirectory; + /** * Creates a new connection to the specified node with the specified name. - * + * * @param node * The node to connect to * @param name @@ -85,7 +89,7 @@ public class Connection { /** * Adds a listener that gets notified on connection events. - * + * * @param connectionListener * The listener to add */ @@ -96,7 +100,7 @@ public class Connection { /** * Removes a listener from the list of registered listeners. Only the first * matching listener is removed. - * + * * @param connectionListener * The listener to remove * @see List#remove(java.lang.Object) @@ -107,12 +111,12 @@ public class Connection { /** * Notifies listeners about a received message. - * + * * @param message * The received message */ protected void fireMessageReceived(Message message) { - for (ConnectionListener connectionListener: connectionListeners) { + for (ConnectionListener connectionListener : connectionListeners) { connectionListener.messageReceived(this, message); } } @@ -121,14 +125,14 @@ public class Connection { * Notifies listeners about the loss of the connection. */ protected void fireConnectionTerminated() { - for (ConnectionListener connectionListener: connectionListeners) { + for (ConnectionListener connectionListener : connectionListeners) { connectionListener.connectionTerminated(this); } } /** * Returns the name of the connection. - * + * * @return The name of the connection */ public String getName() { @@ -136,8 +140,19 @@ public class Connection { } /** + * Sets the temp directory to use for creation of temporary files. + * + * @param tempDirectory + * The temp directory to use, or {@code null} to use the default + * temp directory + */ + public void setTempDirectory(String tempDirectory) { + this.tempDirectory = tempDirectory; + } + + /** * Connects to the node. - * + * * @return true if the connection succeeded and the node * returned a NodeHello message * @throws IOException @@ -155,9 +170,6 @@ public class Connection { nodeSocket.setReceiveBufferSize(65535); nodeInputStream = nodeSocket.getInputStream(); nodeOutputStream = nodeSocket.getOutputStream(); - // nodeWriter = new TeeWriter(new - // OutputStreamWriter(nodeOutputStream, Charset.forName("UTF-8")), - // new PrintWriter(System.out)); nodeWriter = new OutputStreamWriter(nodeOutputStream, Charset.forName("UTF-8")); nodeReader = new NodeReader(nodeInputStream); Thread nodeReaderThread = new Thread(nodeReader); @@ -182,7 +194,7 @@ public class Connection { /** * Returns whether this connection is still connected to the node. - * + * * @return true if this connection is still valid, * false otherwise */ @@ -192,7 +204,7 @@ public class Connection { /** * Returns the NodeHello message the node sent on connection. - * + * * @return The NodeHello message of the node */ public Message getNodeHello() { @@ -203,40 +215,24 @@ public class Connection { * Disconnects from the node. */ public void disconnect() { - if (nodeWriter != null) { - try { - nodeWriter.close(); - } catch (IOException ioe1) { - } - nodeWriter = null; - } - if (nodeOutputStream != null) { - try { - nodeOutputStream.close(); - } catch (IOException ioe1) { - } - nodeOutputStream = null; - } - if (nodeInputStream != null) { - try { - nodeInputStream.close(); - } catch (IOException ioe1) { - } - nodeInputStream = null; - } - if (nodeSocket != null) { - try { - nodeSocket.close(); - } catch (IOException ioe1) { - } - nodeSocket = null; + Closer.close(nodeWriter); + nodeWriter = null; + Closer.close(nodeOutputStream); + nodeOutputStream = null; + Closer.close(nodeInputStream); + nodeInputStream = null; + nodeInputStream = null; + Closer.close(nodeSocket); + nodeSocket = null; + synchronized (this) { + notify(); } fireConnectionTerminated(); } /** * Executes the specified command. - * + * * @param command * The command to execute * @throws IllegalStateException @@ -245,6 +241,22 @@ public class Connection { * if an I/O error occurs */ public synchronized void execute(Command command) throws IllegalStateException, IOException { + execute(command, null); + } + + /** + * Executes the specified command. + * + * @param command + * The command to execute + * @param progressListener + * A progress listener for a payload transfer + * @throws IllegalStateException + * if the connection is not connected + * @throws IOException + * if an I/O error occurs + */ + public synchronized void execute(Command command, ProgressListener progressListener) throws IllegalStateException, IOException { if (nodeSocket == null) { throw new IllegalStateException("connection is not connected"); } @@ -253,7 +265,13 @@ public class Connection { nodeWriter.write("EndMessage" + Command.LINEFEED); nodeWriter.flush(); if (command.hasPayload()) { - StreamCopier.copy(command.getPayload(), nodeOutputStream, command.getPayloadLength()); + InputStream payloadInputStream = null; + try { + payloadInputStream = command.getPayload(); + StreamCopier.copy(payloadInputStream, nodeOutputStream, command.getPayloadLength(), progressListener); + } finally { + Closer.close(payloadInputStream); + } nodeOutputStream.flush(); } } @@ -262,9 +280,9 @@ public class Connection { * The reader thread for this connection. This is essentially a thread that * reads lines from the node, creates messages from them and notifies * listeners about the messages. - * + * * @author David Roden <droden@gmail.com> - * @version $Id: Connection.java 413 2006-03-29 12:22:31Z bombe $ + * @version $Id$ */ private class NodeReader implements Runnable { @@ -274,7 +292,7 @@ public class Connection { /** * Creates a new reader that reads from the specified input stream. - * + * * @param nodeInputStream * The input stream to read from */ @@ -286,6 +304,7 @@ public class Connection { * Main loop of the reader. Lines are read and converted into * {@link Message} objects. */ + @SuppressWarnings("synthetic-access") public void run() { LineInputStream nodeReader = null; try { @@ -306,7 +325,7 @@ public class Connection { /* need to read message from stream now */ File tempFile = null; try { - tempFile = File.createTempFile("fcpv2", "data"); + tempFile = File.createTempFile("fcpv2", "data", (tempDirectory != null) ? new File(tempDirectory) : null); tempFile.deleteOnExit(); FileOutputStream tempFileOutputStream = new FileOutputStream(tempFile); long dataLength = Long.parseLong(message.get("DataLength"));