private void OnMonitoringSessionTerminated(object sender, MonitoringSessionStateChangedEventArgs args) { AcdMonitoringSession monitoringSession = sender as AcdMonitoringSession; switch (args.NewState) { case MonitoringSessionState.Terminating: _agentSessionToMonitor = null; _agentToMonitor = null; this.UpdateState(SupervisorSessionState.GeneralAgentActivityTracking); break; case MonitoringSessionState.Terminated: monitoringSession.StateChanged -= this.OnMonitoringSessionTerminated; break; } }
private void ProcessSupervisorControlChannelRequestReceived(object sender, ContextChannelRequestReceivedEventArgs args) { _logger.Log("RECEIVED REQUEST: AcdSupervisorSession received the following request: " + args.RequestType); switch (args.RequestType) { case ContextChannelRequestType.StartMonitoring: MonitoringRequest startMonitoringRequest = args.Request as MonitoringRequest; Agent agentToMonitor = null; foreach (Agent agent in _matchMaker.Configuration.Agents) { if (SipUriCompare.Equals(agent.SignInAddress, startMonitoringRequest.MonitoringChannel.Uri.ToString())) { agentToMonitor = agent; break; } } if (null == agentToMonitor) { _logger.Log("AcdSupervisorSession could not find the agent to monitor."); args.Request.SendResponse("failure"); return; } if (agentToMonitor.IsAllocated == false) { _logger.Log(String.Format("AcdSupervisorSession detected that the agent to monitor was deallocated {0}", agentToMonitor.SignInAddress)); args.Request.SendResponse("failure"); return; } if (_state == SupervisorSessionState.AgentMonitoring) { _monitoringSession.BeginShutDown(sd => { _monitoringSession.EndShutDown(sd); _monitoringSession = null; args.Request.SendResponse("Success"); this.UpdateState(SupervisorSessionState.GeneralAgentActivityTracking); try { this.BeginStartMonitoringSession(startMonitoringRequest.MonitoringChannel, agentToMonitor, sms => { try { this.EndStartMonitoringSession(sms); args.Request.SendResponse("success"); this.UpdateState(SupervisorSessionState.AgentMonitoring); return; } catch (RealTimeException rtex) { _logger.Log("AcdSupervisorSession fails to end start the monitoring session", rtex); args.Request.SendResponse("failure"); this.UpdateState(SupervisorSessionState.GeneralAgentActivityTracking); return; } }, null); } catch (InvalidOperationException ivoex) { _logger.Log("AcdSupervisorSession fails to begin start the monitoring session", ivoex); args.Request.SendResponse("failure"); this.UpdateState(SupervisorSessionState.GeneralAgentActivityTracking); return; } }, null); return; } try { this.BeginStartMonitoringSession(startMonitoringRequest.MonitoringChannel, agentToMonitor, sms => { try { this.EndStartMonitoringSession(sms); args.Request.SendResponse("success"); lock (_syncRoot) { if (_state == SupervisorSessionState.JoiningCustomerSession) { this.UpdateState(SupervisorSessionState.AgentMonitoring); } } } catch (RealTimeException rtex) { _logger.Log("AcdSupervisorSession fails to end start the monitoring session", rtex); args.Request.SendResponse("failure"); this.UpdateState(SupervisorSessionState.GeneralAgentActivityTracking); } }, null); } catch (InvalidOperationException ivoex) { _logger.Log("AcdSupervisorSession fails to begin start the monitoring session", ivoex); args.Request.SendResponse("failure"); this.UpdateState(SupervisorSessionState.GeneralAgentActivityTracking); } break; case ContextChannelRequestType.StopMonitoring: if (_state != SupervisorSessionState.AgentMonitoring) { _logger.Log("AcdSupervisorSession fails to stop monitoring the session as the supervisorsession is in an invalid state"); args.Request.SendResponse("Failure"); } else { _monitoringSession.BeginShutDown(sd => { _monitoringSession.EndShutDown(sd); _monitoringSession = null; args.Request.SendResponse("Success"); this.UpdateState(SupervisorSessionState.GeneralAgentActivityTracking); }, null); } break; default: _logger.Log("AcdSupervisorSession received a non-supported command"); args.Request.SendResponse("Failure"); break; } }