/// <summary>
        /// Occurs when bot joined the conference.
        /// </summary>
        /// <param name="result">The argument.</param>
        /// <remarks></remarks>
        public void EndJoinInvitedConference(IAsyncResult result)
        {
            ConferenceInvitation invite           = result.AsyncState as ConferenceInvitation;
            Exception            exception        = null;
            List <String>        activeMediaTypes = new List <string>();

            try
            {
                NonBlockingConsole.WriteLine("Joined the invited conference");
                activeMediaTypes = invite.AvailableMediaTypes.ToList();

                _conversation.ConferenceSession.EndJoin(result);
                _conference = _conversation.ConferenceSession;

                NonBlockingConsole.WriteLine(string.Format(
                                                 "Conference Url: conf:{0}%3Fconversation-id={1}",
                                                 _conversation.ConferenceSession.ConferenceUri,
                                                 _conversation.ConferenceSession.Conversation.Id));

                RegisterConferenceEvents();

                // Raise event on TranscriptRecorderSession
                _transcriptRecorder.RaiseTranscriptRecorderSessionChanged(_conference);

                // Establish Calls for Conference's supported modalities
                if (activeMediaTypes.Contains(MediaType.Audio))
                {
                    _transcriptRecorder.OnActiveMediaTypeCallToEstablish(_conversation, TranscriptRecorderType.AudioVideo);
                }
                if (activeMediaTypes.Contains(MediaType.Message))
                {
                    _transcriptRecorder.OnActiveMediaTypeCallToEstablish(_conversation, TranscriptRecorderType.InstantMessage);
                }

                _waitForInvitedConferenceActiveMediaTypeCallEstablished.Set();
            }
            catch (ConferenceFailureException conferenceFailureException)
            {
                // ConferenceFailureException may be thrown on failures due to MCUs being absent or unsupported, or due to malformed parameters.
                // It is left to the application to perform real error handling here.
                NonBlockingConsole.WriteLine(conferenceFailureException.ToString());
                exception = conferenceFailureException;
            }
            catch (RealTimeException realTimeException)
            {
                // It is left to the application to perform real error handling here.
                NonBlockingConsole.WriteLine(realTimeException.ToString());
                exception = realTimeException;
            }
            finally
            {
                // Again, for sync. reasons.
                _state = TranscriptRecorderState.Active;
                _waitForInvitedConferenceJoined.Set();

                if (exception != null)
                {
                    string originator = string.Format("Error when joining the invited conference: {0}", exception.ToString());
                    NonBlockingConsole.WriteLine(originator);
                }
            }
        }