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