[disco] Move logic that was previously in EntityCapsManager in SDM

This commit is contained in:
Florian Schmaus 2020-05-17 20:50:25 +02:00
parent 87591655ad
commit 2679c72f0f
3 changed files with 52 additions and 53 deletions

View File

@ -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);
}
}
} }
/** /**

View File

@ -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);
} }

View File

@ -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);
} }