// Callback method referred to in the call to BeginEscalate on the Conference instance. private void ConferenceEscalateCB(IAsyncResult ar) { Conversation conversation = ar.AsyncState as Conversation; try { conversation.EndEscalateToConference(ar); } // A production application should have catch blocks for a number // of other exceptions, including OperationTimeoutException and // OperationFailureException. catch (RealTimeException exception) { Console.WriteLine(exception.ToString()); } // Synchronize with main thread. // _waitUntilConferenceIsEscalated.Set(); ConferenceInvitation conferenceInvite = new ConferenceInvitation(_incomingConversation); conferenceInvite.StateChanged += new EventHandler <ConferenceInvitationStateChangedEventArgs>(conferenceInvite_StateChanged); ConferenceInvitationDeliverOptions confDeliverOptions = new ConferenceInvitationDeliverOptions(); confDeliverOptions.ToastMessage = new ToastMessage("Join the conference!"); conferenceInvite.BeginDeliver(_remoteContactUri.ToString(), confDeliverOptions, InvitationDeliverCB, conferenceInvite); }
/// <summary> /// Sends a conference invitation to the specified uri. /// </summary> /// <param name="invitationTargetUri">The uri that the invitation should /// be sent to.</param> private void InviteUserToConference(string invitationTargetUri) { ConferenceInvitation confInvitation = new ConferenceInvitation(_impersonatingAvCall.Conversation); ConferenceInvitationDeliverOptions deliverOptions = new ConferenceInvitationDeliverOptions(); const string sipPrefix = "sip:"; if (!invitationTargetUri.Trim().StartsWith(sipPrefix, StringComparison.OrdinalIgnoreCase)) { invitationTargetUri = sipPrefix + invitationTargetUri.Trim(); } Console.WriteLine("Inviting {0} to the conference.", invitationTargetUri); _invitedParticipantAccepted = false; var confInvitationResult = confInvitation.BeginDeliver(invitationTargetUri, deliverOptions, ConfInvitationCompleted, confInvitation); Console.WriteLine("Waiting for the conference invitation to complete."); _conferenceInvitationCompleted.WaitOne(); Console.WriteLine("Finished inviting {0} to the conference.", invitationTargetUri); Console.WriteLine(); }
public static Task<ConferenceInvitationResponse> DeliverAsync(this ConferenceInvitation invitation, string destinationUri, ConferenceInvitationDeliverOptions options) { return Task<ConferenceInvitationResponse>.Factory.FromAsync( invitation.BeginDeliver, invitation.EndDeliver, destinationUri, options, null); }
public static Task<ConferenceInvitationResponse> DeliverAsync(this ConferenceInvitation self, string destinationUri, ConferenceInvitationDeliverOptions options) { return Task.Factory.FromAsync<string, ConferenceInvitationDeliverOptions, ConferenceInvitationResponse>( self.BeginDeliver, self.EndDeliver, destinationUri, options, null); }
public static Task <ConferenceInvitationResponse> DeliverAsync(this ConferenceInvitation invitation, string destinationUri, ConferenceInvitationDeliverOptions options) { return(Task <ConferenceInvitationResponse> .Factory.FromAsync( invitation.BeginDeliver, invitation.EndDeliver, destinationUri, options, null)); }
private void Run() { // A helper class to take care of platform and endpoint setup and // cleanup. This has been abstracted from this sample to focus on // Call Control. _helper = new UCMASampleHelper(); // Create a user endpoint, using the network credential object // defined above. _callerEndpoint = _helper.CreateEstablishedUserEndpoint( "Conference Leader" /* friendly name for conference leader endpoint */); // Create a second user endpoint, using the network credential object // defined above. _calleeEndpoint = _helper.CreateEstablishedUserEndpoint( "Conference Attendee" /* friendly name for conference attendee endpoint */); // Get the URI for the user logged onto Microsoft Lync String _ocUserURI = "sip:" + UCMASampleHelper.PromptUser( "Enter the URI for the user logged onto Microsoft Lync, in the User@Host format => ", "RemoteUserURI" /* key to specify remote user's URI in app.config */); // One of the endpoints schedules the conference in advance. At // schedule time, all the conference settings are set. // The base conference settings object, used to set the policies for the conference. ConferenceScheduleInformation conferenceScheduleInformation = new ConferenceScheduleInformation(); // An open meeting (participants can join who are not on the list), // but requiring authentication (no anonymous users allowed.) conferenceScheduleInformation.AccessLevel = ConferenceAccessLevel.SameEnterprise; // The below flag determines whether or not the passcode is optional // for users joining the conference. conferenceScheduleInformation.IsPasscodeOptional = true; conferenceScheduleInformation.Passcode = "1357924680"; // The verbose description of the conference conferenceScheduleInformation.Description = "Interesting Description"; // The below field indicates the date and time after which the conference can be deleted. conferenceScheduleInformation.ExpiryTime = System.DateTime.Now.AddHours(5); // These two lines assign a set of modalities (here, only // InstantMessage) from the available MCUs to the conference. Custom // modalities (and their corresponding MCUs) may be added at this // time as part of the extensibility model. ConferenceMcuInformation instantMessageMCU = new ConferenceMcuInformation(McuType.InstantMessaging); conferenceScheduleInformation.Mcus.Add(instantMessageMCU); // Now that the setup object is complete, schedule the conference // using the conference services off of Endpoint. Note: the conference // organizer is considered a leader of the conference by default. _callerEndpoint.ConferenceServices.BeginScheduleConference(conferenceScheduleInformation, EndScheduleConference, _callerEndpoint.ConferenceServices); // Wait for the scheduling to complete. _waitForConferenceScheduling.WaitOne(); // Now that the conference is scheduled, it's time to join it. As we // already have a reference to the conference object populated from // the EndScheduleConference call, we do not need to get the // conference first. Initialize a conversation off of the endpoint, // and join the conference from the uri provided above. Conversation callerConversation = new Conversation(_callerEndpoint); callerConversation.ConferenceSession.StateChanged += new EventHandler <StateChangedEventArgs <ConferenceSessionState> >(ConferenceSession_StateChanged); // Join and wait, again forcing synchronization. callerConversation.ConferenceSession.BeginJoin(_conference.ConferenceUri, null /*joinOptions*/, EndJoinConference, callerConversation.ConferenceSession); _waitForConferenceJoin.WaitOne(); // Placing the calls on the conference-connected conversation // connects to the respective MCUs. These calls may then be used to // communicate with the conference/MCUs. InstantMessagingCall instantMessagingCall = new InstantMessagingCall(callerConversation); // Hooking up event handlers and then placing the call. instantMessagingCall.InstantMessagingFlowConfigurationRequested += this.instantMessagingCall_InstantMessagingFlowConfigurationRequested; instantMessagingCall.StateChanged += this._call_StateChanged; instantMessagingCall.BeginEstablish(EndCallEstablish, instantMessagingCall); //Synchronize to ensure that call has completed. _waitForCallEstablish.WaitOne(); //send conf invite ConferenceInvitationDeliverOptions deliverOptions = new ConferenceInvitationDeliverOptions(); deliverOptions.ToastMessage = new ToastMessage("Welcome to my conference"); ConferenceInvitation invitation = new ConferenceInvitation(callerConversation); invitation.BeginDeliver(_ocUserURI, deliverOptions, EndDeliverInvitation, invitation); // Synchronize to ensure that invitation is complete _waitForConversationInviteRemoteParticipants.WaitOne(); //And from the other endpoint's perspective: //Initialize a conversation off of the endpoint, and join the //conference from the uri provided above. Conversation calleeConversation = new Conversation(_calleeEndpoint); calleeConversation.ConferenceSession.StateChanged += new EventHandler <StateChangedEventArgs <ConferenceSessionState> >(ConferenceSession_StateChanged); // Join and wait, again forcing synchronization. calleeConversation.ConferenceSession.BeginJoin(_conference.ConferenceUri, null /*joinOptions*/, EndJoinConference, calleeConversation.ConferenceSession); _waitForConferenceJoin.WaitOne(); // Placing the calls on the conference-connected conversation // connects to the respective MCUs. These calls may then be used to //communicate with the conference/MCUs. InstantMessagingCall instantMessagingCall2 = new InstantMessagingCall(calleeConversation); //Hooking up event handlers and then placing the call. instantMessagingCall2.InstantMessagingFlowConfigurationRequested += this.instantMessagingCall2_InstantMessagingFlowConfigurationRequested; instantMessagingCall2.StateChanged += this._call_StateChanged; instantMessagingCall2.BeginEstablish(EndCallEstablish, instantMessagingCall2); //Synchronize to ensure that call has completed. _waitForCallEstablish.WaitOne(); //Synchronize to ensure that all messages are sent and received _waitForMessageReceived.WaitOne(); //Wait for shutdown initiated by user _waitForShutdown.WaitOne(); UCMASampleHelper.PauseBeforeContinuing("Press ENTER to shutdown and exit."); }