Forked from tomorgan/UCMA UserEndpoint Sending IM Example.cs
Created
May 12, 2021 08:04
-
-
Save chinhvo/10bcf12e4f84447c00fbb353465caded to your computer and use it in GitHub Desktop.
Simplest example using UCMA UserEndpoint to send an IM. Note: no error handling, assumes IM always accepted etc. For learning only :)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Rtc.Collaboration; | |
using System; | |
namespace SimpleUserUCMA | |
{ | |
class Program | |
{ | |
private const string sipaddress = "sip:[email protected]"; | |
private const string username = "USERNAME"; | |
private const string password = "PASSWORD"; | |
private const string domain = "DOMAIN"; | |
private const string destinationSip = "sip:[email protected]"; | |
private const string IMMessage = "Hello!"; | |
static CollaborationPlatform _collabPlatform { get; set; } | |
static UserEndpoint _endpoint { get; set; } | |
static bool _OKToQuit = false; | |
static void Main(string[] args) | |
{ | |
string userAgent = "ClientPlatformExample"; | |
var platformSettings = new ClientPlatformSettings(userAgent, Microsoft.Rtc.Signaling.SipTransportType.Tls); | |
_collabPlatform = new CollaborationPlatform(platformSettings); | |
//Start up the platform, calling back asynchronously once it's done. | |
_collabPlatform.BeginStartup(EndCollabPlatformStartup, null); | |
//In this example, wait for everything to finish before exiting | |
while (!_OKToQuit) | |
{ | |
System.Threading.Thread.Sleep(2000); | |
} | |
} | |
private static void EndCollabPlatformStartup(IAsyncResult ar) | |
{ | |
_collabPlatform.EndStartup(ar); | |
//A collaboration plaform can have one or more Endpoints. An Endpoint is tied to a SIP Address. | |
UserEndpointSettings settings = new UserEndpointSettings(sipaddress); | |
settings.Credential = new System.Net.NetworkCredential(username, password, domain); | |
settings.AutomaticPresencePublicationEnabled = true; | |
_endpoint = new UserEndpoint(_collabPlatform, settings); | |
_endpoint.BeginEstablish(UserEndpointEstablishCompleted, null); | |
} | |
private static void UserEndpointEstablishCompleted(IAsyncResult ar) | |
{ | |
_endpoint.EndEstablish(ar); | |
//Once the endpoint is in place, create a Conversation and an IM Call. | |
var Conversation = new Conversation(_endpoint); | |
var Call = new InstantMessagingCall(Conversation); | |
//When the call is established, Flow will be created. Flow is how you sent IMs around. Therefore, just before | |
//establishing, we attach an event handler to catch the flow being setup (it's state will change to Active) | |
Call.InstantMessagingFlowConfigurationRequested += Call_InstantMessagingFlowConfigurationRequested; | |
Call.BeginEstablish(destinationSip, new CallEstablishOptions(), EndBeginEstablish, Call); | |
} | |
private static void EndBeginEstablish(IAsyncResult ar) | |
{ | |
Call call = (Call)ar.AsyncState; | |
call.EndEstablish(ar); | |
} | |
static void Call_InstantMessagingFlowConfigurationRequested(object sender, InstantMessagingFlowConfigurationRequestedEventArgs e) | |
{ | |
//Once we're notified about this, we get a handle to the newly created Flow. Let's use this to register for state changes. | |
e.Flow.StateChanged += Flow_StateChanged; | |
} | |
static void Flow_StateChanged(object sender, MediaFlowStateChangedEventArgs e) | |
{ | |
if (e.State == MediaFlowState.Active) | |
{ | |
//The flow is now active! We can use it to send messages. | |
InstantMessagingFlow flow = (InstantMessagingFlow)sender; | |
flow.BeginSendInstantMessage(IMMessage, EndBeginSendInstanceMessage, flow); | |
} | |
} | |
private static void EndBeginSendInstanceMessage(IAsyncResult ar) | |
{ | |
InstantMessagingFlow flow = (InstantMessagingFlow)ar.AsyncState; | |
flow.EndSendInstantMessage(ar); | |
//Having sent the message, terminate the conversation | |
flow.Call.Conversation.BeginTerminate(EndBeginTerminate, flow.Call.Conversation); | |
} | |
private static void EndBeginTerminate(IAsyncResult ar) | |
{ | |
Conversation conversation = (Conversation)ar.AsyncState; | |
conversation.EndTerminate(ar); | |
_OKToQuit = true; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment