mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-22 06:12:05 +01:00
Merge branch '4.4'
This commit is contained in:
commit
5782fff2a4
38 changed files with 426 additions and 227 deletions
|
@ -62,7 +62,7 @@ allprojects {
|
||||||
':smack-bosh',
|
':smack-bosh',
|
||||||
':smack-debug',
|
':smack-debug',
|
||||||
':smack-debug-slf4j',
|
':smack-debug-slf4j',
|
||||||
':smack-java7',
|
':smack-java8',
|
||||||
':smack-jingle-old',
|
':smack-jingle-old',
|
||||||
':smack-resolver-dnsjava',
|
':smack-resolver-dnsjava',
|
||||||
':smack-resolver-javax',
|
':smack-resolver-javax',
|
||||||
|
|
|
@ -22,7 +22,7 @@ include 'smack-core',
|
||||||
'smack-bosh',
|
'smack-bosh',
|
||||||
'smack-android',
|
'smack-android',
|
||||||
'smack-android-extensions',
|
'smack-android-extensions',
|
||||||
'smack-java7',
|
'smack-java8',
|
||||||
'smack-java8-full',
|
'smack-java8-full',
|
||||||
'smack-integration-test',
|
'smack-integration-test',
|
||||||
'smack-omemo',
|
'smack-omemo',
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2019 Florian Schmaus
|
* Copyright 2019-2020 Florian Schmaus
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -36,7 +36,16 @@ public class AbstractProvider<E extends Element> {
|
||||||
Type[] actualTypeArguments = parameterizedGenericSuperclass.getActualTypeArguments();
|
Type[] actualTypeArguments = parameterizedGenericSuperclass.getActualTypeArguments();
|
||||||
Type elementType = actualTypeArguments[0];
|
Type elementType = actualTypeArguments[0];
|
||||||
|
|
||||||
|
|
||||||
|
if (elementType instanceof Class) {
|
||||||
elementClass = (Class<E>) elementType;
|
elementClass = (Class<E>) elementType;
|
||||||
|
} else if (elementType instanceof ParameterizedType) {
|
||||||
|
ParameterizedType parameteriezedElementType = (ParameterizedType) elementType;
|
||||||
|
elementClass = (Class<E>) parameteriezedElementType.getRawType();
|
||||||
|
} else {
|
||||||
|
throw new AssertionError(
|
||||||
|
"Element type '" + elementType + "' is neither of type Class or ParameterizedType");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Class<E> getElementClass() {
|
public final Class<E> getElementClass() {
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2020 Florian Schmaus.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smack.util;
|
||||||
|
|
||||||
|
public final class Pair<F, S> {
|
||||||
|
|
||||||
|
private final F first;
|
||||||
|
private final S second;
|
||||||
|
|
||||||
|
private Pair(F first, S second) {
|
||||||
|
this.first = first;
|
||||||
|
this.second = second;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <F extends Object, S extends Object> Pair<F, S> create(F first, S second) {
|
||||||
|
return new Pair<>(first, second);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <F extends Object, S extends Object> Pair<F, S> createAndInitHashCode(F first, S second) {
|
||||||
|
Pair<F, S> pair = new Pair<>(first, second);
|
||||||
|
pair.hashCode();
|
||||||
|
return pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
public F getFirst() {
|
||||||
|
return first;
|
||||||
|
}
|
||||||
|
|
||||||
|
public S getSecond() {
|
||||||
|
return second;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final HashCode.Cache hashCodeCache = new HashCode.Cache();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return hashCodeCache.getHashCode(c ->
|
||||||
|
c.append(first)
|
||||||
|
.append(second)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object object) {
|
||||||
|
return EqualsUtil.equals(this, object, (e, o) ->
|
||||||
|
e.append(first, o.first)
|
||||||
|
.append(second, o.second)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -132,8 +132,8 @@ public final class CarbonManager extends Manager {
|
||||||
final Message wrappingMessage = (Message) stanza;
|
final Message wrappingMessage = (Message) stanza;
|
||||||
final CarbonExtension carbonExtension = CarbonExtension.from(wrappingMessage);
|
final CarbonExtension carbonExtension = CarbonExtension.from(wrappingMessage);
|
||||||
final Direction direction = carbonExtension.getDirection();
|
final Direction direction = carbonExtension.getDirection();
|
||||||
final Forwarded forwarded = carbonExtension.getForwarded();
|
final Forwarded<Message> forwarded = carbonExtension.getForwarded();
|
||||||
final Message carbonCopy = (Message) forwarded.getForwardedStanza();
|
final Message carbonCopy = forwarded.getForwardedStanza();
|
||||||
final BareJid from = carbonCopy.getFrom().asBareJid();
|
final BareJid from = carbonCopy.getFrom().asBareJid();
|
||||||
|
|
||||||
carbonsListenerAsyncButOrdered.performAsyncButOrdered(from, new Runnable() {
|
carbonsListenerAsyncButOrdered.performAsyncButOrdered(from, new Runnable() {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2013-2014 Georg Lukas
|
* Copyright 2013-2014 Georg Lukas, 2020 Florian Schmaus
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -38,7 +38,7 @@ public class CarbonExtension implements ExtensionElement {
|
||||||
public static final String NAMESPACE = Carbon.NAMESPACE;
|
public static final String NAMESPACE = Carbon.NAMESPACE;
|
||||||
|
|
||||||
private final Direction dir;
|
private final Direction dir;
|
||||||
private final Forwarded fwd;
|
private final Forwarded<Message> fwd;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a Carbon message extension.
|
* Construct a Carbon message extension.
|
||||||
|
@ -46,7 +46,7 @@ public class CarbonExtension implements ExtensionElement {
|
||||||
* @param dir Determines if the carbon is being sent/received
|
* @param dir Determines if the carbon is being sent/received
|
||||||
* @param fwd The forwarded message.
|
* @param fwd The forwarded message.
|
||||||
*/
|
*/
|
||||||
public CarbonExtension(Direction dir, Forwarded fwd) {
|
public CarbonExtension(Direction dir, Forwarded<Message> fwd) {
|
||||||
this.dir = dir;
|
this.dir = dir;
|
||||||
this.fwd = fwd;
|
this.fwd = fwd;
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ public class CarbonExtension implements ExtensionElement {
|
||||||
*
|
*
|
||||||
* @return the {@link Forwarded} message contained in this Carbon.
|
* @return the {@link Forwarded} message contained in this Carbon.
|
||||||
*/
|
*/
|
||||||
public Forwarded getForwarded() {
|
public Forwarded<Message> getForwarded() {
|
||||||
return fwd;
|
return fwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2013-2014 Georg Lukas
|
* Copyright 2013-2014 Georg Lukas, 2020 Florian Schmaus.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -18,6 +18,7 @@ package org.jivesoftware.smackx.carbons.provider;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.Message;
|
||||||
import org.jivesoftware.smack.packet.XmlEnvironment;
|
import org.jivesoftware.smack.packet.XmlEnvironment;
|
||||||
import org.jivesoftware.smack.parsing.SmackParsingException;
|
import org.jivesoftware.smack.parsing.SmackParsingException;
|
||||||
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
||||||
|
@ -38,25 +39,22 @@ import org.jivesoftware.smackx.forward.provider.ForwardedProvider;
|
||||||
*/
|
*/
|
||||||
public class CarbonManagerProvider extends ExtensionElementProvider<CarbonExtension> {
|
public class CarbonManagerProvider extends ExtensionElementProvider<CarbonExtension> {
|
||||||
|
|
||||||
private static final ForwardedProvider FORWARDED_PROVIDER = new ForwardedProvider();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CarbonExtension parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
|
public CarbonExtension parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
|
||||||
Direction dir = Direction.valueOf(parser.getName());
|
Direction dir = Direction.valueOf(parser.getName());
|
||||||
Forwarded fwd = null;
|
Forwarded<Message> fwd = null;
|
||||||
|
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
XmlPullParser.Event eventType = parser.next();
|
XmlPullParser.Event eventType = parser.next();
|
||||||
if (eventType == XmlPullParser.Event.START_ELEMENT && parser.getName().equals("forwarded")) {
|
if (eventType == XmlPullParser.Event.START_ELEMENT && parser.getName().equals("forwarded")) {
|
||||||
fwd = FORWARDED_PROVIDER.parse(parser);
|
fwd = ForwardedProvider.parseForwardedMessage(parser, xmlEnvironment);
|
||||||
}
|
}
|
||||||
else if (eventType == XmlPullParser.Event.END_ELEMENT && dir == Direction.valueOf(parser.getName()))
|
else if (eventType == XmlPullParser.Event.END_ELEMENT && dir == Direction.valueOf(parser.getName()))
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
if (fwd == null) {
|
if (fwd == null) {
|
||||||
// TODO: Should be SmackParseException.
|
throw new SmackParsingException("sent/received must contain exactly one <forwarded/> element");
|
||||||
throw new IOException("sent/received must contain exactly one <forwarded> tag");
|
|
||||||
}
|
}
|
||||||
return new CarbonExtension(dir, fwd);
|
return new CarbonExtension(dir, fwd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -632,7 +632,7 @@ public final class MamManager extends Manager {
|
||||||
private final MamFinIQ mamFin;
|
private final MamFinIQ mamFin;
|
||||||
private final List<Message> mamResultCarrierMessages;
|
private final List<Message> mamResultCarrierMessages;
|
||||||
private final List<MamResultExtension> mamResultExtensions;
|
private final List<MamResultExtension> mamResultExtensions;
|
||||||
private final List<Forwarded> forwardedMessages;
|
private final List<Forwarded<Message>> forwardedMessages;
|
||||||
private final List<Message> messages;
|
private final List<Message> messages;
|
||||||
|
|
||||||
private MamQueryPage(StanzaCollector stanzaCollector, MamFinIQ mamFin) {
|
private MamQueryPage(StanzaCollector stanzaCollector, MamFinIQ mamFin) {
|
||||||
|
@ -642,7 +642,7 @@ public final class MamManager extends Manager {
|
||||||
|
|
||||||
List<Message> mamResultCarrierMessages = new ArrayList<>(mamResultCarrierStanzas.size());
|
List<Message> mamResultCarrierMessages = new ArrayList<>(mamResultCarrierStanzas.size());
|
||||||
List<MamResultExtension> mamResultExtensions = new ArrayList<>(mamResultCarrierStanzas.size());
|
List<MamResultExtension> mamResultExtensions = new ArrayList<>(mamResultCarrierStanzas.size());
|
||||||
List<Forwarded> forwardedMessages = new ArrayList<>(mamResultCarrierStanzas.size());
|
List<Forwarded<Message>> forwardedMessages = new ArrayList<>(mamResultCarrierStanzas.size());
|
||||||
|
|
||||||
for (Stanza mamResultStanza : mamResultCarrierStanzas) {
|
for (Stanza mamResultStanza : mamResultCarrierStanzas) {
|
||||||
Message resultMessage = (Message) mamResultStanza;
|
Message resultMessage = (Message) mamResultStanza;
|
||||||
|
@ -665,7 +665,7 @@ public final class MamManager extends Manager {
|
||||||
return messages;
|
return messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Forwarded> getForwarded() {
|
public List<Forwarded<Message>> getForwarded() {
|
||||||
return forwardedMessages;
|
return forwardedMessages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import org.jivesoftware.smack.packet.Element;
|
import org.jivesoftware.smack.packet.Element;
|
||||||
import org.jivesoftware.smack.packet.ExtensionElement;
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jivesoftware.smack.packet.Message;
|
||||||
import org.jivesoftware.smack.packet.MessageView;
|
import org.jivesoftware.smack.packet.MessageView;
|
||||||
import org.jivesoftware.smack.util.StringUtils;
|
import org.jivesoftware.smack.util.StringUtils;
|
||||||
import org.jivesoftware.smack.util.XmlStringBuilder;
|
import org.jivesoftware.smack.util.XmlStringBuilder;
|
||||||
|
@ -69,7 +70,7 @@ public class MamElements {
|
||||||
/**
|
/**
|
||||||
* the forwarded element.
|
* the forwarded element.
|
||||||
*/
|
*/
|
||||||
private final Forwarded forwarded;
|
private final Forwarded<Message> forwarded;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the query id.
|
* the query id.
|
||||||
|
@ -83,7 +84,7 @@ public class MamElements {
|
||||||
* @param id TODO javadoc me please
|
* @param id TODO javadoc me please
|
||||||
* @param forwarded TODO javadoc me please
|
* @param forwarded TODO javadoc me please
|
||||||
*/
|
*/
|
||||||
public MamResultExtension(String queryId, String id, Forwarded forwarded) {
|
public MamResultExtension(String queryId, String id, Forwarded<Message> forwarded) {
|
||||||
if (StringUtils.isEmpty(id)) {
|
if (StringUtils.isEmpty(id)) {
|
||||||
throw new IllegalArgumentException("id must not be null or empty");
|
throw new IllegalArgumentException("id must not be null or empty");
|
||||||
}
|
}
|
||||||
|
@ -109,7 +110,7 @@ public class MamElements {
|
||||||
*
|
*
|
||||||
* @return the forwarded element
|
* @return the forwarded element
|
||||||
*/
|
*/
|
||||||
public Forwarded getForwarded() {
|
public Forwarded<Message> getForwarded() {
|
||||||
return forwarded;
|
return forwarded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2016 Fernando Ramirez
|
* Copyright 2016 Fernando Ramirez, 2020 Florian Schmaus
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -18,6 +18,7 @@ package org.jivesoftware.smackx.mam.provider;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.Message;
|
||||||
import org.jivesoftware.smack.packet.XmlEnvironment;
|
import org.jivesoftware.smack.packet.XmlEnvironment;
|
||||||
import org.jivesoftware.smack.parsing.SmackParsingException;
|
import org.jivesoftware.smack.parsing.SmackParsingException;
|
||||||
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
||||||
|
@ -40,7 +41,7 @@ public class MamResultProvider extends ExtensionElementProvider<MamResultExtensi
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MamResultExtension parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
|
public MamResultExtension parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
|
||||||
Forwarded forwarded = null;
|
Forwarded<Message> forwarded = null;
|
||||||
String queryId = parser.getAttributeValue("", "queryid");
|
String queryId = parser.getAttributeValue("", "queryid");
|
||||||
String id = parser.getAttributeValue("", "id");
|
String id = parser.getAttributeValue("", "id");
|
||||||
|
|
||||||
|
@ -51,7 +52,7 @@ public class MamResultProvider extends ExtensionElementProvider<MamResultExtensi
|
||||||
case START_ELEMENT:
|
case START_ELEMENT:
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case Forwarded.ELEMENT:
|
case Forwarded.ELEMENT:
|
||||||
forwarded = ForwardedProvider.INSTANCE.parse(parser);
|
forwarded = ForwardedProvider.parseForwardedMessage(parser, xmlEnvironment);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -19,9 +19,10 @@ package org.jivesoftware.smackx.carbons;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.Message;
|
||||||
|
import org.jivesoftware.smack.parsing.SmackParsingException;
|
||||||
import org.jivesoftware.smack.test.util.SmackTestUtil;
|
import org.jivesoftware.smack.test.util.SmackTestUtil;
|
||||||
import org.jivesoftware.smack.util.PacketParserUtils;
|
import org.jivesoftware.smack.util.PacketParserUtils;
|
||||||
import org.jivesoftware.smack.xml.XmlPullParser;
|
import org.jivesoftware.smack.xml.XmlPullParser;
|
||||||
|
@ -48,7 +49,7 @@ public class CarbonTest extends ExperimentalInitializerTest {
|
||||||
XmlPullParser parser;
|
XmlPullParser parser;
|
||||||
String control;
|
String control;
|
||||||
CarbonExtension cc;
|
CarbonExtension cc;
|
||||||
Forwarded fwd;
|
Forwarded<Message> fwd;
|
||||||
|
|
||||||
control = XMLBuilder.create("sent")
|
control = XMLBuilder.create("sent")
|
||||||
.e("forwarded")
|
.e("forwarded")
|
||||||
|
@ -107,6 +108,6 @@ public class CarbonTest extends ExperimentalInitializerTest {
|
||||||
.a("xmlns", "urn:xmpp:forwarded:0")
|
.a("xmlns", "urn:xmpp:forwarded:0")
|
||||||
.asString(outputProperties);
|
.asString(outputProperties);
|
||||||
|
|
||||||
assertThrows(IOException.class, () -> SmackTestUtil.parse(control, CarbonManagerProvider.class, parserKind));
|
assertThrows(SmackParsingException.class, () -> SmackTestUtil.parse(control, CarbonManagerProvider.class, parserKind));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,10 +59,10 @@ public class MamResultProviderTest {
|
||||||
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
|
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||||
Date date = calendar.getTime();
|
Date date = calendar.getTime();
|
||||||
|
|
||||||
Forwarded forwarded = mamResultExtension.getForwarded();
|
Forwarded<Message> forwarded = mamResultExtension.getForwarded();
|
||||||
assertEquals(forwarded.getDelayInformation().getStamp(), date);
|
assertEquals(forwarded.getDelayInformation().getStamp(), date);
|
||||||
|
|
||||||
Message message = (Message) forwarded.getForwardedStanza();
|
Message message = forwarded.getForwardedStanza();
|
||||||
assertEquals(message.getFrom().toString(), "romeo@montague.lit/orchard");
|
assertEquals(message.getFrom().toString(), "romeo@montague.lit/orchard");
|
||||||
assertEquals(message.getTo().toString(), "juliet@capulet.lit/balcony");
|
assertEquals(message.getTo().toString(), "juliet@capulet.lit/balcony");
|
||||||
assertEquals(message.getBody(),
|
assertEquals(message.getBody(),
|
||||||
|
@ -81,10 +81,10 @@ public class MamResultProviderTest {
|
||||||
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
|
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||||
Date date = calendar.getTime();
|
Date date = calendar.getTime();
|
||||||
|
|
||||||
Forwarded forwarded = mamResultExtension.getForwarded();
|
Forwarded<Message> forwarded = mamResultExtension.getForwarded();
|
||||||
assertEquals(forwarded.getDelayInformation().getStamp(), date);
|
assertEquals(forwarded.getDelayInformation().getStamp(), date);
|
||||||
|
|
||||||
Message forwardedMessage = (Message) forwarded.getForwardedStanza();
|
Message forwardedMessage = forwarded.getForwardedStanza();
|
||||||
assertEquals(forwardedMessage.getFrom().toString(), "witch@shakespeare.lit");
|
assertEquals(forwardedMessage.getFrom().toString(), "witch@shakespeare.lit");
|
||||||
assertEquals(forwardedMessage.getTo().toString(), "macbeth@shakespeare.lit");
|
assertEquals(forwardedMessage.getTo().toString(), "macbeth@shakespeare.lit");
|
||||||
assertEquals(forwardedMessage.getBody(), "Hail to thee");
|
assertEquals(forwardedMessage.getBody(), "Hail to thee");
|
||||||
|
|
|
@ -79,7 +79,7 @@ public class QueryArchiveTest extends MamTest {
|
||||||
.setBody("Thrice the brinded cat hath mew.")
|
.setBody("Thrice the brinded cat hath mew.")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Forwarded forwarded = new Forwarded(delay, forwardedMessage);
|
Forwarded<Message> forwarded = new Forwarded<>(forwardedMessage, delay);
|
||||||
|
|
||||||
message.addExtension(new MamResultExtension("g27", "34482-21985-73620", forwarded));
|
message.addExtension(new MamResultExtension("g27", "34482-21985-73620", forwarded));
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ public class QueryArchiveTest extends MamTest {
|
||||||
assertEquals(mamResultExtension.getId(), "34482-21985-73620");
|
assertEquals(mamResultExtension.getId(), "34482-21985-73620");
|
||||||
assertEquals(mamResultExtension.getForwarded().getDelayInformation().getStamp(), date);
|
assertEquals(mamResultExtension.getForwarded().getDelayInformation().getStamp(), date);
|
||||||
|
|
||||||
Message resultMessage = (Message) mamResultExtension.getForwarded().getForwardedStanza();
|
Message resultMessage = mamResultExtension.getForwarded().getForwardedStanza();
|
||||||
assertEquals(resultMessage.getFrom(), JidCreate.from("coven@chat.shakespeare.lit/firstwitch"));
|
assertEquals(resultMessage.getFrom(), JidCreate.from("coven@chat.shakespeare.lit/firstwitch"));
|
||||||
assertEquals(resultMessage.getStanzaId(), "162BEBB1-F6DB-4D9A-9BD8-CFDCC801A0B2");
|
assertEquals(resultMessage.getStanzaId(), "162BEBB1-F6DB-4D9A-9BD8-CFDCC801A0B2");
|
||||||
assertEquals(resultMessage.getType(), Type.chat);
|
assertEquals(resultMessage.getType(), Type.chat);
|
||||||
|
|
|
@ -29,14 +29,19 @@ import org.jivesoftware.smack.util.stringencoder.Base64;
|
||||||
*/
|
*/
|
||||||
public class BoBData {
|
public class BoBData {
|
||||||
|
|
||||||
private final int maxAge;
|
private final Integer maxAge;
|
||||||
private final String type;
|
private final String type;
|
||||||
|
|
||||||
private byte[] contentBinary;
|
private byte[] contentBinary;
|
||||||
private String contentString;
|
private String contentString;
|
||||||
|
|
||||||
|
private BoBData(String type, Integer maxAge) {
|
||||||
|
this.type = type;
|
||||||
|
this.maxAge = maxAge;
|
||||||
|
}
|
||||||
|
|
||||||
public BoBData(String type, byte[] content) {
|
public BoBData(String type, byte[] content) {
|
||||||
this(type, content, -1);
|
this(type, content, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,20 +51,18 @@ public class BoBData {
|
||||||
* @param content TODO javadoc me please
|
* @param content TODO javadoc me please
|
||||||
* @param maxAge TODO javadoc me please
|
* @param maxAge TODO javadoc me please
|
||||||
*/
|
*/
|
||||||
public BoBData(String type, byte[] content, int maxAge) {
|
public BoBData(String type, byte[] content, Integer maxAge) {
|
||||||
this.type = type;
|
this(type, maxAge);
|
||||||
this.contentBinary = content;
|
this.contentBinary = content;
|
||||||
this.maxAge = maxAge;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BoBData(String type, String content) {
|
public BoBData(String type, String content) {
|
||||||
this(type, content, -1);
|
this(type, content, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BoBData(String type, String content, int maxAge) {
|
public BoBData(String type, String content, Integer maxAge) {
|
||||||
this.type = type;
|
this(type, maxAge);
|
||||||
this.contentString = content;
|
this.contentString = content;
|
||||||
this.maxAge = maxAge;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -67,7 +70,7 @@ public class BoBData {
|
||||||
*
|
*
|
||||||
* @return the max age
|
* @return the max age
|
||||||
*/
|
*/
|
||||||
public int getMaxAge() {
|
public Integer getMaxAge() {
|
||||||
return maxAge;
|
return maxAge;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,15 +20,15 @@ import java.util.Set;
|
||||||
|
|
||||||
public class BoBInfo {
|
public class BoBInfo {
|
||||||
|
|
||||||
private final Set<BoBHash> hashes;
|
private final Set<ContentId> hashes;
|
||||||
private final BoBData data;
|
private final BoBData data;
|
||||||
|
|
||||||
BoBInfo(Set<BoBHash> hashes, BoBData data) {
|
BoBInfo(Set<ContentId> hashes, BoBData data) {
|
||||||
this.hashes = hashes;
|
this.hashes = hashes;
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<BoBHash> getHashes() {
|
public Set<ContentId> getHashes() {
|
||||||
return hashes;
|
return hashes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2016-2017 Fernando Ramirez, Florian Schmaus
|
* Copyright 2016-2020 Fernando Ramirez, Florian Schmaus
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -81,9 +81,9 @@ public final class BoBManager extends Manager {
|
||||||
return bobManager;
|
return bobManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final LruCache<BoBHash, BoBData> BOB_CACHE = new LruCache<>(128);
|
private static final LruCache<ContentId, BoBData> BOB_CACHE = new LruCache<>(128);
|
||||||
|
|
||||||
private final Map<BoBHash, BoBInfo> bobs = new ConcurrentHashMap<>();
|
private final Map<ContentId, BoBInfo> bobs = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private BoBManager(XMPPConnection connection) {
|
private BoBManager(XMPPConnection connection) {
|
||||||
super(connection);
|
super(connection);
|
||||||
|
@ -95,15 +95,16 @@ public final class BoBManager extends Manager {
|
||||||
@Override
|
@Override
|
||||||
public IQ handleIQRequest(IQ iqRequest) {
|
public IQ handleIQRequest(IQ iqRequest) {
|
||||||
BoBIQ bobIQRequest = (BoBIQ) iqRequest;
|
BoBIQ bobIQRequest = (BoBIQ) iqRequest;
|
||||||
|
ContentId contentId = bobIQRequest.getContentId();
|
||||||
|
|
||||||
BoBInfo bobInfo = bobs.get(bobIQRequest.getBoBHash());
|
BoBInfo bobInfo = bobs.get(contentId);
|
||||||
if (bobInfo == null) {
|
if (bobInfo == null) {
|
||||||
// TODO return item-not-found
|
// TODO return item-not-found
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
BoBData bobData = bobInfo.getData();
|
BoBData bobData = bobInfo.getData();
|
||||||
BoBIQ responseBoBIQ = new BoBIQ(bobIQRequest.getBoBHash(), bobData);
|
BoBIQ responseBoBIQ = new BoBIQ(contentId, bobData);
|
||||||
responseBoBIQ.setType(Type.result);
|
responseBoBIQ.setType(Type.result);
|
||||||
responseBoBIQ.setTo(bobIQRequest.getFrom());
|
responseBoBIQ.setTo(bobIQRequest.getFrom());
|
||||||
return responseBoBIQ;
|
return responseBoBIQ;
|
||||||
|
@ -137,7 +138,7 @@ public final class BoBManager extends Manager {
|
||||||
* @throws NotConnectedException if the XMPP connection is not connected.
|
* @throws NotConnectedException if the XMPP connection is not connected.
|
||||||
* @throws InterruptedException if the calling thread was interrupted.
|
* @throws InterruptedException if the calling thread was interrupted.
|
||||||
*/
|
*/
|
||||||
public BoBData requestBoB(Jid to, BoBHash bobHash) throws NotLoggedInException, NoResponseException,
|
public BoBData requestBoB(Jid to, ContentId bobHash) throws NotLoggedInException, NoResponseException,
|
||||||
XMPPErrorException, NotConnectedException, InterruptedException {
|
XMPPErrorException, NotConnectedException, InterruptedException {
|
||||||
BoBData bobData = BOB_CACHE.lookup(bobHash);
|
BoBData bobData = BOB_CACHE.lookup(bobHash);
|
||||||
if (bobData != null) {
|
if (bobData != null) {
|
||||||
|
@ -159,9 +160,9 @@ public final class BoBManager extends Manager {
|
||||||
|
|
||||||
public BoBInfo addBoB(BoBData bobData) {
|
public BoBInfo addBoB(BoBData bobData) {
|
||||||
// We only support SHA-1 for now.
|
// We only support SHA-1 for now.
|
||||||
BoBHash bobHash = new BoBHash(SHA1.hex(bobData.getContent()), "sha1");
|
ContentId bobHash = new ContentId(SHA1.hex(bobData.getContent()), "sha1");
|
||||||
|
|
||||||
Set<BoBHash> bobHashes = Collections.singleton(bobHash);
|
Set<ContentId> bobHashes = Collections.singleton(bobHash);
|
||||||
bobHashes = Collections.unmodifiableSet(bobHashes);
|
bobHashes = Collections.unmodifiableSet(bobHashes);
|
||||||
|
|
||||||
BoBInfo bobInfo = new BoBInfo(bobHashes, bobData);
|
BoBInfo bobInfo = new BoBInfo(bobHashes, bobData);
|
||||||
|
@ -171,12 +172,12 @@ public final class BoBManager extends Manager {
|
||||||
return bobInfo;
|
return bobInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BoBInfo removeBoB(BoBHash bobHash) {
|
public BoBInfo removeBoB(ContentId bobHash) {
|
||||||
BoBInfo bobInfo = bobs.remove(bobHash);
|
BoBInfo bobInfo = bobs.remove(bobHash);
|
||||||
if (bobInfo == null) {
|
if (bobInfo == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
for (BoBHash otherBobHash : bobInfo.getHashes()) {
|
for (ContentId otherBobHash : bobInfo.getHashes()) {
|
||||||
bobs.remove(otherBobHash);
|
bobs.remove(otherBobHash);
|
||||||
}
|
}
|
||||||
return bobInfo;
|
return bobInfo;
|
||||||
|
|
|
@ -19,29 +19,32 @@ package org.jivesoftware.smackx.bob;
|
||||||
import org.jivesoftware.smack.util.StringUtils;
|
import org.jivesoftware.smack.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bits of Binary hash class.
|
* Content-ID class.
|
||||||
*
|
*
|
||||||
* @author Fernando Ramirez
|
* @author Fernando Ramirez
|
||||||
* @author Florian Schmaus
|
* @author Florian Schmaus
|
||||||
* @see <a href="http://xmpp.org/extensions/xep-0231.html">XEP-0231: Bits of
|
* @see <a href="https://tools.ietf.org/html/rfc2392">RFC 2392: Content-ID and Message-ID Uniform Resource Locators</a>
|
||||||
* Binary</a>
|
|
||||||
*/
|
*/
|
||||||
public class BoBHash {
|
public class ContentId {
|
||||||
|
|
||||||
private final String hash;
|
private final String hash;
|
||||||
private final String hashType;
|
private final String hashType;
|
||||||
private final String cid;
|
private final String cid;
|
||||||
|
|
||||||
|
private ContentId(String hash, String hashType, String cid) {
|
||||||
|
this.hash = StringUtils.requireNotNullNorEmpty(hash, "hash must not be null nor empty");
|
||||||
|
this.hashType = StringUtils.requireNotNullNorEmpty(hashType, "hashType must not be null nor empty");
|
||||||
|
this.cid = cid;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BoB hash constructor.
|
* BoB hash constructor.
|
||||||
*
|
*
|
||||||
* @param hash TODO javadoc me please
|
* @param hash TODO javadoc me please
|
||||||
* @param hashType TODO javadoc me please
|
* @param hashType TODO javadoc me please
|
||||||
*/
|
*/
|
||||||
public BoBHash(String hash, String hashType) {
|
public ContentId(String hash, String hashType) {
|
||||||
this.hash = StringUtils.requireNotNullNorEmpty(hash, "hash must not be null nor empty");
|
this(hash, hashType, hashType + '+' + hash + "@bob.xmpp.org");
|
||||||
this.hashType = StringUtils.requireNotNullNorEmpty(hashType, "hashType must not be null nor empty");
|
|
||||||
this.cid = this.hashType + '+' + this.hash + "@bob.xmpp.org";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -82,8 +85,8 @@ public class BoBHash {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object other) {
|
public boolean equals(Object other) {
|
||||||
if (other instanceof BoBHash) {
|
if (other instanceof ContentId) {
|
||||||
BoBHash otherBob = (BoBHash) other;
|
ContentId otherBob = (ContentId) other;
|
||||||
return cid.equals(otherBob.cid);
|
return cid.equals(otherBob.cid);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -100,10 +103,10 @@ public class BoBHash {
|
||||||
* @param src TODO javadoc me please
|
* @param src TODO javadoc me please
|
||||||
* @return the BoB hash
|
* @return the BoB hash
|
||||||
*/
|
*/
|
||||||
public static BoBHash fromSrc(String src) {
|
public static ContentId fromSrc(String src) {
|
||||||
String hashType = src.substring(src.lastIndexOf("cid:") + 4, src.indexOf("+"));
|
String hashType = src.substring(src.lastIndexOf("cid:") + 4, src.indexOf("+"));
|
||||||
String hash = src.substring(src.indexOf("+") + 1, src.indexOf("@bob.xmpp.org"));
|
String hash = src.substring(src.indexOf("+") + 1, src.indexOf("@bob.xmpp.org"));
|
||||||
return new BoBHash(hash, hashType);
|
return new ContentId(hash, hashType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,10 +115,10 @@ public class BoBHash {
|
||||||
* @param cid TODO javadoc me please
|
* @param cid TODO javadoc me please
|
||||||
* @return the BoB hash
|
* @return the BoB hash
|
||||||
*/
|
*/
|
||||||
public static BoBHash fromCid(String cid) {
|
public static ContentId fromCid(String cid) {
|
||||||
String hashType = cid.substring(0, cid.indexOf("+"));
|
String hashType = cid.substring(0, cid.indexOf("+"));
|
||||||
String hash = cid.substring(cid.indexOf("+") + 1, cid.indexOf("@bob.xmpp.org"));
|
String hash = cid.substring(cid.indexOf("+") + 1, cid.indexOf("@bob.xmpp.org"));
|
||||||
return new BoBHash(hash, hashType);
|
return new ContentId(hash, hashType, cid);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2020 Florian Schmaus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.bob.element;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
|
import org.jivesoftware.smack.packet.Message;
|
||||||
|
import org.jivesoftware.smack.util.Objects;
|
||||||
|
import org.jivesoftware.smack.util.XmlStringBuilder;
|
||||||
|
import org.jivesoftware.smackx.bob.BoBData;
|
||||||
|
import org.jivesoftware.smackx.bob.BoBManager;
|
||||||
|
import org.jivesoftware.smackx.bob.ContentId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bits of Binary data extension element.
|
||||||
|
*
|
||||||
|
* @author Florian Schmaus
|
||||||
|
* @see <a href="http://xmpp.org/extensions/xep-0231.html">XEP-0231: Bits of
|
||||||
|
* Binary</a>
|
||||||
|
*/
|
||||||
|
public class BoBDataExtension implements ExtensionElement {
|
||||||
|
|
||||||
|
public static final String ELEMENT = "data";
|
||||||
|
public static final String NAMESPACE = BoBManager.NAMESPACE;
|
||||||
|
|
||||||
|
private final ContentId cid;
|
||||||
|
private final BoBData bobData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bits of Binary data extension constructor.
|
||||||
|
*
|
||||||
|
* @param cid TODO javadoc me please
|
||||||
|
* @param bobData TODO javadoc me please
|
||||||
|
*/
|
||||||
|
public BoBDataExtension(ContentId cid, BoBData bobData) {
|
||||||
|
this.cid = Objects.requireNonNull(cid);
|
||||||
|
this.bobData = Objects.requireNonNull(bobData);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getElementName() {
|
||||||
|
return ELEMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNamespace() {
|
||||||
|
return NAMESPACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
|
||||||
|
XmlStringBuilder xml = new XmlStringBuilder(this);
|
||||||
|
xml.attribute("cid", cid.getCid());
|
||||||
|
xml.attribute("type", bobData.getType());
|
||||||
|
xml.optAttribute("max-age", bobData.getMaxAge());
|
||||||
|
xml.rightAngleBracket();
|
||||||
|
|
||||||
|
xml.append(bobData.getContentBase64Encoded());
|
||||||
|
|
||||||
|
xml.closeElement(this);
|
||||||
|
return xml;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BoBDataExtension from(Message message) {
|
||||||
|
return message.getExtension(BoBDataExtension.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,97 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Copyright 2016 Fernando Ramirez
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.jivesoftware.smackx.bob.element;
|
|
||||||
|
|
||||||
import org.jivesoftware.smack.packet.Message;
|
|
||||||
import org.jivesoftware.smack.util.XmlStringBuilder;
|
|
||||||
|
|
||||||
import org.jivesoftware.smackx.bob.BoBHash;
|
|
||||||
import org.jivesoftware.smackx.xhtmlim.XHTMLText;
|
|
||||||
import org.jivesoftware.smackx.xhtmlim.packet.XHTMLExtension;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bits of Binary extension element.
|
|
||||||
*
|
|
||||||
* @author Fernando Ramirez
|
|
||||||
* @see <a href="http://xmpp.org/extensions/xep-0231.html">XEP-0231: Bits of
|
|
||||||
* Binary</a>
|
|
||||||
*/
|
|
||||||
public class BoBExtension extends XHTMLExtension {
|
|
||||||
|
|
||||||
private final BoBHash bobHash;
|
|
||||||
private final String alt;
|
|
||||||
private final String paragraph;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bits of Binary extension constructor.
|
|
||||||
*
|
|
||||||
* @param bobHash TODO javadoc me please
|
|
||||||
* @param alt TODO javadoc me please
|
|
||||||
* @param paragraph TODO javadoc me please
|
|
||||||
*/
|
|
||||||
public BoBExtension(BoBHash bobHash, String alt, String paragraph) {
|
|
||||||
this.bobHash = bobHash;
|
|
||||||
this.alt = alt;
|
|
||||||
this.paragraph = paragraph;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the BoB hash.
|
|
||||||
*
|
|
||||||
* @return the BoB hash
|
|
||||||
*/
|
|
||||||
public BoBHash getBoBHash() {
|
|
||||||
return bobHash;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the alt field.
|
|
||||||
*
|
|
||||||
* @return the alt field
|
|
||||||
*/
|
|
||||||
public String getAlt() {
|
|
||||||
return alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
|
|
||||||
XmlStringBuilder xml = new XmlStringBuilder(this);
|
|
||||||
xml.rightAngleBracket();
|
|
||||||
|
|
||||||
xml.halfOpenElement(Message.BODY);
|
|
||||||
xml.xmlnsAttribute(XHTMLText.NAMESPACE);
|
|
||||||
xml.rightAngleBracket();
|
|
||||||
|
|
||||||
xml.openElement(XHTMLText.P);
|
|
||||||
xml.optEscape(paragraph);
|
|
||||||
|
|
||||||
xml.halfOpenElement(XHTMLText.IMG);
|
|
||||||
xml.optAttribute("alt", alt);
|
|
||||||
xml.attribute("src", bobHash.toSrc());
|
|
||||||
xml.closeEmptyElement();
|
|
||||||
|
|
||||||
xml.closeElement(XHTMLText.P);
|
|
||||||
xml.closeElement(Message.BODY);
|
|
||||||
xml.closeElement(this);
|
|
||||||
return xml;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BoBExtension from(Message message) {
|
|
||||||
return (BoBExtension) message.getExtensionElement(ELEMENT, NAMESPACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2016 Fernando Ramirez
|
* Copyright 2016 Fernando Ramirez, 2020 Florian Schmaus
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -19,8 +19,8 @@ package org.jivesoftware.smackx.bob.element;
|
||||||
import org.jivesoftware.smack.packet.IQ;
|
import org.jivesoftware.smack.packet.IQ;
|
||||||
|
|
||||||
import org.jivesoftware.smackx.bob.BoBData;
|
import org.jivesoftware.smackx.bob.BoBData;
|
||||||
import org.jivesoftware.smackx.bob.BoBHash;
|
|
||||||
import org.jivesoftware.smackx.bob.BoBManager;
|
import org.jivesoftware.smackx.bob.BoBManager;
|
||||||
|
import org.jivesoftware.smackx.bob.ContentId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bits of Binary IQ class.
|
* Bits of Binary IQ class.
|
||||||
|
@ -41,28 +41,40 @@ public class BoBIQ extends IQ {
|
||||||
*/
|
*/
|
||||||
public static final String NAMESPACE = BoBManager.NAMESPACE;
|
public static final String NAMESPACE = BoBManager.NAMESPACE;
|
||||||
|
|
||||||
private final BoBHash bobHash;
|
private final ContentId cid;
|
||||||
private final BoBData bobData;
|
private final BoBData bobData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bits of Binary IQ constructor.
|
* Bits of Binary IQ constructor.
|
||||||
*
|
*
|
||||||
* @param bobHash TODO javadoc me please
|
* @param cid TODO javadoc me please
|
||||||
* @param bobData TODO javadoc me please
|
* @param bobData TODO javadoc me please
|
||||||
*/
|
*/
|
||||||
public BoBIQ(BoBHash bobHash, BoBData bobData) {
|
public BoBIQ(ContentId cid, BoBData bobData) {
|
||||||
super(ELEMENT, NAMESPACE);
|
super(ELEMENT, NAMESPACE);
|
||||||
this.bobHash = bobHash;
|
this.cid = cid;
|
||||||
this.bobData = bobData;
|
this.bobData = bobData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bits of Binary IQ constructor.
|
* Bits of Binary IQ constructor.
|
||||||
*
|
*
|
||||||
* @param bobHash TODO javadoc me please
|
* @param cid TODO javadoc me please
|
||||||
*/
|
*/
|
||||||
public BoBIQ(BoBHash bobHash) {
|
public BoBIQ(ContentId cid) {
|
||||||
this(bobHash, null);
|
this(cid, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the BoB hash.
|
||||||
|
*
|
||||||
|
* @return the BoB hash
|
||||||
|
* @deprecated use {@link #getContentId()} instead.
|
||||||
|
*/
|
||||||
|
// TODO: Remove in Smack 4.5.
|
||||||
|
@Deprecated
|
||||||
|
public ContentId getBoBHash() {
|
||||||
|
return cid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -70,8 +82,8 @@ public class BoBIQ extends IQ {
|
||||||
*
|
*
|
||||||
* @return the BoB hash
|
* @return the BoB hash
|
||||||
*/
|
*/
|
||||||
public BoBHash getBoBHash() {
|
public ContentId getContentId() {
|
||||||
return bobHash;
|
return cid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -85,7 +97,7 @@ public class BoBIQ extends IQ {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
|
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
|
||||||
xml.attribute("cid", bobHash.getCid());
|
xml.attribute("cid", cid.getCid());
|
||||||
|
|
||||||
if (bobData != null) {
|
if (bobData != null) {
|
||||||
xml.optIntAttribute("max_age", bobData.getMaxAge());
|
xml.optIntAttribute("max_age", bobData.getMaxAge());
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2020 Florian Schmaus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.bob.provider;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.XmlEnvironment;
|
||||||
|
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
||||||
|
import org.jivesoftware.smack.util.Pair;
|
||||||
|
import org.jivesoftware.smack.xml.XmlPullParser;
|
||||||
|
import org.jivesoftware.smack.xml.XmlPullParserException;
|
||||||
|
import org.jivesoftware.smackx.bob.BoBData;
|
||||||
|
import org.jivesoftware.smackx.bob.ContentId;
|
||||||
|
import org.jivesoftware.smackx.bob.element.BoBDataExtension;
|
||||||
|
|
||||||
|
public class BoBDataExtensionProvider extends ExtensionElementProvider<BoBDataExtension> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BoBDataExtension parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment)
|
||||||
|
throws XmlPullParserException, IOException {
|
||||||
|
Pair<ContentId, BoBData> parserResult = BoBProviderUtil.parseContentIdAndBobData(parser, initialDepth,
|
||||||
|
xmlEnvironment);
|
||||||
|
|
||||||
|
return new BoBDataExtension(parserResult.getFirst(), parserResult.getSecond());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -20,12 +20,12 @@ import java.io.IOException;
|
||||||
|
|
||||||
import org.jivesoftware.smack.packet.XmlEnvironment;
|
import org.jivesoftware.smack.packet.XmlEnvironment;
|
||||||
import org.jivesoftware.smack.provider.IQProvider;
|
import org.jivesoftware.smack.provider.IQProvider;
|
||||||
import org.jivesoftware.smack.util.ParserUtils;
|
import org.jivesoftware.smack.util.Pair;
|
||||||
import org.jivesoftware.smack.xml.XmlPullParser;
|
import org.jivesoftware.smack.xml.XmlPullParser;
|
||||||
import org.jivesoftware.smack.xml.XmlPullParserException;
|
import org.jivesoftware.smack.xml.XmlPullParserException;
|
||||||
|
|
||||||
import org.jivesoftware.smackx.bob.BoBData;
|
import org.jivesoftware.smackx.bob.BoBData;
|
||||||
import org.jivesoftware.smackx.bob.BoBHash;
|
import org.jivesoftware.smackx.bob.ContentId;
|
||||||
import org.jivesoftware.smackx.bob.element.BoBIQ;
|
import org.jivesoftware.smackx.bob.element.BoBIQ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,22 +39,10 @@ public class BoBIQProvider extends IQProvider<BoBIQ> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BoBIQ parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException {
|
public BoBIQ parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException {
|
||||||
String cid = parser.getAttributeValue("", "cid");
|
Pair<ContentId, BoBData> parserResult = BoBProviderUtil.parseContentIdAndBobData(parser, initialDepth,
|
||||||
BoBHash bobHash = BoBHash.fromCid(cid);
|
xmlEnvironment);
|
||||||
|
|
||||||
String dataType = parser.getAttributeValue("", "type");
|
return new BoBIQ(parserResult.getFirst(), parserResult.getSecond());
|
||||||
int maxAge = ParserUtils.getIntegerAttribute(parser, "max-age", -1);
|
|
||||||
|
|
||||||
String base64EncodedData = parser.nextText();
|
|
||||||
|
|
||||||
BoBData bobData;
|
|
||||||
if (dataType != null) {
|
|
||||||
bobData = new BoBData(dataType, base64EncodedData, maxAge);
|
|
||||||
} else {
|
|
||||||
bobData = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new BoBIQ(bobHash, bobData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright 2020 Florian Schmaus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.bob.provider;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.packet.XmlEnvironment;
|
||||||
|
import org.jivesoftware.smack.util.Pair;
|
||||||
|
import org.jivesoftware.smack.util.ParserUtils;
|
||||||
|
import org.jivesoftware.smack.xml.XmlPullParser;
|
||||||
|
import org.jivesoftware.smack.xml.XmlPullParserException;
|
||||||
|
import org.jivesoftware.smackx.bob.BoBData;
|
||||||
|
import org.jivesoftware.smackx.bob.ContentId;
|
||||||
|
|
||||||
|
public class BoBProviderUtil {
|
||||||
|
|
||||||
|
public static Pair<ContentId, BoBData> parseContentIdAndBobData(XmlPullParser parser, int initialDepth,
|
||||||
|
XmlEnvironment xmlEnvironment) throws IOException, XmlPullParserException {
|
||||||
|
String cid = parser.getAttributeValue("", "cid");
|
||||||
|
ContentId contentId = ContentId.fromCid(cid);
|
||||||
|
|
||||||
|
String dataType = parser.getAttributeValue("", "type");
|
||||||
|
Integer maxAge = ParserUtils.getIntegerAttribute(parser, "max-age");
|
||||||
|
|
||||||
|
String base64EncodedData = parser.nextText();
|
||||||
|
|
||||||
|
BoBData bobData = null;
|
||||||
|
if (dataType != null) {
|
||||||
|
bobData = new BoBData(dataType, base64EncodedData, maxAge);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Pair.create(contentId, bobData);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2013-2014 Georg Lukas
|
* Copyright 2013-2014 Georg Lukas, 2020 Florian Schmaus
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -25,6 +25,7 @@ import javax.xml.namespace.QName;
|
||||||
import org.jivesoftware.smack.packet.ExtensionElement;
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
||||||
import org.jivesoftware.smack.packet.Message;
|
import org.jivesoftware.smack.packet.Message;
|
||||||
import org.jivesoftware.smack.packet.Stanza;
|
import org.jivesoftware.smack.packet.Stanza;
|
||||||
|
import org.jivesoftware.smack.util.Objects;
|
||||||
import org.jivesoftware.smack.util.XmlStringBuilder;
|
import org.jivesoftware.smack.util.XmlStringBuilder;
|
||||||
|
|
||||||
import org.jivesoftware.smackx.delay.packet.DelayInformation;
|
import org.jivesoftware.smackx.delay.packet.DelayInformation;
|
||||||
|
@ -35,23 +36,24 @@ import org.jivesoftware.smackx.delay.packet.DelayInformation;
|
||||||
* @author Georg Lukas
|
* @author Georg Lukas
|
||||||
* @see <a href="http://xmpp.org/extensions/xep-0297.html">XEP-0297: Stanza Forwarding</a>
|
* @see <a href="http://xmpp.org/extensions/xep-0297.html">XEP-0297: Stanza Forwarding</a>
|
||||||
*/
|
*/
|
||||||
public class Forwarded implements ExtensionElement {
|
public class Forwarded<S extends Stanza> implements ExtensionElement {
|
||||||
public static final String NAMESPACE = "urn:xmpp:forward:0";
|
public static final String NAMESPACE = "urn:xmpp:forward:0";
|
||||||
public static final String ELEMENT = "forwarded";
|
public static final String ELEMENT = "forwarded";
|
||||||
public static final QName QNAME = new QName(NAMESPACE, ELEMENT);
|
public static final QName QNAME = new QName(NAMESPACE, ELEMENT);
|
||||||
|
|
||||||
private final DelayInformation delay;
|
private final DelayInformation delay;
|
||||||
private final Stanza forwardedPacket;
|
private final S forwardedStanza;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Forwarded stanza extension.
|
* Creates a new Forwarded stanza extension.
|
||||||
*
|
*
|
||||||
* @param delay an optional {@link DelayInformation} timestamp of the packet.
|
* @param delay an optional {@link DelayInformation} timestamp of the packet.
|
||||||
* @param fwdPacket the stanza that is forwarded (required).
|
* @param forwardedStanza the stanza that is forwarded (required).
|
||||||
|
* @deprecated use {@link #Forwarded(Stanza, DelayInformation)} instead.
|
||||||
*/
|
*/
|
||||||
public Forwarded(DelayInformation delay, Stanza fwdPacket) {
|
@Deprecated
|
||||||
this.delay = delay;
|
public Forwarded(DelayInformation delay, S forwardedStanza) {
|
||||||
this.forwardedPacket = fwdPacket;
|
this(forwardedStanza, delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,8 +61,19 @@ public class Forwarded implements ExtensionElement {
|
||||||
*
|
*
|
||||||
* @param fwdPacket the stanza that is forwarded (required).
|
* @param fwdPacket the stanza that is forwarded (required).
|
||||||
*/
|
*/
|
||||||
public Forwarded(Stanza fwdPacket) {
|
public Forwarded(S fwdPacket) {
|
||||||
this(null, fwdPacket);
|
this(fwdPacket, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new Forwarded stanza extension.
|
||||||
|
*
|
||||||
|
* @param forwardedStanza the stanza that is forwarded (required).
|
||||||
|
* @param delay an optional {@link DelayInformation} timestamp of the packet.
|
||||||
|
*/
|
||||||
|
public Forwarded(S forwardedStanza, DelayInformation delay) {
|
||||||
|
this.forwardedStanza = Objects.requireNonNull(forwardedStanza);
|
||||||
|
this.delay = delay;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -78,7 +91,7 @@ public class Forwarded implements ExtensionElement {
|
||||||
XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace);
|
XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace);
|
||||||
xml.rightAngleBracket();
|
xml.rightAngleBracket();
|
||||||
xml.optElement(getDelayInformation());
|
xml.optElement(getDelayInformation());
|
||||||
xml.append(forwardedPacket);
|
xml.append(forwardedStanza);
|
||||||
xml.closeElement(this);
|
xml.closeElement(this);
|
||||||
return xml;
|
return xml;
|
||||||
}
|
}
|
||||||
|
@ -88,8 +101,8 @@ public class Forwarded implements ExtensionElement {
|
||||||
*
|
*
|
||||||
* @return the {@link Stanza} (typically a message) that was forwarded.
|
* @return the {@link Stanza} (typically a message) that was forwarded.
|
||||||
*/
|
*/
|
||||||
public Stanza getForwardedStanza() {
|
public S getForwardedStanza() {
|
||||||
return forwardedPacket;
|
return forwardedStanza;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -101,12 +114,23 @@ public class Forwarded implements ExtensionElement {
|
||||||
return delay;
|
return delay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this is forwarding a stanza of the provided class.
|
||||||
|
*
|
||||||
|
* @param stanzaClass the class to check for.
|
||||||
|
* @return <code>true</code> if this is forwarding a stanza of the provided class.
|
||||||
|
* @since 4.4
|
||||||
|
*/
|
||||||
|
public boolean isForwarded(Class<? extends Stanza> stanzaClass) {
|
||||||
|
return stanzaClass.isAssignableFrom(forwardedStanza.getClass());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the forwarded extension.
|
* Get the forwarded extension.
|
||||||
* @param packet TODO javadoc me please
|
* @param packet TODO javadoc me please
|
||||||
* @return the Forwarded extension or null
|
* @return the Forwarded extension or null
|
||||||
*/
|
*/
|
||||||
public static Forwarded from(Stanza packet) {
|
public static Forwarded<?> from(Stanza packet) {
|
||||||
return packet.getExtension(Forwarded.class);
|
return packet.getExtension(Forwarded.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,10 +142,10 @@ public class Forwarded implements ExtensionElement {
|
||||||
* @return a list a the extracted messages.
|
* @return a list a the extracted messages.
|
||||||
* @since 4.3.0
|
* @since 4.3.0
|
||||||
*/
|
*/
|
||||||
public static List<Message> extractMessagesFrom(Collection<Forwarded> forwardedCollection) {
|
public static List<Message> extractMessagesFrom(Collection<Forwarded<Message>> forwardedCollection) {
|
||||||
List<Message> res = new ArrayList<>(forwardedCollection.size());
|
List<Message> res = new ArrayList<>(forwardedCollection.size());
|
||||||
for (Forwarded forwarded : forwardedCollection) {
|
for (Forwarded<Message> forwarded : forwardedCollection) {
|
||||||
Message message = (Message) forwarded.forwardedPacket;
|
Message message = forwarded.getForwardedStanza();
|
||||||
res.add(message);
|
res.add(message);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2013-2014 Georg Lukas
|
* Copyright 2013-2014 Georg Lukas, 2020 Florian Schmaus
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -38,14 +38,14 @@ import org.jivesoftware.smackx.forward.packet.Forwarded;
|
||||||
*
|
*
|
||||||
* @author Georg Lukas
|
* @author Georg Lukas
|
||||||
*/
|
*/
|
||||||
public class ForwardedProvider extends ExtensionElementProvider<Forwarded> {
|
public class ForwardedProvider extends ExtensionElementProvider<Forwarded<?>> {
|
||||||
|
|
||||||
public static final ForwardedProvider INSTANCE = new ForwardedProvider();
|
public static final ForwardedProvider INSTANCE = new ForwardedProvider();
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(ForwardedProvider.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(ForwardedProvider.class.getName());
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Forwarded parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
|
public Forwarded<?> parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
|
||||||
DelayInformation di = null;
|
DelayInformation di = null;
|
||||||
Stanza packet = null;
|
Stanza packet = null;
|
||||||
|
|
||||||
|
@ -86,6 +86,21 @@ public class ForwardedProvider extends ExtensionElementProvider<Forwarded> {
|
||||||
// TODO: Should be SmackParseException.
|
// TODO: Should be SmackParseException.
|
||||||
throw new IOException("forwarded extension must contain a packet");
|
throw new IOException("forwarded extension must contain a packet");
|
||||||
}
|
}
|
||||||
return new Forwarded(di, packet);
|
return new Forwarded<>(packet, di);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Forwarded<Message> parseForwardedMessage(XmlPullParser parser, XmlEnvironment xmlEnvironment)
|
||||||
|
throws XmlPullParserException, IOException, SmackParsingException {
|
||||||
|
return parseForwardedMessage(parser, parser.getDepth(), xmlEnvironment);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Forwarded<Message> parseForwardedMessage(XmlPullParser parser, int initialDepth,
|
||||||
|
XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException {
|
||||||
|
Forwarded<?> forwarded = INSTANCE.parse(parser, initialDepth, xmlEnvironment);
|
||||||
|
if (!forwarded.isForwarded(Message.class)) {
|
||||||
|
throw new SmackParsingException("Expecting a forwarded message, but got " + forwarded);
|
||||||
|
}
|
||||||
|
return (Forwarded<Message>) forwarded;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
||||||
*
|
*
|
||||||
* @author Gaston Dombiak
|
* @author Gaston Dombiak
|
||||||
*/
|
*/
|
||||||
public class XHTMLExtension implements ExtensionElement {
|
public final class XHTMLExtension implements ExtensionElement {
|
||||||
|
|
||||||
public static final String ELEMENT = "html";
|
public static final String ELEMENT = "html";
|
||||||
public static final String NAMESPACE = "http://jabber.org/protocol/xhtml-im";
|
public static final String NAMESPACE = "http://jabber.org/protocol/xhtml-im";
|
||||||
|
|
|
@ -500,6 +500,12 @@
|
||||||
</extensionProvider>
|
</extensionProvider>
|
||||||
|
|
||||||
<!-- XEP-0231: Bits of Binary -->
|
<!-- XEP-0231: Bits of Binary -->
|
||||||
|
<extensionProvider>
|
||||||
|
<elementName>data</elementName>
|
||||||
|
<namespace>urn:xmpp:bob</namespace>
|
||||||
|
<className>org.jivesoftware.smackx.bob.provider.BoBDataExtensionProvider</className>
|
||||||
|
</extensionProvider>
|
||||||
|
|
||||||
<iqProvider>
|
<iqProvider>
|
||||||
<elementName>data</elementName>
|
<elementName>data</elementName>
|
||||||
<namespace>urn:xmpp:bob</namespace>
|
<namespace>urn:xmpp:bob</namespace>
|
||||||
|
|
|
@ -41,7 +41,7 @@ public class BoBIQTest extends SmackTestSuite {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void checkBoBIQRequest() throws Exception {
|
public void checkBoBIQRequest() throws Exception {
|
||||||
BoBHash bobHash = new BoBHash("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1");
|
ContentId bobHash = new ContentId("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1");
|
||||||
|
|
||||||
BoBIQ createdBoBIQ = new BoBIQ(bobHash);
|
BoBIQ createdBoBIQ = new BoBIQ(bobHash);
|
||||||
createdBoBIQ.setStanzaId("sarasa");
|
createdBoBIQ.setStanzaId("sarasa");
|
||||||
|
@ -55,7 +55,7 @@ public class BoBIQTest extends SmackTestSuite {
|
||||||
public void checkBoBIQResponse() throws Exception {
|
public void checkBoBIQResponse() throws Exception {
|
||||||
BoBIQ bobIQ = PacketParserUtils.parseStanza(sampleBoBIQResponse);
|
BoBIQ bobIQ = PacketParserUtils.parseStanza(sampleBoBIQResponse);
|
||||||
|
|
||||||
BoBHash bobHash = new BoBHash("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1");
|
ContentId bobHash = new ContentId("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1");
|
||||||
BoBData bobData = new BoBData("image/png", "sarasade2354j2".getBytes(StandardCharsets.UTF_8), 86400);
|
BoBData bobData = new BoBData("image/png", "sarasade2354j2".getBytes(StandardCharsets.UTF_8), 86400);
|
||||||
|
|
||||||
BoBIQ createdBoBIQ = new BoBIQ(bobHash, bobData);
|
BoBIQ createdBoBIQ = new BoBIQ(bobHash, bobData);
|
||||||
|
@ -63,8 +63,8 @@ public class BoBIQTest extends SmackTestSuite {
|
||||||
createdBoBIQ.setTo(JidCreate.from("doctor@shakespeare.lit/pda"));
|
createdBoBIQ.setTo(JidCreate.from("doctor@shakespeare.lit/pda"));
|
||||||
createdBoBIQ.setType(Type.result);
|
createdBoBIQ.setType(Type.result);
|
||||||
|
|
||||||
assertEquals(bobIQ.getBoBHash().getHash(), createdBoBIQ.getBoBHash().getHash());
|
assertEquals(bobIQ.getContentId().getHash(), createdBoBIQ.getContentId().getHash());
|
||||||
assertEquals(bobIQ.getBoBHash().getHashType(), createdBoBIQ.getBoBHash().getHashType());
|
assertEquals(bobIQ.getContentId().getHashType(), createdBoBIQ.getContentId().getHashType());
|
||||||
assertEquals(bobIQ.getBoBData().getMaxAge(), createdBoBIQ.getBoBData().getMaxAge());
|
assertEquals(bobIQ.getBoBData().getMaxAge(), createdBoBIQ.getBoBData().getMaxAge());
|
||||||
assertEquals(bobIQ.getBoBData().getType(), createdBoBIQ.getBoBData().getType());
|
assertEquals(bobIQ.getBoBData().getType(), createdBoBIQ.getBoBData().getType());
|
||||||
assertEquals(bobIQ.getBoBData().getContentBase64Encoded(), createdBoBIQ.getBoBData().getContentBase64Encoded());
|
assertEquals(bobIQ.getBoBData().getContentBase64Encoded(), createdBoBIQ.getBoBData().getContentBase64Encoded());
|
||||||
|
|
|
@ -45,7 +45,7 @@ public class ForwardedTest {
|
||||||
public void forwardedTest() throws Exception {
|
public void forwardedTest() throws Exception {
|
||||||
XmlPullParser parser;
|
XmlPullParser parser;
|
||||||
String control;
|
String control;
|
||||||
Forwarded fwd;
|
Forwarded<?> fwd;
|
||||||
|
|
||||||
control = XMLBuilder.create("forwarded")
|
control = XMLBuilder.create("forwarded")
|
||||||
.a("xmlns", "urn:xmpp:forwarded:0")
|
.a("xmlns", "urn:xmpp:forwarded:0")
|
||||||
|
@ -71,7 +71,7 @@ public class ForwardedTest {
|
||||||
public void forwardedWithDelayTest() throws Exception {
|
public void forwardedWithDelayTest() throws Exception {
|
||||||
XmlPullParser parser;
|
XmlPullParser parser;
|
||||||
String control;
|
String control;
|
||||||
Forwarded fwd;
|
Forwarded<?> fwd;
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
control = XMLBuilder.create("forwarded").a("xmlns", "urn:xmpp:forwarded:0")
|
control = XMLBuilder.create("forwarded").a("xmlns", "urn:xmpp:forwarded:0")
|
||||||
|
|
|
@ -6,7 +6,7 @@ dependencies {
|
||||||
api project(':smack-debug')
|
api project(':smack-debug')
|
||||||
api project(':smack-experimental')
|
api project(':smack-experimental')
|
||||||
api project(':smack-extensions')
|
api project(':smack-extensions')
|
||||||
api project(':smack-java7')
|
api project(':smack-java8')
|
||||||
api project(':smack-legacy')
|
api project(':smack-legacy')
|
||||||
api project(':smack-omemo')
|
api project(':smack-omemo')
|
||||||
api project(':smack-openpgp')
|
api project(':smack-openpgp')
|
||||||
|
|
|
@ -33,7 +33,7 @@ public class Java7SmackInitializer implements SmackInitializer {
|
||||||
if (SystemUtil.onAndroid()) {
|
if (SystemUtil.onAndroid()) {
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
throw new RuntimeException(
|
throw new RuntimeException(
|
||||||
"You need to remove the smack-java7 dependency/jar from your build, " +
|
"You need to remove the smack-java8 dependency/jar from your build, " +
|
||||||
"as it does not run on Android. " +
|
"as it does not run on Android. " +
|
||||||
"Use smack-android instead.");
|
"Use smack-android instead.");
|
||||||
// @formatter:on
|
// @formatter:on
|
Loading…
Reference in a new issue