2009-08-26 12 views
5

Utilizo Smack API para escribir mi Google Talk Client. Ahora necesito manejar la solicitud de agregar esto. Configuré SubscriptionMode en el manual & ahora tengo que registrar un detector de paquetes de presencia pero no sé cómo! puede cualquier cuerpo ayudar?Cómo gestionar la solicitud de inserción en smack API

Respuesta

9

No lo he intentado todavía, pero creo que a continuación debería funcionar. Si usa el modo manual, se debe registrar un PacketListener que esté atento a los paquetes de presencia que tengan un tipo de Presence.Type.subscribe.

En primer lugar establece la lista:

Roster roster = connection.getRoster(); 
    roster.setSubscriptionMode(Roster.SubscriptionMode.manual); 

continuación, agregar un listner paquete a la conexión anterior, por ejemplo:

connection.addPacketListener(new SubscriptionListener(), new PacketFilter(){ 

       public boolean accept(Packet packet) { 
        if(packet instanceof Presence) 
         if(((Presence)packet).getType().equals(Presence.Type.subscribe)) 
          return true; 
        return false; 
       }}); 

El código anterior simplemente devuelve verdadero para todas las solicitudes, pero se puede personalizar es decir, establézcalo en verdadero o falso en función de la entrada de la GUI del usuario.

+0

He votado negativamente porque no puedo encontrar una clase SubscriptionListener. – Magmatic

+0

new SubscriptionListener() es un oyente de ejemplo. Es obvio que proporcionaría su propia implementación de oyente. –

5
public static void admitFriendsRequest() { 
     connection.getRoster().setSubscriptionMode(
     Roster.SubscriptionMode.manual); 
     connection.addPacketListener(new PacketListener() { 
      public void processPacket(Packet paramPacket) { 
       System.out.println("\n\n"); 
       if (paramPacket instanceof Presence) { 
        Presence presence = (Presence) paramPacket; 
        String email = presence.getFrom(); 
        System.out.println("chat invite status changed by user: : " 
          + email + " calling listner"); 
        System.out.println("presence: " + presence.getFrom() 
          + "; type: " + presence.getType() + "; to: " 
          + presence.getTo() + "; " + presence.toXML()); 
        Roster roster = connection.getRoster(); 
        for (RosterEntry rosterEntry : roster.getEntries()) { 
         System.out.println("jid: " + rosterEntry.getUser() 
           + "; type: " + rosterEntry.getType() 
           + "; status: " + rosterEntry.getStatus()); 
        } 
        System.out.println("\n\n\n"); 
        if (presence.getType().equals(Presence.Type.subscribe)) { 
         Presence newp = new Presence(Presence.Type.subscribed); 
         newp.setMode(Presence.Mode.available); 
         newp.setPriority(24); 
         newp.setTo(presence.getFrom()); 
         connection.sendPacket(newp); 
         Presence subscription = new Presence(
           Presence.Type.subscribe); 
         subscription.setTo(presence.getFrom()); 
         connection.sendPacket(subscription); 

        } else if (presence.getType().equals(
          Presence.Type.unsubscribe)) { 
         Presence newp = new Presence(Presence.Type.unsubscribed); 
         newp.setMode(Presence.Mode.available); 
         newp.setPriority(24); 
         newp.setTo(presence.getFrom()); 
         connection.sendPacket(newp); 
        } 
       } 

      } 
     }, new PacketFilter() { 
      public boolean accept(Packet packet) { 
       if (packet instanceof Presence) { 
        Presence presence = (Presence) packet; 
        if (presence.getType().equals(Presence.Type.subscribed) 
          || presence.getType().equals(
            Presence.Type.subscribe) 
          || presence.getType().equals(
            Presence.Type.unsubscribed) 
          || presence.getType().equals(
            Presence.Type.unsubscribe)) { 
         return true; 
        } 
       } 
       return false; 
      } 
     }); 

     connection.getRoster().addRosterListener(new RosterListener() { 
      public void presenceChanged(Presence presence) { 
       System.out.println(presence.getFrom() + "presenceChanged"); 

      } 

      public void entriesUpdated(Collection<String> presence) { 
       System.out.println("entriesUpdated"); 

      } 

      public void entriesDeleted(Collection<String> presence) { 
       System.out.println("entriesDeleted"); 

      } 

      public void entriesAdded(Collection<String> presence) { 
       System.out.println("entriesAdded"); 
      } 
     }); 
    } 
+0

Una descripción/comentarios de soporte en el volcado de código haría de esta una respuesta mucho más útil. –

+0

mientras que los comentarios de apoyo serían útiles, encontré este código muy útil. Se podría argumentar que está escrito tan claramente que no requiere comentarios incluso. –

+0

Acepto: primero se leerá el tutorial oficial de smack (http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html => roster/presence topic y el tema del paquete entrante) y luego se dará el el código anterior se vuelve muy útil. – loloof64

Cuestiones relacionadas