1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2025-09-10 17:49:38 +02:00

Basic Sending/Receiving Files works again

This commit is contained in:
vanitasvitae 2017-07-29 22:21:36 +02:00
parent af069ffc49
commit 1dbdafe28c
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
9 changed files with 236 additions and 88 deletions

View file

@ -63,6 +63,18 @@ public abstract class JingleFileTransfer extends JingleDescription<JingleFileTra
}
}
public void notifyProgressListenersFinished() {
for (ProgressListener p : progressListeners) {
p.finished();
}
}
public void notifyProgressListenersStarted() {
for (ProgressListener p : progressListeners) {
p.started();
}
}
@Override
public String getNamespace() {
return JingleFileTransfer.NAMESPACE;

View file

@ -17,8 +17,10 @@
package org.jivesoftware.smackx.jft.internal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -41,6 +43,8 @@ public class JingleIncomingFileOffer extends AbstractJingleFileOffer<RemoteFile>
private static final Logger LOGGER = Logger.getLogger(JingleIncomingFileOffer.class.getName());
private File target;
public JingleIncomingFileOffer(JingleFileTransferChildElement offer) {
super(new RemoteFile(offer));
}
@ -52,13 +56,61 @@ public class JingleIncomingFileOffer extends AbstractJingleFileOffer<RemoteFile>
@Override
public void onTransportReady(BytestreamSession bytestreamSession) {
InputStream inputStream;
LOGGER.log(Level.INFO, "Receive file to " + target.getAbsolutePath());
File mFile = target;
if (!mFile.exists()) {
try {
mFile.createNewFile();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Could not create new File!");
}
}
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = bytestreamSession.getInputStream();
outputStream = new FileOutputStream(mFile);
byte[] filebuf = new byte[(int) file.getSize()];
int read = 0;
byte[] bufbuf = new byte[4096];
LOGGER.log(Level.INFO, "Begin receiving bytes.");
while (read < filebuf.length) {
int r = inputStream.read(bufbuf);
if (r >= 0) {
System.arraycopy(bufbuf, 0, filebuf, read, r);
read += r;
LOGGER.log(Level.INFO, "Read " + r + " (" + read + " of " + filebuf.length + ") bytes.");
} else {
break;
}
}
outputStream.write(filebuf);
outputStream.flush();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Cannot get InputStream from BytestreamSession: " + e, e);
return;
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Could not close InputStream: " + e, e);
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Could not close OutputStream: " + e, e);
}
}
}
notifyProgressListenersFinished();
}
@Override
@ -75,6 +127,7 @@ public class JingleIncomingFileOffer extends AbstractJingleFileOffer<RemoteFile>
public Future<Void> accept(XMPPConnection connection, File target)
throws InterruptedException, XMPPException.XMPPErrorException, SmackException.NotConnectedException,
SmackException.NoResponseException {
this.target = target;
JingleSession session = getParent().getParent();
if (session.getSessionState() == JingleSession.SessionState.pending) {
session.accept(connection);

View file

@ -17,6 +17,12 @@
package org.jivesoftware.smackx.jft.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jivesoftware.smackx.bytestreams.BytestreamSession;
import org.jivesoftware.smackx.jft.controller.OutgoingFileOfferController;
@ -28,6 +34,7 @@ import org.jivesoftware.smackx.jingle.element.JingleElement;
* Created by vanitas on 26.07.17.
*/
public class JingleOutgoingFileOffer extends AbstractJingleFileOffer<LocalFile> implements OutgoingFileOfferController {
private static final Logger LOGGER = Logger.getLogger(JingleOutgoingFileOffer.class.getName());
public JingleOutgoingFileOffer(File file) {
super(new LocalFile(file));
@ -40,7 +47,34 @@ public class JingleOutgoingFileOffer extends AbstractJingleFileOffer<LocalFile>
@Override
public void onTransportReady(BytestreamSession bytestreamSession) {
File mFile = ((LocalFile) file).getFile();
OutputStream outputStream = null;
InputStream inputStream = null;
try {
outputStream = bytestreamSession.getOutputStream();
inputStream = new FileInputStream(mFile);
byte[] fileBuf = new byte[(int) mFile.length()];
inputStream.read(fileBuf);
outputStream.write(fileBuf);
outputStream.flush();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Exception while sending file: " + e, e);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Could not close FileInputStream: " + e, e);
}
}
}
notifyProgressListenersFinished();
}
@Override

View file

@ -88,4 +88,8 @@ public class LocalFile extends AbstractJingleFileTransferFile {
public void setHashElement(HashElement hashElement) {
this.hashElement = hashElement;
}
public File getFile() {
return file;
}
}