/* * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. * * Distributable under LGPL license. * See terms of license at gnu.org. */ package net.java.sip.communicator.impl.protocol.sip; import javax.sip.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; /** * Allows SIP communicator to create SIP accounts without a registrar. We use * this class as a replacement of the SipRegistrarConnection for accounts that * do not have a configured registrar. * * @author Emil Ivov */ public class SipRegistrarlessConnection extends SipRegistrarConnection { /** * A reference to the sip provider that created us. */ private ProtocolProviderServiceSipImpl sipProvider = null; /** * The transport that we should claim to be using in case some of the other * components of the sip package would try to use it as the default transort * to connect with. */ private String defaultTransport = null; /** * Keeps our current registration state. */ private RegistrationState currentRegistrationState = RegistrationState.UNREGISTERED; /** * Creates a new instance of this class. * * @param sipProviderCallback a reference to the * ProtocolProviderServiceSipImpl instance that created us. * @param defaultTransport the transport that we should fake to be using * in case some of the other components in the sip package wants to use it * as a default. */ public SipRegistrarlessConnection( ProtocolProviderServiceSipImpl sipProviderCallback, String defaultTransport) { this.sipProvider = sipProviderCallback; this.defaultTransport = defaultTransport; } /** * Simply sets the state of the connection to REGISTERED without doing * anything else. * * @throws OperationFailedException never thrown */ @Override void register() throws OperationFailedException { setRegistrationState(RegistrationState.REGISTERED, RegistrationStateChangeEvent.REASON_USER_REQUEST, null); } /** * Simply sets the state of the connection to UNREGISTERED without doing * anything else. * * @throws OperationFailedException never thrown. */ @Override public void unregister() throws OperationFailedException { setRegistrationState(RegistrationState.UNREGISTERED, RegistrationStateChangeEvent.REASON_USER_REQUEST, null); } /** * Returns the state of this connection. * * @return a RegistrationState instance indicating the state of our * registration with the corresponding registrar. */ @Override public RegistrationState getRegistrationState() { return currentRegistrationState; } /** * Sets our registration state to <tt>newState</tt> and dispatches an event * through the protocol provider service impl. * <p> * @param newState a reference to the RegistrationState that we're currently * detaining. * @param reasonCode one of the REASON_XXX error codes specified in * {@link RegistrationStateChangeEvent}. * @param reason a reason String further explaining the reasonCode. */ @Override public void setRegistrationState(RegistrationState newState, int reasonCode, String reason) { if( currentRegistrationState.equals(newState) ) { return; } RegistrationState oldState = currentRegistrationState; this.currentRegistrationState = newState; sipProvider.fireRegistrationStateChanged( oldState, newState, reasonCode, reason); } /** * Returns the listening point that should be used for communication with our * current registrar. * * @return the listening point that should be used for communication with our * current registrar. */ @Override public ListeningPoint getListeningPoint() { return sipProvider.getListeningPoint(getTransport()); } /** * Returns the default jain-sip provider for our parent provider. * * @return the default jain-sip provider for our parent provider. */ @Override public SipProvider getJainSipProvider() { return sipProvider.getJainSipProvider(getTransport()); } /** * Returns the default transport for our parent provider. * * @return the default transport for our parent provider. */ @Override public String getTransport() { return defaultTransport; } /** * Returns a string representation of this connection instance * instance including information that would permit to distinguish it among * other sip listeners when reading a log file. * <p> * @return a string representation of this operation set. */ @Override public String toString() { String className = getClass().getName(); try { className = className.substring(className.lastIndexOf('.') + 1); } catch (Exception ex) { // we don't want to fail in this method because we've messed up //something with indexes, so just ignore. } return className + "-[dn=" + sipProvider.getOurDisplayName() +" addr="+sipProvider.getAccountID().getUserID() + "]"; } /** * Returns true if this is a fake connection that is not actually using * a registrar. This method should be overridden in * <tt>SipRegistrarlessConnection</tt> and return <tt>true</tt> in there. * * @return true if this connection is really using a registrar and * false if it is a fake connection that doesn't really use a registrar. */ @Override public boolean isRegistrarless() { return true; } }