Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslewis2005-04-14 06:32:05 +0000
committerslewis2005-04-14 06:32:05 +0000
commita544f56fe0c27998fdf84edbf6410c49b39e0915 (patch)
treebf239791f64dfbc20a75e3febdf857e768c91c79
parentc60ceea0e94b3a5208c8a9c2c4070b67fb8b75d8 (diff)
downloadorg.eclipse.ecf-a544f56fe0c27998fdf84edbf6410c49b39e0915.tar.gz
org.eclipse.ecf-a544f56fe0c27998fdf84edbf6410c49b39e0915.tar.xz
org.eclipse.ecf-a544f56fe0c27998fdf84edbf6410c49b39e0915.zip
Fixes for many IM bugs. Group creation, add/remove of buddy, etc.
-rw-r--r--examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java46
-rw-r--r--framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java3
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AddBuddyDialog.java117
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/ReceiveAuthorizeRequestDialog.java (renamed from framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java)6
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SelectGroup.java79
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SendAuthorizeRequest.java37
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java2
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java148
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java3
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java33
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java10
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java2
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java22
13 files changed, 339 insertions, 169 deletions
diff --git a/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java b/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java
index b7bba52ab..818304003 100644
--- a/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java
+++ b/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java
@@ -13,10 +13,12 @@ package org.eclipse.ecf.example.collab;
import java.net.ConnectException;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
+import java.util.List;
import java.util.Vector;
import org.eclipse.core.resources.IResource;
@@ -47,9 +49,11 @@ import org.eclipse.ecf.presence.IPresenceSender;
import org.eclipse.ecf.presence.IRosterEntry;
import org.eclipse.ecf.presence.ISubscribeListener;
import org.eclipse.ecf.presence.impl.Presence;
-import org.eclipse.ecf.ui.dialogs.AuthorizeRequest;
+import org.eclipse.ecf.ui.dialogs.AddBuddyDialog;
+import org.eclipse.ecf.ui.dialogs.ReceiveAuthorizeRequestDialog;
import org.eclipse.ecf.ui.views.ILocalInputHandler;
import org.eclipse.ecf.ui.views.RosterView;
+import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
@@ -356,6 +360,15 @@ public class Client {
public void updatePresence(ID userID, IPresence presence) {
presenceSender.sendPresenceUpdate(localUser,userID,presence);
}
+
+ public void sendRosterAdd(String user, String name, String[] groups) {
+ // Send roster add
+ presenceSender.sendRosterAdd(localUser, user,name,groups);
+ }
+
+ public void sendRosterRemove(ID userID) {
+ presenceSender.sendRosterRemove(localUser, userID);
+ }
});
} catch (Exception e) {
@@ -430,24 +443,40 @@ public class Client {
try {
IWorkbenchWindow ww = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
- AuthorizeRequest authRequest = new AuthorizeRequest(ww.getShell(),fromID.getName(),localUser.getName());
+ ReceiveAuthorizeRequestDialog authRequest = new ReceiveAuthorizeRequestDialog(ww.getShell(),fromID.getName(),localUser.getName());
+ authRequest.setBlockOnOpen(true);
authRequest.open();
int res = authRequest.getButtonPressed();
- if (res == AuthorizeRequest.AUTHORIZE_AND_ADD) {
+ if (res == ReceiveAuthorizeRequestDialog.AUTHORIZE_AND_ADD) {
if (presenceSender != null) {
presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.SUBSCRIBED));
// Get group info here
if (rosterView != null) {
String [] groupNames = rosterView.getGroupNames();
- // XXX TODO
+ List g = Arrays.asList(groupNames);
+ String selectedGroup = rosterView.getSelectedGroupName();
+ int selected = (selectedGroup==null)?-1:g.indexOf(selectedGroup);
+ AddBuddyDialog sg = new AddBuddyDialog(ww.getShell(),fromID.getName(),groupNames,selected);
+ sg.open();
+ if (sg.getReturnCode() == Window.OK) {
+ String group = sg.getGroup();
+ String user = sg.getUser();
+ String nickname = sg.getNickname();
+ sg.close();
+ if (!g.contains(group)) {
+ // create group with name
+ rosterView.addGroup(group);
+ }
+ // Finally, send the information and request subscription
+ presenceSender.sendRosterAdd(localUser, user,nickname,new String[] { group } );
+ }
}
- presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.SUBSCRIBE));
}
- } else if (res == AuthorizeRequest.AUTHORIZE_ID) {
+ } else if (res == ReceiveAuthorizeRequestDialog.AUTHORIZE_ID) {
if (presenceSender != null) {
presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.SUBSCRIBED));
}
- } else if (res == AuthorizeRequest.REFUSE_ID) {
+ } else if (res == ReceiveAuthorizeRequestDialog.REFUSE_ID) {
System.out.println("Refuse hit");
} else {
System.out.println("No buttons hit");
@@ -462,6 +491,9 @@ public class Client {
public void handleUnsubscribeRequest(ID fromID, IPresence presence) {
System.out.println("unsubscribe request from "+fromID);
+ if (presenceSender != null) {
+ presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.UNSUBSCRIBED));
+ }
}
public void handleSubscribed(ID fromID, IPresence presence) {
diff --git a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java
index baa3c97ac..e596e1d81 100644
--- a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java
+++ b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java
@@ -15,5 +15,6 @@ import org.eclipse.ecf.core.identity.ID;
public interface IPresenceSender {
public void sendPresenceUpdate(ID fromID, ID toID, IPresence presence);
-
+ public void sendRosterAdd(ID fromID, String user, String name, String [] groups);
+ public void sendRosterRemove(ID fromID, ID userID);
}
diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AddBuddyDialog.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AddBuddyDialog.java
new file mode 100644
index 000000000..dc17b8c7e
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AddBuddyDialog.java
@@ -0,0 +1,117 @@
+package org.eclipse.ecf.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class AddBuddyDialog extends Dialog {
+
+ private Text usertext;
+ private Text nicknametext;
+ private Combo groups;
+
+ private String user = null;
+ private String [] existing = null;
+ private int selectedGroup = -1;
+
+ private int result;
+
+ private String userresult = null;
+ private String nicknameresult = null;
+ private String groupsresult = null;
+
+ public AddBuddyDialog(Shell parentShell,String username, String [] existingGroups, int selectedGroup) {
+ super(parentShell);
+ this.user = username;
+ this.existing = existingGroups;
+ this.selectedGroup = selectedGroup;
+ }
+ protected Control createDialogArea(Composite parent) {
+ Composite container = (Composite) super.createDialogArea(parent);
+ final GridLayout gridLayout = new GridLayout();
+ gridLayout.horizontalSpacing = 0;
+ container.setLayout(gridLayout);
+
+ final Composite composite = new Composite(container, SWT.NONE);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ final GridLayout gridLayout_2 = new GridLayout();
+ gridLayout_2.numColumns = 2;
+ composite.setLayout(gridLayout_2);
+
+ final Label label_3 = new Label(composite, SWT.NONE);
+ label_3.setText("User ID:");
+
+ usertext = new Text(composite, SWT.BORDER);
+ usertext.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ if (user != null) {
+ usertext.setText(user);
+ usertext.setEnabled(false);
+ }
+
+ final Label label_1 = new Label(composite, SWT.NONE);
+ label_1.setText("Group:");
+
+ groups = new Combo(composite, SWT.NONE);
+ groups.setToolTipText("Select group or enter new group");
+ final GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ gridData.widthHint = 141;
+ groups.setLayoutData(gridData);
+ if (existing != null) {
+ for(int i=0; i < existing.length; i++) {
+ groups.add(existing[i]);
+ }
+ if (selectedGroup != -1) groups.select(selectedGroup);
+ else groups.select(0);
+ }
+
+ final Label label_2 = new Label(composite, SWT.NONE);
+ label_2.setText("Nickname:");
+
+ nicknametext = new Text(composite, SWT.BORDER);
+ final GridData gridData_1 = new GridData(GridData.FILL_HORIZONTAL);
+ gridData_1.widthHint = 192;
+ nicknametext.setLayoutData(gridData_1);
+ //
+ return container;
+ }
+
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
+ true);
+ createButton(parent, IDialogConstants.CANCEL_ID,
+ IDialogConstants.CANCEL_LABEL, false);
+ }
+ public String getGroup() {
+ return groupsresult;
+ }
+ public String getUser() {
+ return userresult;
+ }
+ public String getNickname() {
+ return nicknameresult;
+ }
+ protected Point getInitialSize() {
+ return new Point(302, 168);
+ }
+ public void buttonPressed(int button) {
+ result = button;
+ userresult = usertext.getText();
+ nicknameresult = nicknametext.getText();
+ groupsresult = groups.getText();
+ close();
+ }
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText("Add Buddy");
+ }
+
+}
diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/ReceiveAuthorizeRequestDialog.java
index 5de15784e..b37313c88 100644
--- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java
+++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/ReceiveAuthorizeRequestDialog.java
@@ -11,7 +11,7 @@ import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
-public class AuthorizeRequest extends Dialog {
+public class ReceiveAuthorizeRequestDialog extends Dialog {
private String targetName = "target";
private String requesterName = "requester";
@@ -24,11 +24,11 @@ public class AuthorizeRequest extends Dialog {
int buttonPressed = 0;
- public AuthorizeRequest(Shell parentShell) {
+ public ReceiveAuthorizeRequestDialog(Shell parentShell) {
super(parentShell);
}
- public AuthorizeRequest(Shell parentShell, String fromName, String toName) {
+ public ReceiveAuthorizeRequestDialog(Shell parentShell, String fromName, String toName) {
super(parentShell);
this.requesterName = fromName;
this.targetName = toName;
diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SelectGroup.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SelectGroup.java
deleted file mode 100644
index 6a3813392..000000000
--- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SelectGroup.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.eclipse.ecf.ui.dialogs;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-public class SelectGroup extends Dialog {
-
- private Label username;
- private Combo groups;
-
- private String user = null;
- private String [] existing = null;
-
- private int result;
-
- public SelectGroup(Shell parentShell,String username, String [] existing) {
- super(parentShell);
- this.user = username;
- this.existing = existing;
- }
- protected Control createDialogArea(Composite parent) {
- Composite container = (Composite) super.createDialogArea(parent);
- final GridLayout gridLayout = new GridLayout();
- gridLayout.horizontalSpacing = 0;
- container.setLayout(gridLayout);
-
- final Composite composite_1 = new Composite(container, SWT.NONE);
- final GridLayout gridLayout_1 = new GridLayout();
- gridLayout_1.horizontalSpacing = 0;
- gridLayout_1.numColumns = 2;
- composite_1.setLayout(gridLayout_1);
-
- final Label label = new Label(composite_1, SWT.NONE);
- label.setText("Please select a group for");
-
- username = new Label(composite_1, SWT.NONE);
- username.setText(" user");
-
- final Composite composite = new Composite(container, SWT.NONE);
- composite.setLayoutData(new GridData(GridData.FILL_BOTH));
- composite.setLayout(new GridLayout());
-
- groups = new Combo(composite, SWT.NONE);
- groups.setToolTipText("Select group or enter new group");
- final GridData gridData = new GridData(GridData.GRAB_HORIZONTAL);
- gridData.widthHint = 141;
- groups.setLayoutData(gridData);
- //
- return container;
- }
-
- protected void createButtonsForButtonBar(Composite parent) {
- createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
- true);
- createButton(parent, IDialogConstants.CANCEL_ID,
- IDialogConstants.CANCEL_LABEL, false);
- }
-
- public String getGroup() {
- return groups.getText();
- }
- protected Point getInitialSize() {
- return new Point(292, 141);
- }
- protected void configureShell(Shell newShell) {
- super.configureShell(newShell);
- newShell.setText("Select Group");
- }
-
-}
diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SendAuthorizeRequest.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SendAuthorizeRequest.java
deleted file mode 100644
index 36c2cd8d5..000000000
--- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SendAuthorizeRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.eclipse.ecf.ui.dialogs;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-public class SendAuthorizeRequest extends Dialog {
-
- public SendAuthorizeRequest(Shell parentShell) {
- super(parentShell);
- }
-
- protected Control createDialogArea(Composite parent) {
- Composite container = (Composite) super.createDialogArea(parent);
- //
- return container;
- }
-
- protected void createButtonsForButtonBar(Composite parent) {
- createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
- true);
- createButton(parent, IDialogConstants.CANCEL_ID,
- IDialogConstants.CANCEL_LABEL, false);
- }
-
- protected Point getInitialSize() {
- return new Point(500, 375);
- }
- protected void configureShell(Shell newShell) {
- super.configureShell(newShell);
- newShell.setText("Send Subscribe Request");
- }
-
-}
diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java
index 35c43cb46..ed7410df1 100644
--- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java
+++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java
@@ -18,5 +18,7 @@ public interface ILocalInputHandler {
public void inputText(ID userID, String text);
public void startTyping(ID userID);
public void updatePresence(ID userID, IPresence presence);
+ public void sendRosterAdd(String user, String name, String [] groups);
+ public void sendRosterRemove(ID userID);
public void disconnect();
}
diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java
index be7f24402..078112df5 100644
--- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java
+++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java
@@ -13,11 +13,13 @@ package org.eclipse.ecf.ui.views;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Path;
import org.eclipse.ecf.core.identity.ID;
@@ -32,6 +34,7 @@ import org.eclipse.ecf.presence.IRosterGroup;
import org.eclipse.ecf.presence.impl.RosterEntry;
import org.eclipse.ecf.ui.UiPlugin;
import org.eclipse.ecf.ui.UiPluginConstants;
+import org.eclipse.ecf.ui.dialogs.AddBuddyDialog;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
@@ -53,6 +56,7 @@ import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
@@ -80,7 +84,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
private Action addGroupAction;
protected IUser localUser;
- protected ILocalInputHandler textInputHandler;
+ protected ILocalInputHandler inputHandler;
protected Hashtable chatThreads = new Hashtable();
protected ID groupID;
@@ -91,15 +95,19 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
protected String getUserNameFromID(ID userID) {
if (userID == null) return "";
String uname = userID.getName();
- String username = uname.substring(0,uname.indexOf("@"));
+ int index = uname.indexOf("@");
+ String username = uname;
+ if (index >= 0) {
+ username = uname.substring(0,index);
+ }
if (username.equals("")) {
return uname;
} else return username;
}
public void dispose() {
- if (textInputHandler != null) {
- textInputHandler.disconnect();
- textInputHandler = null;
+ if (inputHandler != null) {
+ inputHandler.disconnect();
+ inputHandler = null;
}
super.dispose();
}
@@ -267,6 +275,8 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
public TreeBuddy fillPresence(TreeBuddy obj, IPresence presence) {
obj.setPresence(presence);
+ obj.removeChildren();
+ obj.addChild(new TreeObject("Account: "+obj.getUserID().getName()));
TreeObject type = new TreeObject("Status: "
+ presence.getType().toString());
obj.addChild(type);
@@ -325,23 +335,27 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
} else return new String[0];
}
public TreeBuddy findBuddy(TreeParent parent, IRosterEntry entry) {
+ return findBuddy(parent,entry.getUserID());
+ }
+
+ public TreeBuddy findBuddy(TreeParent parent, ID entryID) {
TreeObject [] objs = parent.getChildren();
if (objs == null) return null;
for(int i=0; i < objs.length; i++) {
if (objs[i] instanceof TreeBuddy) {
TreeBuddy tb = (TreeBuddy) objs[i];
ID tbid = tb.getUserID();
- if (tbid != null && tbid.equals(entry.getUserID())) {
+ if (tbid != null && tbid.equals(entryID)) {
return (TreeBuddy) objs[i];
}
} else if (objs[i] instanceof TreeGroup) {
- TreeBuddy found = findBuddy((TreeParent) objs[i],entry);
+ TreeBuddy found = findBuddy((TreeParent) objs[i],entryID);
if (found != null) return found;
}
}
return null;
}
-
+
public TreeBuddy findAndReplaceEntry(TreeParent parent, IRosterEntry entry) {
TreeBuddy tb = findBuddy(parent,entry);
TreeBuddy result = createBuddy(tb,entry);
@@ -373,7 +387,9 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
parent.addChild(newgrp);
}
} else {
- parent.addChild(newBuddy);
+ TreeGroup tg = new TreeGroup("Unfiled");
+ tg.addChild(newBuddy);
+ parent.addChild(tg);
}
}
}
@@ -408,7 +424,18 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
public void addEntry(IRosterEntry entry) {
addEntry(root, entry);
}
-
+ public void removeRosterEntry(ID entry) {
+ removeEntry(root,entry);
+ }
+ public void removeEntry(TreeParent parent, ID entry) {
+ TreeBuddy buddy = findBuddy(parent,entry);
+ if (buddy == null) return;
+ TreeParent p = buddy.getParent();
+ if (p != null) {
+ p.removeChild(buddy);
+ refreshView();
+ }
+ }
public void removeAllEntries() {
root = null;
}
@@ -526,17 +553,25 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
UiPlugin.getDefault().find(new Path(INSTANT_MESSAGE_ICON))));
manager.add(selectedChatAction);
+
TreeObject parent = treeObject.getParent();
+ TreeGroup tg = null;
if (parent != null && parent instanceof TreeGroup) {
- final TreeGroup treeGroup = (TreeGroup) parent;
- Action removeUserAction = new Action() {
- public void run() {
- removeUserFromGroup(tb,treeGroup);
- }
- };
+ tg = (TreeGroup) parent;
+ }
+ final TreeGroup treeGroup = tg;
+ Action removeUserAction = new Action() {
+ public void run() {
+ removeUserFromGroup(tb,treeGroup);
+ }
+ };
+ if (treeGroup != null) {
removeUserAction.setText("Remove "+treeObject.getName()+" from "+treeGroup.getName());
- manager.add(removeUserAction);
+ } else {
+ removeUserAction.setText("Remove "+treeObject.getName());
}
+ manager.add(removeUserAction);
+
} else if (treeObject instanceof TreeGroup) {
final TreeGroup treeGroup = (TreeGroup) treeObject;
final String groupName = treeGroup.getName();
@@ -545,7 +580,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
addUserToGroup(groupName);
}
};
- addUserAction.setText("Add buddy to "+treeObject.getName()+" group");
+ addUserAction.setText("Add buddy to "+treeObject.getName());
addUserAction.setImageDescriptor(ImageDescriptor.createFromURL(
UiPlugin.getDefault().find(new Path(ADDGROUP_ICON))));
manager.add(addUserAction);
@@ -558,13 +593,31 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
}
protected void addUserToGroup(String groupName) {
- // XXX TODO
- System.out.println("adding user to group "+groupName);
+ String [] groupNames = getGroupNames();
+ String selected = getSelectedGroupName();
+ int index = -1;
+ if (selected != null && selected.equals(groupName)) {
+ index = 0;
+ }
+ AddBuddyDialog sg = new AddBuddyDialog(viewer.getControl().getShell(),null,new String[] { groupName },index);
+ sg.open();
+ if (sg.getReturnCode() == Window.OK) {
+ String group = sg.getGroup();
+ String user = sg.getUser();
+ String nickname = sg.getNickname();
+ sg.close();
+ if (!Arrays.asList(groupNames).contains(group)) {
+ // create group with name
+ addGroup(group);
+ }
+ inputHandler.sendRosterAdd(user,nickname,new String[] { group } );
+ }
}
protected void removeUserFromGroup(TreeBuddy buddy, TreeGroup group) {
- // XXX TODO
- System.out.println("removing user "+buddy.getName()+ " from group "+group);
+ if (inputHandler != null) {
+ inputHandler.sendRosterRemove(buddy.getUserID());
+ }
}
protected TreeObject getSelectedTreeObject() {
ISelection selection = viewer.getSelection();
@@ -622,8 +675,8 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
};
disconnectAction = new Action() {
public void run() {
- if (textInputHandler != null) {
- textInputHandler.disconnect();
+ if (inputHandler != null) {
+ inputHandler.disconnect();
chatAction.setEnabled(false);
addGroupAction.setEnabled(false);
disconnectAction.setEnabled(false);
@@ -668,7 +721,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
}
};
addGroupAction.setText("Add Group...");
- addGroupAction.setToolTipText("Add group to list");
+ addGroupAction.setToolTipText("Add group");
addGroupAction.setEnabled(false);
addGroupAction.setImageDescriptor(ImageDescriptor.createFromURL(
UiPlugin.getDefault().find(new Path(ADDGROUP_ICON))));
@@ -728,7 +781,10 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
ViewContentProvider vcp = (ViewContentProvider) viewer
.getContentProvider();
if (vcp != null) {
- vcp.addEntry(entry);
+ if (entry.getInterestType() == IRosterEntry.InterestType.REMOVE ||
+ entry.getInterestType() == IRosterEntry.InterestType.NONE) {
+ vcp.removeRosterEntry(entry.getUserID());
+ } else vcp.addEntry(entry);
refreshView();
}
}
@@ -746,38 +802,52 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
*/
public void setLocalUser(IUser user, ILocalInputHandler textInputHandler) {
this.localUser = user;
- this.textInputHandler = textInputHandler;
+ this.inputHandler = textInputHandler;
}
public Object getAdapter(Class clazz) {
if (clazz != null && clazz.equals(ILocalInputHandler.class)) {
return new ILocalInputHandler() {
public void inputText(ID userID, String text) {
- if (textInputHandler != null) {
- textInputHandler.inputText(userID, text);
+ if (inputHandler != null) {
+ inputHandler.inputText(userID, text);
} else
System.out.println("handleTextLine(" + text + ")");
}
public void startTyping(ID userID) {
- if (textInputHandler != null) {
- textInputHandler.startTyping(userID);
+ if (inputHandler != null) {
+ inputHandler.startTyping(userID);
} else
System.out.println("handleStartTyping()");
}
public void disconnect() {
- if (textInputHandler != null) {
- textInputHandler.disconnect();
+ if (inputHandler != null) {
+ inputHandler.disconnect();
} else
System.out.println("disconnect()");
}
public void updatePresence(ID userID, IPresence presence) {
- if (textInputHandler != null) {
- textInputHandler.updatePresence(userID,presence);
+ if (inputHandler != null) {
+ inputHandler.updatePresence(userID,presence);
} else
System.out.println("disconnect()");
}
+
+ public void sendRosterAdd(String user, String name, String[] groups) {
+ if (inputHandler != null) {
+ inputHandler.sendRosterAdd(user,name,groups);
+ } else
+ System.out.println("sendRosterAdd()");
+ }
+
+ public void sendRosterRemove(ID userID) {
+ if (inputHandler != null) {
+ inputHandler.sendRosterRemove(userID);
+ } else
+ System.out.println("sendRosterRemove()");
+ }
};
} else if (clazz.equals(IPresenceListener.class)) {
return this;
@@ -884,6 +954,14 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL
refreshView();
}
}
+ public void removeRosterEntry(ID id) {
+ ViewContentProvider vcp = (ViewContentProvider) viewer
+ .getContentProvider();
+ if (vcp != null) {
+ vcp.removeRosterEntry(id);
+ refreshView();
+ }
+ }
protected void handleGroupManagerDeparted() {
removeAllRosterEntries();
disposeAllChatWindows("Disconnected from server. Chat is inactive");
diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java
index eee180899..95f5d7fe9 100644
--- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java
+++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java
@@ -23,5 +23,6 @@ public interface IIMMessageSender {
public void sendPresenceUpdate(ID target, Presence presence) throws IOException;
public Roster getRoster() throws IOException;
-
+ public void sendRosterAdd(String user, String name, String [] groups) throws IOException;
+ public void sendRosterRemove(String user) throws IOException;
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java
index b41a6fef7..b90845ab1 100644
--- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java
@@ -298,13 +298,25 @@ public class XMPPClientSOContainer extends ClientSOContainer {
protected Presence makePresenceFromIPresence(IPresence presence) {
return sharedObject.makePresence(presence);
}
- public void sendPresenceUpdate(ID target, Presence presence) throws IOException {
+ protected void sendPresenceUpdate(ID target, Presence presence) throws IOException {
if (messageSender != null) {
if (presence == null) throw new NullPointerException("presence cannot be null");
messageSender.sendPresenceUpdate(target, presence);
}
}
+ protected void sendRosterAdd(String user, String name, String [] groups) throws IOException {
+ if (messageSender != null) {
+ messageSender.sendRosterAdd(user,name,groups);
+ }
+ }
+
+ protected void sendRosterRemove(String user) throws IOException {
+ if (messageSender != null) {
+ messageSender.sendRosterRemove(user);
+ }
+ }
+
public Object getAdapter(Class clazz) {
if (clazz.equals(IPresenceContainer.class)) {
return new IPresenceContainer() {
@@ -345,7 +357,24 @@ public class XMPPClientSOContainer extends ClientSOContainer {
dumpStack("Exception in sendPresenceUpdate to "+toID+" with presence "+presence,e);
}
}
-
+
+ public void sendRosterAdd(ID fromID, String user, String name, String[] groups) {
+ try {
+ XMPPClientSOContainer.this.sendRosterAdd(user,name,groups);
+ } catch (IOException e) {
+ dumpStack("Exception in sendRosterAdd",e);
+ }
+ }
+
+ public void sendRosterRemove(ID fromID, ID userID) {
+ try {
+ if (userID == null) return;
+ XMPPClientSOContainer.this.sendRosterRemove(userID.getName());
+ } catch (IOException e) {
+ dumpStack("Exception in sendRosterAdd",e);
+ }
+ }
+
};
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java
index a17115804..1fb712f13 100644
--- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java
+++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java
@@ -10,9 +10,9 @@ package org.eclipse.ecf.provider.xmpp.container;
import java.io.IOException;
import java.util.Map;
+
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.util.IQueueEnqueue;
-import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.provider.generic.SOContainer;
import org.eclipse.ecf.provider.generic.SOContext;
import org.jivesoftware.smack.Roster;
@@ -34,8 +34,6 @@ public class XMPPContainerContext extends SOContext {
public void sendMessage(ID target, String message) throws IOException {
((XMPPClientSOContainer) container).sendMessage(target,message);
}
- public void sendPresenceUpdate(ID target, IPresence presence) throws IOException {
- }
public Roster getRoster() throws IOException {
return ((XMPPClientSOContainer) container).getRoster();
}
@@ -43,6 +41,12 @@ public class XMPPContainerContext extends SOContext {
if (presence == null) throw new NullPointerException("presence cannot be null");
((XMPPClientSOContainer) container).sendPresenceUpdate(target,presence);
}
+ public void sendRosterAdd(String user, String name, String[] groups) throws IOException {
+ ((XMPPClientSOContainer) container).sendRosterAdd(user,name,groups);
+ }
+ public void sendRosterRemove(String user) throws IOException {
+ ((XMPPClientSOContainer) container).sendRosterRemove(user);
+ }
};
} else return null;
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java
index 8e41d9c27..38c417309 100644
--- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java
+++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java
@@ -264,11 +264,13 @@ public class XMPPPresenceSharedObject implements ISharedObject, IAccountManager
if (iq instanceof RosterPacket) {
// Roster packet...report to UI
RosterPacket rosterPacket = (RosterPacket) iq;
+ if (rosterPacket.getType() == IQ.Type.SET || rosterPacket.getType() == IQ.Type.RESULT) {
for (Iterator i = rosterPacket.getRosterItems(); i.hasNext();) {
IRosterEntry entry = makeRosterEntry((RosterPacket.Item) i
.next());
fireRosterEntry(entry);
}
+ }
} else {
debug("Received unknown IQ message: " + iq.toXML());
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java
index 25c8405e3..754060a62 100644
--- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java
+++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java
@@ -24,6 +24,7 @@ import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
+import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
@@ -135,7 +136,7 @@ public class ChatConnection implements ISynchAsynchConnection, IIMMessageSender
}
}, null);
// Login
- connection.login(username, (String) data, "ECF");
+ connection.login(username, (String) data, "ECF_XMPP");
isConnected = true;
debug("User: " + username + " logged into " + serverName);
roster = getRoster();
@@ -310,6 +311,24 @@ public class ChatConnection implements ISynchAsynchConnection, IIMMessageSender
connection.sendPacket(presence);
}
}
+
+ public void sendRosterAdd(String user, String name, String [] groups) throws IOException {
+ Roster r = getRoster();
+ try {
+ r.createEntry(user,name,groups);
+ } catch (XMPPException e) {
+ e.printStackTrace();
+ }
+ }
+ public void sendRosterRemove(String user) throws IOException {
+ Roster r = getRoster();
+ RosterEntry re = r.getEntry(user);
+ try {
+ r.removeEntry(re);
+ } catch (XMPPException e) {
+ e.printStackTrace();
+ }
+ }
/*
* (non-Javadoc)
*
@@ -323,4 +342,5 @@ public class ChatConnection implements ISynchAsynchConnection, IIMMessageSender
Roster roster = connection.getRoster();
return roster;
}
+
}

Back to the top