Objetivo
Nessa parte vamos discutir o concieto de publicação de category instances na UCC API. A publicação é a idéia de mandar uma informação para o servidor e propagar essa informação para outros usuários, ou seja, mandar seu cartão de contato, criar grupos, adicionar contatos a sua lista de contatos são operações de publicação.
Qunado publicamos uma informação você verá uma propriedade “container id”. Essa propriedade signfica quem pode ver essa publicação. Essa parte é um pouco complicado e pode gerar alguns comportamentos estranhos que veremos no próximo post.
A idéia deste é somente explicar como fazer uma publicação. No próximo veremos como tratar o container id e quem pode ver essa informação.
Publicando
O padrão para fazer uma publicação é relativamente simples:
- Obter um category instance publicável (publishable category instance)
- Publicar
- Ver se a publicação foi bem-sucedida.
Existem duas formas de se obter uma category instance publicável:
- Através do método CreatePublishableCategoryInstance no IUccPublicationManager
- Criar uma através de uma category instance recebida por uma publicação (parte 2). O IUccCategoryInstance também possui um método CreatePublishableCategoryInstance.
Para mostrar como esse padrão funciona, vamos ver um exemplo de como publicar o estado de um usuário (o estado também é um category instance!).
public void PublishPresence(MyEndpoint Endpoint, int instanceId, UCC_CATEGORY_INSTANCE_EXPIRE_TYPE expireType, int availability,
UCC_PRESENCE_STATE_TYPE presenceStateType, bool manual)
{
IUccPublicationManager pubManager = (IUccPublicationManager)uccEndpoint;
IUccCategoryInstance pubInstance = (IUccCategoryInstance)pubManager.CreatePublishableCategoryInstance("state", 2, instanceId, expireType, 0);
IUccPresenceStateInstance state = (IUccPresenceStateInstance)pubInstance;
state.Availability = (int)availability;
state.Type = presenceStateType;
state.IsManual = manual;
pubInstance.PublicationOperation = UCC_PUBLICATION_OPERATION_TYPE.UCCPOT_ADD;
IUccPublication pub = pubManager.CreatePublication();
ComHelper.Advise<_IUccPublicationEvent>(pub, this);
pub.AddPublishableCategoryInstance(pubInstance);
pub.Publish();
}
Primeiro, obtemos a instancia do IUccPublicationManager através do endpoint do usuário conectado. O próximo passo é obter uma category instance publicável (publishable category instance) usando o método CreatePublishableCategoryInstance.
Este método recebe o “state” que é uma string “reservada” (ou hard-coded, como prefiram). O próximo parâmetro é o ContainerId. Veremos o porque do valor “2” no próximo post deste blog. O outro parâmetro é o InstanceId. O InstanceId depende do tipo de categoria que está sendo publicada. Verifique na documentação da categoria. O expire type determina quando a publicação expira. Está relacionado com o tempo de vida da publicação. O último parâmetro indica o tempo caso o expire type seja tempo (time).
O mais importante aqui é que publicações do tipo STATIC são armazenadas no servidor. Mesmo se o usuário desconectar, a publicação é mantida no servidor.
O próximo passo é fazer um cast da categoria para seu tipo especializado. Neste caso, user presence state. Então definios as propriedades específicas ali.
A operação de publicação geralmente é UCCPOT_ADD. Eu não sei exatamente o porque da existência do UCCPOT_REMOV, já que se você deseja remover uma categoria deve usar o método RemovePublishableCategoryInstance e não um tipo diferente de publicação.
No próximo passo criamos uma instância de IUccPublication. Isso é feito através do método CreatePublication no publication manager.
Então, fazemos um advise nos eventos da publicação, adicionamos a category instance publicável e chamamos o método Publish().
Então, o OnPublish da interface _IUccPublicationEvents será chamado:
public void OnPublish(IUccPublication pPublication, IUccOperationProgressEvent pPublicationEventInfo)
{
if (!pPublicationEventInfo.IsComplete)
return;
if (pPublicationEventInfo.StatusCode != 0)
throw new Exception("Error");
}
Neste método apenas checamos o StatusCode. Se é 0, a publicação foi bem sucedida.
Publicando Estado de Presença (Presence State)
Apenas para completar o exemplo, vamos mostrar como publicar estado de presença. O código 3500 está relacionado com o status “Available”. Lá vai o código:
private void PublishOnlinePresence(object sender, EventArgs e)
{
MyPublicationManager myPublicationManager = new MyPublicationManager();
myPublicationManager.PublishPresence(myEndpoint, 0x20000000, UCC_CATEGORY_INSTANCE_EXPIRE_TYPE.UCCCIET_USER, 3500, UCC_PRESENCE_STATE_TYPE.UCCPST_USER_STATE, true);
MyPublicationManager myPublicationManager2 = new MyPublicationManager();
myPublicationManager2.PublishPresence(myEndpoint, 0x30000000, UCC_CATEGORY_INSTANCE_EXPIRE_TYPE.UCCCIET_DEVICE, 3500, UCC_PRESENCE_STATE_TYPE.UCCPST_MACHINE_STATE, false);
}
Neste exemplo, usamos o instance Id 0x20000000 para estado do usuário e 0x30000000 para estado da máquina. Esses valores são específicos para publicação de estado. Verifique a documentação da msdn para outros códigos.
Conclusão
Toda vez que houver necessidade de publicar um category instance, apenas siga este padrão. Você precisará saber alguns detalhes específicos sobre a category instance que deseja publicar, como se você está publicando o InstanceId correto e propriedades específicas.
O ContainerId será explicado no próximo post.
Espero que ajude.
belstaff ebay 944-5047