mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-12-22 12:37:58 +01:00
[bob] Add BoBDataExtension, remove BoBExtension
BoBExtension extending XHTMLExtension was poorly designed and only worked for a single paragraphy. Fixes SMACK-770.
This commit is contained in:
parent
15e3d267f6
commit
6d39a4e3ac
13 changed files with 254 additions and 168 deletions
|
@ -29,14 +29,19 @@ import org.jivesoftware.smack.util.stringencoder.Base64;
|
|||
*/
|
||||
public class BoBData {
|
||||
|
||||
private final int maxAge;
|
||||
private final Integer maxAge;
|
||||
private final String type;
|
||||
|
||||
private byte[] contentBinary;
|
||||
private String contentString;
|
||||
|
||||
private BoBData(String type, Integer maxAge) {
|
||||
this.type = type;
|
||||
this.maxAge = maxAge;
|
||||
}
|
||||
|
||||
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 maxAge TODO javadoc me please
|
||||
*/
|
||||
public BoBData(String type, byte[] content, int maxAge) {
|
||||
this.type = type;
|
||||
public BoBData(String type, byte[] content, Integer maxAge) {
|
||||
this(type, maxAge);
|
||||
this.contentBinary = content;
|
||||
this.maxAge = maxAge;
|
||||
}
|
||||
|
||||
public BoBData(String type, String content) {
|
||||
this(type, content, -1);
|
||||
this(type, content, null);
|
||||
}
|
||||
|
||||
public BoBData(String type, String content, int maxAge) {
|
||||
this.type = type;
|
||||
public BoBData(String type, String content, Integer maxAge) {
|
||||
this(type, maxAge);
|
||||
this.contentString = content;
|
||||
this.maxAge = maxAge;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -67,7 +70,7 @@ public class BoBData {
|
|||
*
|
||||
* @return the max age
|
||||
*/
|
||||
public int getMaxAge() {
|
||||
public Integer getMaxAge() {
|
||||
return maxAge;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,15 +20,15 @@ import java.util.Set;
|
|||
|
||||
public class BoBInfo {
|
||||
|
||||
private final Set<BoBHash> hashes;
|
||||
private final Set<ContentId> hashes;
|
||||
private final BoBData data;
|
||||
|
||||
BoBInfo(Set<BoBHash> hashes, BoBData data) {
|
||||
BoBInfo(Set<ContentId> hashes, BoBData data) {
|
||||
this.hashes = hashes;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Set<BoBHash> getHashes() {
|
||||
public Set<ContentId> getHashes() {
|
||||
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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -81,9 +81,9 @@ public final class BoBManager extends Manager {
|
|||
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) {
|
||||
super(connection);
|
||||
|
@ -95,15 +95,16 @@ public final class BoBManager extends Manager {
|
|||
@Override
|
||||
public IQ handleIQRequest(IQ iqRequest) {
|
||||
BoBIQ bobIQRequest = (BoBIQ) iqRequest;
|
||||
ContentId contentId = bobIQRequest.getContentId();
|
||||
|
||||
BoBInfo bobInfo = bobs.get(bobIQRequest.getBoBHash());
|
||||
BoBInfo bobInfo = bobs.get(contentId);
|
||||
if (bobInfo == null) {
|
||||
// TODO return item-not-found
|
||||
return null;
|
||||
}
|
||||
|
||||
BoBData bobData = bobInfo.getData();
|
||||
BoBIQ responseBoBIQ = new BoBIQ(bobIQRequest.getBoBHash(), bobData);
|
||||
BoBIQ responseBoBIQ = new BoBIQ(contentId, bobData);
|
||||
responseBoBIQ.setType(Type.result);
|
||||
responseBoBIQ.setTo(bobIQRequest.getFrom());
|
||||
return responseBoBIQ;
|
||||
|
@ -137,7 +138,7 @@ public final class BoBManager extends Manager {
|
|||
* @throws NotConnectedException if the XMPP connection is not connected.
|
||||
* @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 {
|
||||
BoBData bobData = BOB_CACHE.lookup(bobHash);
|
||||
if (bobData != null) {
|
||||
|
@ -159,9 +160,9 @@ public final class BoBManager extends Manager {
|
|||
|
||||
public BoBInfo addBoB(BoBData bobData) {
|
||||
// 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);
|
||||
|
||||
BoBInfo bobInfo = new BoBInfo(bobHashes, bobData);
|
||||
|
@ -171,12 +172,12 @@ public final class BoBManager extends Manager {
|
|||
return bobInfo;
|
||||
}
|
||||
|
||||
public BoBInfo removeBoB(BoBHash bobHash) {
|
||||
public BoBInfo removeBoB(ContentId bobHash) {
|
||||
BoBInfo bobInfo = bobs.remove(bobHash);
|
||||
if (bobInfo == null) {
|
||||
return null;
|
||||
}
|
||||
for (BoBHash otherBobHash : bobInfo.getHashes()) {
|
||||
for (ContentId otherBobHash : bobInfo.getHashes()) {
|
||||
bobs.remove(otherBobHash);
|
||||
}
|
||||
return bobInfo;
|
||||
|
|
|
@ -19,29 +19,32 @@ package org.jivesoftware.smackx.bob;
|
|||
import org.jivesoftware.smack.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Bits of Binary hash class.
|
||||
* Content-ID class.
|
||||
*
|
||||
* @author Fernando Ramirez
|
||||
* @author Florian Schmaus
|
||||
* @see <a href="http://xmpp.org/extensions/xep-0231.html">XEP-0231: Bits of
|
||||
* Binary</a>
|
||||
* @see <a href="https://tools.ietf.org/html/rfc2392">RFC 2392: Content-ID and Message-ID Uniform Resource Locators</a>
|
||||
*/
|
||||
public class BoBHash {
|
||||
public class ContentId {
|
||||
|
||||
private final String hash;
|
||||
private final String hashType;
|
||||
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.
|
||||
*
|
||||
* @param hash TODO javadoc me please
|
||||
* @param hashType TODO javadoc me please
|
||||
*/
|
||||
public BoBHash(String hash, String hashType) {
|
||||
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 = this.hashType + '+' + this.hash + "@bob.xmpp.org";
|
||||
public ContentId(String hash, String hashType) {
|
||||
this(hash, hashType, hashType + '+' + hash + "@bob.xmpp.org");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -82,8 +85,8 @@ public class BoBHash {
|
|||
|
||||
@Override
|
||||
public boolean equals(Object other) {
|
||||
if (other instanceof BoBHash) {
|
||||
BoBHash otherBob = (BoBHash) other;
|
||||
if (other instanceof ContentId) {
|
||||
ContentId otherBob = (ContentId) other;
|
||||
return cid.equals(otherBob.cid);
|
||||
}
|
||||
return false;
|
||||
|
@ -100,10 +103,10 @@ public class BoBHash {
|
|||
* @param src TODO javadoc me please
|
||||
* @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 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
|
||||
* @return the BoB hash
|
||||
*/
|
||||
public static BoBHash fromCid(String cid) {
|
||||
public static ContentId fromCid(String cid) {
|
||||
String hashType = cid.substring(0, cid.indexOf("+"));
|
||||
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");
|
||||
* 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.smackx.bob.BoBData;
|
||||
import org.jivesoftware.smackx.bob.BoBHash;
|
||||
import org.jivesoftware.smackx.bob.BoBManager;
|
||||
import org.jivesoftware.smackx.bob.ContentId;
|
||||
|
||||
/**
|
||||
* Bits of Binary IQ class.
|
||||
|
@ -41,28 +41,40 @@ public class BoBIQ extends IQ {
|
|||
*/
|
||||
public static final String NAMESPACE = BoBManager.NAMESPACE;
|
||||
|
||||
private final BoBHash bobHash;
|
||||
private final ContentId cid;
|
||||
private final BoBData bobData;
|
||||
|
||||
/**
|
||||
* Bits of Binary IQ constructor.
|
||||
*
|
||||
* @param bobHash TODO javadoc me please
|
||||
* @param cid 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);
|
||||
this.bobHash = bobHash;
|
||||
this.cid = cid;
|
||||
this.bobData = bobData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bits of Binary IQ constructor.
|
||||
*
|
||||
* @param bobHash TODO javadoc me please
|
||||
* @param cid TODO javadoc me please
|
||||
*/
|
||||
public BoBIQ(BoBHash bobHash) {
|
||||
this(bobHash, null);
|
||||
public BoBIQ(ContentId cid) {
|
||||
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
|
||||
*/
|
||||
public BoBHash getBoBHash() {
|
||||
return bobHash;
|
||||
public ContentId getContentId() {
|
||||
return cid;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -85,7 +97,7 @@ public class BoBIQ extends IQ {
|
|||
|
||||
@Override
|
||||
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
|
||||
xml.attribute("cid", bobHash.getCid());
|
||||
xml.attribute("cid", cid.getCid());
|
||||
|
||||
if (bobData != null) {
|
||||
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.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.XmlPullParserException;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
|
@ -39,22 +39,10 @@ public class BoBIQProvider extends IQProvider<BoBIQ> {
|
|||
|
||||
@Override
|
||||
public BoBIQ parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException {
|
||||
String cid = parser.getAttributeValue("", "cid");
|
||||
BoBHash bobHash = BoBHash.fromCid(cid);
|
||||
Pair<ContentId, BoBData> parserResult = BoBProviderUtil.parseContentIdAndBobData(parser, initialDepth,
|
||||
xmlEnvironment);
|
||||
|
||||
String dataType = parser.getAttributeValue("", "type");
|
||||
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);
|
||||
return new BoBIQ(parserResult.getFirst(), parserResult.getSecond());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -37,7 +37,7 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
|||
*
|
||||
* @author Gaston Dombiak
|
||||
*/
|
||||
public class XHTMLExtension implements ExtensionElement {
|
||||
public final class XHTMLExtension implements ExtensionElement {
|
||||
|
||||
public static final String ELEMENT = "html";
|
||||
public static final String NAMESPACE = "http://jabber.org/protocol/xhtml-im";
|
||||
|
|
|
@ -500,6 +500,12 @@
|
|||
</extensionProvider>
|
||||
|
||||
<!-- XEP-0231: Bits of Binary -->
|
||||
<extensionProvider>
|
||||
<elementName>data</elementName>
|
||||
<namespace>urn:xmpp:bob</namespace>
|
||||
<className>org.jivesoftware.smackx.bob.provider.BoBDataExtensionProvider</className>
|
||||
</extensionProvider>
|
||||
|
||||
<iqProvider>
|
||||
<elementName>data</elementName>
|
||||
<namespace>urn:xmpp:bob</namespace>
|
||||
|
|
|
@ -41,7 +41,7 @@ public class BoBIQTest extends SmackTestSuite {
|
|||
|
||||
@Test
|
||||
public void checkBoBIQRequest() throws Exception {
|
||||
BoBHash bobHash = new BoBHash("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1");
|
||||
ContentId bobHash = new ContentId("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1");
|
||||
|
||||
BoBIQ createdBoBIQ = new BoBIQ(bobHash);
|
||||
createdBoBIQ.setStanzaId("sarasa");
|
||||
|
@ -55,7 +55,7 @@ public class BoBIQTest extends SmackTestSuite {
|
|||
public void checkBoBIQResponse() throws Exception {
|
||||
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);
|
||||
|
||||
BoBIQ createdBoBIQ = new BoBIQ(bobHash, bobData);
|
||||
|
@ -63,8 +63,8 @@ public class BoBIQTest extends SmackTestSuite {
|
|||
createdBoBIQ.setTo(JidCreate.from("doctor@shakespeare.lit/pda"));
|
||||
createdBoBIQ.setType(Type.result);
|
||||
|
||||
assertEquals(bobIQ.getBoBHash().getHash(), createdBoBIQ.getBoBHash().getHash());
|
||||
assertEquals(bobIQ.getBoBHash().getHashType(), createdBoBIQ.getBoBHash().getHashType());
|
||||
assertEquals(bobIQ.getContentId().getHash(), createdBoBIQ.getContentId().getHash());
|
||||
assertEquals(bobIQ.getContentId().getHashType(), createdBoBIQ.getContentId().getHashType());
|
||||
assertEquals(bobIQ.getBoBData().getMaxAge(), createdBoBIQ.getBoBData().getMaxAge());
|
||||
assertEquals(bobIQ.getBoBData().getType(), createdBoBIQ.getBoBData().getType());
|
||||
assertEquals(bobIQ.getBoBData().getContentBase64Encoded(), createdBoBIQ.getBoBData().getContentBase64Encoded());
|
||||
|
|
Loading…
Reference in a new issue