mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-22 06:12:05 +01:00
[disco] Move logic that was previously in EntityCapsManager in SDM
This commit is contained in:
parent
87591655ad
commit
2679c72f0f
3 changed files with 52 additions and 53 deletions
|
@ -33,8 +33,6 @@ import java.util.SortedSet;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import org.jivesoftware.smack.ConnectionCreationListener;
|
import org.jivesoftware.smack.ConnectionCreationListener;
|
||||||
import org.jivesoftware.smack.ConnectionListener;
|
import org.jivesoftware.smack.ConnectionListener;
|
||||||
|
@ -51,7 +49,6 @@ import org.jivesoftware.smack.filter.PresenceTypeFilter;
|
||||||
import org.jivesoftware.smack.filter.StanzaExtensionFilter;
|
import org.jivesoftware.smack.filter.StanzaExtensionFilter;
|
||||||
import org.jivesoftware.smack.filter.StanzaFilter;
|
import org.jivesoftware.smack.filter.StanzaFilter;
|
||||||
import org.jivesoftware.smack.filter.StanzaTypeFilter;
|
import org.jivesoftware.smack.filter.StanzaTypeFilter;
|
||||||
import org.jivesoftware.smack.packet.IQ;
|
|
||||||
import org.jivesoftware.smack.packet.Presence;
|
import org.jivesoftware.smack.packet.Presence;
|
||||||
import org.jivesoftware.smack.packet.PresenceBuilder;
|
import org.jivesoftware.smack.packet.PresenceBuilder;
|
||||||
import org.jivesoftware.smack.packet.Stanza;
|
import org.jivesoftware.smack.packet.Stanza;
|
||||||
|
@ -87,7 +84,6 @@ import org.jxmpp.util.cache.LruCache;
|
||||||
* @see <a href="http://www.xmpp.org/extensions/xep-0115.html">XEP-0115: Entity Capabilities</a>
|
* @see <a href="http://www.xmpp.org/extensions/xep-0115.html">XEP-0115: Entity Capabilities</a>
|
||||||
*/
|
*/
|
||||||
public final class EntityCapsManager extends Manager {
|
public final class EntityCapsManager extends Manager {
|
||||||
private static final Logger LOGGER = Logger.getLogger(EntityCapsManager.class.getName());
|
|
||||||
|
|
||||||
public static final String NAMESPACE = CapsExtension.NAMESPACE;
|
public static final String NAMESPACE = CapsExtension.NAMESPACE;
|
||||||
public static final String ELEMENT = CapsExtension.ELEMENT;
|
public static final String ELEMENT = CapsExtension.ELEMENT;
|
||||||
|
@ -307,7 +303,6 @@ public final class EntityCapsManager extends Manager {
|
||||||
|
|
||||||
private boolean entityCapsEnabled;
|
private boolean entityCapsEnabled;
|
||||||
private CapsVersionAndHash currentCapsVersion;
|
private CapsVersionAndHash currentCapsVersion;
|
||||||
private volatile Presence presenceSend;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The entity node String used by this EntityCapsManager instance.
|
* The entity node String used by this EntityCapsManager instance.
|
||||||
|
@ -342,11 +337,6 @@ public final class EntityCapsManager extends Manager {
|
||||||
// feature, so we try to process it after we are connected and
|
// feature, so we try to process it after we are connected and
|
||||||
// once after we are authenticated.
|
// once after we are authenticated.
|
||||||
processCapsStreamFeatureIfAvailable(connection);
|
processCapsStreamFeatureIfAvailable(connection);
|
||||||
|
|
||||||
// Reset presenceSend when the connection was not resumed
|
|
||||||
if (!resumed) {
|
|
||||||
presenceSend = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
private void processCapsStreamFeatureIfAvailable(XMPPConnection connection) {
|
private void processCapsStreamFeatureIfAvailable(XMPPConnection connection) {
|
||||||
CapsExtension capsExtension = connection.getFeature(
|
CapsExtension capsExtension = connection.getFeature(
|
||||||
|
@ -359,9 +349,6 @@ public final class EntityCapsManager extends Manager {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// This calculates the local entity caps version
|
|
||||||
updateLocalEntityCaps();
|
|
||||||
|
|
||||||
if (autoEnableEntityCaps)
|
if (autoEnableEntityCaps)
|
||||||
enableEntityCaps();
|
enableEntityCaps();
|
||||||
|
|
||||||
|
@ -387,26 +374,16 @@ public final class EntityCapsManager extends Manager {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
connection.addStanzaSendingListener(new StanzaListener() {
|
|
||||||
@Override
|
|
||||||
public void processStanza(Stanza packet) {
|
|
||||||
presenceSend = (Presence) packet;
|
|
||||||
}
|
|
||||||
}, PresenceTypeFilter.OUTGOING_PRESENCE_BROADCAST);
|
|
||||||
|
|
||||||
|
|
||||||
enableEntityCaps();
|
|
||||||
|
|
||||||
// It's important to do this as last action. Since it changes the
|
// It's important to do this as last action. Since it changes the
|
||||||
// behavior of the SDM in some ways
|
// behavior of the SDM in some ways
|
||||||
sdm.addEntityCapabilitiesChangedListener(new EntityCapabilitiesChangedListener() {
|
sdm.addEntityCapabilitiesChangedListener(new EntityCapabilitiesChangedListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onEntityCapailitiesChanged() {
|
public void onEntityCapabilitiesChanged(DiscoverInfo synthesizedDiscoveryInfo) {
|
||||||
if (!entityCapsEnabled()) {
|
if (!entityCapsEnabled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateLocalEntityCaps();
|
updateLocalEntityCaps(synthesizedDiscoveryInfo);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -431,7 +408,6 @@ public final class EntityCapsManager extends Manager {
|
||||||
|
|
||||||
// Add Entity Capabilities (XEP-0115) feature node.
|
// Add Entity Capabilities (XEP-0115) feature node.
|
||||||
sdm.addFeature(NAMESPACE);
|
sdm.addFeature(NAMESPACE);
|
||||||
updateLocalEntityCaps();
|
|
||||||
entityCapsEnabled = true;
|
entityCapsEnabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,11 +422,6 @@ public final class EntityCapsManager extends Manager {
|
||||||
return entityCapsEnabled;
|
return entityCapsEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setEntityNode(String entityNode) {
|
|
||||||
this.entityNode = entityNode;
|
|
||||||
updateLocalEntityCaps();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a record telling what entity caps node a user has.
|
* Remove a record telling what entity caps node a user has.
|
||||||
*
|
*
|
||||||
|
@ -522,13 +493,10 @@ public final class EntityCapsManager extends Manager {
|
||||||
* presence is send to inform others about your new Entity Caps node string.
|
* presence is send to inform others about your new Entity Caps node string.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private void updateLocalEntityCaps() {
|
private void updateLocalEntityCaps(DiscoverInfo synthesizedDiscoveryInfo) {
|
||||||
XMPPConnection connection = connection();
|
XMPPConnection connection = connection();
|
||||||
|
|
||||||
DiscoverInfoBuilder discoverInfoBuilder = DiscoverInfo.builder("synthetized-disco-info-response")
|
DiscoverInfoBuilder discoverInfoBuilder = synthesizedDiscoveryInfo.asBuilder();
|
||||||
.ofType(IQ.Type.result);
|
|
||||||
sdm.addDiscoverInfoTo(discoverInfoBuilder);
|
|
||||||
|
|
||||||
// getLocalNodeVer() will return a result only after currentCapsVersion is set. Therefore
|
// getLocalNodeVer() will return a result only after currentCapsVersion is set. Therefore
|
||||||
// set it first and then call getLocalNodeVer()
|
// set it first and then call getLocalNodeVer()
|
||||||
currentCapsVersion = generateVerificationString(discoverInfoBuilder);
|
currentCapsVersion = generateVerificationString(discoverInfoBuilder);
|
||||||
|
@ -564,20 +532,6 @@ public final class EntityCapsManager extends Manager {
|
||||||
return packetExtensions;
|
return packetExtensions;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Re-send the last sent presence, and let the stanza interceptor
|
|
||||||
// add a <c/> node to it.
|
|
||||||
// See http://xmpp.org/extensions/xep-0115.html#advertise
|
|
||||||
// We only send a presence packet if there was already one send
|
|
||||||
// to respect ConnectionConfiguration.isSendPresence()
|
|
||||||
if (connection != null && connection.isAuthenticated() && presenceSend != null) {
|
|
||||||
try {
|
|
||||||
connection.sendStanza(presenceSend.cloneWithNewId());
|
|
||||||
}
|
|
||||||
catch (InterruptedException | NotConnectedException e) {
|
|
||||||
LOGGER.log(Level.WARNING, "Could could not update presence with caps info", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright 2018 Florian Schmaus.
|
* Copyright 2018-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.
|
||||||
|
@ -16,8 +16,10 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.disco;
|
package org.jivesoftware.smackx.disco;
|
||||||
|
|
||||||
|
import org.jivesoftware.smackx.disco.packet.DiscoverInfo;
|
||||||
|
|
||||||
public interface EntityCapabilitiesChangedListener {
|
public interface EntityCapabilitiesChangedListener {
|
||||||
|
|
||||||
void onEntityCapailitiesChanged();
|
void onEntityCapabilitiesChanged(DiscoverInfo synthesizedDiscoveryInfo);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,11 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.CopyOnWriteArraySet;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import org.jivesoftware.smack.ConnectionCreationListener;
|
import org.jivesoftware.smack.ConnectionCreationListener;
|
||||||
|
import org.jivesoftware.smack.ConnectionListener;
|
||||||
import org.jivesoftware.smack.Manager;
|
import org.jivesoftware.smack.Manager;
|
||||||
import org.jivesoftware.smack.ScheduledAction;
|
import org.jivesoftware.smack.ScheduledAction;
|
||||||
import org.jivesoftware.smack.SmackException.NoResponseException;
|
import org.jivesoftware.smack.SmackException.NoResponseException;
|
||||||
|
@ -40,10 +43,12 @@ import org.jivesoftware.smack.SmackException.NotConnectedException;
|
||||||
import org.jivesoftware.smack.XMPPConnection;
|
import org.jivesoftware.smack.XMPPConnection;
|
||||||
import org.jivesoftware.smack.XMPPConnectionRegistry;
|
import org.jivesoftware.smack.XMPPConnectionRegistry;
|
||||||
import org.jivesoftware.smack.XMPPException.XMPPErrorException;
|
import org.jivesoftware.smack.XMPPException.XMPPErrorException;
|
||||||
|
import org.jivesoftware.smack.filter.PresenceTypeFilter;
|
||||||
import org.jivesoftware.smack.internal.AbstractStats;
|
import org.jivesoftware.smack.internal.AbstractStats;
|
||||||
import org.jivesoftware.smack.iqrequest.AbstractIqRequestHandler;
|
import org.jivesoftware.smack.iqrequest.AbstractIqRequestHandler;
|
||||||
import org.jivesoftware.smack.iqrequest.IQRequestHandler.Mode;
|
import org.jivesoftware.smack.iqrequest.IQRequestHandler.Mode;
|
||||||
import org.jivesoftware.smack.packet.IQ;
|
import org.jivesoftware.smack.packet.IQ;
|
||||||
|
import org.jivesoftware.smack.packet.Presence;
|
||||||
import org.jivesoftware.smack.packet.Stanza;
|
import org.jivesoftware.smack.packet.Stanza;
|
||||||
import org.jivesoftware.smack.packet.StanzaError;
|
import org.jivesoftware.smack.packet.StanzaError;
|
||||||
import org.jivesoftware.smack.util.CollectionUtil;
|
import org.jivesoftware.smack.util.CollectionUtil;
|
||||||
|
@ -77,6 +82,8 @@ import org.jxmpp.util.cache.ExpirationCache;
|
||||||
*/
|
*/
|
||||||
public final class ServiceDiscoveryManager extends Manager {
|
public final class ServiceDiscoveryManager extends Manager {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(ServiceDiscoveryManager.class.getName());
|
||||||
|
|
||||||
private static final String DEFAULT_IDENTITY_NAME = "Smack";
|
private static final String DEFAULT_IDENTITY_NAME = "Smack";
|
||||||
private static final String DEFAULT_IDENTITY_CATEGORY = "client";
|
private static final String DEFAULT_IDENTITY_CATEGORY = "client";
|
||||||
private static final String DEFAULT_IDENTITY_TYPE = "pc";
|
private static final String DEFAULT_IDENTITY_TYPE = "pc";
|
||||||
|
@ -97,6 +104,8 @@ public final class ServiceDiscoveryManager extends Manager {
|
||||||
private List<DataForm> extendedInfos = new ArrayList<>(2);
|
private List<DataForm> extendedInfos = new ArrayList<>(2);
|
||||||
private final Map<String, NodeInformationProvider> nodeInformationProviders = new ConcurrentHashMap<>();
|
private final Map<String, NodeInformationProvider> nodeInformationProviders = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private volatile Presence presenceSend;
|
||||||
|
|
||||||
// Create a new ServiceDiscoveryManager on every established connection
|
// Create a new ServiceDiscoveryManager on every established connection
|
||||||
static {
|
static {
|
||||||
XMPPConnectionRegistry.addConnectionCreationListener(new ConnectionCreationListener() {
|
XMPPConnectionRegistry.addConnectionCreationListener(new ConnectionCreationListener() {
|
||||||
|
@ -196,6 +205,18 @@ public final class ServiceDiscoveryManager extends Manager {
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connection.addConnectionListener(new ConnectionListener() {
|
||||||
|
@Override
|
||||||
|
public void authenticated(XMPPConnection connection, boolean resumed) {
|
||||||
|
// Reset presenceSend when the connection was not resumed
|
||||||
|
if (!resumed) {
|
||||||
|
presenceSend = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
connection.addStanzaSendingListener(p -> presenceSend = (Presence) p,
|
||||||
|
PresenceTypeFilter.OUTGOING_PRESENCE_BROADCAST);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -920,11 +941,33 @@ public final class ServiceDiscoveryManager extends Manager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final XMPPConnection connection = connection();
|
||||||
|
|
||||||
renewEntityCapsScheduledAction = scheduleBlocking(() -> {
|
renewEntityCapsScheduledAction = scheduleBlocking(() -> {
|
||||||
renewEntityCapsPerformed.incrementAndGet();
|
renewEntityCapsPerformed.incrementAndGet();
|
||||||
|
|
||||||
|
DiscoverInfoBuilder discoverInfoBuilder = DiscoverInfo.builder("synthetized-disco-info-response")
|
||||||
|
.ofType(IQ.Type.result);
|
||||||
|
addDiscoverInfoTo(discoverInfoBuilder);
|
||||||
|
DiscoverInfo synthesizedDiscoveryInfo = discoverInfoBuilder.build();
|
||||||
|
|
||||||
for (EntityCapabilitiesChangedListener entityCapabilitiesChangedListener : entityCapabilitiesChangedListeners) {
|
for (EntityCapabilitiesChangedListener entityCapabilitiesChangedListener : entityCapabilitiesChangedListeners) {
|
||||||
entityCapabilitiesChangedListener.onEntityCapailitiesChanged();
|
entityCapabilitiesChangedListener.onEntityCapabilitiesChanged(synthesizedDiscoveryInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-send the last sent presence, and let the stanza interceptor
|
||||||
|
// add a <c/> node to it.
|
||||||
|
// See http://xmpp.org/extensions/xep-0115.html#advertise
|
||||||
|
// We only send a presence packet if there was already one send
|
||||||
|
// to respect ConnectionConfiguration.isSendPresence()
|
||||||
|
final Presence presenceSend = this.presenceSend;
|
||||||
|
if (connection.isAuthenticated() && presenceSend != null) {
|
||||||
|
try {
|
||||||
|
connection.sendStanza(presenceSend.cloneWithNewId());
|
||||||
|
}
|
||||||
|
catch (InterruptedException | NotConnectedException e) {
|
||||||
|
LOGGER.log(Level.WARNING, "Could could not update presence with caps info", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, RENEW_ENTITY_CAPS_DELAY_MILLIS, TimeUnit.MILLISECONDS);
|
}, RENEW_ENTITY_CAPS_DELAY_MILLIS, TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue