use of javax.sip.TimeoutEvent in project XobotOS by xamarin.
the class SIPClientTransaction method fireRetransmissionTimer.
/**
* Called by the transaction stack when a retransmission timer fires.
*/
protected void fireRetransmissionTimer() {
try {
// Resend the last request sent
if (this.getState() == null || !this.isMapped)
return;
boolean inv = isInviteTransaction();
TransactionState s = this.getState();
// Bug-fix for non-INVITE transactions not retransmitted when 1xx response received
if ((inv && TransactionState.CALLING == s) || (!inv && (TransactionState.TRYING == s || TransactionState.PROCEEDING == s))) {
if (lastRequest != null) {
if (sipStack.generateTimeStampHeader && lastRequest.getHeader(TimeStampHeader.NAME) != null) {
long milisec = System.currentTimeMillis();
TimeStamp timeStamp = new TimeStamp();
try {
timeStamp.setTimeStamp(milisec);
} catch (InvalidArgumentException ex) {
InternalErrorHandler.handleException(ex);
}
lastRequest.setHeader(timeStamp);
}
super.sendMessage(lastRequest);
if (this.notifyOnRetransmit) {
TimeoutEvent txTimeout = new TimeoutEvent(this.getSipProvider(), this, Timeout.RETRANSMIT);
this.getSipProvider().handleEvent(txTimeout, this);
}
if (this.timeoutIfStillInCallingState && this.getState() == TransactionState.CALLING) {
this.callingStateTimeoutCount--;
if (callingStateTimeoutCount == 0) {
TimeoutEvent timeoutEvent = new TimeoutEvent(this.getSipProvider(), this, Timeout.RETRANSMIT);
this.getSipProvider().handleEvent(timeoutEvent, this);
this.timeoutIfStillInCallingState = false;
}
}
}
}
} catch (IOException e) {
this.raiseIOExceptionEvent();
raiseErrorEvent(SIPTransactionErrorEvent.TRANSPORT_ERROR);
}
}
use of javax.sip.TimeoutEvent in project XobotOS by xamarin.
the class SIPServerTransaction method fireRetransmissionTimer.
/**
* Called by the transaction stack when a retransmission timer fires. This retransmits the
* last response when the retransmission filter is enabled.
*/
protected void fireRetransmissionTimer() {
try {
if (sipStack.isLoggingEnabled()) {
sipStack.getStackLogger().logDebug("fireRetransmissionTimer() -- ");
}
// Resend the last response sent by this transaction
if (isInviteTransaction() && lastResponse != null) {
// null can happen if this is terminating when the timer fires.
if (!this.retransmissionAlertEnabled || sipStack.isTransactionPendingAck(this)) {
// Retransmit last response until ack.
if (lastResponse.getStatusCode() / 100 > 2 && !this.isAckSeen)
super.sendMessage(lastResponse);
} else {
// alert the application to retransmit the last response
SipProviderImpl sipProvider = (SipProviderImpl) this.getSipProvider();
TimeoutEvent txTimeout = new TimeoutEvent(sipProvider, this, Timeout.RETRANSMIT);
sipProvider.handleEvent(txTimeout, this);
}
}
} catch (IOException e) {
if (sipStack.isLoggingEnabled())
sipStack.getStackLogger().logException(e);
raiseErrorEvent(SIPTransactionErrorEvent.TRANSPORT_ERROR);
}
}
use of javax.sip.TimeoutEvent in project XobotOS by xamarin.
the class SipProviderImpl method transactionErrorEvent.
/**
* Invoked when an error has ocurred with a transaction. Propagate up to the
* listeners.
*
* @param transactionErrorEvent
* Error event.
*/
public void transactionErrorEvent(SIPTransactionErrorEvent transactionErrorEvent) {
SIPTransaction transaction = (SIPTransaction) transactionErrorEvent.getSource();
if (transactionErrorEvent.getErrorID() == SIPTransactionErrorEvent.TRANSPORT_ERROR) {
// There must be a way to inform the TU here!!
if (sipStack.isLoggingEnabled()) {
sipStack.getStackLogger().logDebug("TransportError occured on " + transaction);
}
// Treat this like a timeout event. (Suggestion from Christophe).
Object errorObject = transactionErrorEvent.getSource();
Timeout timeout = Timeout.TRANSACTION;
TimeoutEvent ev = null;
if (errorObject instanceof SIPServerTransaction) {
ev = new TimeoutEvent(this, (ServerTransaction) errorObject, timeout);
} else {
SIPClientTransaction clientTx = (SIPClientTransaction) errorObject;
Hop hop = clientTx.getNextHop();
if (sipStack.getRouter() instanceof RouterExt) {
((RouterExt) sipStack.getRouter()).transactionTimeout(hop);
}
ev = new TimeoutEvent(this, (ClientTransaction) errorObject, timeout);
}
// Handling transport error like timeout
this.handleEvent(ev, (SIPTransaction) errorObject);
} else if (transactionErrorEvent.getErrorID() == SIPTransactionErrorEvent.TIMEOUT_ERROR) {
// This is a timeout event.
Object errorObject = transactionErrorEvent.getSource();
Timeout timeout = Timeout.TRANSACTION;
TimeoutEvent ev = null;
if (errorObject instanceof SIPServerTransaction) {
ev = new TimeoutEvent(this, (ServerTransaction) errorObject, timeout);
} else {
SIPClientTransaction clientTx = (SIPClientTransaction) errorObject;
Hop hop = clientTx.getNextHop();
if (sipStack.getRouter() instanceof RouterExt) {
((RouterExt) sipStack.getRouter()).transactionTimeout(hop);
}
ev = new TimeoutEvent(this, (ClientTransaction) errorObject, timeout);
}
this.handleEvent(ev, (SIPTransaction) errorObject);
} else if (transactionErrorEvent.getErrorID() == SIPTransactionErrorEvent.TIMEOUT_RETRANSMIT) {
// This is a timeout retransmit event.
// We should never get this if retransmit filter is
// enabled (ie. in that case the stack should handle.
// all retransmits.
Object errorObject = transactionErrorEvent.getSource();
Transaction tx = (Transaction) errorObject;
if (tx.getDialog() != null)
InternalErrorHandler.handleException("Unexpected event !", this.sipStack.getStackLogger());
Timeout timeout = Timeout.RETRANSMIT;
TimeoutEvent ev = null;
if (errorObject instanceof SIPServerTransaction) {
ev = new TimeoutEvent(this, (ServerTransaction) errorObject, timeout);
} else {
ev = new TimeoutEvent(this, (ClientTransaction) errorObject, timeout);
}
this.handleEvent(ev, (SIPTransaction) errorObject);
}
}
Aggregations