Here is what seems to work for me:
-
Connect and login the usual way.
-
Get a ServiceDiscoveryManager using ServiceDiscoveryManager.getInstanceFor(connection);
-
Iterate through the discovery items to get the transport entity IDs:
discoverItems = disco.discoverItems(connection.getServiceName());
Iterator items = discoItems.getItems();
Set<String> transports = new HashSet<String>();
while (items.hasNext())
{
item = (DiscoverItems.Item) items.next();
String entityName = item.getEntityID();
if (entityName != null)
{
if (entityName.startsWith(“aim.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“msn.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“yahoo.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“icq.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“gtalk.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“xmpp.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“irc.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“sip.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“gadugadu.”))
{
transports.add(entityName);
}
else if (entityName.startsWith(“qq.”))
{
transports.add(entityName);
}
}
} // while
- Send a Presence packet:
for (String xmppid : transports) {
Presence p = new Presence(Presence.Type.available);
p.setTo(xmppId);
connection.sendPacket§;
}
In practice I don’t send that unless the transport is not available.