This Question is Not Answered

1 "correct" answer available (10 pts) 1 "helpful" answer available (5 pts)
4 Replies Last post: May 21, 2008 9:45 AM by zabalet  
Click to view zabalet's profile Bronze 19 posts since
Apr 29, 2008

May 15, 2008 8:27 AM

Remove someone from my roster without removimg myself from his roster, is it possible?


This is the example, I have to pals, Scooby and Shaggy. Scooby is in Shaggy's roster and Shaggy is in Scooby's roster too. When Shaggy asks to remove Scooby from his roster, I try with this code:
....
RosterEntry entry = roster.getEntry(userName);
connection.removeEntry(entry)
....

But Scooby lost Shaggy's entry too, and Shaggy desapear from his roster.
Is it possible from smack to change the subscription type from "both" to "from"?

Click to view Op3racional's profile Gold 285 posts since
Oct 21, 2005
You can do this on Scooby's side - when he receives the unsubscribed packet, you can ask the user if they want to unsubscribe too, or do an action by default (which usually is to unsubscribe aswell).
Click to view Op3racional's profile Gold 285 posts since
Oct 21, 2005
If you set your Roster.SubscriptionMode to manual, that means your application has to react to subscription Packets in
 public void processPacket(Packet packet) 


    /** listens for Presence packets for manual subscriprion mode */
    @Override
    public void processPacket(Packet packet) {
        // packetlistener
        final Presence presence = (Presence) packet;
        final String from = presence.getFrom();
        
        if (presence.getType() == Presence.Type.subscribe) {
            // check if the user is already subscribed
            if (roster.isSubscribed(from)) {
                Presence response = new Presence(Presence.Type.subscribed);
                response.setTo(from);
                con.sendPacket(response);
                return;
            }
            
            // ask user to accept or deny subscription request 
            //snip
 
            if (n == JOptionPane.YES_OPTION) {
                // send subscription accept packet
                Presence response = new Presence(Presence.Type.subscribed);
                response.setTo(from);
                con.sendPacket(response);
            } else {
                // send subscription deny packet
                Presence response = new Presence(Presence.Type.unsubscribe);
                response.setTo(from);
                con.sendPacket(response);
            }
        } else 
            if (presence.getType() == Presence.Type.unsubscribe) {
                SwingUtilities.invokeLater(new Runnable() {
                @Override
                    public void run() {
                        final RosterEntry entry = roster.getEntry(from);
                        if (entry != null) {
                            try {
                                roster.removeEntry(entry);
                            }
                            catch (XMPPException ex) {
                                Presence unsub = new Presence(Presence.Type
                                        .unsubscribed);
                                unsub.setTo(from);
                                con.sendPacket(unsub);
                                ex.printStackTrace();
                            }
                        }
                    }
                });
            } else 
                if (presence.getType() == Presence.Type.subscribed) {
                    // update roster GUI
                } else 
                    if (presence.getType() == Presence.Type.unsubscribed) {
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                final RosterEntry entry = roster.getEntry(from);
                                if (entry != null) {
                                    try {
                                        roster.removeEntry(entry);
                                    }
                                    catch (XMPPException ex) {
                                        ex.printStackTrace();
                                    }
                                }
                            }
                        });
                    }
    }