Keepalive are now send as iq packets not as messages.

cusax-fix
Damian Minkov 19 years ago
parent 003c9e5429
commit f0e3cdfc4f

@ -89,7 +89,7 @@ public class OperationSetBasicInstantMessagingJabberImpl
provider.addRegistrationStateChangeListener(new RegistrationStateListener());
// register the KeepAlive Extension in the smack library
ProviderManager.addExtensionProvider(KeepAliveEventProvider.ELEMENT_NAME,
ProviderManager.addIQProvider(KeepAliveEventProvider.ELEMENT_NAME,
KeepAliveEventProvider.NAMESPACE,
new KeepAliveEventProvider());
}
@ -274,6 +274,11 @@ public void registrationStateChanged(RegistrationStateChangeEvent evt)
// run keepalive thread
if(keepAliveSendTask == null && keepAliveEnabled)
{
jabberProvider.getConnection().addPacketListener(
new KeepalivePacketListener(),
new PacketTypeFilter(
KeepAliveEvent.class));
keepAliveSendTask = new KeepAliveSendTask();
keepAliveTimer.scheduleAtFixedRate(
@ -340,17 +345,6 @@ public void processPacket(Packet packet)
+ msg.toXML());
}
KeepAliveEvent keepAliveEvent =
(KeepAliveEvent)packet.getExtension(
KeepAliveEventProvider.ELEMENT_NAME,
KeepAliveEventProvider.NAMESPACE);
if(keepAliveEvent != null)
{
keepAliveEvent.setFromUserID(fromUserID);
receivedKeepAlivePackets.addLast(keepAliveEvent);
return;
}
Message newMessage = createMessage(msg.getBody());
Contact sourceContact =
@ -400,6 +394,31 @@ public void processPacket(Packet packet)
fireMessageEvent(msgReceivedEvt);
}
}
/**
* Receives incoming KeepAlive Packets
*/
private class KeepalivePacketListener
implements PacketListener
{
public void processPacket(Packet packet)
{
if(packet != null && !(packet instanceof KeepAliveEvent))
return;
KeepAliveEvent keepAliveEvent = (KeepAliveEvent)packet;
if(logger.isDebugEnabled())
{
logger.debug("Received keepAliveEvent from "
+ keepAliveEvent.getFromUserID()
+ " the message : "
+ keepAliveEvent.toXML());
}
receivedKeepAlivePackets.addLast(keepAliveEvent);
}
}
/**
* Task sending packets on intervals.
@ -410,55 +429,32 @@ private class KeepAliveSendTask
{
public void run()
{
try
// if we are not registerd do nothing
if(!jabberProvider.isRegistered())
{
// if we are not registerd do nothing
if(!jabberProvider.isRegistered())
{
logger.trace("provider not registered. "
+"won't send keep alive. acc.id="
+ jabberProvider.getAccountID()
.getAccountUniqueID());
return;
}
Chat chat =
jabberProvider.getConnection().
createChat(jabberProvider.getAccountID().getUserID());
org.jivesoftware.smack.packet.Message msg = chat.createMessage();
//make the system message unique (emcho: I think some servers "
//may be ignoring repetitive messages.)
msg.setBody("SYSTEM MESSAGE! ("
+ System.currentTimeMillis()
+ ")");
logger.trace("provider not registered. "
+"won't send keep alive. acc.id="
+ jabberProvider.getAccountID()
.getAccountUniqueID());
return;
}
KeepAliveEvent keepAliveEvent = new KeepAliveEvent();
KeepAliveEvent keepAliveEvent =
new KeepAliveEvent(jabberProvider.getConnection().getUser());
keepAliveEvent.setSrcOpSetHash(
OperationSetBasicInstantMessagingJabberImpl.this.hashCode());
keepAliveEvent.setSrcProviderHash(jabberProvider.hashCode());
keepAliveEvent.setSrcOpSetHash(
OperationSetBasicInstantMessagingJabberImpl.this.hashCode());
keepAliveEvent.setSrcProviderHash(jabberProvider.hashCode());
// add keepalive data
msg.addExtension(keepAliveEvent);
// schedule the check task
keepAliveTimer.schedule(
new KeepAliveCheckTask(), KEEPALIVE_WAIT);
// schedule the check task
keepAliveTimer.schedule(
new KeepAliveCheckTask(), KEEPALIVE_WAIT);
logger.trace(
"send keepalive for acc: "
+ jabberProvider.getAccountID().getAccountUniqueID());
logger.trace(
"send keepalive for acc: "
+ jabberProvider.getAccountID().getAccountUniqueID());
chat.sendMessage(msg);
}
catch (XMPPException ex)
{
logger.error(
"Error sending keep alive packet for account"
+ jabberProvider.getAccountID().getAccountUniqueID()
, ex);
}
jabberProvider.getConnection().sendPacket(keepAliveEvent);
}
}

@ -7,6 +7,7 @@
package net.java.sip.communicator.impl.protocol.jabber.extensions;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smack.util.*;
/**
* KeepAlive Event. Events are send on specified interval
@ -18,7 +19,7 @@
* @author Damian Minkov
*/
public class KeepAliveEvent
implements PacketExtension
extends IQ
{
public static final String SOURCE_PROVIDER_HASH = "src-provider-hash";
public static final String SOURCE_OPSET_HASH = "src-opset-hash";
@ -26,41 +27,36 @@ public class KeepAliveEvent
private int srcProviderHash = -1;
private int srcOpSetHash = -1;
private String fromUserID = null;
/**
* Returns the XML element name of the extension sub-packet root element.
* Always returns "x"
*
* @return the XML element name of the packet extension.
* Constructs empty packet
*/
public String getElementName()
{
return KeepAliveEventProvider.ELEMENT_NAME;
}
public KeepAliveEvent()
{}
/**
* Returns the XML namespace of the extension sub-packet root element.
* The namespace is always "sip-communicator:x:keepalive"
*
* @return the XML namespace of the packet extension.
* Construct packet for sending
*/
public String getNamespace()
public KeepAliveEvent(String to)
{
return KeepAliveEventProvider.NAMESPACE;
if (to == null)
{
throw new IllegalArgumentException("Parameter cannot be null");
}
setTo(to);
}
/**
* Returns the XML reppresentation of the PacketExtension.
* Returns the sub-element XML section of this packet
*
* @return the packet extension as XML.
* @todo Implement this org.jivesoftware.smack.packet.PacketExtension
* method
* @return the packet as XML.
*/
public String toXML()
public String getChildElementXML()
{
StringBuffer buf = new StringBuffer();
buf.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append(
"\">");
buf.append("<").append(KeepAliveEventProvider.ELEMENT_NAME).
append(" xmlns=\"").append(KeepAliveEventProvider.NAMESPACE).
append("\">");
buf.append("<").
append(SOURCE_PROVIDER_HASH).append(">").
@ -72,9 +68,21 @@ public String toXML()
append(getSrcOpSetHash()).append("</").
append(SOURCE_OPSET_HASH).append(">");
buf.append("</").append(getElementName()).append(">");
buf.append("</").append(KeepAliveEventProvider.ELEMENT_NAME).append(">");
return buf.toString();
}
/**
* The user id sending this packet
* @return String user id
*/
public String getFromUserID()
{
if(getFrom() != null)
return StringUtils.parseBareAddress(getFrom());
else
return null;
}
/**
* Returns the hash of the source opeartion set sending this message
@ -94,15 +102,6 @@ public int getSrcProviderHash()
return srcProviderHash;
}
/**
* The user id sending this packet
* @return String user id
*/
public String getFromUserID()
{
return fromUserID;
}
/**
* Sets the hash of the source provider that will send the message
* @param srcProviderHash int hash of the provider
@ -119,14 +118,5 @@ public void setSrcProviderHash(int srcProviderHash)
public void setSrcOpSetHash(int srcOpSetHash)
{
this.srcOpSetHash = srcOpSetHash;
}
/**
* The user id sending this packet
* @param fromUserID String user id
*/
public void setFromUserID(String fromUserID)
{
this.fromUserID = fromUserID;
}
}
}

@ -16,10 +16,10 @@
* @author Damian Minkov
*/
public class KeepAliveEventProvider
implements PacketExtensionProvider
implements IQProvider
{
public static final String ELEMENT_NAME = "x";
public static final String NAMESPACE = "sip-communicator:x:keepalive";
public static final String ELEMENT_NAME = "keepalive";
public static final String NAMESPACE = "sip-communicator:iq:keepalive";
/**
* Creates a new KeepAliveEventProvider.
@ -30,15 +30,13 @@ public KeepAliveEventProvider()
{}
/**
* Parses a KeepAliveEvent packet (extension sub-packet).
* Parses a KeepAliveEvent packet .
*
* @param parser an XML parser.
* @return a new IQ instance.
* @throws Exception if an error occurs parsing the XML.
* @todo Implement this
* org.jivesoftware.smack.provider.PacketExtensionProvider method
*/
public PacketExtension parseExtension(XmlPullParser parser)
public IQ parseIQ(XmlPullParser parser)
throws Exception
{
KeepAliveEvent result = new KeepAliveEvent();
@ -64,7 +62,7 @@ public PacketExtension parseExtension(XmlPullParser parser)
}
else if(eventType == XmlPullParser.END_TAG)
{
if(parser.getName().equals("x"))
if(parser.getName().equals(ELEMENT_NAME))
{
done = true;
}

@ -266,6 +266,7 @@ public void subtestStateTransition( IcqStatusEnum newStatus)
// and wait for the response
if(statusEventCollector.collectedPresEvents.size() == 0)
{
logger.trace("Will query again status as we haven't received one");
operationSetPresence.queryContactStatus(fixture.icqAccountID.getUserID());
statusEventCollector.waitForPresEvent(10000);
}

Loading…
Cancel
Save