diff options
5 files changed, 109 insertions, 12 deletions
diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java index d0fec3e259..0387d486d7 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java @@ -18,6 +18,7 @@ import org.eclipse.net4j.buddies.internal.protocol.Collaboration; import org.eclipse.net4j.buddies.internal.protocol.CollaborationContainer; import org.eclipse.net4j.buddies.internal.server.bundle.OM; import org.eclipse.net4j.buddies.internal.server.protocol.BuddyRemovedNotification; +import org.eclipse.net4j.buddies.internal.server.protocol.CollaborationInitiatedNotification; import org.eclipse.net4j.buddies.protocol.IAccount; import org.eclipse.net4j.buddies.protocol.IBuddy; import org.eclipse.net4j.buddies.protocol.IBuddyStateChangedEvent; @@ -102,26 +103,46 @@ public class BuddyAdmin extends CollaborationContainer implements IBuddyAdmin, I return session; } - public ICollaboration initiateCollaboration(String... userIDs) + public ICollaboration initiateCollaboration(IBuddy initiator, String... userIDs) { - long id; + long collaborationID; Set<IBuddy> buddies = new HashSet<IBuddy>(); + buddies.add(initiator); synchronized (this) { - id = ++lastCollaborationID; + collaborationID = ++lastCollaborationID; for (String userID : userIDs) { ISession session = sessions.get(userID); if (session != null) { buddies.add(session.getSelf()); - } } } - Collaboration collaboration = new Collaboration(id, buddies); + Collaboration collaboration = new Collaboration(collaborationID, buddies); addCollaboration(collaboration); + for (IBuddy buddy : buddies) + { + if (buddy != initiator) + { + try + { + buddies.remove(buddy); + new CollaborationInitiatedNotification(buddy.getSession().getChannel(), collaborationID, buddies).send(); + } + catch (Exception ex) + { + OM.LOG.error(ex); + } + finally + { + buddies.add(buddy); + } + } + } + return collaboration; } diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/CollaborationInitiatedNotification.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/CollaborationInitiatedNotification.java index e7c52adfb4..bc50e84fd0 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/CollaborationInitiatedNotification.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/CollaborationInitiatedNotification.java @@ -12,33 +12,50 @@ package org.eclipse.net4j.buddies.internal.server.protocol; import org.eclipse.net4j.IChannel; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; +import org.eclipse.net4j.buddies.protocol.IBuddy; import org.eclipse.net4j.signal.Request; import org.eclipse.net4j.util.io.ExtendedDataOutputStream; import java.io.IOException; +import java.util.Set; /** * @author Eike Stepper */ public class CollaborationInitiatedNotification extends Request { - private String buddy; + private long collaborationID; - public CollaborationInitiatedNotification(IChannel channel, String buddy) + private Set<IBuddy> buddies; + + public CollaborationInitiatedNotification(IChannel channel, long collaborationID, Set<IBuddy> buddies) { super(channel); - this.buddy = buddy; + this.collaborationID = collaborationID; + this.buddies = buddies; } @Override protected short getSignalID() { - return ProtocolConstants.SIGNAL_BUDDY_ADDED; + return ProtocolConstants.SIGNAL_COLLABORATION_INITIATED; } @Override protected void requesting(ExtendedDataOutputStream out) throws IOException { - out.writeString(buddy); + out.writeLong(collaborationID); + if (buddies == null) + { + out.writeInt(0); + } + else + { + out.writeInt(buddies.size()); + for (IBuddy buddy : buddies) + { + out.writeString(buddy.getUserID()); + } + } } } diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InitiateCollaborationIndication.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InitiateCollaborationIndication.java index f735873bc1..b98aea50df 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InitiateCollaborationIndication.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InitiateCollaborationIndication.java @@ -11,7 +11,9 @@ package org.eclipse.net4j.buddies.internal.server.protocol; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; +import org.eclipse.net4j.buddies.protocol.IBuddy; import org.eclipse.net4j.buddies.protocol.ICollaboration; +import org.eclipse.net4j.buddies.protocol.ISession; import org.eclipse.net4j.buddies.server.IBuddyAdmin; import org.eclipse.net4j.signal.IndicationWithResponse; import org.eclipse.net4j.util.io.ExtendedDataInputStream; @@ -46,7 +48,9 @@ public class InitiateCollaborationIndication extends IndicationWithResponse userIDs[i] = in.readString(); } - collaboration = IBuddyAdmin.INSTANCE.initiateCollaboration(userIDs); + ISession session = (ISession)getProtocol().getInfraStructure(); + IBuddy initiator = session.getSelf(); + collaboration = IBuddyAdmin.INSTANCE.initiateCollaboration(initiator, userIDs); } @Override diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java index 7347fcf909..8a57521a9d 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java @@ -13,6 +13,7 @@ package org.eclipse.net4j.buddies.server; import org.eclipse.net4j.IChannel; import org.eclipse.net4j.buddies.internal.server.BuddyAdmin; import org.eclipse.net4j.buddies.protocol.IAccount; +import org.eclipse.net4j.buddies.protocol.IBuddy; import org.eclipse.net4j.buddies.protocol.ICollaboration; import org.eclipse.net4j.buddies.protocol.ICollaborationContainer; import org.eclipse.net4j.buddies.protocol.ISession; @@ -32,5 +33,5 @@ public interface IBuddyAdmin extends ICollaborationContainer public ISession openSession(IChannel channel, String userID, String password, String[] facilityTypes); - public ICollaboration initiateCollaboration(String... userIDs); + public ICollaboration initiateCollaboration(IBuddy initiator, String... userIDs); } diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/CollaborationInitiatedIndication.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/CollaborationInitiatedIndication.java new file mode 100644 index 0000000000..1387a2fb0b --- /dev/null +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/CollaborationInitiatedIndication.java @@ -0,0 +1,54 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.internal.buddies.protocol; + +import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; +import org.eclipse.net4j.internal.buddies.ClientSession; +import org.eclipse.net4j.signal.Indication; +import org.eclipse.net4j.util.concurrent.ConcurrencyUtil; +import org.eclipse.net4j.util.io.ExtendedDataInputStream; + +import java.io.IOException; + +/** + * @author Eike Stepper + */ +public class CollaborationInitiatedIndication extends Indication +{ + public CollaborationInitiatedIndication() + { + } + + @Override + protected short getSignalID() + { + return ProtocolConstants.SIGNAL_BUDDY_REMOVED; + } + + @Override + protected void indicating(ExtendedDataInputStream in) throws IOException + { + String buddy = in.readString(); + for (int i = 0; i < 50; i++) + { + ClientSession session = (ClientSession)getProtocol().getInfraStructure(); + if (session == null) + { + ConcurrencyUtil.sleep(100); + } + else + { + session.buddyRemoved(buddy); + break; + } + } + } +} |