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.