private void sipService_onInviteEvent(object sender, InviteEventArgs e) { if (e.Type == InviteEventTypes.DISCONNECTED) { HistoryEvent @event; if ((@event = this.historyDataSource.FirstOrDefault(x => x.MediaType == BogheCore.MediaType.FileTransfer && x.SipSessionId == e.SessionId)) != null) { this.Dispatcher.Invoke((System.Threading.ThreadStart)delegate { this.historyService.AddEvent(@event); }); } else if (this.ChatSession != null && this.ChatSession.Id == e.SessionId) { this.Dispatcher.Invoke((System.Threading.ThreadStart)delegate { this.ChatSession = null; }); } } }
private void sipService_onInviteEvent(object sender, InviteEventArgs e) { switch (e.Type) { case InviteEventTypes.INCOMING: Win32ServiceManager.SharedManager.Dispatcher.Invoke((System.Threading.ThreadStart)delegate { MediaActionHanler.ReceiveCall(e.GetExtra(InviteEventArgs.EXTRA_SESSION) as MyInviteSession); }, null); break; default: break; } }
/// <summary> /// Dialog events (Common to all) /// </summary> /// <param name="e"></param> /// <returns></returns> public override int OnDialogEvent(DialogEvent e) { String phrase = e.getPhrase(); short code = e.getCode(); SipSession session = e.getBaseSession(); if (session == null) { return 0; } uint sessionId = session.getId(); MySipSession mySession = null; SipService.LOG.Info(String.Format("OnDialogEvent ({0})", phrase)); if (code == tinyWRAP.tsip_event_code_dialog_connecting) { // Registration if (this.sipService.regSession != null && this.sipService.regSession.Id == sessionId) { EventHandlerTrigger.TriggerEvent<RegistrationEventArgs>(this.sipService.onRegistrationEvent, this.sipService, new RegistrationEventArgs(RegistrationEventTypes.REGISTRATION_INPROGRESS, code, phrase)); } // Audio/Video/MSRP else if (((mySession = MyAVSession.GetSession(sessionId)) != null) || ((mySession = MyMsrpSession.GetSession(sessionId)) != null)) { (mySession as MyInviteSession).State = MyInviteSession.InviteState.INPROGRESS; InviteEventArgs eargs = new InviteEventArgs(sessionId, InviteEventTypes.INPROGRESS, phrase); eargs.AddExtra(InviteEventArgs.EXTRA_SESSION, mySession); EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, eargs); } // Subscription // Publication } else if (code == tinyWRAP.tsip_event_code_dialog_connected) { // Registration if (this.sipService.regSession != null && this.sipService.regSession.Id == sessionId) { this.sipService.regSession.IsConnected = true; // Update default identity (vs barred) String _defaultIdentity = this.sipService.SipStack.getPreferredIdentity(); if (!String.IsNullOrEmpty(_defaultIdentity)) { this.sipService.defaultIdentity = _defaultIdentity; } // Do PostRegistrationOp() in new thread to avoid blocking callbacks new Thread(new ThreadStart(delegate { this.sipService.DoPostRegistrationOp(); })) .Start(); EventHandlerTrigger.TriggerEvent<RegistrationEventArgs>(this.sipService.onRegistrationEvent, this.sipService, new RegistrationEventArgs(RegistrationEventTypes.REGISTRATION_OK, code, phrase)); } // Audio/Video/MSRP else if (((mySession = MyAVSession.GetSession(sessionId)) != null) || ((mySession = MyMsrpSession.GetSession(sessionId)) != null)) { (mySession as MyInviteSession).State = MyInviteSession.InviteState.INCALL; mySession.IsConnected = true; EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(sessionId, InviteEventTypes.CONNECTED, phrase)); } // Subscription else if ((mySession = this.sipService.subPresence.FirstOrDefault(x => x.Id == sessionId)) != null) { mySession.IsConnected = true; } // Publication else if (this.sipService.pubPres != null && this.sipService.pubPres.Id == sessionId) { this.sipService.pubPres.IsConnected = true; } } else if (code == tinyWRAP.tsip_event_code_dialog_terminating) { // Registration if (this.sipService.regSession != null && this.sipService.regSession.Id == sessionId) { EventHandlerTrigger.TriggerEvent<RegistrationEventArgs>(this.sipService.onRegistrationEvent, this.sipService, new RegistrationEventArgs(RegistrationEventTypes.UNREGISTRATION_INPROGRESS, code, phrase)); } // Audio/Video/MSRP else if (((mySession = MyAVSession.GetSession(sessionId)) != null) || ((mySession = MyMsrpSession.GetSession(sessionId)) != null)) { (mySession as MyInviteSession).State = MyInviteSession.InviteState.TERMINATING; EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(sessionId, InviteEventTypes.TERMWAIT, phrase)); } // Subscription // Publication } else if (code == tinyWRAP.tsip_event_code_dialog_terminated) { // Registration if (this.sipService.regSession != null && this.sipService.regSession.Id == sessionId) { this.sipService.regSession.IsConnected = false; // To PostRegistration() in new thread EventHandlerTrigger.TriggerEvent<RegistrationEventArgs>(this.sipService.onRegistrationEvent, this.sipService, new RegistrationEventArgs(RegistrationEventTypes.UNREGISTRATION_OK, code, phrase)); /* Stop the stack (as we are already in the stack-thread, then do it in a new thread) */ new Thread(new ThreadStart(delegate { if (this.sipService.sipStack.State == MySipStack.STACK_STATE.STARTED) { this.sipService.sipStack.stop(); } })).Start(); } // Audio/Video/MSRP else if (((mySession = MyAVSession.GetSession(sessionId)) != null) || ((mySession = MyMsrpSession.GetSession(sessionId)) != null)) { mySession.IsConnected = false; (mySession as MyInviteSession).State = MyInviteSession.InviteState.TERMINATED; EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(sessionId, InviteEventTypes.DISCONNECTED, phrase)); } // Subscription else if ((mySession = this.sipService.subPresence.FirstOrDefault(x => x.Id == sessionId)) != null) { mySession.IsConnected = false; this.sipService.subPresence.Remove(mySession as MySubscriptionSession); } // Publication else if (this.sipService.pubPres != null && this.sipService.pubPres.Id == sessionId) { this.sipService.pubPres.IsConnected = false; if (this.sipService.hyperAvailabilityTimer != null) { if (this.sipService.hyperAvailabilityTimer.Enabled) { this.sipService.hyperAvailabilityTimer.Stop(); } this.sipService.hyperAvailabilityTimer = null; } } } return 0; }
/// <summary> /// Call (MSRP, Audio, Video, T.38, ...) events /// </summary> /// <param name="e"></param> /// <returns></returns> public override int OnInviteEvent(InviteEvent e) { tsip_invite_event_type_t type = e.getType(); short code = e.getCode(); String phrase = e.getPhrase(); InviteSession session = e.getSession(); switch (type) { case tsip_invite_event_type_t.tsip_i_newcall: if (session != null) /* As we are not the owner, then the session MUST be null */ { LOG.Error("Invalid incoming session"); session.hangup(); // To avoid another callback event return -1; } SipMessage message = e.getSipMessage(); if (message == null) { LOG.Error("Invalid message"); return -1; } twrap_media_type_t sessionType = e.getMediaType(); switch (sessionType) { case twrap_media_type_t.twrap_media_msrp: { if ((session = e.takeMsrpSessionOwnership()) == null) { LOG.Error("Failed to take MSRP session ownership"); return -1; } MyMsrpSession msrpSession = MyMsrpSession.TakeIncomingSession(this.sipService.SipStack, session as MsrpSession, message); if (msrpSession == null) { LOG.Error("Failed to create new session"); session.hangup(); session.Dispose(); return 0; } msrpSession.State = MyInviteSession.InviteState.INCOMING; InviteEventArgs eargs = new InviteEventArgs(msrpSession.Id, InviteEventTypes.INCOMING, phrase); eargs.AddExtra(InviteEventArgs.EXTRA_SESSION, msrpSession); EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, eargs); break; } case twrap_media_type_t.twrap_media_audio: case twrap_media_type_t.twrap_media_audiovideo: case twrap_media_type_t.twrap_media_video: { if ((session = e.takeCallSessionOwnership()) == null) { LOG.Error("Failed to take audio/video session ownership"); return -1; } MyAVSession avSession = MyAVSession.TakeIncomingSession(this.sipService.SipStack, session as CallSession, sessionType, message); avSession.State = MyInviteSession.InviteState.INCOMING; InviteEventArgs eargs = new InviteEventArgs(avSession.Id, InviteEventTypes.INCOMING, phrase); eargs.AddExtra(InviteEventArgs.EXTRA_SESSION, avSession); EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, eargs); break; } default: LOG.Error("Invalid media type"); return 0; } break; case tsip_invite_event_type_t.tsip_ao_request: if (code == 180 && session != null) { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.RINGING, phrase)); } break; case tsip_invite_event_type_t.tsip_i_request: case tsip_invite_event_type_t.tsip_o_ect_ok: case tsip_invite_event_type_t.tsip_o_ect_nok: case tsip_invite_event_type_t.tsip_i_ect: { break; } case tsip_invite_event_type_t.tsip_m_early_media: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.EARLY_MEDIA, phrase)); break; } case tsip_invite_event_type_t.tsip_m_local_hold_ok: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_HOLD_OK, phrase)); break; } case tsip_invite_event_type_t.tsip_m_local_hold_nok: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_HOLD_NOK, phrase)); break; } case tsip_invite_event_type_t.tsip_m_local_resume_ok: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_RESUME_OK, phrase)); break; } case tsip_invite_event_type_t.tsip_m_local_resume_nok: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_RESUME_NOK, phrase)); break; } case tsip_invite_event_type_t.tsip_m_remote_hold: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.REMOTE_HOLD, phrase)); break; } case tsip_invite_event_type_t.tsip_m_remote_resume: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.REMOTE_RESUME, phrase)); break; } } return 0; }
private void sipService_onInviteEvent(object sender, InviteEventArgs e) { if (this.AVSession == null || this.AVSession.Id != e.SessionId) { /* Messaging */ if (e.Type == InviteEventTypes.DISCONNECTED) { if (this.historyDataSource.Any(x => x.SipSessionId == e.SessionId)) { this.Dispatcher.Invoke((System.Threading.ThreadStart)delegate { HistoryEvent @event = this.historyDataSource.FirstOrDefault(x => x.SipSessionId == e.SessionId); if (@event != null) { this.historyService.AddEvent(@event); } }, null); } else if (this.ChatSession != null && this.ChatSession.Id == e.SessionId) { this.Dispatcher.Invoke((System.Threading.ThreadStart)delegate { this.ChatSession = null; }); } } return; } /* Audio/Video */ if (this.Dispatcher.Thread != Thread.CurrentThread) { this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new EventHandler<InviteEventArgs>(this.sipService_onInviteEvent), sender, new object[] { e }); return; } this.UpdateControls(); switch (e.Type) { case InviteEventTypes.INCOMING: this.labelInfo.Content = String.Format("Incoming call from {0}", this.AVSession.RemotePartyDisplayName); this.avHistoryEvent = new HistoryAVCallEvent(this.AVSession.MediaType != BogheCore.MediaType.Audio, this.AVSession.RemotePartyUri); this.avHistoryEvent.Status = HistoryEvent.StatusType.Missed; break; case InviteEventTypes.INPROGRESS: // History Event this.labelInfo.Content = "Call In Progress..."; bool isVideo = (this.AVSession.MediaType == MediaType.AudioVideo || this.AVSession.MediaType == MediaType.Video); this.avHistoryEvent = new HistoryAVCallEvent(isVideo, this.AVSession.RemotePartyUri); this.avHistoryEvent.Status = HistoryEvent.StatusType.Outgoing; // Video Displays if (isVideo) { this.AttachDisplays(); } break; case InviteEventTypes.RINGING: this.labelInfo.Content = "Ringing"; this.soundService.PlayRingBackTone(); break; case InviteEventTypes.EARLY_MEDIA: this.labelInfo.Content = "Early Media Started"; this.soundService.StopRingBackTone(); this.soundService.StopRingTone(); break; case InviteEventTypes.CONNECTED: this.labelInfo.Content = "In Call"; this.soundService.StopRingBackTone(); this.soundService.StopRingTone(); this.videoDisplayLocal.Visibility = System.Windows.Visibility.Visible; this.videoDisplayRemote.Visibility = System.Windows.Visibility.Visible; this.timerCall.Start(); if (this.avHistoryEvent != null) { if (this.avHistoryEvent.Status == HistoryEvent.StatusType.Missed) { this.avHistoryEvent.Status = HistoryEvent.StatusType.Incoming; } this.avHistoryEvent.StartTime = DateTime.Now; this.avHistoryEvent.EndTime = this.avHistoryEvent.StartTime; } break; case InviteEventTypes.DISCONNECTED: case InviteEventTypes.TERMWAIT: this.labelInfo.Content = e.Type == InviteEventTypes.TERMWAIT ? "Call Terminated" : e.Phrase; this.timerCall.Stop(); this.soundService.StopRingBackTone(); this.soundService.StopRingTone(); if (this.avHistoryEvent != null) { lock (this.avHistoryEvent) { this.avHistoryEvent.EndTime = DateTime.Now; this.historyService.AddEvent(this.avHistoryEvent); this.avHistoryEvent = null; } } //--this.videoDisplayLocal.Visibility = System.Windows.Visibility.Hidden; //--this.videoDisplayRemote.Visibility = System.Windows.Visibility.Hidden; this.AVSession = null; break; case InviteEventTypes.LOCAL_HOLD_OK: this.labelInfo.Content = "Call placed on hold"; this.IsHeld = true; break; case InviteEventTypes.LOCAL_HOLD_NOK: this.labelInfo.Content = "Failed to place remote party on hold"; break; case InviteEventTypes.LOCAL_RESUME_OK: this.labelInfo.Content = "Call taken off hold"; this.IsHeld = false; break; case InviteEventTypes.LOCAL_RESUME_NOK: this.labelInfo.Content = "Failed to unhold call"; break; case InviteEventTypes.REMOTE_HOLD: this.labelInfo.Content = "Placed on hold by remote party"; break; case InviteEventTypes.REMOTE_RESUME: this.labelInfo.Content = "Taken off hold by remote party"; break; } }
private void sipService_onInviteEvent(object sender, InviteEventArgs e) { if (this.AVSession == null || (this.AVSession.Id != e.SessionId && e.Type != InviteEventTypes.REMOTE_TRANSFER_INPROGESS)) { /* Messaging */ if (e.Type == InviteEventTypes.DISCONNECTED) { if (this.historyDataSource.Any(x => x.SipSessionId == e.SessionId)) { this.Dispatcher.Invoke((System.Threading.ThreadStart)delegate { HistoryEvent @event = this.historyDataSource.FirstOrDefault(x => x.SipSessionId == e.SessionId); if (@event != null) { this.historyService.AddEvent(@event); } }, null); } else if (this.ChatSession != null && this.ChatSession.Id == e.SessionId) { this.Dispatcher.Invoke((System.Threading.ThreadStart)delegate { this.ChatSession = null; }); } } return; } /* Audio/Video */ if (this.Dispatcher.Thread != Thread.CurrentThread) { this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new EventHandler<InviteEventArgs>(this.sipService_onInviteEvent), sender, new object[] { e }); return; } this.UpdateControls(); switch (e.Type) { case InviteEventTypes.INCOMING: { this.labelInfo.Content = String.Format("{0} {1}", Strings.Text_IncomingCall, this.AVSession.RemotePartyDisplayName); this.avHistoryEvent = new HistoryAVCallEvent(this.AVSession.MediaType != BogheCore.MediaType.Audio, this.AVSession.RemotePartyUri); this.avHistoryEvent.Status = HistoryEvent.StatusType.Missed; break; } case InviteEventTypes.INPROGRESS: { // History Event this.labelInfo.Content = String.Format("{0}...", Strings.Text_CallInProgress); bool isVideo = ((this.AVSession.MediaType & MediaType.Video) == MediaType.Video || (this.AVSession.MediaType & MediaType.Videobfcp) == MediaType.Videobfcp); this.avHistoryEvent = new HistoryAVCallEvent(isVideo, this.AVSession.RemotePartyUri); this.avHistoryEvent.Status = HistoryEvent.StatusType.Outgoing; if (isVideo) { // Video Displays this.AttachDisplays(); } break; } case InviteEventTypes.RINGING: { this.labelInfo.Content = Strings.Text_Ringing; this.soundService.PlayRingBackTone(); break; } case InviteEventTypes.EARLY_MEDIA: { this.labelInfo.Content = Strings.Text_EarlyMediaStarted; this.soundService.StopRingBackTone(); this.soundService.StopRingTone(); break; } case InviteEventTypes.MEDIA_UPDATING: { this.labelInfo.Content = "Trying to update media..."; break; } case InviteEventTypes.MEDIA_UPDATED: { bool isVideo = ((this.AVSession.MediaType & MediaType.Video) == MediaType.Video || (this.AVSession.MediaType & MediaType.Videobfcp) == MediaType.Videobfcp); this.labelInfo.Content = String.Format("Media Updated - {0}", isVideo ? "Video" : "Audio"); if (isVideo) { this.AttachDisplays(); } break; } case InviteEventTypes.CONNECTED: { this.labelInfo.Content = Strings.Text_InCall; this.soundService.StopRingBackTone(); this.soundService.StopRingTone(); this.videoDisplayLocal.Visibility = ((this.AVSession.MediaType & MediaType.Video) == MediaType.Video) ? System.Windows.Visibility.Visible : System.Windows.Visibility.Hidden; this.videoDisplayScrenCastLocal.Visibility = ((this.AVSession.MediaType & MediaType.Videobfcp) == MediaType.Videobfcp) ? System.Windows.Visibility.Visible : System.Windows.Visibility.Hidden; this.videoDisplayRemote.Visibility = ((this.AVSession.MediaType & MediaType.Video) == MediaType.Video) ? System.Windows.Visibility.Visible : System.Windows.Visibility.Hidden; this.labelQuality.Visibility = ((this.AVSession.MediaType & MediaType.Video) == MediaType.Video) ? System.Windows.Visibility.Visible : System.Windows.Visibility.Hidden; this.timerCall.Start(); if (this.avHistoryEvent != null) { if (this.avHistoryEvent.Status == HistoryEvent.StatusType.Missed) { this.avHistoryEvent.Status = HistoryEvent.StatusType.Incoming; } this.avHistoryEvent.StartTime = DateTime.Now; this.avHistoryEvent.EndTime = this.avHistoryEvent.StartTime; } if (this.labelQuality.Visibility == System.Windows.Visibility.Visible) { this.labelQuality.Content = "Quality: 100%"; this.timerQuality.Start(); } break; } case InviteEventTypes.DISCONNECTED: case InviteEventTypes.TERMWAIT: { if (runningAppsWindow != null) { runningAppsWindow.Close(); runningAppsWindow = null; } if (this.qosWindow != null) { this.qosWindow.Close(); this.qosWindow = null; } this.labelInfo.Content = e.Type == InviteEventTypes.TERMWAIT ? Strings.Text_CallTerminated : e.Phrase; this.timerCall.Stop(); this.timerQuality.Stop(); this.soundService.StopRingBackTone(); this.soundService.StopRingTone(); if (this.avHistoryEvent != null) { lock (this.avHistoryEvent) { this.avHistoryEvent.EndTime = DateTime.Now; this.historyService.AddEvent(this.avHistoryEvent); this.avHistoryEvent = null; } } this.videoDisplayLocal.Visibility = System.Windows.Visibility.Hidden; this.videoDisplayRemote.Visibility = System.Windows.Visibility.Hidden; this.videoDisplayScrenCastLocal.Visibility = System.Windows.Visibility.Hidden; this.labelQuality.Visibility = System.Windows.Visibility.Hidden; this.AVSession.PreDispose(); this.AVSession = null; break; } case InviteEventTypes.LOCAL_HOLD_OK: { if (this.isTransfering) { this.isTransfering = false; this.AVSession.TransferCall(this.transferUri); } this.labelInfo.Content = Strings.Text_CallPlacedOnHold; this.IsHeld = true; break; } case InviteEventTypes.LOCAL_HOLD_NOK: { this.isTransfering = false; this.labelInfo.Content = Strings.Text_FailedToPlaceRemotePartyOnHold; break; } case InviteEventTypes.LOCAL_RESUME_OK: { this.isTransfering = false; this.labelInfo.Content = Strings.Text_CallTakenOffHold; this.IsHeld = false; break; } case InviteEventTypes.LOCAL_RESUME_NOK: { this.isTransfering = false; this.labelInfo.Content = Strings.Text_FailedToUnholdCall; break; } case InviteEventTypes.REMOTE_HOLD: { this.labelInfo.Content = Strings.Text_PlacedOnHoldByRemoteParty; break; } case InviteEventTypes.REMOTE_RESUME: { this.labelInfo.Content = Strings.Text_TakenOffHoldByRemoteParty; break; } case InviteEventTypes.LOCAL_TRANSFER_TRYING: { this.labelInfo.Content = String.Format("{0}: {1}", Strings.Text_CallTransfer, Strings.Text_Initiated); break; } case InviteEventTypes.LOCAL_TRANSFER_FAILED: { this.labelInfo.Content = String.Format("{0}: {1}", Strings.Text_CallTransfer, Strings.Text_Failed); break; } case InviteEventTypes.LOCAL_TRANSFER_ACCEPTED: { this.labelInfo.Content = String.Format("{0}: {1}", Strings.Text_CallTransfer, Strings.Text_Accepted); break; } case InviteEventTypes.LOCAL_TRANSFER_COMPLETED: { this.labelInfo.Content = String.Format("{0}: {1}", Strings.Text_CallTransfer, Strings.Text_Completed); break; } case InviteEventTypes.LOCAL_TRANSFER_NOTIFY: case InviteEventTypes.REMOTE_TRANSFER_NOTIFY: { short? code = e.GetExtra(InviteEventArgs.EXTRA_SIP_CODE) as short?; this.labelInfo.Content = String.Format("{0}: {1} {2}", Strings.Text_CallTransfer, code.HasValue ? code.Value : -1, e.Phrase); if (code.HasValue) { if (code.Value >= 300 && this.IsHeld) { this.AVSession.ResumeCall(); } } break; } case InviteEventTypes.REMOTE_TRANSFER_REQUESTED: { new Thread((System.Threading.ParameterizedThreadStart)delegate(object _e) { this.Dispatcher.Invoke((System.Threading.ThreadStart)delegate { InviteEventArgs args = _e as InviteEventArgs; if (args != null) { String referToUri = args.GetExtra(InviteEventArgs.EXTRA_REFERTO_URI) as String; String referToName = UriUtils.GetDisplayName(referToUri); DialogResult ret = MessageBox.Show(String.Format("Call Transfer to {0} requested. Do you accept?", referToName), "Call Transfer Request", MessageBoxButtons.YesNo); if (this.AVSession != null) { if (ret == System.Windows.Forms.DialogResult.Yes) { this.AVSession.AcceptCallTransfer(); } else { this.AVSession.RejectCallTransfer(); } } } }); }) .Start(e); break; } case InviteEventTypes.REMOTE_TRANSFER_INPROGESS: { this.AVTransfSession = e.GetExtra(InviteEventArgs.EXTRA_SESSION) as MyAVSession; break; } case InviteEventTypes.REMOTE_TRANSFER_FAILED: { this.AVTransfSession = null; break; } case InviteEventTypes.REMOTE_TRANSFER_COMPLETED: { if (this.AVTransfSession != null) { this.AVSession = this.AVTransfSession; this.AVTransfSession = null; this.InitializeView(); this.UpdateControls(); } break; } } }
/// <summary> /// Call (MSRP, Audio, Video, T.38, ...) events /// </summary> /// <param name="e"></param> /// <returns></returns> public override int OnInviteEvent(InviteEvent e) { tsip_invite_event_type_t type = e.getType(); short code = e.getCode(); String phrase = e.getPhrase(); InviteSession session = e.getSession(); switch (type) { case tsip_invite_event_type_t.tsip_i_newcall: case tsip_invite_event_type_t.tsip_i_ect_newcall: { if (session != null) /* As we are not the owner, then the session MUST be null */ { LOG.Error("Invalid incoming session"); session.hangup(null); // To avoid another callback event return -1; } SipMessage message = e.getSipMessage(); if (message == null) { LOG.Error("Invalid message"); return -1; } twrap_media_type_t sessionType = e.getMediaType(); switch (sessionType) { case twrap_media_type_t.twrap_media_msrp: { if ((session = e.takeMsrpSessionOwnership()) == null) { LOG.Error("Failed to take MSRP session ownership"); return -1; } MyMsrpSession msrpSession = MyMsrpSession.TakeIncomingSession(this.sipService.SipStack, session as MsrpSession, message); if (msrpSession == null) { LOG.Error("Failed to create new session"); session.hangup(null); (session as IDisposable).Dispose(); return 0; } msrpSession.State = MyInviteSession.InviteState.INCOMING; InviteEventArgs eargs = new InviteEventArgs(msrpSession.Id, InviteEventTypes.INCOMING, phrase); eargs.AddExtra(InviteEventArgs.EXTRA_SESSION, msrpSession); EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, eargs); break; } case twrap_media_type_t.twrap_media_audio: case twrap_media_type_t.twrap_media_audiovideo: case twrap_media_type_t.twrap_media_video: case (twrap_media_type_t.twrap_media_audio | twrap_media_type_t.twrap_media_t140): case (twrap_media_type_t.twrap_media_audio | twrap_media_type_t.twrap_media_video | twrap_media_type_t.twrap_media_t140): case twrap_media_type_t.twrap_media_t140: { if ((session = e.takeCallSessionOwnership()) == null) { LOG.Error("Failed to take audio/video session ownership"); return -1; } if (type == tsip_invite_event_type_t.tsip_i_newcall) { MyAVSession avSession = MyAVSession.TakeIncomingSession(this.sipService.SipStack, session as CallSession, sessionType, message); avSession.State = MyInviteSession.InviteState.INCOMING; InviteEventArgs eargs = new InviteEventArgs(avSession.Id, InviteEventTypes.INCOMING, phrase); eargs.AddExtra(InviteEventArgs.EXTRA_SESSION, avSession); EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, eargs); } else { MyAVSession avSession = MyAVSession.TakeOutgoingTranferSession(this.sipService.SipStack, (session as CallSession), sessionType, message); InviteEventArgs eargs = new InviteEventArgs(avSession.Id, InviteEventTypes.REMOTE_TRANSFER_INPROGESS, phrase); eargs.AddExtra(InviteEventArgs.EXTRA_SESSION, avSession); EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, eargs); } break; } default: LOG.Error("Invalid media type"); return 0; } break; } case tsip_invite_event_type_t.tsip_ao_request: if (code == 180 && session != null) { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.RINGING, phrase)); } break; case tsip_invite_event_type_t.tsip_i_request: { SipMessage message = e.getSipMessage(); if (message != null) { if (message.getRequestType() == tsip_request_type_t.tsip_INFO) { String from = message.getSipHeaderValue("f"); String contentType = message.getSipHeaderValue("c"); //byte[] bytes = message.getSipContent(); //if (!String.IsNullOrEmpty(contentType) && String.Equals(contentType, ContentType.DOUBANGO_DEVICE_INFO, StringComparison.InvariantCultureIgnoreCase)) //{ // if (bytes != null) // { // //InviteEventArgs eargs = new InviteEventArgs(session.getId(), InviteEventTypes.INFO, e.getPhrase()); // // eargs // // .AddExtra(InviteEventArgs.EXTRA_CONTENT, from) // // .AddExtra(InviteEventArgs.EXTRA_REMOTE_PARTY, from) // // .AddExtra(InviteEventArgs.EXTRA_CONTENT_TYPE, contentType == null ? ContentType.UNKNOWN : contentType); // // EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, eargs); // } // } } } break; } case tsip_invite_event_type_t.tsip_o_ect_trying: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_TRANSFER_TRYING, phrase)); break; } case tsip_invite_event_type_t.tsip_o_ect_accepted: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_TRANSFER_ACCEPTED, phrase)); break; } case tsip_invite_event_type_t.tsip_o_ect_completed: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_TRANSFER_COMPLETED, phrase)); break; } case tsip_invite_event_type_t.tsip_o_ect_failed: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_TRANSFER_FAILED, phrase)); break; } case tsip_invite_event_type_t.tsip_o_ect_notify: case tsip_invite_event_type_t.tsip_i_ect_notify: { InviteEventTypes eType = type == tsip_invite_event_type_t.tsip_o_ect_notify ? InviteEventTypes.LOCAL_TRANSFER_NOTIFY : InviteEventTypes.REMOTE_TRANSFER_NOTIFY; InviteEventArgs args = new InviteEventArgs(session.getId(), eType, phrase); args.AddExtra(InviteEventArgs.EXTRA_SIP_CODE, code); EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, args); break; } case tsip_invite_event_type_t.tsip_i_ect_requested: { SipMessage message = e.getSipMessage(); if (message != null) { if (message.getRequestType() == tsip_request_type_t.tsip_REFER) { String referToUri = message.getSipHeaderValue("refer-to"); if (!String.IsNullOrEmpty(referToUri)) { InviteEventArgs args = new InviteEventArgs(session.getId(), InviteEventTypes.REMOTE_TRANSFER_REQUESTED, phrase); args.AddExtra(InviteEventArgs.EXTRA_REFERTO_URI, referToUri); EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, args); } } } break; } case tsip_invite_event_type_t.tsip_i_ect_failed: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.REMOTE_TRANSFER_FAILED, phrase)); break; } case tsip_invite_event_type_t.tsip_i_ect_completed: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.REMOTE_TRANSFER_COMPLETED, phrase)); break; } case tsip_invite_event_type_t.tsip_m_early_media: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.EARLY_MEDIA, phrase)); break; } case tsip_invite_event_type_t.tsip_m_updating: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.MEDIA_UPDATING, phrase)); break; } case tsip_invite_event_type_t.tsip_m_updated: { if (MyAVSession.HandleMediaUpdate(session.getId(), e.getMediaType())) { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.MEDIA_UPDATED, phrase)); } break; } case tsip_invite_event_type_t.tsip_m_local_hold_ok: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_HOLD_OK, phrase)); break; } case tsip_invite_event_type_t.tsip_m_local_hold_nok: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_HOLD_NOK, phrase)); break; } case tsip_invite_event_type_t.tsip_m_local_resume_ok: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_RESUME_OK, phrase)); break; } case tsip_invite_event_type_t.tsip_m_local_resume_nok: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.LOCAL_RESUME_NOK, phrase)); break; } case tsip_invite_event_type_t.tsip_m_remote_hold: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.REMOTE_HOLD, phrase)); break; } case tsip_invite_event_type_t.tsip_m_remote_resume: { EventHandlerTrigger.TriggerEvent<InviteEventArgs>(this.sipService.onInviteEvent, this.sipService, new InviteEventArgs(session.getId(), InviteEventTypes.REMOTE_RESUME, phrase)); break; } } return 0; }