Allow a grace period for registration to complete at boot

fix-message-formatting
Daniel Pocock 11 years ago
parent a92eec8ad7
commit d0d881bc61

@ -7,6 +7,7 @@
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import net.java.sip.communicator.service.argdelegation.*;
import net.java.sip.communicator.service.gui.*;
@ -76,6 +77,12 @@ public class UriHandlerSipImpl
*/
private List<String> uris;
/**
* ExecutorService used to schedule a dialing attempt after a delay.
*/
private static final ScheduledExecutorService worker =
Executors.newSingleThreadScheduledExecutor();
/**
* Creates an instance of this uri handler, so that it would start handling
* URIs by passing them to the providers registered by <tt>protoFactory</tt>
@ -254,8 +261,7 @@ public String getProtocol()
}
/**
* Parses the specified URI and creates a call with the currently active
* telephony operation set.
* Parses the specified URI and tries to create a call when online.
*
* @param uri the SIP URI that we have to call.
*/
@ -301,6 +307,80 @@ public void handleUri(String uri)
return;
}
if(provider.getRegistrationState() == RegistrationState.REGISTERED)
{
handleUri(uri, provider);
}
else
{
// Allow a grace period for the provider to register in case
// we have just started up
DelayedHandler task = new DelayedHandler(uri, provider);
task.schedule();
}
}
/**
* This class is a Runnable for checking if the provider is ready
* (which may take a second or two after startup) rather
* than immediately failing the dialing attempt with an error.
*/
private class DelayedHandler
implements Runnable
{
final static int RETRIES = 8;
final static int RETRY_DELAY = 250;
private String uri;
private ProtocolProviderService provider;
int retries = RETRIES;
/**
* Initialize this Runnable, storing the values needed
* when the timeout occurs.
*
* @param uri the URI to try and dial
* @param provider the provider to use
*/
public DelayedHandler(String uri, ProtocolProviderService provider)
{
this.uri = uri;
this.provider = provider;
}
/**
* Tells the Runnable to schedule itself
*/
public void schedule()
{
worker.schedule(this, RETRY_DELAY, TimeUnit.MILLISECONDS);
}
/**
* Executed after the timeout elapses.
*
* Checks if the registration is complete or if we had enough retries
* and then tries to dial.
*/
public void run() {
if(retries-- == 0 ||
provider.getRegistrationState() == RegistrationState.REGISTERED)
{
handleUri(uri, provider);
return;
}
// retry after another delay
schedule();
}
}
/**
* Creates a call with the currently active telephony operation set.
*
* @param uri the SIP URI that we have to call.
*/
protected void handleUri(String uri, ProtocolProviderService provider)
{
//handle "sip://" URIs as "sip:"
if(uri != null)
uri = uri.replace("sip://", "sip:");

Loading…
Cancel
Save