Commit 07a474b9 authored by Daniel Henninger's avatar Daniel Henninger Committed by dhenninger

Copyright updates and, unfortunately, removal of SIP/SIMPLE support due to...

Copyright updates and, unfortunately, removal of SIP/SIMPLE support due to lack of license agreement with contributors.

git-svn-id: http://svn.igniterealtime.org/svn/repos/wildfire/trunk@7522 b35dd754-fafc-0310-a699-88a17e54d16e
parent 2ef81dcf
...@@ -162,7 +162,6 @@ hr { ...@@ -162,7 +162,6 @@ hr {
<h2>Major Known Issues</h2> <h2>Major Known Issues</h2>
<ul> <ul>
<li>Many issues with Yahoo support that I haven't been able to track down (yahoo supported moved to post-1.0)</li> <li>Many issues with Yahoo support that I haven't been able to track down (yahoo supported moved to post-1.0)</li>
<li>I haven't been able to test SIP/SIMPLE support well. Please report if you have success with it.</li>
<li>Some outstanding issues with ICQ as joscar doesn't fully support ICQ yet</li> <li>Some outstanding issues with ICQ as joscar doesn't fully support ICQ yet</li>
</ul> </ul>
...@@ -181,6 +180,11 @@ hr { ...@@ -181,6 +180,11 @@ hr {
<li>[<a href='http://www.igniterealtime.org/issues/browse/GATE-157'>GATE-157</a>] - Yahoo usernames now allow a . (period)</li> <li>[<a href='http://www.igniterealtime.org/issues/browse/GATE-157'>GATE-157</a>] - Yahoo usernames now allow a . (period)</li>
</ul> </ul>
<b>Removals</b>
<ul>
<li>Required to remove SIP/SIMPLE support due to lack of license agreement. =(</li>
</ul>
<h2>1.0 Beta 8 -- <span style="font-weight: normal;">February 26, 2007</span></h2> <h2>1.0 Beta 8 -- <span style="font-weight: normal;">February 26, 2007</span></h2>
<b>Bug Fixes</b> <b>Bug Fixes</b>
......
Name | Version Name | Version
------------------------------------------------------- -------------------------------------------------------
cindy.jar | 2.4.4 (patched [#4]) cindy.jar | 2.4.4 (patched [#4])
concurrent.jar | 1.3.4
dwr.jar | 1.1.1 (patched [#3]) dwr.jar | 1.1.1 (patched [#3])
irclib.jar | 1.10 irclib.jar | 1.10
jainsipapi.jar | 1.2 (nightly 2007-02-13)
jainsipri.jar | 1.2 (nightly 2007-02-13)
jakarta-regexp.jar | 1.3
jml.jar | svn-20070225 jml.jar | svn-20070225
joscar-client.jar | svn-20070204 (patched [#2]) joscar-client.jar | svn-20070204 (patched [#2])
joscar-common.jar | svn-20070204 joscar-common.jar | svn-20070204
joscar-protocol.jar | svn-20070204 (patched [#2]) joscar-protocol.jar | svn-20070204 (patched [#2])
log4j.jar | 1.2.8
picocontainer.jar | 1.2.0 picocontainer.jar | 1.2.0
ymsg_network.jar | 0.61 (patched [#1]) ymsg_network.jar | 0.61 (patched [#1])
ymsg_support.jar | 0.61 (patched [#1]) ymsg_support.jar | 0.61 (patched [#1])
......
...@@ -229,7 +229,6 @@ hr { ...@@ -229,7 +229,6 @@ hr {
<li>ICQ: login.oscar.aol.com 5190</li> <li>ICQ: login.oscar.aol.com 5190</li>
<li>IRC: irc.freenode.net 7000</li> <li>IRC: irc.freenode.net 7000</li>
<li>MSN: messenger.hotmail.com 1863</li> <li>MSN: messenger.hotmail.com 1863</li>
<li>SIP: localhost 5060</li>
<li>Yahoo: scs.msg.yahoo.com 5050</li> <li>Yahoo: scs.msg.yahoo.com 5050</li>
</ul> </ul>
Please be aware that these are only the initial connections made. Many of Please be aware that these are only the initial connections made. Many of
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
...@@ -81,10 +81,6 @@ public class GatewayPlugin implements Plugin { ...@@ -81,10 +81,6 @@ public class GatewayPlugin implements Plugin {
/* Set up MSN transport. */ /* Set up MSN transport. */
transports.put("msn", new TransportInstance(TransportType.msn, LocaleUtils.getLocalizedString("gateway.msn.name", "gateway"), "org.jivesoftware.wildfire.gateway.protocols.msn.MSNTransport", componentManager)); transports.put("msn", new TransportInstance(TransportType.msn, LocaleUtils.getLocalizedString("gateway.msn.name", "gateway"), "org.jivesoftware.wildfire.gateway.protocols.msn.MSNTransport", componentManager));
maybeStartService("msn"); maybeStartService("msn");
/* Set up SIP/SIMPLE transport. */
transports.put("sip", new TransportInstance(TransportType.sip, LocaleUtils.getLocalizedString("gateway.sip.name", "gateway"), "org.jivesoftware.wildfire.gateway.protocols.simple.SimpleTransport", componentManager));
maybeStartService("sip");
} }
public void destroyPlugin() { public void destroyPlugin() {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
*/ */
package org.jivesoftware.wildfire.gateway; package org.jivesoftware.wildfire.gateway;
/** /**
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
/**
* $Revision$
* $Date$
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.wildfire.gateway.protocols.simple;
import java.io.ByteArrayInputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.QName;
import org.jivesoftware.util.Log;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmpp.packet.Presence;
/**
* This class performs conversions between presence packets of XMPP and SIMPLE formats.
* <br>
* By now, SIP presence comforms with <a href="http://www.ietf.org/rfc/rfc4480.txt">RFC4480</a>.
* @author Patrick Siu
* @version 0.0.1
*/
public class SimplePresence {
/**
* Tuple status of the presence packet.
* @author Patrick Siu
* @version 0.0.1
*/
public enum TupleStatus {
OPEN ("open"),
CLOSED("closed");
private String status;
public static TupleStatus getTupleStatus(String tupleStatusString) throws IllegalArgumentException {
for (TupleStatus t : values()) {
if (t.toString().equalsIgnoreCase(tupleStatusString)) return t;
}
throw new IllegalArgumentException("There is no matching TupleStatus for this String.");
}
private TupleStatus(String status) {
this.status = status;
}
public boolean isOpen() {
return status.equals("open");
}
public String toString() {
return status;
}
}
/**
* Represents the rpid of the status packet.
* <br><br>
* Refer to <a href="http://www.ietf.org/rfc/rfc4480.txt">RFC4480</a> for details of these statuses.
* @author Patrick Siu
* @version 0.0.1
*/
public enum Rpid {
APPOINTMENT ("appointment"),
AWAY ("away"),
BREAKFAST ("breakfast"),
BUSY ("busy"),
DINNER ("dinner"),
HOLIDAY ("holiday"),
IN_TRANSIT ("in-transit"),
LOOKING_FOR_WORK ("looking-for-work"),
LUNCH ("lunch"),
MEAL ("meal"),
MEETING ("meeting"),
ON_THE_PHONE ("on-the-phone"),
OTHER ("other"),
PERFORMANCE ("performance"),
PERMANENT_ABSENCE("permanent-absence"),
PLAYING ("playing"),
PRESENTATION ("presentation"),
SHOPPING ("shopping"),
SLEEPING ("sleeping"),
SPECTATOR ("spectator"),
STEERING ("steering"),
TRAVEL ("travel"),
TV ("tv"),
UNKNOWN ("unknown"),
VACATION ("vacation"),
WORKING ("working"),
WORSHIP ("worship");
private String desc;
public static Rpid getRpid(String rpidString) throws IllegalArgumentException {
for (Rpid r : values()) {
if (r.toString().equalsIgnoreCase(rpidString)) return r;
}
throw new IllegalArgumentException("There is no matching Rpid for the String.");
}
private Rpid(String desc) {
this.desc = desc;
}
/**
* Overridden to return the string description of the constant.
*/
public String toString() {
return desc;
}
}
private TupleStatus tupleStatus;
private Rpid rpid;
private String dmNote;
private String entity;
/**
* Constructor.
*/
public SimplePresence() {
this.tupleStatus = TupleStatus.OPEN;
this.rpid = Rpid.UNKNOWN;
this.dmNote = "";
this.entity = "";
}
public SimplePresence(TupleStatus tupleStatus) {
this.tupleStatus = tupleStatus;
this.rpid = Rpid.UNKNOWN;
this.dmNote = "";
this.entity = "";
}
public void setRpid(Rpid rpid) {
this.rpid = rpid;
}
public void setDmNote(String dmNote) {
this.dmNote = dmNote;
}
public void setEntity(String entity) {
this.entity = entity;
}
public void setTupleStatus(TupleStatus tupleStatus) {
this.tupleStatus = tupleStatus;
}
public Rpid getRpid() {
return this.rpid;
}
public String getDmNote() {
return this.dmNote;
}
public TupleStatus getTupleStatus() {
return this.tupleStatus;
}
private String getEightLength(int hash) {
StringBuffer buffer = new StringBuffer(Integer.toHexString(hash));
while (buffer.length() < 8) {
buffer.insert(0, "0");
}
return new String(buffer);
}
public String toXML() {
String result =
"<?xml version='1.0' encoding='UTF-8'?>" +
"<presence xmlns='urn:ietf:params:xml:ns:pidf'" +
" xmlns:dm='urn:ietf:params:xml:ns:pidf:data-model'" +
" xmlns:rpid='urn:ietf:params:xml:ns:pidf:rpid'" +
" xmlns:c='urn:ietf:params:xml:ns:pidf:cipid'" +
" entity='" + entity + "'>" +
"<tuple id='t" + getEightLength(tupleStatus.hashCode()) + "'><status><basic>" + tupleStatus.toString() + "</basic></status></tuple>" +
"<dm:person id='p" + getEightLength(this.hashCode()) + "'><rpid:activities><rpid:" + rpid.toString() + "/></rpid:activities>" +
// "<tuple><status><basic>" + tupleStatus.toString() + "</basic></status></tuple>" +
// "<dm:person><rpid:activities><rpid:" + rpid.toString() + "/></rpid:activities>" +
((dmNote != null && !dmNote.equals("")) ? "<dm:note>" + dmNote + "</dm:note>" : "") +
"</dm:person>" +
"</presence>";
// DocumentFactory docFactory = DocumentFactory.getInstance();
//
// Document xmlDocument = docFactory.createDocument();
// Element rootElement = docFactory.createDocument().addElement("presence");
//
// rootElement.addAttribute("xmlns", "urn:ietf:params:xml:ns:pidf");
// rootElement.addAttribute(new QName("xmlns", "dm"), "urn:ietf:params:xml:ns:pidf:data-model");
// rootElement.addAttribute(new QName("xmlns", "rpid"), "urn:ietf:params:xml:ns:pidf:rpid");
// rootElement.addAttribute(new QName("xmlns", "c"), "urn:ietf:params:xml:ns:pidf:cipid");
// rootElement.addAttribute("entity", entity);
//
// Element tupleElement = rootElement.addElement("tuple");
// tupleElement.addAttribute("id", "t" + Integer.toHexString(this.hashCode()));
// tupleElement.addElement("status").addElement("basic").setText(this.tupleStatus.toString());
//
// Element personElement = rootElement.addElement(new QName("dm", "person"));
// personElement.addAttribute("id", "p" + Integer.toHexString(this.hashCode()));
// personElement.addElement(new QName("rpid", "activities")).addElement("rpid:" + this.rpid.toString());
//
// if (this.dmNote != null && !this.dmNote.trim().equals("")) {
// personElement.addElement("dm:note").setText(this.dmNote);
// }
//
// return xmlDocument.asXML();
return result;
}
// public Presence convertSIPPresenceToXMPP(String sipPresence) {
// Presence xmppPresence = new Presence();
//
// SAXParser saxParser;
// try {
// SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// saxParser = saxParserFactory.newSAXParser();
//
// } catch (Exception e) {
// Log.debug("Unable to load parser to parse SIP presence to XMPP Presence.", e);
// return xmppPresence;
// }
//
// return xmppPresence;
// }
// public String convertXMPPPresenceToSIP(Presence xmppPresence) {
// String sipPresence = "";
// String basic = "open";
// String rpid = "unknown";
// String dmNote = "";
//
// if (!xmppPresence.isAvailable()) {
// // Prepare "closed" basic presence.
// basic = "closed";
// } else {
// Presence.Show xmppPresenceShow = xmppPresence.getShow();
// if (xmppPresenceShow.equals(Presence.Show.away)) {
// rpid = "away";
// } else if (xmppPresenceShow.equals(Presence.Show.chat)) {
// rpid = "away";
// } else if (xmppPresenceShow.equals(Presence.Show.dnd)) {
// rpid = "busy";
// } else if (xmppPresenceShow.equals(Presence.Show.xa)) {
// rpid = "away";
// } else {
// rpid = "";
// }
// }
//
// sipPresence = "<?xml version='1.0' encoding='UTF-8'?>"
// + "<presence xmlns='urn:ietf:params:xml:ns:pidf' xmlns:dm='urn:ietf:params:xml:ns:pidf:data-model' "
// + "xmlns:rpid='urn:ietf:params:xml:ns:pidf:rpid' xmlns:c='urn:ietf:params:xml:ns:pidf:cipid' "
// + "entity='pres:sip:sipdemo1@192.168.1.199'>"
// + "<tuple><status><basic>" + basic + "</basic></status></tuple>"
// + "<dm:person id='p3e32d940'><rpid:activities><rpid:" + rpid + "/></rpid:activities></dm:person></presence>";
//
// return sipPresence;
// }
public void parse(String simplePresenceXml) throws Exception {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
ByteArrayInputStream bais = new ByteArrayInputStream(simplePresenceXml.getBytes());
saxParser.parse(bais, new SimplePresenceParser());
bais.close();
}
public static SimplePresence parseSimplePresence(String simplePresenceXml) throws Exception {
SimplePresence simplePresenceObject = new SimplePresence();
simplePresenceObject.parse(simplePresenceXml);
return simplePresenceObject;
}
class SimplePresenceParser extends DefaultHandler {
private boolean isStartTag = false;
private boolean isPresence = false;
private boolean isStatus = false;
private boolean isStatusType = false;
private boolean isStatusName = false;
String elementName = null;
String paramName = null;
String userName = null;
String statusType = null;
String statusName = null;
public SimplePresenceParser() {
}
public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) throws SAXException {
isStartTag = true;
elementName = (!sName.equals(""))? sName : qName;
if(elementName.equals("presence")) {
isPresence = true;
if (attrs.getIndex("entity") >= 0) {
entity = attrs.getValue("entity");
}
}
else if(elementName.equals("basic")) {
isStatus = true;
}
else if(elementName.equals("rpid:user-input")) {
isStatusType = true;
}
else if(elementName.startsWith("rpid:")) {
try {
String temp = elementName.substring(elementName.indexOf("rpid:") + 5);
if(!temp.equals("activities")) {
try {
rpid = Rpid.getRpid(temp);
}
catch (IllegalArgumentException ex) {
Log.debug(ex);
// Ignore the exception. Leave it as "unknown".
}
}
}
catch (Exception ex) {
Log.debug(ex);
}
}
else if(elementName.equals("dm:note")) {
isStatusName = true;
}
if (isPresence) {
// for(int i = 0; i < attrs.getLength(); i++) {
// if(attrs.getQName(i).equals("entity")) {
// userName = attrs.getValue(i).substring(attrs.getValue(i).indexOf("sip:"));
// }
// }
}
}
public void characters(char buf[], int offset, int len) throws SAXException {
String data = new String(buf, offset, len);
if (isStatus) {
try {
tupleStatus = TupleStatus.getTupleStatus(data);
}
catch (IllegalArgumentException ex) {
}
}
else if (isStatusType) {
// statusType = data;
}
else if (isStatusName) {
dmNote = data;
// if (rpid.compareTo(Rpid.UNKNOWN) == 0) {
// try {
// rpid = Rpid.getRpid(data);
// }
// catch (IllegalArgumentException ex) {
// // Ignore the exception. Leave it as "unknown".
// }
// }
// statusName = data;
}
}
public void endElement(String namespaceURI, String sName, String qName) throws SAXException {
isStartTag = false;
elementName = (!sName.equals(""))? sName : qName;
if(elementName.equals("presence")) {
isPresence = false;
}
else if(elementName.equals("basic")) {
isStatus = false;
}
else if(elementName.equals("rpid:user-input")) {
isStatusType = false;
}
else if(elementName.equals("dm:note")) {
isStatusName = false;
}
}
public void endDocument() throws SAXException {
// obj.setUser(userName);
// obj.setType(statusType);
// obj.setStatus(statusName);
}
}
}
/**
* $Revision$
* $Date$
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.wildfire.gateway.protocols.simple;
import java.util.Hashtable;
import org.jivesoftware.util.Log;
/**
* This class represents the roster of SIP transport.
* <br><br>
* By now the SIP has no rosters stored so clients got to implement rosters themselves.
* @author Patrick Siu
* @version 0.0.2
*/
public class SimpleRoster {
private SimpleSession mySimpleSession;
private Hashtable<String, SimpleRosterItem> rosterItemList;
private boolean activated = false;
public SimpleRoster(SimpleSession mySimpleSession) {
if (mySimpleSession == null)
throw new NullPointerException("The SIP session provided cannot be null!");
this.mySimpleSession = mySimpleSession;
}
public synchronized void activate() {
this.activated = true;
}
public synchronized void deactivate() {
this.activated = false;
}
public void addEntry(String userid, SimpleRosterItem item) {
rosterItemList.put(userid, item);
}
public void removeEntry(String userid) {
rosterItemList.remove(userid);
}
public SimpleRosterItem getEntry(String userid) {
return rosterItemList.get(userid);
}
/**
* Loads the SIP roster from persistent store.
*/
public void loadRoster() {
// Roster should be loaded in persistent stores.
}
/**
* Stores the SIP roster into persistent store.
*/
public void storeRoster() {
// Roster should be stored in persistent stores.
}
public void finalize() {
Log.debug("SimpleRoster shutting down!");
rosterItemList.clear();
}
}
/**
* $Revision$
* $Date$
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.wildfire.gateway.protocols.simple;
import javax.sip.Dialog;
/**
* This class represents a roster item of SIP transport.
*/
public class SimpleRosterItem {
private String userid;
private String nickname;
private SimplePresence presence;
private Dialog outgoingDialog;
private long seqNum;
public SimpleRosterItem(String userid, String nickname, long seqNum) {
this.userid = userid;
this.nickname = nickname;
this.seqNum = seqNum;
presence = new SimplePresence();
presence.setTupleStatus(SimplePresence.TupleStatus.CLOSED);
outgoingDialog = null;
}
public void incrementSeqNum() {
seqNum++;
}
public long getSeqNum() {
return seqNum;
}
public void updatePresence(String newPresence) throws Exception {
presence.parse(newPresence);
}
public void setOutgoingDialog(Dialog outgoingDialog) {
this.outgoingDialog = outgoingDialog;
}
public Dialog getOutgoingDialog() {
return outgoingDialog;
}
}
\ No newline at end of file
/**
* $Revision$
* $Date$
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.wildfire.gateway.protocols.simple;
import java.net.InetAddress;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Properties;
import java.util.TooManyListenersException;
import javax.sip.ClientTransaction;
import javax.sip.Dialog;
import javax.sip.InvalidArgumentException;
import javax.sip.ListeningPoint;
import javax.sip.RequestEvent;
import javax.sip.ServerTransaction;
import javax.sip.SipException;
import javax.sip.SipFactory;
import javax.sip.SipProvider;
import javax.sip.SipStack;
import javax.sip.TransactionAlreadyExistsException;
import javax.sip.TransactionDoesNotExistException;
import javax.sip.TransactionUnavailableException;
import javax.sip.address.Address;
import javax.sip.address.AddressFactory;
import javax.sip.address.SipURI;
import javax.sip.header.*;
import javax.sip.message.MessageFactory;
import javax.sip.message.Request;
import javax.sip.message.Response;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.Log;
import org.jivesoftware.wildfire.XMPPServer;
import org.jivesoftware.wildfire.gateway.*;
import org.jivesoftware.wildfire.roster.*;
import org.jivesoftware.wildfire.user.User;
import org.xmpp.packet.JID;
import org.xmpp.packet.Presence;
/**
* A gateway session to a SIMPLE IM server.
* @author Patrick Siu
* @version 0.0.1
*/
public class SimpleSession extends TransportSession {
private SipFactory sipFactory = null;
private String sipHost;
private int sipPort;
private String username;
private String sessionId = null;
private long seqNum;
private ListeningPoint tcp = null;
private ListeningPoint udp = null;
private SipProvider tcpSipProvider;
private SipProvider udpSipProvider;
private MessageFactory messageFactory;
private AddressFactory addressFactory;
private HeaderFactory headerFactory;
private SipStack sipStack;
private SimpleSessionListener myListener;
private SimpleRoster myRoster;
/**
* Constructor utilizing the lesser constructor of the super class.
* @see org.jivesoftware.wildfire.gateway.TransportSession#TransportSession(org.jivesoftware.wildfire.gateway.Registration,org.xmpp.packet.JID,org.jivesoftware.wildfire.gateway.BaseTransport)
*/
public SimpleSession(Registration registration, JID jid, BaseTransport transport) {
super(registration, jid, transport);
init();
}
/**
* Constructor utilizing the greater constructor of the super class.
* @see org.jivesoftware.wildfire.gateway.TransportSession#TransportSession(org.jivesoftware.wildfire.gateway.Registration,org.xmpp.packet.JID,org.jivesoftware.wildfire.gateway.BaseTransport,java.lang.Integer)
*/
public SimpleSession(Registration registration, JID jid, BaseTransport transport, Integer priority) {
super(registration, jid, transport, priority);
init();
}
/** This process initializes the session by building (or retrieving) a SIP Stack and adding listeners to it. */
private void init() {
// Initialize local variable first!
myRoster = new SimpleRoster(this);
seqNum = 1L;
sipHost = JiveGlobals.getProperty("plugin.gateway.sip.connecthost", "");
sipPort = ((SimpleTransport) transport).generateListenerPort();
// Initialize the SipFactory
sipFactory = SipFactory.getInstance();
if (sipFactory.getPathName() == null || !sipFactory.getPathName().equals("gov.nist"))
sipFactory.setPathName("gov.nist");
// Initialize the SipStack for this session
Properties properties = new Properties();
properties.setProperty("javax.sip.STACK_NAME", jid.getNode());
properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "32");
try {
String localIP = InetAddress.getLocalHost().getHostAddress();
sipStack = sipFactory.createSipStack(properties);
headerFactory = sipFactory.createHeaderFactory();
addressFactory = sipFactory.createAddressFactory();
messageFactory = sipFactory.createMessageFactory();
Iterator listeningPointIterator = sipStack.getListeningPoints();
while (listeningPointIterator.hasNext()) {
ListeningPoint listeningPoint = (ListeningPoint) listeningPointIterator.next();
if (listeningPoint.getIPAddress() != null &&
listeningPoint.getIPAddress().equals(localIP) &&
// listeningPoint.getPort() == sipPort &&
listeningPoint.getTransport().equals(ListeningPoint.TCP)) {
tcp = listeningPoint;
sipPort = tcp.getPort();
}
if (listeningPoint.getIPAddress() != null &&
listeningPoint.getIPAddress().equals(localIP) &&
// listeningPoint.getPort() == sipPort &&
listeningPoint.getTransport().equals(ListeningPoint.UDP)) {
udp = listeningPoint;
sipPort = udp.getPort();
}
}
if (tcp == null) {
tcp = sipStack.createListeningPoint(localIP, sipPort, ListeningPoint.TCP);
sipPort = tcp.getPort();
}
if (udp == null) {
udp = sipStack.createListeningPoint(localIP, sipPort, ListeningPoint.UDP);
sipPort = udp.getPort();
}
Iterator sipProviderIterator = sipStack.getSipProviders();
while (sipProviderIterator.hasNext()) {
SipProvider sipProvider = (SipProvider) sipProviderIterator.next();
if (sipProvider.getListeningPoint(ListeningPoint.TCP) != null) {
tcpSipProvider = sipProvider;
}
if (sipProvider.getListeningPoint(ListeningPoint.UDP) != null) {
udpSipProvider = sipProvider;
}
}
if (tcpSipProvider == null)
tcpSipProvider = sipStack.createSipProvider(tcp);
if (udpSipProvider == null)
udpSipProvider = sipStack.createSipProvider(udp);
} catch (Exception ex) {
Log.debug(ex);
}
try {
myListener = new SimpleSessionListener(this);
tcpSipProvider.addSipListener(myListener);
udpSipProvider.addSipListener(myListener);
} catch (TooManyListenersException ex) {
Log.debug(ex);
}
try {
sipStack.start();
} catch (SipException ex) {
Log.debug(ex);
}
}
/**
* Perform rollback action once the login fails or logout goes on the way.
*/
private void rollback() {
// if (myListener != null)
}
public void updateStatus(PresenceType presenceType, String verboseStatus) {
Log.debug("SimpleSession(" + getJID().getNode() + ").updateStatus: Method commenced!");
SimplePresence simplePresence = ((SimpleTransport) getTransport()).convertJabStatusToSIP(presenceType);
}
public void addContact(RosterItem item) {
String nickname = getTransport().convertJIDToID(item.getJid());
if (item.getNickname() != null && !item.getNickname().equals("")) {
nickname = item.getNickname();
}
lockRoster(item.getJid().toString());
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Roster of " + item.getJid().toString() + " locked!");
JID destJid = item.getJid();
String destId = ((SimpleTransport) transport).convertJIDToID(destJid);
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Starting addContact function for " + destId);
Request subscribeRequest = null;
try {
subscribeRequest = prepareSubscribeRequest(destId);
subscribeRequest.addHeader(headerFactory.createExpiresHeader(365 * 24 * 60 * 60));
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Unable to prepare SUBSCRIBE request.", e);
unlockRoster(item.getJid().toString());
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Roster of " + item.getJid().toString() + " unlocked!");
return;
}
try {
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.ACK));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.BYE));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.CANCEL));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.INFO));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.INVITE));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.MESSAGE));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.NOTIFY));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.OPTIONS));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.REFER));
subscribeRequest.addHeader(headerFactory.createAllowHeader(Request.SUBSCRIBE));
subscribeRequest.addHeader(headerFactory.createEventHeader("presence"));
subscribeRequest.addHeader(headerFactory.createAcceptHeader("application", "pidf+xml"));
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Unable to add a header", e);
}
try {
sendRequest(subscribeRequest, ListeningPoint.UDP);
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Unable to send request.", e);
unlockRoster(item.getJid().toString());
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Roster of " + item.getJid().toString() + " unlocked!");
return;
}
destJid = getTransport().convertIDToJID(destId);
try {
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Adding contact '" + destJid.toString() + "' to roster...");
getTransport().addOrUpdateRosterItem(getJID(), destJid, nickname, item.getGroups());
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Contact '" + destJid.toString() + "' added!");
}
catch (Exception ex) {
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Unable to add contact.", ex);
}
unlockRoster(item.getJid().toString());
Log.debug("SimpleSession(" + jid.getNode() + ").addContact: Roster of " + item.getJid().toString() + " unlocked!");
}
public void removeContact(RosterItem item) {
String nickname = getTransport().convertJIDToID(item.getJid());
if (item.getNickname() != null && !item.getNickname().equals("")) {
nickname = item.getNickname();
}
lockRoster(item.getJid().toString());
Log.debug("SimpleSession(" + jid.getNode() + ").removeContact: Roster of " + item.getJid().toString() + " locked!");
JID destJid = item.getJid();
String destId = ((SimpleTransport) transport).convertJIDToID(destJid);
Log.debug("SimpleSession(" +jid.getNode() + ").removeContact: Starting addContact function for " + destId);
List<Header> customHeaders = new ArrayList<Header>(13);
try { customHeaders.add(headerFactory.createExpiresHeader(0)); }
catch (Exception e) {} // Ignore
try { customHeaders.add(headerFactory.createEventHeader("presence")); }
catch (Exception e) {} // Ignore
// prepareRequest(RequestType.SUBSCRIBE, destId, null, null, 1L, 70, customHeaders, null);
destJid = getTransport().convertIDToJID(destId);
try {
Log.debug("SimpleSession(" + jid.getNode() + ").removeContact: Removing contact '" + destJid.toString() + "' from roster...");
getTransport().removeFromRoster(getJID(), destJid);
Log.debug("SimpleSession(" + jid.getNode() + ").removeContact: Contact '" + destJid.toString() + "' removed!");
}
catch (Exception ex) {
Log.debug("SimpleSession(" + jid.getNode() + ").removeContact: Unable to add contact.", ex);
}
unlockRoster(item.getJid().toString());
Log.debug("SimpleSession(" + jid.getNode() + ").removeContact: Roster of " + item.getJid().toString() + " unlocked!");
}
public void updateContact(RosterItem item) {
Log.debug("SimpleSession(" + jid.getNode() + ").updateContact: I was called!");
}
public void sendMessage(JID jid, String message) {
Log.debug("SimpleSession(" + jid.getNode() + "): Starting message sending process.");
ContentTypeHeader contentTypeHeader = null;
try {
contentTypeHeader = headerFactory.createContentTypeHeader("text", "plain");
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").sendMessage: Unable to initiate ContentType header.", e);
return;
}
Log.debug("SimpleSession(" + jid.getNode() + "): Finished adding ContentType header.");
MessageContent content = new MessageContent(contentTypeHeader, message);
try {
Request request = prepareMessageRequest(content, ((SimpleTransport) transport).convertJIDToID(jid));
sendRequest(request, ListeningPoint.UDP);
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").sendMessage: Unable to send message.", e);
}
// if (!prepareRequest(RequestType.MESSAGE, ((SimpleTransport) transport).convertJIDToID(jid), null, null, 1L, 70, null, content)) {
// Log.debug("SimpleSession(" + this.jid.getNode() + ").sendMessage: Unable to send message!");
// }
}
public void sendServerMessage(String message) {
Log.debug("SimpleSession(" + jid.getNode() + ").sendServerMessage: I was called!");
}
public void sendChatState(JID jid, ChatStateType chatState) {
Log.debug("SimpleSession(" + jid.getNode() + ").sendChatState: I was called!");
}
public void retrieveContactStatus(JID jid) {
Log.debug("SimpleSession(" + this.jid.getNode() + ").retrieveContactStatus: I was called!");
}
public void resendContactStatuses(JID jid) {
Log.debug("SimpleSession(" + this.jid.getNode() + ").resendContactStatuses: I was called!");
}
// The following are SimpleSession specific methods
public void login(PresenceType presenceType, String verboseStatus) {
if (!this.isLoggedIn()) {
this.setLoginStatus(TransportLoginStatus.LOGGING_IN);
Log.debug("SimpleSession(" + jid.getNode() + ").login: Start login as " + registration.getUsername() + ".");
Request registerRequest = prepareRegisterRequest();
if (registerRequest.getHeader(CallIdHeader.NAME) == null) {
Log.debug("SimpleSession(" + getJID().getNode() + ").login: Unable to create a SIP session ID!!");
this.setLoginStatus(TransportLoginStatus.LOGGED_OUT);
return;
}
else {
sessionId = ((CallIdHeader) registerRequest.getHeader(CallIdHeader.NAME)).getCallId();
}
try {
registerRequest.addHeader(headerFactory.createExpiresHeader(365 * 24 * 60 * 60));
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").login: " +
"Unable to set the expiry interval, which is essential for a login.", e);
this.setLoginStatus(TransportLoginStatus.LOGGED_OUT);
return;
}
try {
registerRequest.addHeader(headerFactory.createAllowHeader(Request.ACK));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.BYE));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.CANCEL));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.INFO));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.INVITE));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.MESSAGE));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.NOTIFY));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.OPTIONS));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.REFER));
registerRequest.addHeader(headerFactory.createAllowHeader(Request.SUBSCRIBE));
}
catch (Exception e) {} // Ignore
try {
sendRequest(registerRequest, ListeningPoint.UDP);
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").login: Unable to send login packet.", e);
this.setLoginStatus(TransportLoginStatus.LOGGED_OUT);
}
}
}
public void logout() {
this.setLoginStatus(TransportLoginStatus.LOGGING_OUT);
myRoster.deactivate();
// Lots of logout work here...
Log.debug("SimpleSession(" + getJID().getNode() + ").logout: Preparing logout packet...");
Request registerRequest = prepareRegisterRequest();
try {
registerRequest.addHeader(headerFactory.createExpiresHeader(0));
sendRequest(registerRequest, ListeningPoint.UDP);
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").login: Unable to logout.", e);
this.setLoginStatus(TransportLoginStatus.LOGGED_IN);
return;
}
// List<Header> customHeaders = new ArrayList<Header>(1);
// try { customHeaders.add(headerFactory.createExpiresHeader(0)); }
// catch (Exception e) {
// Log.debug("SimpleSession(" + getJID().getNode() + ").logout: " +
// "Unable to set the expiry interval, which is essential for a logout.", e);
// return;
// }
// String myUsername = registration.getUsername();
// if (myUsername.indexOf("sip:") < 0) myUsername = "sip:" + myUsername;
// if (myUsername.indexOf("@") < 0) myUsername = myUsername + "@" + sipHost;
//
// prepareRequest(RequestType.REGISTER, myUsername, null, this.sessionId, seqNum++, 70, customHeaders, null);
this.setLoginStatus(TransportLoginStatus.LOGGED_OUT);
}
public void sipUserLoggedIn() {
myRoster.activate();
getRegistration().setLastLogin(new Date());
setLoginStatus(TransportLoginStatus.LOGGED_IN);
}
public void sipUserLoggedOut() {
// If anybody subscribed me, send NOTIFY or subscription termination
myRoster.deactivate();
setLoginStatus(TransportLoginStatus.LOGGED_OUT);
}
public void removeStack() {
Log.debug("SimpleSession for " + jid.getNode() + " is going to shut down!");
tcpSipProvider.removeSipListener(myListener);
udpSipProvider.removeSipListener(myListener);
myListener = null;
Log.debug("SimpleSession for " + jid.getNode() + " has their listeners removed.");
try {
sipStack.deleteSipProvider(tcpSipProvider);
sipStack.deleteSipProvider(udpSipProvider);
Log.debug("SimpleSession(" + jid.getNode() + ").shutdown: SIP Providers deleted.");
sipStack.deleteListeningPoint(tcp);
sipStack.deleteListeningPoint(udp);
Log.debug("SimpleSession(" + jid.getNode() + ").shutdown: Listening points deleted.");
}
catch (Exception ex) {
Log.debug("SimpleSession for " + jid.getNode() + " is unable to gracefully shut down.", ex);
}
sipStack.stop();
sipStack = null;
}
public void finalize() {
Log.debug("SimpleSession for " + jid.getNode() + ": Finalize function initialized!");
if (this.getLoginStatus().equals(TransportLoginStatus.LOGGED_IN)) {
logout();
}
}
///// Simple specific functions
/**
* An inner enum encapsulating SIP Request types.
*/
private enum RequestType {
ACK (Request.ACK),
BYE (Request.BYE),
CANCEL (Request.CANCEL),
INFO (Request.INFO),
INVITE (Request.INVITE),
MESSAGE (Request.MESSAGE),
NOTIFY (Request.NOTIFY),
OPTIONS (Request.OPTIONS),
PRACK (Request.PRACK),
PUBLISH (Request.PUBLISH),
REFER (Request.REFER),
REGISTER (Request.REGISTER),
SUBSCRIBE(Request.SUBSCRIBE),
UPDATE (Request.UPDATE);
private String sipReqType;
RequestType(String sipReqType) {
this.sipReqType = sipReqType;
}
public String toString() {
return sipReqType;
}
}
/**
* An inner class representing the content of a SIP message.
*/
private class MessageContent {
private ContentTypeHeader contentTypeHeader;
private String content;
MessageContent(ContentTypeHeader contentTypeHeader, String content) {
this.contentTypeHeader = contentTypeHeader;
this.content = content;
}
public ContentTypeHeader getContentTypeHeader() {
return this.contentTypeHeader;
}
public String getContent() {
return this.content;
}
}
/**
* Sends a request with the specified request and transport.
* @param request The request packet.
* @param transport The transport protocol used.
*/
private void sendRequest(Request request, String transport)
throws TransactionUnavailableException, TransactionDoesNotExistException, SipException {
sendRequest(request, transport, null);
}
/**
* Sends a request with the specified request and transport.
* @param request The request packet.
* @param transport The transport protocol used.
* @param dialog The dialog for a persistent transaction.
* Leave it <code>null</code> if no dialog is associated with this request.
*/
private void sendRequest(Request request, String transport, Dialog dialog)
throws TransactionUnavailableException, TransactionDoesNotExistException, SipException {
for (Iterator sipProviders = sipStack.getSipProviders(); sipProviders.hasNext(); ) {
SipProvider provider = (SipProvider) sipProviders.next();
if (provider.getListeningPoint(transport) != null) {
Log.debug("Sending packet: \n" + request.toString() + "\n========\n");
ClientTransaction transaction = provider.getNewClientTransaction(request);
if (dialog != null)
dialog.sendRequest(transaction);
else
transaction.sendRequest();
return;
}
}
Log.debug("SimpleSession(" + this.jid.getNode() + "): No SipProvider found for that transport!");
}
/**
* @param destUri The SipURI for the destination. Leave <code>null</code> if a loopback request (e.g. REGISTER) is being made.
* @param toTag The tag for to header. Can leave null.
* @param requestUri The Request URI to set in the message. Leave null if the default destination SipURI should be used.
*/
private Request prepareRequest(RequestType requestType, SipURI destUri, String toTag, SipURI requestUri, String callId, long seqNum) {
Request request = null;
String myJiveId = this.jid.getNode();
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing request packet of type '" + requestType + "'");
try {
// Prepare request packet first
request = messageFactory.createRequest(null);
request.setMethod(requestType.toString());
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing request.", e);
}
// Prepare "From" header
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"From\" header...");
String mySipUsername = registration.getUsername();
try {
SipURI fromUri = addressFactory.createSipURI(mySipUsername, sipHost);
Address fromNameAddress = addressFactory.createAddress(fromUri);
fromNameAddress.setDisplayName(mySipUsername);
FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress, getTag());
// Use "set" because this header is mandatory.
request.setHeader(fromHeader);
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing FromHeader.", e);
return null;
}
// Prepare "To" header
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"To\" header...");
try {
if (destUri == null)
destUri = addressFactory.createSipURI(mySipUsername, sipHost);
Address toNameAddress = addressFactory.createAddress(destUri);
ToHeader toHeader = headerFactory.createToHeader(toNameAddress, toTag);
// Use "set" because this header is mandatory.
request.setHeader(toHeader);
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing ToHeader.", e);
return null;
}
// Prepare "Via" header
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"Via\" header...");
try {
ViaHeader viaHeader = headerFactory.createViaHeader(InetAddress.getLocalHost().getHostAddress(), sipPort, ListeningPoint.UDP, null);
// Use "set" because this header is mandatory.
request.setHeader(viaHeader);
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing ViaHeader.", e);
return null;
}
// Prepare "CallId" header
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"CallId\" header...");
CallIdHeader callIdHeader = null;
try {
if (callId != null)
callIdHeader = headerFactory.createCallIdHeader(callId);
else
callIdHeader = udpSipProvider.getNewCallId();
// Use "set" because this header is mandatory.
request.setHeader(callIdHeader);
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing CallIdHeader.", e);
return null;
}
// Prepare "CSeq" header
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"CSeq\" header...");
try {
CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(seqNum, requestType.toString());
// Use "set" because this header is mandatory.
request.setHeader(cSeqHeader);
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing CSeqHeader.", e);
return null;
}
// Prepare "MaxForwards" header
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"MaxForwards\" header...");
try {
MaxForwardsHeader maxForwardsHeader = headerFactory.createMaxForwardsHeader(70);
// Use "set" because this header is mandatory.
request.setHeader(maxForwardsHeader);
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing MaxForwardsHeader.", e);
return null;
}
// Setting Request URI
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: setting request URI...");
try {
if (requestUri == null) {
requestUri = (SipURI) destUri.clone();
requestUri.setTransportParam(ListeningPoint.UDP);
}
request.setRequestURI(requestUri);
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when setting request URI.", e);
return null;
}
// Add "Contact" header
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"Contact\" header...");
try {
SipURI contactURI = addressFactory.createSipURI(mySipUsername, InetAddress.getLocalHost().getHostAddress());
contactURI.setPort(sipPort);
Address contactAddress = addressFactory.createAddress(contactURI);
contactAddress.setDisplayName(mySipUsername);
ContactHeader contactHeader = headerFactory.createContactHeader(contactAddress);
request.setHeader(contactHeader);
}
catch (Exception e) {
Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when adding ContactHeader.", e);
return null;
}
return request;
}
// /**
// * Prepares a Request packet.
// * <br><br>
// * The "From", "To", "Via", "Contact", "CSeq", "MaxForwards" and "CallId" headers,
// * as well as the content (if provided) are prepared in the method.
// * <br>
// * Additional headers should be provided as customer headers. See the "headers" parameter for further details.
// * @param requestType An inner request type enum
// * @param destination The recipient of this request
// * @param toTag Additional tag code of the destination. Can usually leave it <code>null</code>.
// * @param callId A String representing an ongoing SIP CallID. Leave it <code>null</code> if a new CallID should be generated.
// * @param seqNum A sequence number for an ongoing session.
// * @param maxForward Maximum times of forwarding allowed for this packet.
// * @param headers Additional headers that have to be added. Leave <code>null</code> if no custom header is to be added.
// * @param content An object containing the content of the message, as well as the header defining the content type.
// * Can leave <code>null</code> if no content is to be specified.
// * @see org.jivesoftware.wildfire.gateway.protocols.simple.SimpleSession.RequestType
// */
// private boolean prepareRequest(
// RequestType requestType,
// String destination,
// String toTag,
// String callId,
// long seqNum,
// int maxForward,
// List<Header> headers,
// MessageContent content) {
// String myJiveId = this.jid.getNode();
// String mySipUsername = registration.getUsername();
//
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing request packet of type '" + requestType + "'");
//
// // Prepare "From" header
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"From\" header...");
// FromHeader fromHeader = null;
// try {
// SipURI fromUri = addressFactory.createSipURI(mySipUsername, sipHost);
// Address fromNameAddress = addressFactory.createAddress(fromUri);
// fromNameAddress.setDisplayName(mySipUsername);
//
// fromHeader = headerFactory.createFromHeader(fromNameAddress, getTag());
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing FromHeader.", e);
//
// return false;
// }
//
// // Prepare "To" header
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"To\" header...");
// ToHeader toHeader = null;
//
// String destUsername = "";
// String destAddress = "";
//
// // Code modification to allow address be input without specifying "sip:"
// if (destination.startsWith("sip:")) {
// destination = destination.substring("sip:".length());
// }
//
// if (destination.indexOf("@") > 0) {
// destUsername = destination.substring(destination.indexOf(":") + 1, destination.indexOf("@"));
// destAddress = destination.substring(destination.indexOf("@") + 1);
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: destUsername = '" + destUsername + "'; destAddress = '" + destAddress + "'");
// }
// else {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing ToHeader.",
// new IllegalArgumentException("The destination specified is not a valid SIP address"));
//
// return false;
// }
//
// try {
// SipURI toAddress = addressFactory.createSipURI(destUsername, destAddress);
// Address toNameAddress = addressFactory.createAddress(toAddress);
//
// String displayName = destUsername;
// try {
// RosterItem ri = getRoster().getRosterItem(this.getTransport().convertIDToJID(destination));
// if (ri != null) displayName = ri.getNickname();
// }
// catch (Exception e) {} // Ignore the exception. We don't need to handle it.
//
// toNameAddress.setDisplayName(displayName);
//
// toHeader = headerFactory.createToHeader(toNameAddress, toTag);
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing ToHeader.", e);
//
// return false;
// }
//
// // Prepare "Via" header
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"Via\" header...");
// ArrayList viaHeaders = new ArrayList();
// try {
// ViaHeader viaHeader = headerFactory.createViaHeader(InetAddress.getLocalHost().getHostAddress(), sipPort, ListeningPoint.UDP, null);
// viaHeaders.add(viaHeader);
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing ViaHeader.", e);
//
// return false;
// }
//
// // Prepare "CallId" header
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"CallId\" header...");
// CallIdHeader callIdHeader = null;
// try {
// if (callId != null)
// callIdHeader = headerFactory.createCallIdHeader(callId);
// else
// callIdHeader = udpSipProvider.getNewCallId();
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing CallIdHeader.", e);
//
// return false;
// }
//
// // Prepare "CSeq" header
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"CSeq\" header...");
// CSeqHeader cSeqHeader = null;
// try {
// cSeqHeader = headerFactory.createCSeqHeader(seqNum, requestType.toString());
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing CSeqHeader.", e);
//
// return false;
// }
//
// // Prepare "MaxForwards" header
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"MaxForwards\" header...");
// MaxForwardsHeader maxForwardsHeader = null;
// try {
// maxForwardsHeader = headerFactory.createMaxForwardsHeader(maxForward);
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing MaxForwardsHeader.", e);
//
// return false;
// }
//
// // Prepare request URI
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing request URI...");
// SipURI requestURI = null;
// try {
// requestURI = addressFactory.createSipURI(destUsername, destAddress);
// requestURI.setTransportParam(ListeningPoint.UDP);
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when preparing Request URI.", e);
//
// return false;
// }
//
// // Instantiate Request packet
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Instantiating Request packet...");
// Request request = null;
// try {
// request = messageFactory.createRequest(
// requestURI, requestType.toString(),
// callIdHeader, cSeqHeader,
// fromHeader, toHeader,
// viaHeaders, maxForwardsHeader
// );
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when instantiating Request packet.", e);
//
// return false;
// }
//
// // Add custom headers
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Start adding custom headers...");
// int headerCount = 0;
// if (headers != null) {
// headerCount = headers.size();
// for (ListIterator<Header> headersIterator = headers.listIterator(); headersIterator.hasNext(); ) {
// Header aHeader = headersIterator.next();
// try {
// request.addHeader(aHeader);
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when adding a " +
// aHeader.getClass().toString() + " to the request packet.", e);
// headerCount--;
// }
// }
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Finished adding custom headers. " +
// headerCount + " of " + headers.size() + " headers successfully added.");
// }
// else {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: The custom headers input is null. No custom headers to add.");
// }
//
// // Add "Contact" header
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Preparing \"Contact\" header...");
// try {
// SipURI contactURI;
// if (requestType.equals(RequestType.NOTIFY))
// contactURI = addressFactory.createSipURI(null, InetAddress.getLocalHost().getHostAddress());
// else
// contactURI = addressFactory.createSipURI(mySipUsername, InetAddress.getLocalHost().getHostAddress());
// contactURI.setPort(sipPort);
//
// Address contactAddress = addressFactory.createAddress(contactURI);
//
// if (!requestType.equals(RequestType.NOTIFY))
// contactAddress.setDisplayName(mySipUsername);
//
// ContactHeader contactHeader = headerFactory.createContactHeader(contactAddress);
// request.addHeader(contactHeader);
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when adding ContactHeader.", e);
//
// return false;
// }
//
// if (content != null) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Content is specified. Adding content...");
// try {
// request.setContent(content.getContent(), content.getContentTypeHeader());
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when adding content to the request packet.", e);
// // Just tell, then continue the request!
// }
// }
//
// // Send the request
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Sending Request packet: \n" + request.toString());
// try {
// ClientTransaction clientTransaction = udpSipProvider.getNewClientTransaction(request);
// clientTransaction.sendRequest();
// }
// catch (Exception e) {
// Log.debug("SimpleSession(" + myJiveId + ").prepareRequest: Exception occured when sending Request packet.", e);
// return false;
// }
//
// return true;
// }
private Request prepareRegisterRequest() {
return prepareRequest(RequestType.REGISTER, null, null, null, sessionId, seqNum++);
}
private Request prepareMessageRequest(MessageContent content, String destination) throws InvalidArgumentException, ParseException {
String destUsername = destination;
String destHost = sipHost;
if (destination.indexOf("@") == 0 || destination.indexOf("@") == destination.length() - 1) {
throw new InvalidArgumentException("The address provided is invalid!");
}
else if (destination.indexOf("@") > 0) {
destUsername = destination.substring(0, destination.indexOf("@"));
destHost = destination.substring(destination.indexOf("@") + 1);
}
SipURI destUri = addressFactory.createSipURI(destUsername, destHost);
Request messageRequest = prepareRequest(RequestType.MESSAGE, destUri, null, destUri, sessionId, seqNum++);
messageRequest.setContent(content.content, content.contentTypeHeader);
return messageRequest;
}
private Request prepareSubscribeRequest(String destination) throws InvalidArgumentException, ParseException {
String destUsername = destination;
String destHost = sipHost;
if (destination.indexOf("@") == 0 || destination.indexOf("@") == destination.length() - 1) {
throw new InvalidArgumentException("The address provided is invalid!");
}
else if (destination.indexOf("@") > 0) {
destUsername = destination.substring(0, destination.indexOf("@"));
destHost = destination.substring(destination.indexOf("@") + 1);
}
SipURI destUri = addressFactory.createSipURI(destUsername, destHost);
Request messageRequest = prepareRequest(RequestType.SUBSCRIBE, destUri, null, destUri, null, 1L);
return messageRequest;
}
private Request prepareNotifyRequest(Dialog dialog) throws ParseException {
printDialog(dialog);
String fromTag = dialog.getRemoteTag();
Address fromAddress = dialog.getRemoteParty();
SipURI destUri = (SipURI) fromAddress.getURI();
dialog.incrementLocalSequenceNumber();
long seqNum = dialog.getLocalSeqNumber();
String callId = dialog.getCallId().getCallId();
SipURI fromReqUri = null;
if (dialog != null) {
Log.debug("Getting request URI from dialog");
Address fromReqAddr = dialog.getRemoteTarget();
if (fromReqAddr != null && fromReqAddr.getURI() != null && fromReqAddr.getURI() instanceof SipURI)
fromReqUri = (SipURI) fromReqAddr.getURI();
}
if (fromReqUri == null) {
Log.debug("Getting request URI from destination URI");
fromReqUri = destUri;
}
// Instantiate request packet
Request notifyRequest = prepareRequest(RequestType.NOTIFY, destUri, fromTag, fromReqUri, callId, seqNum);
// Request notifyRequest = dialog.createRequest(Request.NOTIFY);
((FromHeader) notifyRequest.getHeader(FromHeader.NAME)).setTag(dialog.getLocalTag());
// Set "subscription state" header
SubscriptionStateHeader subscriptionStateHeader = headerFactory.createSubscriptionStateHeader(SubscriptionStateHeader.ACTIVE.toLowerCase());
// if (expires > 0) subscriptionStateHeader.setExpires(expires);
notifyRequest.setHeader(subscriptionStateHeader);
// Set "event" header
notifyRequest.setHeader(headerFactory.createEventHeader("presence"));
return notifyRequest;
}
private Request prepareNotifyRequest(Dialog dialog, SimplePresence simplePresence) throws ParseException {
Request request = prepareNotifyRequest(dialog);
request.setContent(simplePresence.toXML(), headerFactory.createContentTypeHeader("application", "pidf+xml"));
return request;
}
public void contactSubscribed(String targetSipAddress) {
try {
Roster roster = getTransport().getRosterManager().getRoster(getJID().getNode());
JID contactJID = getTransport().convertIDToJID(targetSipAddress);
RosterItem item = roster.getRosterItem(contactJID);
Log.debug("SimpleSession(" + jid.getNode() + ").contactSubscribed: Preparing presence packet...");
Presence presence = new Presence();
presence.setFrom(contactJID);
presence.setTo(getJID());
presence.setType(Presence.Type.subscribed);
getTransport().sendPacket(presence);
Log.debug("SimpleSession(" + jid.getNode() + ").contactSubscribed: Presence packet sent ==> \n" + presence.toXML());
// Log.debug("SimpleSession(" + jid.getNode() + ").contactSubscribed: Synchronizing SIP user roster...");
// String rosteruserid = ((SimpleTransport) transport).convertJIDToID(item.getJid());
// if (myRoster.getEntry(rosteruserid) == null) {
// SimpleRosterItem simpleRosterItem = new SimpleRosterItem(rosteruserid, item.getNickname(), 1L);
// myRoster.addEntry(rosteruserid, simpleRosterItem);
// }
// Log.debug("SimpleSession(" + jid.getNode() + ").contactSubscribed: Finished synchronizing SIP user roster.");
// syncContactGroups(contact, item.getGroups());
// unlockRoster(contactJID.toString());
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").contactSubscribed: Exception occured when adding pending contact " + targetSipAddress, e);
JID contactJID = getTransport().convertIDToJID(targetSipAddress);
// unlockRoster(contactJID.toString());
}
}
public void contactUnsubscribed(String targetSipAddress) {
try {
Roster roster = getTransport().getRosterManager().getRoster(getJID().getNode());
JID contactJID = getTransport().convertIDToJID(targetSipAddress);
RosterItem item = roster.getRosterItem(contactJID);
Log.debug("SimpleSession(" + getJID().getNode() + ").contactUnsubscribed: Preparing presence packet...");
Presence presence = new Presence();
presence.setFrom(contactJID);
presence.setTo(getJID());
presence.setType(Presence.Type.unsubscribed);
getTransport().sendPacket(presence);
Log.debug("SimpleSession(" + getJID().getNode() + ").contactUnsubscribed: Presence packet sent ==> \n" + presence.toXML());
// Log.debug("SimpleSession(" + jid.getNode() + ").contactUnsubscribed: Synchronizing SIP user roster...");
// String rosteruserid = ((SimpleTransport) transport).convertJIDToID(item.getJid());
// myRoster.removeEntry(rosteruserid);
// Log.debug("SimpleSession(" + jid.getNode() + ").contactUnsubscribed: Finished synchronizing SIP user roster.");
// syncContactGroups(contact, item.getGroups());
// unlockRoster(contactJID.toString());
}
catch (Exception e) {
Log.debug("SimpleSession(" + getJID().getNode() + ").contactUnsubscribed: Exception occured when adding pending contact " + targetSipAddress, e);
JID contactJID = getTransport().convertIDToJID(targetSipAddress);
// unlockRoster(contactJID.toString());
}
}
public ServerTransaction sendResponse(int status, Request request, ServerTransaction serverTransaction) {
try {
Log.debug("SimpleSession(" + jid.getNode() + ").sendResponse: Starting response sending process.");
if (serverTransaction == null)
serverTransaction = udpSipProvider.getNewServerTransaction(request);
Response response = messageFactory.createResponse(status, request);
// Set "Exprires" header
if (request.getHeader(ExpiresHeader.NAME) != null)
response.setHeader(request.getHeader(ExpiresHeader.NAME));
// Add "Contact" header
Log.debug("SimpleSession(" + jid.getNode() + ").sendResponse: Preparing \"Contact\" header...");
try {
SipURI contactURI = addressFactory.createSipURI(null, InetAddress.getLocalHost().getHostAddress());
contactURI.setPort(sipPort);
Address contactAddress = addressFactory.createAddress(contactURI);
// contactAddress.setDisplayName(mySipUsername);
ContactHeader contactHeader = headerFactory.createContactHeader(contactAddress);
response.addHeader(contactHeader);
}
catch (Exception e) {
Log.debug("SimpleSession(" + jid.getNode() + ").sendResponse: Exception occured when adding ContactHeader.", e);
// return false; // We can continue with this though.
}
Log.debug("SimpleSession(" + jid.getNode() + ").sendResponse: Sending response: " + response.toString());
serverTransaction.sendResponse(response);
// udpSipProvider.sendResponse(response);
Log.debug("SimpleSession(" + jid.getNode() + ").sendResponse: Response sent!");
return serverTransaction;
}
catch (Exception ex) {
Log.debug("SimpleSession(" + jid.getNode() + ").sendResponse: ", ex);
}
return null;
}
public void sendNotify(Dialog dialog) throws ParseException, SipException, InvalidArgumentException {
Request notifyRequest = prepareNotifyRequest(dialog);
try {
User me = XMPPServer.getInstance().getUserManager().getUser(getJID().getNode());
Presence myPresence = XMPPServer.getInstance().getPresenceManager().getPresence(me);
String presenceContent = "";
SimplePresence simplePresence = new SimplePresence();
simplePresence.setEntity("pres:" + registration.getUsername() + "@" + sipHost);
simplePresence.setDmNote(myPresence.getStatus());
if (myPresence.getStatus() != null && myPresence.getStatus().equalsIgnoreCase("Offline"))
simplePresence.setTupleStatus(SimplePresence.TupleStatus.CLOSED);
else {
simplePresence.setTupleStatus(SimplePresence.TupleStatus.OPEN);
if (myPresence.getShow() != null) {
switch (myPresence.getShow()) {
case away:
simplePresence.setRpid(SimplePresence.Rpid.AWAY);
break;
case dnd:
simplePresence.setRpid(SimplePresence.Rpid.BUSY);
break;
case xa:
simplePresence.setRpid(SimplePresence.Rpid.AWAY);
break;
default:
break;
}
}
}
presenceContent = simplePresence.toXML();
ContentTypeHeader contentTypeHeader = headerFactory.createContentTypeHeader("application", "pidf+xml");
notifyRequest.setContent(presenceContent, contentTypeHeader);
}
catch (Exception e) {
Log.debug("Unable to include presence details in the packet.", e);
}
sendRequest(notifyRequest, ListeningPoint.UDP, dialog);
}
private String getTag() {
StringBuffer tag = new StringBuffer(Integer.toHexString(this.hashCode()));
while (tag.length() < 8) {
tag.insert(0, "0");
}
return new String(tag);
}
void printDialog(Dialog dialog) {
if (dialog != null) {
StringBuffer log = new StringBuffer(1024);
log.append("Printing dialog: \n");
log.append("Call id = ");
log.append(dialog.getCallId().getCallId());
log.append("\n");
log.append("Dialog id = ");
log.append(dialog.getDialogId());
log.append("\n");
log.append("Local party = ");
log.append(dialog.getLocalParty());
log.append("\n");
log.append("Remote party = ");
log.append(dialog.getRemoteParty());
log.append("\n");
log.append("Remote targ = ");
log.append(dialog.getRemoteTarget());
log.append("\n");
log.append("Local seq = ");
log.append(dialog.getLocalSeqNumber());
log.append("\n");
log.append("Remote seq = ");
log.append(dialog.getRemoteSeqNumber());
log.append("\n");
log.append("Local tag = ");
log.append(dialog.getLocalTag());
log.append("\n");
log.append("Remote tag = ");
log.append(dialog.getRemoteTag());
log.append("\n");
log.append("Dialog state = ");
log.append(dialog.getState());
Log.debug(new String(log));
}
}
}
\ No newline at end of file
/**
* $Revision$
* $Date$
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.wildfire.gateway.protocols.simple;
import gov.nist.javax.sip.address.SipUri;
import java.util.ListIterator;
import javax.sip.ClientTransaction;
import javax.sip.Dialog;
import javax.sip.DialogTerminatedEvent;
import javax.sip.IOExceptionEvent;
import javax.sip.RequestEvent;
import javax.sip.ResponseEvent;
import javax.sip.ServerTransaction;
import javax.sip.SipListener;
import javax.sip.TimeoutEvent;
import javax.sip.TransactionTerminatedEvent;
import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.address.URI;
import javax.sip.header.CSeqHeader;
import javax.sip.header.CallIdHeader;
import javax.sip.header.ContactHeader;
import javax.sip.header.ExpiresHeader;
import javax.sip.header.FromHeader;
import javax.sip.header.MaxForwardsHeader;
import javax.sip.header.RecordRouteHeader;
import javax.sip.header.SubscriptionStateHeader;
import javax.sip.header.ToHeader;
import javax.sip.message.Request;
import javax.sip.message.Response;
import org.jivesoftware.util.Log;
import org.jivesoftware.wildfire.gateway.TransportLoginStatus;
import org.jivesoftware.wildfire.user.UserNotFoundException;
import org.xmpp.packet.JID;
import org.xmpp.packet.Presence;
/**
* A listener for a SIMPLE session.
* <br><br>
* Instances of this class serve as an assistant to SimpleSession objects,
* carrying out works of receiving messages or responses from the SIP server
* or another remote client.
*
* @author Patrick Siu
* @version 0.0.1
*/
public class SimpleSessionListener implements SipListener {
/**
* Stores the SIMPLE session object to which this listener belongs.
*/
private SimpleSession mySimpleSession;
/**
* Stores the Jive username using this SIMPLE session listener.
* <br><br>
* The storage is for logging purpose.
*/
private String myUsername;
/**
* Constructor.
* @param mySimpleSession The SIMPLE session object to which this listener belongs.
*/
public SimpleSessionListener(SimpleSession mySimpleSession) {
this.mySimpleSession = mySimpleSession;
this.myUsername = mySimpleSession.getJID().getNode();
}
public void processRequest(RequestEvent requestEvent) {
ServerTransaction serverTransaction = requestEvent.getServerTransaction();
Dialog dialog = null;
if (serverTransaction != null) {
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: Getting dialog");
dialog = serverTransaction.getDialog();
}
int responseCode = 200;
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: Received a request event: \n" + requestEvent.getRequest().toString());
String fromAddr = "";
Request request = requestEvent.getRequest();
if (request.getHeader(FromHeader.NAME) != null) {
FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME);
Address fromAddress = fromHeader.getAddress();
String displayName = fromAddress.getDisplayName();
URI fromUri = fromAddress.getURI();
if (fromUri != null) {
if (fromUri.isSipURI()) {
SipURI fromSipUri = (SipURI) fromUri;
fromAddr = fromSipUri.getUser() + "@" + fromSipUri.getHost();
}
else {
fromAddr = fromUri.toString();
}
}
}
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: FromAddr = " + fromAddr);
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: Request method = '" + request.getMethod() + "'");
if (request.getMethod().equals(Request.MESSAGE)) {
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: Starting MESSAGE request handling process.");
JID senderJid = mySimpleSession.getTransport().convertIDToJID(fromAddr);
String msgContent = new String((byte []) request.getContent());
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: Forwarding MESSAGE request as XMPP message, setting from = " +
senderJid + " and content = '" + msgContent + "'");
mySimpleSession.getTransport().sendMessage(mySimpleSession.getJID(), senderJid, msgContent);
mySimpleSession.sendResponse(responseCode, request, serverTransaction);
}
else if (request.getMethod().equals(Request.NOTIFY)) {
Presence presence = new Presence();
presence.setFrom(mySimpleSession.getTransport().convertIDToJID(fromAddr));
presence.setTo(mySimpleSession.getJID());
SubscriptionStateHeader subscriptionStateHeader = (SubscriptionStateHeader) request.getHeader(SubscriptionStateHeader.NAME);
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: NOTIFY request handling process started.");
if (subscriptionStateHeader.getState().equalsIgnoreCase(SubscriptionStateHeader.ACTIVE)) {
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: NOTIFY Active!");
int expires = subscriptionStateHeader.getExpires();
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: NOTIFY Expiry = " + expires);
try {
if (expires > 0) {
String content = "";
if (request.getContent() != null)
content = new String((byte []) request.getContent());
if (content.length() > 0) {
SimplePresence simplePresence = SimplePresence.parseSimplePresence(content);
((SimpleTransport) mySimpleSession.getTransport()).convertSIPStatusToJap(presence, simplePresence);
}
}
else {
presence.setType(Presence.Type.unsubscribed);
}
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: Sending XMPP presence packet.");
}
catch (Exception ex) {
Log.debug("SimpleSessionListener(" + myUsername + ").processRequest: Exception occured when processing NOTIFY packet...", ex);
}
}
else if (subscriptionStateHeader.getState().equalsIgnoreCase(SubscriptionStateHeader.TERMINATED)) {
presence.setType(Presence.Type.unsubscribed);
}
mySimpleSession.getTransport().sendPacket(presence);
mySimpleSession.sendResponse(responseCode, request, serverTransaction);
}
else if (request.getMethod().equals(Request.SUBSCRIBE)) {
Log.debug("SimpleSessionListener for " + myUsername + ": SUBSCRIBE request handling process.");
ServerTransaction transaction = mySimpleSession.sendResponse(202, request, serverTransaction);
Log.debug("SimpleSessionListener for " + myUsername + ": SUBSCRIBE should be followed by a NOTIFY");
// Send NOTIFY packet.
try {
if (transaction != null)
mySimpleSession.sendNotify(transaction.getDialog());
else
mySimpleSession.sendNotify(dialog);
}
catch (Exception e) {
Log.debug("SimpleSessionListener for " + myUsername + ": Unable to prepare NOTIFY packet.", e);
}
}
}
public void processResponse(ResponseEvent responseEvent) {
if (responseEvent.getClientTransaction() != null) {
Log.debug("SimpleSessionListener for " + myUsername + ": Getting client transaction...");
ClientTransaction clientTransaction = responseEvent.getClientTransaction();
Dialog clientDialog = clientTransaction.getDialog();
mySimpleSession.printDialog(clientDialog);
}
Log.debug("SimpleSessionListener for " + myUsername + ": Received a response event: " + responseEvent.getResponse().toString());
String fromAddr = "";
String toAddr = "";
Response response = responseEvent.getResponse();
if (response.getHeader(FromHeader.NAME) != null) {
FromHeader fromHeader = (FromHeader) response.getHeader(FromHeader.NAME);
URI fromUri = fromHeader.getAddress().getURI();
if (fromUri instanceof SipUri)
fromAddr = ((SipUri) fromUri).getUser() + "@" + ((SipUri) fromUri).getHost();
else
fromAddr = fromUri.toString();
}
if (response.getHeader(ToHeader.NAME) != null) {
ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME);
URI toUri = toHeader.getAddress().getURI();
if (toUri instanceof SipUri)
toAddr = ((SipUri) toUri).getUser() + "@" + ((SipUri) toUri).getHost();
else
toAddr = toUri.toString();
}
if (response.getHeader(CSeqHeader.NAME) != null) {
String method = ((CSeqHeader) response.getHeader(CSeqHeader.NAME)).getMethod();
if (method.equals(Request.REGISTER)) {
if (response.getStatusCode() / 100 == 2) {
int expires = 0;
if (response.getHeader(ContactHeader.NAME) != null) {
expires = ((ContactHeader) response.getHeader(ContactHeader.NAME)).getExpires();
} else if (response.getHeader(ExpiresHeader.NAME) != null) {
expires = ((ExpiresHeader) response.getHeader(ExpiresHeader.NAME)).getExpires();
}
if (expires > 0) {
Log.debug("SimpleSessionListener(" + myUsername + ").processResponse: " +
mySimpleSession.getRegistration().getUsername() + " log in successful!");
mySimpleSession.sipUserLoggedIn();
// mySimpleSession.getRegistration().setLastLogin(new Date());
// mySimpleSession.setLoginStatus(TransportLoginStatus.LOGGED_IN);
}
else {
if (mySimpleSession.getLoginStatus().equals(TransportLoginStatus.LOGGING_OUT)) {
Log.debug("SimpleSessionListener(" + myUsername + ").processResponse: " +
mySimpleSession.getRegistration().getUsername() + " log out successful!");
mySimpleSession.sipUserLoggedOut();
mySimpleSession.removeStack();
}
}
}
}
if (method.equals(Request.SUBSCRIBE)) {
if (response.getStatusCode() / 100 == 2) {
Log.debug("SimpleSessionListener for " + myUsername + ": Handling SUBSCRIBE acknowledgement!!");
int expires = 0;
if (response.getHeader(ContactHeader.NAME) != null) {
expires = ((ContactHeader) response.getHeader(ContactHeader.NAME)).getExpires();
}
if (response.getHeader(ExpiresHeader.NAME) != null) {
expires = ((ExpiresHeader) response.getHeader(ExpiresHeader.NAME)).getExpires();
}
// Presence presence = new Presence();
// presence.setFrom(mySimpleSession.getTransport().convertIDToJID(toAddr));
// presence.setTo(mySimpleSession.getJID());
if (expires > 0) {
// Confirm subscription of roster item
mySimpleSession.contactSubscribed(toAddr);
} else {
// Confirm unsubscription of roster item
mySimpleSession.contactUnsubscribed(toAddr);
}
Log.debug("SimpleSessionListener for " + myUsername + ": Handled SUBSCRIBE acknowledgement!!");
}
}
}
}
public void processTimeout(TimeoutEvent timeoutEvent) {
Log.debug("SimpleSessionListener for " + myUsername + " received a timeout event: " + timeoutEvent.getTimeout().toString());
// timeoutEvent.getTimeout().
// Should we try to resend the packet?
}
public void processIOException(IOExceptionEvent iOExceptionEvent) {
Log.debug("SimpleSessionListener for " + myUsername + " received an IOException event: " + iOExceptionEvent.toString());
}
public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
Log.debug("SimpleSessionListener(" + myUsername + "): Received a TransactionTerminatedEvent [" + transactionTerminatedEvent.hashCode() + "]");
// Should we obtain the transaction and log down the tranaction terminated?
}
public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
Log.debug("SimpleSessionListener for " + myUsername + " received a dialog terminated event: " +
dialogTerminatedEvent.getDialog().getDialogId());
}
public void finalize() {
Log.debug("SimpleSessionListener for " + myUsername + " is being shut down!!");
mySimpleSession = null;
}
}
\ No newline at end of file
/**
* $Revision$
* $Date$
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.wildfire.gateway.protocols.simple;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Properties;
import java.util.TooManyListenersException;
import javax.sip.InvalidArgumentException;
import javax.sip.ListeningPoint;
import javax.sip.ObjectInUseException;
import javax.sip.PeerUnavailableException;
import javax.sip.SipFactory;
import javax.sip.SipProvider;
import javax.sip.SipStack;
import javax.sip.TransportNotSupportedException;
import javax.sip.address.AddressFactory;
import javax.sip.header.HeaderFactory;
import javax.sip.message.MessageFactory;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.Log;
import org.jivesoftware.wildfire.gateway.BaseTransport;
import org.jivesoftware.wildfire.gateway.PresenceType;
import org.jivesoftware.wildfire.gateway.Registration;
import org.jivesoftware.wildfire.gateway.TransportLoginStatus;
import org.jivesoftware.wildfire.gateway.TransportSession;
import org.xmpp.packet.JID;
import org.xmpp.packet.Presence;
/**
* A transport implementation for SIMPLE protocol.
* @author Patrick Siu
* @version 0.0.1
*/
public class SimpleTransport extends BaseTransport {
SipFactory sipFactory = null;
public SimpleTransport() {
super();
// Initialize the SipFactory
sipFactory = SipFactory.getInstance();
sipFactory.setPathName("gov.nist");
}
public TransportSession registrationLoggedIn(Registration registration, JID jid, PresenceType presenceType, String verboseStatus, Integer priority) {
TransportSession session = new SimpleSession(registration, jid, this, priority);
// Possibly more work here!
((SimpleSession) session).login(presenceType, verboseStatus);
return session;
}
public void registrationLoggedOut(TransportSession session) {
((SimpleSession) session).logout();
((SimpleSession) session).removeStack();
session.sessionDone();
// Just in case.
session.setLoginStatus(TransportLoginStatus.LOGGED_OUT);
}
/**
*/
public String getTerminologyUsername() {
return LocaleUtils.getLocalizedString("gateway.sip.username", "gateway");
}
public String getTerminologyPassword() {
return LocaleUtils.getLocalizedString("gateway.sip.password", "gateway");
}
/**
* @see org.jivesoftware.wildfire.gateway.BaseTransport#getTerminologyNickname()
*/
public String getTerminologyNickname() {
// If this string is needed, then take it. Just put a draft code to ensure integrity.
String result = null;
return result;
}
/**
* @see org.jivesoftware.wildfire.gateway.BaseTransport#getTerminologyRegistration()
*/
public String getTerminologyRegistration() {
return LocaleUtils.getLocalizedString("gateway.sip.registration", "gateway");
}
/**
* @see org.jivesoftware.wildfire.gateway.BaseTransport#isPasswordRequired()
*/
public Boolean isPasswordRequired() {
// Just put a draft code to ensure integrity.
Boolean result = true;
return result;
}
/**
* @see org.jivesoftware.wildfire.gateway.BaseTransport#isNicknameRequired()
*/
public Boolean isNicknameRequired() {
// Just put a draft code to ensure integrity.
Boolean result = false;
return result;
}
/**
* @see org.jivesoftware.wildfire.gateway.BaseTransport#isUsernameValid(String)
*/
public Boolean isUsernameValid(String username) {
// Just put a draft code to ensure integrity.
Log.debug("SimpleTransport.isUsernameValid: Checking '" + username + "'");
// Boolean result = username.matches("\\w+");
Boolean result = username.matches("[^ \\p{Cntrl}()@,;:\\\\\"\\[\\]]+@[^ \\p{Cntrl}()@,;:\\\\\"\\[\\]]+");
return result;
}
// The following code are generic custom classes for SIP-XMPP conversion.
public SimplePresence convertJabStatusToSIP(PresenceType jabStatus) {
SimplePresence simplePresence = new SimplePresence();
switch (jabStatus) {
case available:
// simplePresence.setRpid(SimplePresence.Rpid.UNKNOWN);
simplePresence.setDmNote("Online");
break;
case away:
simplePresence.setRpid(SimplePresence.Rpid.AWAY);
break;
case chat:
simplePresence.setRpid(SimplePresence.Rpid.OTHER);
simplePresence.setDmNote("Free to chat");
break;
case dnd:
simplePresence.setRpid(SimplePresence.Rpid.BUSY);
break;
case unavailable:
simplePresence.setTupleStatus(SimplePresence.TupleStatus.CLOSED);
break;
case unknown:
simplePresence.setRpid(SimplePresence.Rpid.UNKNOWN);
break;
case xa:
simplePresence.setRpid(SimplePresence.Rpid.AWAY);
break;
default:
break;
}
return simplePresence;
}
public void convertSIPStatusToJap(Presence presence, SimplePresence simplePresence) {
if (simplePresence.getTupleStatus().isOpen()) {
switch (simplePresence.getRpid()) {
case APPOINTMENT:
presence.setShow(Presence.Show.dnd);
break;
case AWAY:
presence.setShow(Presence.Show.away);
break;
case BREAKFAST:
presence.setShow(Presence.Show.xa);
break;
case BUSY:
presence.setShow(Presence.Show.dnd);
break;
case DINNER:
presence.setShow(Presence.Show.xa);
break;
case HOLIDAY:
presence.setShow(Presence.Show.xa);
break;
case IN_TRANSIT:
presence.setShow(Presence.Show.xa);
break;
case LOOKING_FOR_WORK:
presence.setShow(Presence.Show.dnd);
break;
case LUNCH:
case MEAL:
presence.setShow(Presence.Show.xa);
break;
case MEETING:
presence.setShow(Presence.Show.dnd);
break;
case ON_THE_PHONE:
presence.setShow(Presence.Show.away);
presence.setStatus("On Phone");
break;
case OTHER:
break;
case PERFORMANCE:
presence.setShow(Presence.Show.dnd);
break;
case PERMANENT_ABSENCE:
presence.setType(Presence.Type.unavailable);
break;
case PLAYING:
presence.setShow(Presence.Show.away);
break;
case PRESENTATION:
presence.setShow(Presence.Show.dnd);
break;
case SHOPPING:
presence.setShow(Presence.Show.xa);
break;
case SLEEPING:
presence.setShow(Presence.Show.xa);
break;
case SPECTATOR:
presence.setShow(Presence.Show.xa);
break;
case STEERING:
presence.setShow(Presence.Show.xa);
break;
case TRAVEL:
presence.setShow(Presence.Show.xa);
break;
case TV:
presence.setShow(Presence.Show.away);
break;
case UNKNOWN:
// presence.setType(Presence.Type.unavailable);
break;
case VACATION:
presence.setShow(Presence.Show.xa);
break;
case WORKING:
presence.setShow(Presence.Show.dnd);
break;
case WORSHIP:
presence.setShow(Presence.Show.dnd);
break;
default:
break;
}
}
else {
presence.setType(Presence.Type.unavailable);
}
}
/**
* An improved method to do the trick.
*/
public String convertJIDToID(JID jid) {
String node = jid.getNode();
while (!JID.unescapeNode(node).equals(node)) {
node = JID.unescapeNode(node);
}
return node;
}
int portOffset = 0;
synchronized int generateListenerPort() {
return (ListeningPoint.PORT_5060 + (++portOffset));
}
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
*/ */
package org.jivesoftware.wildfire.gateway.web; package org.jivesoftware.wildfire.gateway.web;
import org.jivesoftware.wildfire.container.PluginManager; import org.jivesoftware.wildfire.container.PluginManager;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* $Revision$ * $Revision$
* $Date$ * $Date$
* *
* Copyright (C) 2006 Jive Software. All rights reserved. * Copyright (C) 2006-2007 Jive Software. All rights reserved.
* *
* This software is published under the terms of the GNU Public License (GPL), * This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution. * a copy of which is included in this distribution.
......
/**
* $Revision$
* $Date$
*
* Copyright (C) 2006-2007 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.util; package org.jivesoftware.util;
import org.jivesoftware.wildfire.gateway.PresenceType; import org.jivesoftware.wildfire.gateway.PresenceType;
......
<?xml version="1.0" encoding="UTF-8"?>
<optionsconfig>
<leftpanel></leftpanel>
<rightpanel>
<item type="text" sysprop="plugin.gateway.sip.connecthost" var="host" desckey="gateway.web.settings.host" default="localhost"/>
<item type="text" sysprop="plugin.gateway.sip.connectport" var="port" desckey="gateway.web.settings.port" default="5060"/>
</rightpanel>
</optionsconfig>
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
trEnabled.put("irc", plugin.getTransportInstance("irc").isEnabled()); trEnabled.put("irc", plugin.getTransportInstance("irc").isEnabled());
trEnabled.put("msn", plugin.getTransportInstance("msn").isEnabled()); trEnabled.put("msn", plugin.getTransportInstance("msn").isEnabled());
trEnabled.put("yahoo", plugin.getTransportInstance("yahoo").isEnabled()); trEnabled.put("yahoo", plugin.getTransportInstance("yahoo").isEnabled());
trEnabled.put("sip", plugin.getTransportInstance("sip").isEnabled());
webManager.init(request, response, session, application, out); webManager.init(request, response, session, application, out);
...@@ -66,7 +65,6 @@ ...@@ -66,7 +65,6 @@
if (webManager.getPageProperty("gateway-registrations", "filterYAHOO", 0) != 0) { filteropts.add("yahoo"); } if (webManager.getPageProperty("gateway-registrations", "filterYAHOO", 0) != 0) { filteropts.add("yahoo"); }
if (webManager.getPageProperty("gateway-registrations", "filterIRC", 0) != 0) { filteropts.add("irc"); } if (webManager.getPageProperty("gateway-registrations", "filterIRC", 0) != 0) { filteropts.add("irc"); }
if (webManager.getPageProperty("gateway-registrations", "filterSIGNEDON", 0) != 0) { filteropts.add("signedon"); } if (webManager.getPageProperty("gateway-registrations", "filterSIGNEDON", 0) != 0) { filteropts.add("signedon"); }
if (webManager.getPageProperty("gateway-registrations", "filterSIP", 0) != 0) { filteropts.add("sip"); }
} }
else { else {
filteropts.add("aim"); filteropts.add("aim");
...@@ -74,7 +72,6 @@ ...@@ -74,7 +72,6 @@
filteropts.add("msn"); filteropts.add("msn");
filteropts.add("yahoo"); filteropts.add("yahoo");
filteropts.add("irc"); filteropts.add("irc");
filteropts.add("sip");
} }
webManager.setPageProperty("gateway-registrations", "filterSET", 1); webManager.setPageProperty("gateway-registrations", "filterSET", 1);
...@@ -84,7 +81,6 @@ ...@@ -84,7 +81,6 @@
webManager.setPageProperty("gateway-registrations", "filterYAHOO", filteropts.contains("yahoo") ? 1 : 0); webManager.setPageProperty("gateway-registrations", "filterYAHOO", filteropts.contains("yahoo") ? 1 : 0);
webManager.setPageProperty("gateway-registrations", "filterIRC", filteropts.contains("irc") ? 1 : 0); webManager.setPageProperty("gateway-registrations", "filterIRC", filteropts.contains("irc") ? 1 : 0);
webManager.setPageProperty("gateway-registrations", "filterSIGNEDON", filteropts.contains("signedon") ? 1 : 0); webManager.setPageProperty("gateway-registrations", "filterSIGNEDON", filteropts.contains("signedon") ? 1 : 0);
webManager.setPageProperty("gateway-registrations", "filterSIP", filteropts.contains("sip") ? 1 : 0);
int resCount = 0; int resCount = 0;
for (Registration registration : registrations) { for (Registration registration : registrations) {
...@@ -288,7 +284,6 @@ ...@@ -288,7 +284,6 @@
<% if (trEnabled.get("icq")) { %> <option value="icq"><fmt:message key="gateway.icq.shortservice" /></option> <% } %> <% if (trEnabled.get("icq")) { %> <option value="icq"><fmt:message key="gateway.icq.shortservice" /></option> <% } %>
<% if (trEnabled.get("irc")) { %> <option value="irc"><fmt:message key="gateway.irc.shortservice" /></option> <% } %> <% if (trEnabled.get("irc")) { %> <option value="irc"><fmt:message key="gateway.irc.shortservice" /></option> <% } %>
<% if (trEnabled.get("msn")) { %> <option value="msn"><fmt:message key="gateway.msn.shortservice" /></option> <% } %> <% if (trEnabled.get("msn")) { %> <option value="msn"><fmt:message key="gateway.msn.shortservice" /></option> <% } %>
<% if (trEnabled.get("sip")) { %> <option value="sip"><fmt:message key="gateway.sip.shortservice" /></option> <% } %>
<% if (trEnabled.get("yahoo")) { %> <option value="yahoo"><fmt:message key="gateway.yahoo.shortservice" /></option> <% } %> <% if (trEnabled.get("yahoo")) { %> <option value="yahoo"><fmt:message key="gateway.yahoo.shortservice" /></option> <% } %>
</select><br> </select><br>
<strong><fmt:message key="gateway.web.registrations.gateway" /></strong> <strong><fmt:message key="gateway.web.registrations.gateway" /></strong>
...@@ -398,11 +393,6 @@ ...@@ -398,11 +393,6 @@
<img src="images/msn.gif" border="0" alt="<fmt:message key="gateway.msn.shortservice" />"> <img src="images/msn.gif" border="0" alt="<fmt:message key="gateway.msn.shortservice" />">
<!--<span><fmt:message key="gateway.msn.shortservice" /></span>--> <!--<span><fmt:message key="gateway.msn.shortservice" /></span>-->
</label> </label>
<label for="filterSIPcheckbox">
<input type="checkbox" name="filter[]" value="sip" <%= ((filteropts.contains("sip")) ? "checked" : "") %> id="filterSIPcheckbox">
<img src="images/sipsimple.gif" border="0" alt="<fmt:message key="gateway.sip.shortservice" />">
<!--<span><fmt:message key="gateway.sip.shortservice" /></span>-->
</label>
<label for="filterYAHOOcheckbox"> <label for="filterYAHOOcheckbox">
<input type="checkbox" name="filter[]" value="yahoo" <%= ((filteropts.contains("yahoo")) ? "checked" : "") %> id="filterYAHOOcheckbox"> <input type="checkbox" name="filter[]" value="yahoo" <%= ((filteropts.contains("yahoo")) ? "checked" : "") %> id="filterYAHOOcheckbox">
<img src="images/yahoo.gif" border="0" alt="<fmt:message key="gateway.yahoo.shortservice" />"> <img src="images/yahoo.gif" border="0" alt="<fmt:message key="gateway.yahoo.shortservice" />">
......
...@@ -354,7 +354,6 @@ ...@@ -354,7 +354,6 @@
GatewaySettings icqSettings = new GatewaySettings(out, plugin, TransportType.icq, LocaleUtils.getLocalizedString("gateway.icq.service", "gateway")); GatewaySettings icqSettings = new GatewaySettings(out, plugin, TransportType.icq, LocaleUtils.getLocalizedString("gateway.icq.service", "gateway"));
GatewaySettings ircSettings = new GatewaySettings(out, plugin, TransportType.irc, LocaleUtils.getLocalizedString("gateway.irc.service", "gateway")); GatewaySettings ircSettings = new GatewaySettings(out, plugin, TransportType.irc, LocaleUtils.getLocalizedString("gateway.irc.service", "gateway"));
GatewaySettings msnSettings = new GatewaySettings(out, plugin, TransportType.msn, LocaleUtils.getLocalizedString("gateway.msn.service", "gateway")); GatewaySettings msnSettings = new GatewaySettings(out, plugin, TransportType.msn, LocaleUtils.getLocalizedString("gateway.msn.service", "gateway"));
GatewaySettings sipSettings = new GatewaySettings(out, plugin, TransportType.sip, LocaleUtils.getLocalizedString("gateway.sip.service", "gateway"));
GatewaySettings yahooSettings = new GatewaySettings(out, plugin, TransportType.yahoo, LocaleUtils.getLocalizedString("gateway.yahoo.service", "gateway")); GatewaySettings yahooSettings = new GatewaySettings(out, plugin, TransportType.yahoo, LocaleUtils.getLocalizedString("gateway.yahoo.service", "gateway"));
%> %>
...@@ -616,7 +615,6 @@ ...@@ -616,7 +615,6 @@
<p><fmt:message key="gateway.web.settings.unstable.notice" /></p> <p><fmt:message key="gateway.web.settings.unstable.notice" /></p>
<% icqSettings.printSettingsDialog(); %> <% icqSettings.printSettingsDialog(); %>
<% sipSettings.printSettingsDialog(); %>
<% yahooSettings.printSettingsDialog(); %> <% yahooSettings.printSettingsDialog(); %>
</form> </form>
......
...@@ -344,14 +344,6 @@ a.jive-gatewayButtonOn { ...@@ -344,14 +344,6 @@ a.jive-gatewayButtonOn {
background: url(../images/msn-gray.gif) no-repeat left; background: url(../images/msn-gray.gif) no-repeat left;
background-position: 2px 1px; background-position: 2px 1px;
} }
.jive-gateway-SIPon {
background: url(../images/sip.gif) no-repeat left;
background-position: 2px 1px;
}
.jive-gateway-SIPoff {
background: url(../images/sip-gray.gif) no-repeat left;
background-position: 2px 1px;
}
.jive-gateway-YAHOOon { .jive-gateway-YAHOOon {
background: url(../images/yahoo.gif) no-repeat left; background: url(../images/yahoo.gif) no-repeat left;
background-position: 0px 1px; background-position: 0px 1px;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment