From 0e49adff1d4d88359c3a0c2c2d60efdfc31677e8 Mon Sep 17 00:00:00 2001 From: Aditya Borikar Date: Tue, 18 Aug 2020 11:12:56 +0530 Subject: [PATCH] Introduce StreamOpenAndCloseFactory for modular architecture --- .../smack/AbstractXMPPConnection.java | 3 +++ .../ModularXmppClientToServerConnection.java | 21 ++++++++++++++- .../smack/c2s/StreamOpenAndCloseFactory.java | 26 +++++++++++++++++++ .../c2s/XmppClientToServerTransport.java | 2 ++ .../smack/tcp/XmppTcpTransportModule.java | 18 +++++++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 smack-core/src/main/java/org/jivesoftware/smack/c2s/StreamOpenAndCloseFactory.java diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java index 530bf7b11..fa76f780d 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java @@ -2243,7 +2243,10 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { StreamOpen streamOpen = new StreamOpen(to, from, id, config.getXmlLang(), StreamOpen.StreamContentNamespace.client); sendNonza(streamOpen); + updateOutgoingStreamXmlEnvironmentOnStreamOpen(streamOpen); + } + protected void updateOutgoingStreamXmlEnvironmentOnStreamOpen(StreamOpen streamOpen) { XmlEnvironment.Builder xmlEnvironmentBuilder = XmlEnvironment.builder(); xmlEnvironmentBuilder.with(streamOpen); outgoingStreamXmlEnvironment = xmlEnvironmentBuilder.build(); diff --git a/smack-core/src/main/java/org/jivesoftware/smack/c2s/ModularXmppClientToServerConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/c2s/ModularXmppClientToServerConnection.java index 5bc020c46..25351cc45 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/c2s/ModularXmppClientToServerConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/c2s/ModularXmppClientToServerConnection.java @@ -68,6 +68,7 @@ import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Stanza; import org.jivesoftware.smack.packet.StreamClose; import org.jivesoftware.smack.packet.StreamError; +import org.jivesoftware.smack.packet.StreamOpen; import org.jivesoftware.smack.packet.TopLevelStreamElement; import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.parsing.SmackParsingException; @@ -81,7 +82,9 @@ import org.jivesoftware.smack.util.Supplier; import org.jivesoftware.smack.xml.XmlPullParser; import org.jivesoftware.smack.xml.XmlPullParserException; +import org.jxmpp.jid.DomainBareJid; import org.jxmpp.jid.parts.Resourcepart; +import org.jxmpp.util.XmppStringUtils; public final class ModularXmppClientToServerConnection extends AbstractXMPPConnection { @@ -560,10 +563,26 @@ public final class ModularXmppClientToServerConnection extends AbstractXMPPConne protected void newStreamOpenWaitForFeaturesSequence(String waitFor) throws InterruptedException, SmackException, XMPPException { prepareToWaitForFeaturesReceived(); - sendStreamOpen(); + + // Create StreamOpen from StreamOpenAndCloseFactory via underlying transport. + StreamOpenAndCloseFactory streamOpenAndCloseFactory = activeTransport.getStreamOpenAndCloseFactory(); + CharSequence from = null; + CharSequence localpart = connectionInternal.connection.getConfiguration().getUsername(); + DomainBareJid xmppServiceDomain = getXMPPServiceDomain(); + if (localpart != null) { + from = XmppStringUtils.completeJidFrom(localpart, xmppServiceDomain); + } + StreamOpen streamOpen = streamOpenAndCloseFactory.createStreamOpen(xmppServiceDomain, from, getStreamId(), getConfiguration().getXmlLang()); + sendStreamOpen(streamOpen); + waitForFeaturesReceived(waitFor); } + private void sendStreamOpen(StreamOpen streamOpen) throws NotConnectedException, InterruptedException { + sendNonza(streamOpen); + updateOutgoingStreamXmlEnvironmentOnStreamOpen(streamOpen); + } + public static class DisconnectedStateDescriptor extends StateDescriptor { protected DisconnectedStateDescriptor() { super(DisconnectedState.class, StateDescriptor.Property.finalState); diff --git a/smack-core/src/main/java/org/jivesoftware/smack/c2s/StreamOpenAndCloseFactory.java b/smack-core/src/main/java/org/jivesoftware/smack/c2s/StreamOpenAndCloseFactory.java new file mode 100644 index 000000000..250fedfce --- /dev/null +++ b/smack-core/src/main/java/org/jivesoftware/smack/c2s/StreamOpenAndCloseFactory.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2020 Aditya Borikar. + * + * 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.c2s; + +import org.jivesoftware.smack.packet.StreamClose; +import org.jivesoftware.smack.packet.StreamOpen; + +public interface StreamOpenAndCloseFactory { + StreamOpen createStreamOpen(CharSequence to, CharSequence from, String id, String lang); + + StreamClose createStreamClose(); +} diff --git a/smack-core/src/main/java/org/jivesoftware/smack/c2s/XmppClientToServerTransport.java b/smack-core/src/main/java/org/jivesoftware/smack/c2s/XmppClientToServerTransport.java index d68440fc3..4bedb51b6 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/c2s/XmppClientToServerTransport.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/c2s/XmppClientToServerTransport.java @@ -58,6 +58,8 @@ public abstract class XmppClientToServerTransport { return getSslSession() != null; } + public abstract StreamOpenAndCloseFactory getStreamOpenAndCloseFactory(); + public abstract Stats getStats(); public abstract static class Stats { diff --git a/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XmppTcpTransportModule.java b/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XmppTcpTransportModule.java index 946eb4a1a..ca003ca8d 100644 --- a/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XmppTcpTransportModule.java +++ b/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XmppTcpTransportModule.java @@ -58,6 +58,7 @@ import org.jivesoftware.smack.XmppInputOutputFilter; import org.jivesoftware.smack.c2s.ModularXmppClientToServerConnection.ConnectedButUnauthenticatedStateDescriptor; import org.jivesoftware.smack.c2s.ModularXmppClientToServerConnection.LookupRemoteConnectionEndpointsStateDescriptor; import org.jivesoftware.smack.c2s.ModularXmppClientToServerConnectionModule; +import org.jivesoftware.smack.c2s.StreamOpenAndCloseFactory; import org.jivesoftware.smack.c2s.XmppClientToServerTransport; import org.jivesoftware.smack.c2s.internal.ModularXmppClientToServerConnectionInternal; import org.jivesoftware.smack.c2s.internal.WalkStateGraphContext; @@ -68,6 +69,7 @@ import org.jivesoftware.smack.fsm.StateTransitionResult; import org.jivesoftware.smack.internal.SmackTlsContext; import org.jivesoftware.smack.packet.Stanza; import org.jivesoftware.smack.packet.StartTls; +import org.jivesoftware.smack.packet.StreamClose; import org.jivesoftware.smack.packet.StreamOpen; import org.jivesoftware.smack.packet.TlsFailure; import org.jivesoftware.smack.packet.TlsProceed; @@ -580,6 +582,22 @@ public class XmppTcpTransportModule extends ModularXmppClientToServerConnectionM super(connectionInternal); } + @Override + public StreamOpenAndCloseFactory getStreamOpenAndCloseFactory() { + return new StreamOpenAndCloseFactory() { + @Override + public StreamOpen createStreamOpen(CharSequence to, CharSequence from, String id, String lang) { + String xmlLang = connectionInternal.connection.getConfiguration().getXmlLang(); + StreamOpen streamOpen = new StreamOpen(to, from, id, xmlLang, StreamOpen.StreamContentNamespace.client); + return streamOpen; + } + @Override + public StreamClose createStreamClose() { + return StreamClose.INSTANCE; + } + }; + } + @Override protected void resetDiscoveredConnectionEndpoints() { discoveredTcpEndpoints = null;