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;
}
}
}