mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-29 23:42:06 +01:00
CS-4346 - Added method to send a stream instead of a file. Also added a way of getting the sid for a transfer. To be reviewed by Gato. Migrated from 3.0.4
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@10556 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
8d07e07379
commit
708284ca46
3 changed files with 75 additions and 12 deletions
|
@ -19,12 +19,12 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.filetransfer;
|
package org.jivesoftware.smackx.filetransfer;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.XMPPException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import org.jivesoftware.smack.XMPPException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains the generic file information and progress related to a particular
|
* Contains the generic file information and progress related to a particular
|
||||||
* file transfer.
|
* file transfer.
|
||||||
|
@ -175,6 +175,10 @@ public abstract class FileTransfer {
|
||||||
return exception;
|
return exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getStreamID() {
|
||||||
|
return streamID;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancels the file transfer.
|
* Cancels the file transfer.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,9 +19,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.filetransfer;
|
package org.jivesoftware.smackx.filetransfer;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.jivesoftware.smack.PacketListener;
|
import org.jivesoftware.smack.PacketListener;
|
||||||
import org.jivesoftware.smack.XMPPConnection;
|
import org.jivesoftware.smack.XMPPConnection;
|
||||||
import org.jivesoftware.smack.filter.AndFilter;
|
import org.jivesoftware.smack.filter.AndFilter;
|
||||||
|
@ -30,9 +27,11 @@ import org.jivesoftware.smack.filter.PacketTypeFilter;
|
||||||
import org.jivesoftware.smack.packet.IQ;
|
import org.jivesoftware.smack.packet.IQ;
|
||||||
import org.jivesoftware.smack.packet.Packet;
|
import org.jivesoftware.smack.packet.Packet;
|
||||||
import org.jivesoftware.smack.packet.XMPPError;
|
import org.jivesoftware.smack.packet.XMPPError;
|
||||||
import org.jivesoftware.smack.util.StringUtils;
|
|
||||||
import org.jivesoftware.smackx.packet.StreamInitiation;
|
import org.jivesoftware.smackx.packet.StreamInitiation;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The file transfer manager class handles the sending and recieving of files.
|
* The file transfer manager class handles the sending and recieving of files.
|
||||||
* To send a file invoke the {@link #createOutgoingFileTransfer(String)} method.
|
* To send a file invoke the {@link #createOutgoingFileTransfer(String)} method.
|
||||||
|
@ -131,12 +130,13 @@ public class FileTransferManager {
|
||||||
* @return The send file object on which the negotiated transfer can be run.
|
* @return The send file object on which the negotiated transfer can be run.
|
||||||
*/
|
*/
|
||||||
public OutgoingFileTransfer createOutgoingFileTransfer(String userID) {
|
public OutgoingFileTransfer createOutgoingFileTransfer(String userID) {
|
||||||
if (userID == null || StringUtils.parseName(userID).length() <= 0
|
// Why is this only accepting fully qualified JID?
|
||||||
|| StringUtils.parseServer(userID).length() <= 0
|
// if (userID == null || StringUtils.parseName(userID).length() <= 0
|
||||||
|| StringUtils.parseResource(userID).length() <= 0) {
|
// || StringUtils.parseServer(userID).length() <= 0
|
||||||
throw new IllegalArgumentException(
|
// || StringUtils.parseResource(userID).length() <= 0) {
|
||||||
"The provided user id was not fully qualified");
|
// throw new IllegalArgumentException(
|
||||||
}
|
// "The provided user id was not fully qualified");
|
||||||
|
// }
|
||||||
|
|
||||||
return new OutgoingFileTransfer(connection.getUser(), userID,
|
return new OutgoingFileTransfer(connection.getUser(), userID,
|
||||||
fileTransferNegotiator.getNextStreamID(),
|
fileTransferNegotiator.getNextStreamID(),
|
||||||
|
|
|
@ -255,6 +255,65 @@ public class OutgoingFileTransfer extends FileTransfer {
|
||||||
transferThread.start();
|
transferThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method handles the stream negotiation process and transmits the file
|
||||||
|
* to the remote user. It returns immediatly and the progress of the file
|
||||||
|
* transfer can be monitored through several methods:
|
||||||
|
*
|
||||||
|
* <UL>
|
||||||
|
* <LI>{@link FileTransfer#getStatus()}
|
||||||
|
* <LI>{@link FileTransfer#getProgress()}
|
||||||
|
* <LI>{@link FileTransfer#isDone()}
|
||||||
|
* </UL>
|
||||||
|
*
|
||||||
|
* @param in the stream to transfer to the remote entity.
|
||||||
|
* @param fileName the name of the file that is transferred
|
||||||
|
* @param fileSize the size of the file that is transferred
|
||||||
|
* @param description a description for the file to transfer.
|
||||||
|
*/
|
||||||
|
public synchronized void sendStream(final InputStream in, final String fileName, final long fileSize, final String description){
|
||||||
|
checkTransferThread();
|
||||||
|
|
||||||
|
transferThread = new Thread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
//Create packet filter
|
||||||
|
try {
|
||||||
|
outputStream = negotiateStream(fileName, fileSize, description);
|
||||||
|
} catch (XMPPException e) {
|
||||||
|
handleXMPPException(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (outputStream == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!updateStatus(Status.negotiated, Status.in_progress)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
writeToStream(in, outputStream);
|
||||||
|
} catch (XMPPException e) {
|
||||||
|
setStatus(FileTransfer.Status.error);
|
||||||
|
setException(e);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (in != null) {
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
outputStream.flush();
|
||||||
|
outputStream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
/* Do Nothing */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateStatus(Status.in_progress, FileTransfer.Status.complete);
|
||||||
|
}
|
||||||
|
|
||||||
|
}, "File Transfer " + streamID);
|
||||||
|
transferThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
private void handleXMPPException(XMPPException e) {
|
private void handleXMPPException(XMPPException e) {
|
||||||
XMPPError error = e.getXMPPError();
|
XMPPError error = e.getXMPPError();
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
|
|
Loading…
Reference in a new issue