/// <summary> /// Runs the activity. /// </summary> private void Run() { InstantMessagingCall.StateChanged += new EventHandler <CallStateChangedEventArgs>(this.HandleInstantMessageCallStateChanged); InstantMessagingCall.Flow.MessageReceived += new EventHandler <InstantMessageReceivedEventArgs>(this.Customer_MessageReceived); SendInstantMessageActivity sendIMActivity = new SendInstantMessageActivity(this.InstantMessagingCall, this.Prompt); Task <ActivityResult> SendIMTask = sendIMActivity.ExecuteAsync(); SendIMTask.ContinueWith((task) => { if (task.Exception == null) { this.m_lastImReceivedTime = DateTime.Now; m_timer.Start(); } else { if (m_tcs != null) { m_tcs.TrySetException(task.Exception); } } }); }
/// <summary> /// Handles an event when timer is expired. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Timer_Elapsed(object sender, ElapsedEventArgs e) { TimeSpan idleInterval = DateTime.Now - this.m_lastImReceivedTime; Exception ex = null; if (idleInterval.Seconds >= this.SilenceTimeOut) { this.m_lastImReceivedTime = DateTime.Now; NoInputCount++; if (this.InstantMessagingCall.State != CallState.Terminated) { SendInstantMessageActivity senIM = new SendInstantMessageActivity(this.InstantMessagingCall, this.NoRecognitionPrompt); Task <ActivityResult> sendIMTask = senIM.ExecuteAsync(); sendIMTask.ContinueWith((task) => { try { if (NoInputCount >= MaxSilenceCount) { this.m_timer.Stop(); if (!string.IsNullOrEmpty(this.EscalatedSilencePrompt)) { SendInstantMessageActivity sendIM = new SendInstantMessageActivity(this.InstantMessagingCall, this.EscalatedSilencePrompt); Task <ActivityResult> sendEscalatedMessage = sendIM.ExecuteAsync(); sendEscalatedMessage.Wait(); } throw new SilenceTimeOutException("No Input from User"); } } catch (SilenceTimeOutException exception) { ex = exception; } catch (Exception exception) { ex = exception; } finally { if (ex != null) { this.UnRegisterEvents(); if (m_tcs != null) { m_tcs.TrySetException(ex); } } } }); } } }
/// <summary> /// Function called when users input is not recognized againt expected inputs. /// </summary> protected void HandleNoRecognition() { Exception ex = null; SendInstantMessageActivity sendInstantMessage = new SendInstantMessageActivity(this.InstantMessagingCall, this.NoRecognitionPrompt); Task <ActivityResult> sendNoRecoIMTask = sendInstantMessage.ExecuteAsync(); sendNoRecoIMTask.ContinueWith((task) => { try { this.NoRecoCount++; if (this.NoRecoCount == this.MaxNoRecoAttempts) { this.m_timer.Stop(); if (!string.IsNullOrEmpty(this.EscalatedNoRecognitionPrompt)) { SendInstantMessageActivity sendIM = new SendInstantMessageActivity(this.InstantMessagingCall, this.EscalatedNoRecognitionPrompt); Task <ActivityResult> sendEscalatedMessage = sendIM.ExecuteAsync(); sendEscalatedMessage.Wait(); } throw new NoRecognitionException("NoRecognition"); } } catch (NoRecognitionException exception) { ex = exception; } catch (Exception exception) { ex = exception; } finally { if (ex != null) { this.UnRegisterEvents(); if (m_tcs != null) { m_tcs.TrySetException(ex); } } } }); }