private void RenewSession() { try { string sessionID = m_notificationsSessionID; Thread.Sleep(RENEW_SESSION_LENGTH * 1000); while (!HasClosed && sessionID == m_notificationsSessionID) { m_publisher.ExtendSession(m_notificationsAddress, m_notificationsSessionID, DEFAULT_SESSION_LENGTH); Thread.Sleep(RENEW_SESSION_LENGTH * 1000); } } catch (Exception excp) { logger.Error("Exception SIPSorceryVT100Server RenewSession. " + excp.Message); } }
/// <summary> /// Attempts to renew an existing subscription. /// </summary> /// <returns>The session ID if the renewal was successful or null if it wasn't.</returns> public string RenewSubscription(SIPRequest subscribeRequest, out SIPResponseStatusCodesEnum errorResponse, out string errorReason) { errorResponse = SIPResponseStatusCodesEnum.None; errorReason = null; try { int expiry = subscribeRequest.Header.Expires; string toTag = subscribeRequest.Header.To.ToTag; string fromTag = subscribeRequest.Header.From.FromTag; string callID = subscribeRequest.Header.CallId; int cseq = subscribeRequest.Header.CSeq; // Check for an existing subscription. SIPEventSubscription existingSubscription = (from sub in m_subscriptions.Values where sub.SubscriptionDialogue.CallId == callID select sub).FirstOrDefault(); if (existingSubscription != null) { if (expiry == 0) { // Subsciption is being cancelled. StopSubscription(existingSubscription); return(null); } else if (cseq > existingSubscription.SubscriptionDialogue.RemoteCSeq) { logger.Debug("Renewing subscription for " + existingSubscription.SessionID + " and " + existingSubscription.SubscriptionDialogue.Owner + "."); existingSubscription.SubscriptionDialogue.RemoteCSeq = cseq; //existingSubscription.ProxySendFrom = (!subscribeRequest.Header.ProxyReceivedOn.IsNullOrBlank()) ? SIPEndPoint.ParseSIPEndPoint(subscribeRequest.Header.ProxyReceivedOn) : null; string extensionResult = m_publisher.ExtendSession(m_notificationsAddress, existingSubscription.SessionID, expiry); if (extensionResult != null) { // One or more of the monitor servers could not extend the session. Close all the existing sessions and re-create. MonitorLogEvent_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Notifier, SIPMonitorEventTypesEnum.SubscribeFailed, "Monitor session extension for " + existingSubscription.SubscriptionEventPackage.ToString() + " " + existingSubscription.ResourceURI.ToString() + " failed. " + extensionResult, existingSubscription.SubscriptionDialogue.Owner)); m_publisher.CloseSession(m_notificationsAddress, existingSubscription.SessionID); // Need to re-establish the sessions with the notification servers. string subscribeError = null; string sessionID = Guid.NewGuid().ToString(); m_publisher.Subscribe(existingSubscription.SubscriptionDialogue.Owner, existingSubscription.SubscriptionDialogue.AdminMemberId, m_notificationsAddress, sessionID, SIPMonitorClientTypesEnum.Machine.ToString(), existingSubscription.MonitorFilter, expiry, null, out subscribeError); if (subscribeError != null) { throw new ApplicationException(subscribeError); } else { lock (m_subscriptions) { m_subscriptions.Remove(existingSubscription.SessionID); existingSubscription.SessionID = sessionID; m_subscriptions.Add(sessionID, existingSubscription); } MonitorLogEvent_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Notifier, SIPMonitorEventTypesEnum.SubscribeAccept, "Monitor session recreated for " + existingSubscription.SubscriptionEventPackage.ToString() + " " + existingSubscription.ResourceURI.ToString() + ".", existingSubscription.SubscriptionDialogue.Owner)); } } MonitorLogEvent_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Notifier, SIPMonitorEventTypesEnum.SubscribeRenew, "Monitor session successfully renewed for " + existingSubscription.SubscriptionEventPackage.ToString() + " " + existingSubscription.ResourceURI.ToString() + ".", existingSubscription.SubscriptionDialogue.Owner)); return(existingSubscription.SessionID); } else { throw new ApplicationException("A duplicate SUBSCRIBE request was received by NotifierSubscriptionsManager."); } } else { //throw new ApplicationException("No existing subscription could be found for a subscribe renewal request."); errorResponse = SIPResponseStatusCodesEnum.CallLegTransactionDoesNotExist; errorReason = "Subscription dialog not found"; return(null); } } catch (Exception excp) { logger.Error("Exception RenewSubscription. " + excp.Message); throw; } }
public string ExtendSession(string address, string sessionID, int expiry) { return(m_publisher.ExtendSession(address, sessionID, expiry)); }