aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/xmpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/thedevstack/conversationsplus/xmpp')
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java1
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/FileTransferHttp.java3
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteRequestPacket.java (renamed from src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteSlotRequestPacket.java)8
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteSlotPacketParser.java29
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeletedPacketParser.java43
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/FileTransferHttpDeleteRequestPacketGenerator.java (renamed from src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/FileTransferHttpDeleteSlotRequestPacketGenerator.java)6
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/FileTransferHttpUploadSlotRequestPacket.java53
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/HttpUploadRequestSlotPacketGenerator.java35
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/HttpUploadSlotRequestPacket.java (renamed from src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/SlotRequestPacket.java)11
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/SlotPacketParser.java12
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/JingleConnection.java2
11 files changed, 154 insertions, 49 deletions
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java
index 1082e19f..b886bf65 100644
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java
@@ -1208,6 +1208,7 @@ public class XmppConnection implements Runnable {
disconnect(true);
return;
}
+ Logging.d("SendIqPacket", "Outgoing stanza: " + packet.toString());
tagWriter.writeStanzaAsync(packet);
if (packet instanceof AbstractAcknowledgeableStanza) {
AbstractAcknowledgeableStanza stanza = (AbstractAcknowledgeableStanza) packet;
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/FileTransferHttp.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/FileTransferHttp.java
index 28f4f870..1c6544b4 100644
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/FileTransferHttp.java
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/FileTransferHttp.java
@@ -1,8 +1,9 @@
package de.thedevstack.conversationsplus.xmpp.filetransfer.http;
/**
- * Created by steckbrief on 21.08.2016.
+ *
*/
public interface FileTransferHttp {
String NAMESPACE = "urn:xmpp:filetransfer:http";
+ String DEFAULT_MIME_TYPE = "application/octet-stream";
}
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteSlotRequestPacket.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteRequestPacket.java
index e389d851..d358a266 100644
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteSlotRequestPacket.java
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteRequestPacket.java
@@ -7,19 +7,19 @@ import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
/**
* Created by steckbrief on 21.08.2016.
*/
-public class DeleteSlotRequestPacket extends IqPacket {
+public class DeleteRequestPacket extends IqPacket {
public static final String ELEMENT_NAME = "request";
public static final String FILEURL_ELEMENT_NAME = "fileurl";
private Element requestElement;
private String fileurl;
- private DeleteSlotRequestPacket() {
+ private DeleteRequestPacket() {
super(TYPE.GET);
- this.requestElement = super.addChild(DeleteSlotRequestPacket.ELEMENT_NAME, FileTransferHttp.NAMESPACE);
+ this.requestElement = super.addChild(DeleteRequestPacket.ELEMENT_NAME, FileTransferHttp.NAMESPACE);
this.requestElement.setAttribute("type", "delete");
}
- public DeleteSlotRequestPacket(String fileurl) {
+ public DeleteRequestPacket(String fileurl) {
this();
this.setFileURL(fileurl);
}
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteSlotPacketParser.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteSlotPacketParser.java
deleted file mode 100644
index 7c011449..00000000
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeleteSlotPacketParser.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package de.thedevstack.conversationsplus.xmpp.filetransfer.http.delete;
-
-import de.thedevstack.conversationsplus.xml.Element;
-import de.thedevstack.conversationsplus.xmpp.IqPacketParser;
-import de.thedevstack.conversationsplus.xmpp.exceptions.UnexpectedIqPacketTypeException;
-import de.thedevstack.conversationsplus.xmpp.exceptions.XmppException;
-import de.thedevstack.conversationsplus.xmpp.filetransfer.http.FileTransferHttp;
-import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
-import de.thedevstack.conversationsplus.xmpp.utils.ErrorIqPacketExceptionHelper;
-
-/**
- * Created by steckbrief on 21.08.2016.
- */
-public class DeleteSlotPacketParser extends IqPacketParser {
- public static String parseDeleteToken(IqPacket packet) throws XmppException {
- String deletetoken = null;
- if (packet.getType() == IqPacket.TYPE.RESULT) {
- Element slot = findRequiredChild(packet, "slot", FileTransferHttp.NAMESPACE);
-
- deletetoken = findRequiredChildContent(slot, "deletetoken");
- } else if (packet.getType() == IqPacket.TYPE.ERROR) {
- ErrorIqPacketExceptionHelper.throwIqErrorException(packet);
- } else {
- throw new UnexpectedIqPacketTypeException(packet, packet.getType(), IqPacket.TYPE.RESULT, IqPacket.TYPE.ERROR);
- }
-
- return deletetoken;
- }
-}
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeletedPacketParser.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeletedPacketParser.java
new file mode 100644
index 00000000..df17a997
--- /dev/null
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/DeletedPacketParser.java
@@ -0,0 +1,43 @@
+package de.thedevstack.conversationsplus.xmpp.filetransfer.http.delete;
+
+import de.thedevstack.conversationsplus.xml.Element;
+import de.thedevstack.conversationsplus.xmpp.IqPacketParser;
+import de.thedevstack.conversationsplus.xmpp.exceptions.UnexpectedIqPacketTypeException;
+import de.thedevstack.conversationsplus.xmpp.exceptions.XmppException;
+import de.thedevstack.conversationsplus.xmpp.filetransfer.http.FileTransferHttp;
+import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
+import de.thedevstack.conversationsplus.xmpp.utils.ErrorIqPacketExceptionHelper;
+
+/**
+ * IqPacketParser to parse the response of a remote file delete request.
+ * This parser parses a IqPacket according to the specification 'filetransfer for XMPP over http".
+ */
+public class DeletedPacketParser extends IqPacketParser {
+ /**
+ * Parses an IqPacket.
+ * <pre>
+ * <iq from='montague.tld'
+ * id='delete-file_002'
+ * to='romeo@montague.tld/garden'
+ * type='result'>
+ * <deleted xmlns='urn:xmpp:filetransfer:http'/>
+ * </iq>
+ * </pre>
+ * @param packet the packet to parse
+ * @return <code>true</code> if the result packet contains a deleted element of namespace <code>urn:xmpp:filetransfer:http</code>
+ * @throws XmppException in case of IqPacket type error or {@link UnexpectedIqPacketTypeException} in case of an unexpected IqPacket type.
+ */
+ public static boolean parseDeleteToken(IqPacket packet) throws XmppException {
+ boolean successfullyDeleted = false;
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ Element deletedElement = findRequiredChild(packet, "deleted", FileTransferHttp.NAMESPACE);
+ successfullyDeleted = null != deletedElement;
+ } else if (packet.getType() == IqPacket.TYPE.ERROR) {
+ ErrorIqPacketExceptionHelper.throwIqErrorException(packet);
+ } else {
+ throw new UnexpectedIqPacketTypeException(packet, packet.getType(), IqPacket.TYPE.RESULT, IqPacket.TYPE.ERROR);
+ }
+
+ return successfullyDeleted;
+ }
+}
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/FileTransferHttpDeleteSlotRequestPacketGenerator.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/FileTransferHttpDeleteRequestPacketGenerator.java
index ac7de74e..88ad5d5a 100644
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/FileTransferHttpDeleteSlotRequestPacketGenerator.java
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/delete/FileTransferHttpDeleteRequestPacketGenerator.java
@@ -6,7 +6,7 @@ import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
/**
* Created by steckbrief on 21.08.2016.
*/
-public final class FileTransferHttpDeleteSlotRequestPacketGenerator {
+public final class FileTransferHttpDeleteRequestPacketGenerator {
/**
* Generates the IqPacket to request a slot to delete a file previously uploaded via http upload.
* The attributes from and id are not set in here - this is added while sending the packet.
@@ -25,7 +25,7 @@ public final class FileTransferHttpDeleteSlotRequestPacketGenerator {
* @return the IqPacket
*/
public static IqPacket generate(Jid host, String fileurl) {
- DeleteSlotRequestPacket packet = new DeleteSlotRequestPacket(fileurl);
+ DeleteRequestPacket packet = new DeleteRequestPacket(fileurl);
packet.setTo(host);
return packet;
}
@@ -33,7 +33,7 @@ public final class FileTransferHttpDeleteSlotRequestPacketGenerator {
/**
* Utility class - avoid instantiation
*/
- private FileTransferHttpDeleteSlotRequestPacketGenerator() {
+ private FileTransferHttpDeleteRequestPacketGenerator() {
// Helper class - avoid instantiation
}
}
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/FileTransferHttpUploadSlotRequestPacket.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/FileTransferHttpUploadSlotRequestPacket.java
new file mode 100644
index 00000000..2d7ed1c7
--- /dev/null
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/FileTransferHttpUploadSlotRequestPacket.java
@@ -0,0 +1,53 @@
+package de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload;
+
+import de.thedevstack.conversationsplus.xml.Element;
+import de.thedevstack.conversationsplus.xmpp.filetransfer.http.FileTransferHttp;
+import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
+
+/**
+ *
+ */
+public class FileTransferHttpUploadSlotRequestPacket extends IqPacket {
+ public static final String ELEMENT_NAME = "request";
+ public static final String FILENAME_ELEMENT_NAME = "filename";
+ public static final String FILESIZE_ELEMENT_NAME = "size";
+ public static final String MIME_ELEMENT_NAME = "content-type";
+ private static final String RECIPIENT_ATTRIBUTE_NAME = "recipient";
+ private Element requestElement;
+ private String filename;
+ private long filesize;
+ private String mime;
+
+ public FileTransferHttpUploadSlotRequestPacket(String recipient, String filename, long filesize, String mime) {
+ super(TYPE.GET);
+ this.requestElement = super.addChild(FileTransferHttpUploadSlotRequestPacket.ELEMENT_NAME, FileTransferHttp.NAMESPACE);
+ this.requestElement.setAttribute(RECIPIENT_ATTRIBUTE_NAME, recipient);
+ this.setFilename(filename);
+ this.setFilesize(filesize);
+ this.setMime(mime);
+ }
+
+ public void setFilename(String filename) {
+ if (null == filename || filename.isEmpty()) {
+ throw new IllegalArgumentException("filename must not be null or empty.");
+ }
+ this.filename = filename;
+ this.requestElement.addChild(FILENAME_ELEMENT_NAME).setContent(filename);
+ }
+
+ public void setFilesize(long filesize) {
+ if (0 >= filesize) {
+ throw new IllegalArgumentException("filesize must not be null or empty.");
+ }
+ this.filesize = filesize;
+ this.requestElement.addChild(FILESIZE_ELEMENT_NAME).setContent(String.valueOf(filesize));
+ }
+
+ public void setMime(String mime) {
+ if (null == mime || mime.isEmpty()) {
+ mime = FileTransferHttp.DEFAULT_MIME_TYPE;
+ }
+ this.mime = mime;
+ this.requestElement.addChild(MIME_ELEMENT_NAME).setContent(mime);
+ }
+}
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/HttpUploadRequestSlotPacketGenerator.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/HttpUploadRequestSlotPacketGenerator.java
index 4b0a956c..db455b7a 100644
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/HttpUploadRequestSlotPacketGenerator.java
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/HttpUploadRequestSlotPacketGenerator.java
@@ -1,5 +1,7 @@
package de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload;
+import de.thedevstack.conversationsplus.entities.Account;
+import de.thedevstack.conversationsplus.xmpp.filetransfer.http.FileTransferHttp;
import de.thedevstack.conversationsplus.xmpp.jid.Jid;
import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
@@ -24,17 +26,38 @@ public final class HttpUploadRequestSlotPacketGenerator {
* </request>
* </iq>
* </pre>
- * @param host the jid of the host to request a slot from
+ * @param account the account requesting a slot
* @param filename the filename of the file which will be transferred
* @param filesize the filesize of the file which will be transferred
* @param mime the mime type of the file which will be transferred - <code>optional</code> and therefore nullable
* @return the IqPacket
*/
- public static IqPacket generate(Jid host, String filename, long filesize, String mime) {
- SlotRequestPacket packet = new SlotRequestPacket(filename, filesize);
- packet.setTo(host);
- packet.setMime((mime == null || mime.isEmpty()) ? HttpUpload.DEFAULT_MIME_TYPE : mime);
- return packet;
+ public static IqPacket generate(Account account, Jid recipient, String filename, long filesize, String mime) {
+ String namespace = getNamespace(account);
+ Jid host = getHost(account, namespace);
+ IqPacket requestPacket;
+ switch (namespace) {
+ case HttpUpload.NAMESPACE:
+ requestPacket = new HttpUploadSlotRequestPacket(filename, filesize, mime);
+ break;
+ case FileTransferHttp.NAMESPACE:
+ default:
+ requestPacket = new FileTransferHttpUploadSlotRequestPacket(recipient.toString(), filename, filesize, mime);
+ }
+ requestPacket.setTo(host);
+ return requestPacket;
+ }
+
+ private static String getNamespace(Account account) {
+ if (null != account.getXmppConnection().findDiscoItemByFeature(FileTransferHttp.NAMESPACE)) {
+ return FileTransferHttp.NAMESPACE;
+ } else {
+ return HttpUpload.NAMESPACE;
+ }
+ }
+
+ private static Jid getHost(Account account, String namespace) {
+ return account.getXmppConnection().findDiscoItemByFeature(namespace);
}
/**
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/SlotRequestPacket.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/HttpUploadSlotRequestPacket.java
index d0866508..93422d3f 100644
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/SlotRequestPacket.java
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/HttpUploadSlotRequestPacket.java
@@ -6,7 +6,7 @@ import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
/**
*
*/
-public class SlotRequestPacket extends IqPacket {
+public class HttpUploadSlotRequestPacket extends IqPacket {
public static final String ELEMENT_NAME = "request";
public static final String FILENAME_ELEMENT_NAME = "filename";
public static final String FILESIZE_ELEMENT_NAME = "size";
@@ -16,15 +16,16 @@ public class SlotRequestPacket extends IqPacket {
private long filesize;
private String mime;
- private SlotRequestPacket() {
+ private HttpUploadSlotRequestPacket() {
super(TYPE.GET);
- this.requestElement = super.addChild(SlotRequestPacket.ELEMENT_NAME, HttpUpload.NAMESPACE);
+ this.requestElement = super.addChild(HttpUploadSlotRequestPacket.ELEMENT_NAME, HttpUpload.NAMESPACE);
}
- public SlotRequestPacket(String filename, long filesize) {
+ public HttpUploadSlotRequestPacket(String filename, long filesize, String mime) {
this();
this.setFilename(filename);
this.setFilesize(filesize);
+ this.setMime(mime);
}
public void setFilename(String filename) {
@@ -45,7 +46,7 @@ public class SlotRequestPacket extends IqPacket {
public void setMime(String mime) {
if (null == mime || mime.isEmpty()) {
- throw new IllegalArgumentException("mime type must not be null or empty.");
+ mime = HttpUpload.DEFAULT_MIME_TYPE;
}
this.mime = mime;
this.requestElement.addChild(MIME_ELEMENT_NAME).setContent(mime);
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/SlotPacketParser.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/SlotPacketParser.java
index 85d11b6b..e2d629e4 100644
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/SlotPacketParser.java
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/filetransfer/http/upload/SlotPacketParser.java
@@ -2,8 +2,10 @@ package de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload;
import de.thedevstack.conversationsplus.xml.Element;
import de.thedevstack.conversationsplus.xmpp.IqPacketParser;
+import de.thedevstack.conversationsplus.xmpp.exceptions.MissingRequiredElementException;
import de.thedevstack.conversationsplus.xmpp.exceptions.UnexpectedIqPacketTypeException;
import de.thedevstack.conversationsplus.xmpp.exceptions.XmppException;
+import de.thedevstack.conversationsplus.xmpp.filetransfer.http.FileTransferHttp;
import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
import de.thedevstack.conversationsplus.xmpp.utils.ErrorIqPacketExceptionHelper;
@@ -11,10 +13,18 @@ import de.thedevstack.conversationsplus.xmpp.utils.ErrorIqPacketExceptionHelper;
*
*/
public final class SlotPacketParser extends IqPacketParser {
+ private static final String SLOT_ELEMENT_NAME = "slot";
+
public static HttpUploadSlot parseGetAndPutUrl(IqPacket packet) throws XmppException {
HttpUploadSlot httpUploadSlot = null;
if (packet.getType() == IqPacket.TYPE.RESULT) {
- Element slot = findRequiredChild(packet, "slot", HttpUpload.NAMESPACE);
+ Element slot = findChild(packet, SLOT_ELEMENT_NAME, FileTransferHttp.NAMESPACE);
+ if (null == slot) {
+ slot = findChild(packet, SLOT_ELEMENT_NAME, HttpUpload.NAMESPACE);
+ }
+ if (null == slot) {
+ throw new MissingRequiredElementException(SLOT_ELEMENT_NAME, "neither " + FileTransferHttp.NAMESPACE + " nor " + HttpUpload.NAMESPACE, packet);
+ }
String getUrl = findRequiredChildContent(slot, "get");
String putUrl = findRequiredChildContent(slot, "put");
diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/JingleConnection.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/JingleConnection.java
index aa85430b..ea93fdb8 100644
--- a/src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/JingleConnection.java
+++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/JingleConnection.java
@@ -464,6 +464,8 @@ public class JingleConnection implements Transferable {
}
});
+ } else {
+ fail();
}
}