How to handle add request in smack API
Asked Answered
E

2

5

I use Smack API to write my Google talk Client . Now i need to handle add request for this . I set SubscriptionMode to manual & now I have to registering a listener for presence packets but i don't know how !! can any body help ?

Edmonson answered 26/8, 2009 at 12:20 Comment(0)
M
10

I have not tried it yet, but I guess the below should work. If using the manual mode, a PacketListener should be registered that listens for Presence packets that have a type of Presence.Type.subscribe.

First set the roster:

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

Then add a packet listner to the above connection, eg :

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;
                }});

The above code just returns true for all requests, But you can customize it i.e set it to true or false based on user GUI input.

Michaelmichaela answered 17/9, 2009 at 11:39 Comment(2)
I voted down because I can't find a class SubscriptionListener.Galop
new SubscriptionListener() is an example listener. It is obvious you would provide your own listener implementation.Chacma
T
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");
            }
        });
    }
Tonita answered 7/6, 2013 at 7:39 Comment(3)
A supporting description / comments in your code dump would make this a much more useful answer.Euchromatin
while supporting comments would be useful, I found this code very helpful. One could argue that that it's written so clearly it doesnt require comments even.Riddle
I agree : first one would read official smack tutorial (igniterealtime.org/builds/smack/docs/latest/documentation/… => roster/presence topic and incoming packet topic) and then the given code above becomes very useful.Palpebrate

© 2022 - 2024 — McMap. All rights reserved.