summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/filetransfer/Transfer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/filetransfer/Transfer.java')
-rw-r--r--src/main/java/org/openslx/filetransfer/Transfer.java32
1 files changed, 25 insertions, 7 deletions
diff --git a/src/main/java/org/openslx/filetransfer/Transfer.java b/src/main/java/org/openslx/filetransfer/Transfer.java
index 3e278c8..fc3d1d8 100644
--- a/src/main/java/org/openslx/filetransfer/Transfer.java
+++ b/src/main/java/org/openslx/filetransfer/Transfer.java
@@ -34,7 +34,7 @@ public abstract class Transfer
* @param log Logger to use
* @throws IOException
*/
- protected Transfer( String host, int port, SSLContext context, Logger log ) throws IOException
+ protected Transfer( String host, int port, int readTimeoutMs, SSLContext context, Logger log ) throws IOException
{
this.log = log;
// create socket.
@@ -44,7 +44,7 @@ public abstract class Transfer
SSLSocketFactory sslSocketFactory = context.getSocketFactory();
transferSocket = sslSocketFactory.createSocket();
}
- transferSocket.setSoTimeout( 10000 ); // set socket timeout.
+ transferSocket.setSoTimeout( readTimeoutMs );
transferSocket.connect( new InetSocketAddress( host, port ) );
outStream = new DataOutputStream( transferSocket.getOutputStream() );
@@ -196,7 +196,7 @@ public abstract class Transfer
* Method for closing connection, if download has finished.
*
*/
- public void close( String error, UploadStatusCallback callback, boolean sendToPeer )
+ protected void close( String error, UploadStatusCallback callback, boolean sendToPeer )
{
if ( error != null ) {
if ( sendToPeer )
@@ -205,14 +205,30 @@ public abstract class Transfer
callback.uploadError( error );
log.info( error );
}
- safeClose( dataFromServer, outStream, transferSocket );
+ synchronized ( transferSocket ) {
+ safeClose( dataFromServer, outStream, transferSocket );
+ }
}
- public void close( String error )
+ protected void close( String error )
{
close( error, null, false );
}
+ public void cancel()
+ {
+ synchronized ( transferSocket ) {
+ if ( isValid() ) {
+ try {
+ transferSocket.shutdownInput();
+ transferSocket.shutdownOutput();
+ } catch ( Exception e ) {
+ // Silence
+ }
+ }
+ }
+ }
+
/**
* Returns whether this transfer/connection is considered valid or usable,
* which means the socket is still properly connected to the remote peer.
@@ -221,8 +237,10 @@ public abstract class Transfer
*/
public boolean isValid()
{
- return transferSocket.isConnected() && !transferSocket.isClosed()
- && !transferSocket.isInputShutdown() && !transferSocket.isOutputShutdown();
+ synchronized ( transferSocket ) {
+ return transferSocket.isConnected() && !transferSocket.isClosed()
+ && !transferSocket.isInputShutdown() && !transferSocket.isOutputShutdown();
+ }
}
/**