UCC API – Unified Communications Client API – Parte 3 – Publicando Category Instances

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.

    Advertisement

One thought on “UCC API – Unified Communications Client API – Parte 3 – Publicando Category Instances

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s