Example #1
0
        public async Task RunAsync(CancellationToken token)
        {
            NonBlockingConsole.WriteLine("RunAsync - Entry");
            bool        startTask = true;
            List <Task> runTasks  = new List <Task>();

            lock (s_lock)
            {
                if (_state != TranscriptSessionManagerState.Created)
                {
                    NonBlockingConsole.WriteLine("RunAsync - Warn: TranscriptSessionManager is already running.");
                    startTask = false;
                    if (_runTask != null)
                    {
                        runTasks.Add(_runTask);
                    }
                }
                else
                {
                    _state       = TranscriptSessionManagerState.Idle;
                    _cancelToken = token;
                    RegisterEndpointEvents();
                    _runTask = new Task(() =>
                    {
                            #if (CONVERSATION_DIALIN_ENABLED)
                        string conversationUri = _helper.GetRemoteUserURI();
                        if (string.IsNullOrEmpty(conversationUri))
                        {
                            NonBlockingConsole.WriteLine("Error: Valid remote user Uri must be provided for CONVERSATION_DIALIN_ENABLED mode.\n Exiting...\n");
                            return;
                        }
                        StartConversationTranscriptRecorderSession(conversationUri);
                            #endif // (CONVERSATION_DIALIN_ENABLED)

                            #if (CONFERENCE_DIALIN_ENABLED)
                        string conferenceUri = _helper.GetConferenceURI();
                        if (string.IsNullOrEmpty(conferenceUri))
                        {
                            NonBlockingConsole.WriteLine("Error: Valid conference Uri must be provided for CONFERENCE_DIALIN_ENABLED mode.\n Exiting...\n");
                            return;
                        }
                        StartConferenceTranscriptRecorderSession(conferenceUri);
                            #endif // CONFERENCE_DIALIN_ENABLED

                        _waitForTranscriptSessionStarted.WaitOne();
                        _waitForTranscriptSessionTerminated.WaitOne();
                    }, token);
                    runTasks.Add(_runTask);
                }
            } // lock

            if (startTask)
            {
                _runTask.Start();
            }

            await Task.WhenAll(runTasks.ToArray());

            NonBlockingConsole.WriteLine("RunAsync - Exit");
        }
        public async Task RunAsync(CancellationToken token)
        {
            NonBlockingConsole.WriteLine("RunAsync - Entry");
            bool startTask = true;
            List<Task> runTasks = new List<Task>();
            lock (s_lock)
            {
                if (_state != TranscriptSessionManagerState.Created)
                {
                    NonBlockingConsole.WriteLine("RunAsync - Warn: TranscriptSessionManager is already running.");
                    startTask = false;
                    if (_runTask != null)
                    {
                        runTasks.Add(_runTask);
                    }
                }
                else
                {
                    _state = TranscriptSessionManagerState.Idle;
                    _cancelToken = token;
                    RegisterEndpointEvents();
                    _runTask = new Task(() =>
                        {
                            #if (CONVERSATION_DIALIN_ENABLED)
                            string conversationUri = _helper.GetRemoteUserURI();
                            if (string.IsNullOrEmpty(conversationUri))
                            {
                                NonBlockingConsole.WriteLine("Error: Valid remote user Uri must be provided for CONVERSATION_DIALIN_ENABLED mode.\n Exiting...\n");
                                return;
                            }
                            StartConversationTranscriptRecorderSession(conversationUri);
                            #endif // (CONVERSATION_DIALIN_ENABLED)

                            #if (CONFERENCE_DIALIN_ENABLED)
                                string conferenceUri = _helper.GetConferenceURI();
                                if (string.IsNullOrEmpty(conferenceUri))
                                {
                                    NonBlockingConsole.WriteLine("Error: Valid conference Uri must be provided for CONFERENCE_DIALIN_ENABLED mode.\n Exiting...\n");
                                    return;
                                }
                                StartConferenceTranscriptRecorderSession(conferenceUri);
                            #endif // CONFERENCE_DIALIN_ENABLED

                            _waitForTranscriptSessionStarted.WaitOne();
                            _waitForTranscriptSessionTerminated.WaitOne();
                        }, token);
                    runTasks.Add(_runTask);
                }
            } // lock

            if (startTask)
            {
                _runTask.Start();
            }

            await Task.WhenAll(runTasks.ToArray());

            NonBlockingConsole.WriteLine("RunAsync - Exit");
        }
