X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fde%2Ftodesbaum%2Futil%2Ffreenet%2Ffcp2%2FConnection.java;h=c4cb66909daaf895b818c5f3d514f11c1b5fa5b4;hb=953de352675a4ad91fe307d816a4ea7780c94274;hp=848ee868e54b0666c9a0b5075f81ce1e5603ab4d;hpb=e44d6888ffaa3151a99b9bb7cb3c887d11feb596;p=jSite.git
diff --git a/src/de/todesbaum/util/freenet/fcp2/Connection.java b/src/de/todesbaum/util/freenet/fcp2/Connection.java
index 848ee86..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,13 +30,15 @@ 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$
*/
@@ -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
@@ -179,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
*/
@@ -189,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() {
@@ -200,34 +215,15 @@ 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();
}
@@ -236,7 +232,7 @@ public class Connection {
/**
* 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,7 +280,7 @@ 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$
*/
@@ -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"));