Visão Geral
Nesta parte veremos como estabelecer uma sessão de instant messaging entre dois usuários na UCC API.
Uma informação importante sobre esse tipo de sessão é que ela tem apenas UM participante. É por isso que conferências são um pouco mais complicadas do que sessão “single-user”.
Eu vou falar nessa parte apenas de sessões para um único usuário.
Outra particularidade é que existem tratamentos diferentes para sessões originárias do usuário conectado (outgoing sessions) e sessões iniciadas por outros usuários (incoming session).
Outgoing Sessions
Iniciar uma sessão é simples:
public void CreateIMSession(IUccEndpoint endpoint, string user)
{
IUccSessionManager sessionManager = (IUccSessionManager)endpoint;
UccUriManager uriManager = new UccUriManager();
UccUri destUser = uriManager.ParseUri(user);
IUccSession session = sessionManager.CreateSession(UCC_SESSION_TYPE.UCCST_INSTANT_MESSAGING, null);
IUccSessionParticipant participant = session.CreateParticipant(destUser, null);
ComHelper.Advise<_IUccInstantMessagingSessionParticipantEvents>(participant, this);
session.AddParticipant(participant);
imSession = (IUccInstantMessagingSession)session;
ComHelper.Advise<_IUccInstantMessagingSessionEvents>(imSession, this);
}
Esta função recebe um endpoint habilitado e o usuário que deseja convidar para a sessão. O formato esperado é “sip:user@domain.com”. Praticamente todo lugar que espera por uma Uri utiliza este formato na UCC API.
Na primeira linha, fazemos um cast do endpoin para IUccSessionManager. O session manager é o mecanismo para iniciar qualquer tipo de sessão na UCC API. O tipo de sessão é especificado no primeiro parâmetro do método CreateSession.
O próximo passo é instanciar um participante. É aqui que colocamos a Uri do usuário remoto. Então fazemos um advise na interface _IUccInstantMessagingSessionParticipantEvents no participante criado.
O último passo é fazer um advise da interface _IUccInstantMessagingSessionEvents no objeto imSession. O objeto imSession object é um objeto do tipo IUccInstantMessagingSession. Nós precisamos guardar uma referência para ele para podermos enviar mensagens.
A interface _IUccInstantMessagingSessionParticipantEvents tem métodos importantes como OnComposing e OnIdle, usados para podermos criar features do tipo “o usuário está digitando” numa aplicação de instant messaging. O OnInstantMessageReceived é o evento mais importante. Esse método será chamado toda vez que o participante remoto manda uma mensagem.
public void OnInstantMessageReceived(UccInstantMessagingSessionParticipant pEventSource, UccIncomingInstantMessageEvent pEventData)
{
MessageBox.Show(pEventData.Content);
}
É importante tratarmos o content-type da mensagem.
Para mandar uma mensagem, usamos o método SendMessage da IUccInstantMessagingSession.
public void SendMessage(string msg)
{
imSession.SendMessage("text/plain", msg);
}
Incoming Sessions
Toda vez que uma incoming session é iniciada, o método IUccEndpoint.OnIncomingSession é chamado (se o endpoint corretamente ouve os eventos de _IUccEndpointEvents).
Neste evento, é necessário tratarmos a sessão da seguinte forma:
public void OnIncomingSession(IUccEndpoint pEventSource, UccIncomingSessionEvent pEventData)
{
if (pEventData.Session.Type == UCC_SESSION_TYPE.UCCST_INSTANT_MESSAGING)
{
pEventData.Accept();
imSession = (IUccInstantMessagingSession)pEventData.Session;
IUccSessionParticipant participant = (IUccSessionParticipant) pEventData.Inviter;
ComHelper.Advise(participant, this);
}
}
A idéia é muito parecida com uma outgoing session. A diferença é que recebemos o objeto IUccInstantMessageSession e o IUccInstantMessagingSessionParticipant do parâmetro pEventData.
Devemos manter a referência do objeto imSession para enviarmos mensagens através do método SendMessage.
Ouvindo os eventos de IUccInstantMessagingSessionParticipantEvents, teremos acesso ao evento OnInstantMessageReceived.
Desta forma, podemos estabelecer o canal de comunicação para incoming sessions.