1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2025-12-14 23:11:08 +01:00

Merge branch '4.2' into master-paul-merged

This commit is contained in:
Florian Schmaus 2017-12-17 11:16:02 +01:00
commit 431e5b3c67
434 changed files with 1770 additions and 1517 deletions

View file

@ -64,7 +64,18 @@ import org.jxmpp.jid.DomainBareJid;
*/
public final class HttpFileUploadManager extends Manager {
/**
* Namespace of XEP-0363 v0.4 or higher. Constant value {@value #NAMESPACE}.
*
* @see <a href="https://xmpp.org/extensions/attic/xep-0363-0.4.0.html">XEP-0363 v0.4.0</a>
*/
public static final String NAMESPACE = "urn:xmpp:http:upload:0";
/**
* Namespace of XEP-0363 v0.2 or lower. Constant value {@value #NAMESPACE_0_2}.
*
* @see <a href="https://xmpp.org/extensions/attic/xep-0363-0.2.5.html">XEP-0363 v0.2.5</a>
*/
public static final String NAMESPACE_0_2 = "urn:xmpp:http:upload";
private static final Logger LOGGER = Logger.getLogger(HttpFileUploadManager.class.getName());
@ -459,6 +470,22 @@ public final class HttpFileUploadManager extends Manager {
}
}
public static UploadService.Version namespaceToVersion(String namespace) {
UploadService.Version version;
switch (namespace) {
case NAMESPACE:
version = Version.v0_3;
break;
case NAMESPACE_0_2:
version = Version.v0_2;
break;
default:
version = null;
break;
}
return version;
}
private static boolean containsHttpFileUploadNamespace(DiscoverInfo discoverInfo) {
return discoverInfo.containsFeature(NAMESPACE) || discoverInfo.containsFeature(NAMESPACE_0_2);
}

View file

@ -22,8 +22,19 @@ import org.jxmpp.jid.DomainBareJid;
public class UploadService {
enum Version {
public enum Version {
/**
* Upload service as specified in XEP-0363 v0.2 or lower.
*
* @see <a href="https://xmpp.org/extensions/attic/xep-0363-0.2.5.html">XEP-0363 v0.2.5</a>
*/
v0_2,
/**
* Upload service as specified in XEP-0363 v0.3 or higher.
*
* @see <a href="https://xmpp.org/extensions/attic/xep-0363-0.4.0.html">XEP-0363 v0.4.0</a>
*/
v0_3,
}

View file

@ -33,8 +33,9 @@ public class Slot extends IQ {
public static final String ELEMENT = "slot";
public static final String NAMESPACE = SlotRequest.NAMESPACE;
private final URL putUrl;
private final URL getUrl;
protected final URL putUrl;
protected final URL getUrl;
private final Map<String, String> headers;
public Slot(URL putUrl, URL getUrl) {
@ -73,12 +74,21 @@ public class Slot extends IQ {
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.rightAngleBracket();
xml.element("put", putUrl.toString());
xml.element("get", getUrl.toString());
for (Map.Entry<String, String> entry : getHeaders().entrySet()) {
xml.openElement("header").attribute(entry.getKey(), entry.getValue());
xml.halfOpenElement("put").attribute("url", putUrl.toString());
if (headers.isEmpty()) {
xml.closeEmptyElement();
} else {
xml.rightAngleBracket();
for (Map.Entry<String, String> entry : getHeaders().entrySet()) {
xml.halfOpenElement("header").attribute("name", entry.getKey()).rightAngleBracket();
xml.escape(entry.getValue());
xml.closeElement("header");
}
xml.closeElement("put");
}
xml.halfOpenElement("get").attribute("url", getUrl.toString()).closeEmptyElement();
return xml;
}
}

View file

@ -28,4 +28,13 @@ public class Slot_V0_2 extends Slot {
super(putUrl, getUrl, null, NAMESPACE);
}
@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.rightAngleBracket();
xml.element("put", putUrl.toString());
xml.element("get", getUrl.toString());
return xml;
}
}

View file

@ -1,6 +1,6 @@
/**
*
* Copyright © 2017 Grigory Fedorov
* Copyright © 2017 Grigory Fedorov, Florian Schmaus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -25,6 +25,8 @@ import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.util.ParserUtils;
import org.jivesoftware.smackx.httpfileupload.HttpFileUploadManager;
import org.jivesoftware.smackx.httpfileupload.UploadService;
import org.jivesoftware.smackx.httpfileupload.element.Slot;
import org.jivesoftware.smackx.httpfileupload.element.Slot_V0_2;
@ -42,9 +44,13 @@ public class SlotProvider extends IQProvider<Slot> {
@Override
public Slot parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException, SmackException {
final String namespace = parser.getNamespace();
final UploadService.Version version = HttpFileUploadManager.namespaceToVersion(namespace);
assert version != null;
URL putUrl = null;
URL getUrl = null;
Map<String, String> headers = null;
PutElement_V0_4_Content putElementV04Content = null;
outerloop: while (true) {
int event = parser.next();
@ -53,19 +59,33 @@ public class SlotProvider extends IQProvider<Slot> {
case XmlPullParser.START_TAG:
String name = parser.getName();
switch (name) {
case "put":
putUrl = new URL(parser.nextText());
break;
case "get":
getUrl = new URL(parser.nextText());
break;
case "header":
String headerName = ParserUtils.getRequiredAttribute(parser, "name");
String headerValue = ParserUtils.getRequiredNextText(parser);
if (headers == null) {
headers = new HashMap<>();
case "put": {
switch (version) {
case v0_2:
String putUrlString = parser.nextText();
putUrl = new URL(putUrlString);
break;
case v0_3:
putElementV04Content = parsePutElement_V0_4(parser);
break;
default:
throw new AssertionError();
}
headers.put(headerName, headerValue);
break;
}
case "get":
String getUrlString;
switch (version) {
case v0_2:
getUrlString = parser.nextText();
break;
case v0_3:
getUrlString = parser.getAttributeValue(null, "url");
break;
default:
throw new AssertionError();
}
getUrl = new URL(getUrlString);
break;
}
break;
@ -77,13 +97,67 @@ public class SlotProvider extends IQProvider<Slot> {
}
}
switch (namespace) {
case Slot.NAMESPACE:
return new Slot(putUrl, getUrl, headers);
case Slot_V0_2.NAMESPACE:
switch (version) {
case v0_3:
return new Slot(putElementV04Content.putUrl, getUrl, putElementV04Content.headers);
case v0_2:
return new Slot_V0_2(putUrl, getUrl);
default:
throw new AssertionError();
}
}
public static PutElement_V0_4_Content parsePutElement_V0_4(XmlPullParser parser) throws XmlPullParserException, IOException {
final int initialDepth = parser.getDepth();
String putUrlString = parser.getAttributeValue(null, "url");
URL putUrl = new URL(putUrlString);
Map<String, String> headers = null;
outerloop: while (true) {
int next = parser.next();
switch (next) {
case XmlPullParser.START_TAG:
String name = parser.getName();
switch (name) {
case "header":
String headerName = ParserUtils.getRequiredAttribute(parser, "name");
String headerValue = ParserUtils.getRequiredNextText(parser);
if (headers == null) {
headers = new HashMap<>();
}
headers.put(headerName, headerValue);
break;
default:
break;
}
break;
case XmlPullParser.END_TAG:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
}
}
return new PutElement_V0_4_Content(putUrl, headers);
}
public static final class PutElement_V0_4_Content {
private final URL putUrl;
private final Map<String, String> headers;
private PutElement_V0_4_Content(URL putUrl, Map<String, String> headers) {
this.putUrl = putUrl;
this.headers = headers;
}
public URL getPutUrl() {
return putUrl;
}
public Map<String, String> getHeaders() {
return headers;
}
}
}