Example #3
0
        public async Task ShutdownAsync(bool runSync = false)
        {
            NonBlockingConsole.WriteLine("ShutdownAsync - Entry");
            bool        startTask        = true;
            List <Task> preShutdownTasks = new List <Task>();
            List <Task> shutdownTasks    = new List <Task>();

            lock (s_lock)
            {
                if (_state == TranscriptSessionManagerState.Terminating || _state == TranscriptSessionManagerState.Terminated)
                {
                    NonBlockingConsole.WriteLine("Warn: Already shutdown or shutting down.");
                    startTask = false;
                    if (_shutdownTask != null)
                    {
                        shutdownTasks.Add(_shutdownTask);
                    }
                }
                else
                {
                    _state = TranscriptSessionManagerState.Terminating;
                    this.UnregisterEndpointEvents();

                    List <TranscriptRecorderSession> sessionsToShutdown = new List <TranscriptRecorderSession>();
                    // Add all active conversation transcript sessions to shutdown list
                    foreach (TranscriptRecorderSession t in _activeConversationSessions.Values)
                    {
                        sessionsToShutdown.Add(t);
                    }
                    // Add all active conference transcript sessions to shutdown list
                    foreach (TranscriptRecorderSession t in _activeConferenceSessions.Values)
                    {
                        sessionsToShutdown.Add(t);
                    }
                    _shutdownTask = new Task(() =>
                    {
                        SaveTranscripts();
                        SendTranscripts();

                        _activeConversationSessions.Clear();
                        _activeConferenceSessions.Clear();
                        foreach (TranscriptRecorderSession t in sessionsToShutdown)
                        {
                            Task task = new Task(() =>
                            {
                                t.TranscriptRecorderSessionChanged  -= this.TranscriptRecorder_OnTranscriptRecorderSessionChanged;
                                t.TranscriptRecorderSessionShutdown -= this.TranscriptRecorder_OnTranscriptRecorderSessionShutdown;
                                t.Shutdown();
                            });
                            task.Wait();
                        }

                        // Terminate user endpoint
                        if (_userEndpoint != null)
                        {
                            _userEndpoint.BeginTerminate(EndTerminateUserEndpoint, _userEndpoint);
                            _waitForUserEndpointTerminated.WaitOne();
                        }

                        // Clean up by shutting down the platform.
                        if (_helper != null)
                        {
                            _helper.ShutdownPlatform();
                        }

                        _state = TranscriptSessionManagerState.Terminated;
                    });
                    shutdownTasks.Add(_shutdownTask);
                }
            } // lock

            if (startTask)
            {
                _shutdownTask.Start();
            }

            if (runSync)
            {
                Task.WhenAll(shutdownTasks.ToArray()).Wait();
            }
            else
            {
                await Task.WhenAll(shutdownTasks.ToArray());
            }

            NonBlockingConsole.WriteLine("ShutdownAsync - Exit");
        }
        public async Task ShutdownAsync(bool runSync = false)
        {
            NonBlockingConsole.WriteLine("ShutdownAsync - Entry");
            bool startTask = true;
            List<Task> preShutdownTasks = new List<Task>();
            List<Task> shutdownTasks = new List<Task>();
            lock (s_lock)
            {
                if (_state == TranscriptSessionManagerState.Terminating || _state == TranscriptSessionManagerState.Terminated)
                {
                    NonBlockingConsole.WriteLine("Warn: Already shutdown or shutting down.");
                    startTask = false;
                    if (_shutdownTask != null)
                    {
                        shutdownTasks.Add(_shutdownTask);
                    }
                }
                else
                {
                    _state = TranscriptSessionManagerState.Terminating;
                    this.UnregisterEndpointEvents();

                    List<TranscriptRecorderSession> sessionsToShutdown = new List<TranscriptRecorderSession>();
                    // Add all active conversation transcript sessions to shutdown list
                    foreach (TranscriptRecorderSession t in _activeConversationSessions.Values)
                    {
                        sessionsToShutdown.Add(t);
                    }
                    // Add all active conference transcript sessions to shutdown list
                    foreach (TranscriptRecorderSession t in _activeConferenceSessions.Values)
                    {
                        sessionsToShutdown.Add(t);
                    }
                    _shutdownTask = new Task(()=>
                        {
                            SaveTranscripts();
                            SendTranscripts();

                            _activeConversationSessions.Clear();
                            _activeConferenceSessions.Clear();
                            foreach (TranscriptRecorderSession t in sessionsToShutdown)
                            {
                                Task task = new Task(()=>
                                    {
                                        t.TranscriptRecorderSessionChanged -= this.TranscriptRecorder_OnTranscriptRecorderSessionChanged;
                                        t.TranscriptRecorderSessionShutdown -= this.TranscriptRecorder_OnTranscriptRecorderSessionShutdown;
                                        t.Shutdown();
                                    });
                                task.Wait();
                            }

                            // Terminate user endpoint
                            if (_userEndpoint != null)
                                {
                                    
                                    _userEndpoint.BeginTerminate(EndTerminateUserEndpoint, _userEndpoint);
                                    _waitForUserEndpointTerminated.WaitOne();
                                }

                            // Clean up by shutting down the platform.
                            if (_helper != null)
                            {
                                _helper.ShutdownPlatform();
                            }

                            _state = TranscriptSessionManagerState.Terminated;
                        });
                    shutdownTasks.Add(_shutdownTask);
                }
            } // lock

            if (startTask)
            {
                _shutdownTask.Start();
            }

            if (runSync)
            {
                Task.WhenAll(shutdownTasks.ToArray()).Wait();
            }
            else
            {
                await Task.WhenAll(shutdownTasks.ToArray());
            }

            NonBlockingConsole.WriteLine("ShutdownAsync - Exit");
        }