Lines 437-443
Link Here
|
437 |
final IRosterEntry entry = createRosterEntry(newID, item); |
437 |
final IRosterEntry entry = createRosterEntry(newID, item); |
438 |
if (itemType == RosterPacket.ItemType.NONE |
438 |
if (itemType == RosterPacket.ItemType.NONE |
439 |
|| itemType == RosterPacket.ItemType.REMOVE) { |
439 |
|| itemType == RosterPacket.ItemType.REMOVE) { |
440 |
removeFromRoster(createIDFromName(item.getUser())); |
440 |
removeItemFromRoster(roster.getItems(), |
|
|
441 |
createIDFromName(item.getUser())); |
441 |
remove = true; |
442 |
remove = true; |
442 |
} else { |
443 |
} else { |
443 |
remove = false; |
444 |
remove = false; |
Lines 459-482
Link Here
|
459 |
rosterManager.notifyRosterAdd(entry); |
460 |
rosterManager.notifyRosterAdd(entry); |
460 |
} |
461 |
} |
461 |
|
462 |
|
462 |
private void removeFromRoster(XMPPID itemIDToRemove) { |
463 |
private void removeItemFromRoster(Collection rosterItems, |
|
|
464 |
XMPPID itemIDToRemove) { |
463 |
boolean removed = false; |
465 |
boolean removed = false; |
464 |
Collection rosterItems = roster.getItems(); |
|
|
465 |
synchronized (rosterItems) { |
466 |
synchronized (rosterItems) { |
466 |
for (final Iterator i = rosterItems.iterator(); i.hasNext();) { |
467 |
for (final Iterator i = rosterItems.iterator(); i.hasNext();) { |
467 |
final IRosterItem item = (IRosterItem) i.next(); |
468 |
final IRosterItem item = (IRosterItem) i.next(); |
468 |
if (item instanceof org.eclipse.ecf.presence.roster.RosterGroup) { |
469 |
if (item instanceof org.eclipse.ecf.presence.roster.RosterGroup) { |
469 |
final org.eclipse.ecf.presence.roster.RosterGroup group = (org.eclipse.ecf.presence.roster.RosterGroup) item; |
470 |
final org.eclipse.ecf.presence.roster.RosterGroup group = (org.eclipse.ecf.presence.roster.RosterGroup) item; |
470 |
boolean r = removeItemFromRosterGroup(group, itemIDToRemove); |
471 |
removed = removeItemFromRosterGroup(group, itemIDToRemove); |
471 |
if (r) |
|
|
472 |
removed = true; |
473 |
// If group is empty, remove it too |
472 |
// If group is empty, remove it too |
474 |
if (group.getEntries().size() == 0) |
473 |
if (group.getEntries().size() == 0) |
475 |
i.remove(); |
474 |
i.remove(); |
476 |
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) { |
475 |
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) { |
477 |
org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) item; |
476 |
if (((org.eclipse.ecf.presence.roster.RosterEntry) item) |
478 |
XMPPID entryID = (XMPPID) entry.getUser().getID(); |
477 |
.getUser().getID().equals(itemIDToRemove)) { |
479 |
if (entryID.equals(itemIDToRemove)) { |
|
|
480 |
i.remove(); |
478 |
i.remove(); |
481 |
removed = true; |
479 |
removed = true; |
482 |
} |
480 |
} |
Lines 496-503
Link Here
|
496 |
for (final Iterator i = group.getEntries().iterator(); i.hasNext();) { |
494 |
for (final Iterator i = group.getEntries().iterator(); i.hasNext();) { |
497 |
final org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) i |
495 |
final org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) i |
498 |
.next(); |
496 |
.next(); |
499 |
XMPPID entryID = (XMPPID) entry.getUser().getID(); |
497 |
if (entry.getUser().getID().equals(itemIDToRemove)) { |
500 |
if (entryID.equals(itemIDToRemove)) { |
|
|
501 |
i.remove(); |
498 |
i.remove(); |
502 |
return true; |
499 |
return true; |
503 |
} |
500 |
} |
Lines 570-769
Link Here
|
570 |
|
567 |
|
571 |
private void updatePresence(XMPPID fromID, IPresence newPresence) { |
568 |
private void updatePresence(XMPPID fromID, IPresence newPresence) { |
572 |
final Collection rosterItems = roster.getItems(); |
569 |
final Collection rosterItems = roster.getItems(); |
573 |
AdditionalClient newEntry = null; |
570 |
List newEntrys = new ArrayList(); |
574 |
synchronized (rosterItems) { |
571 |
synchronized (rosterItems) { |
575 |
for (final Iterator i = roster.getItems().iterator(); i.hasNext();) { |
572 |
for (final Iterator i = roster.getItems().iterator(); i.hasNext();) { |
576 |
final IRosterItem item = (IRosterItem) i.next(); |
573 |
final IRosterItem item = (IRosterItem) i.next(); |
577 |
if (item instanceof IRosterGroup) { |
574 |
if (item instanceof IRosterGroup) { |
578 |
AdditionalClient newClient = updatePresenceInGroup( |
575 |
AdditionalClientRosterEntry[] es = updatePresenceInGroup( |
579 |
(IRosterGroup) item, fromID, newPresence); |
576 |
(IRosterGroup) item, fromID, newPresence); |
580 |
if (newClient != null) |
577 |
for (int j = 0; j < es.length; j++) { |
581 |
newEntry = newClient; |
578 |
newEntrys.add(es[j]); |
|
|
579 |
} |
582 |
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) { |
580 |
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) { |
583 |
AdditionalClient newClient = updatePresenceForMatchingEntry( |
581 |
AdditionalClientRosterEntry entry = updatePresenceForMatchingEntry( |
584 |
(org.eclipse.ecf.presence.roster.RosterEntry) item, |
582 |
(org.eclipse.ecf.presence.roster.RosterEntry) item, |
585 |
fromID, newPresence); |
583 |
fromID, newPresence); |
586 |
if (newClient != null) |
584 |
if (entry != null) |
587 |
newEntry = newClient; |
585 |
newEntrys.add(entry); |
588 |
} |
586 |
} |
589 |
} |
587 |
} |
590 |
} |
588 |
} |
591 |
|
589 |
|
592 |
if (newEntry != null) { |
590 |
AdditionalClientRosterEntry[] entrys = (AdditionalClientRosterEntry[]) newEntrys |
593 |
if (newEntry.add) { |
591 |
.toArray(new AdditionalClientRosterEntry[] {}); |
594 |
if (!rosterContainsEntry(fromID)) { |
592 |
IRosterEntry entry = null; |
595 |
IRosterEntry entry = new org.eclipse.ecf.presence.roster.RosterEntry( |
593 |
if (entrys.length > 0) { |
596 |
newEntry.parent, newEntry.user, newEntry.presence); |
594 |
for (int i = 0; i < entrys.length; i++) { |
597 |
rosterManager.notifyRosterUpdate(roster); |
595 |
entry = new org.eclipse.ecf.presence.roster.RosterEntry(entrys[i].parent,entrys[i].user,entrys[i].presence); |
598 |
fireSetRosterEntry(false, entry); |
596 |
//roster.addItem(entry); |
599 |
} |
|
|
600 |
} else { |
601 |
// remove from roster as it's another client |
602 |
removeFromRoster(fromID); |
603 |
} |
597 |
} |
|
|
598 |
rosterManager.notifyRosterUpdate(roster); |
599 |
fireSetRosterEntry(false, entry); |
604 |
} |
600 |
} |
605 |
} |
601 |
} |
606 |
|
602 |
|
607 |
class AdditionalClient { |
603 |
class AdditionalClientRosterEntry { |
608 |
|
604 |
|
609 |
IRosterItem parent; |
605 |
IRosterItem parent; |
610 |
IUser user; |
606 |
IUser user; |
611 |
IPresence presence; |
607 |
IPresence presence; |
612 |
boolean add; |
608 |
|
613 |
|
609 |
public AdditionalClientRosterEntry(IRosterItem parent, IUser user, IPresence presence) { |
614 |
public AdditionalClient(IRosterItem parent, IUser user, |
|
|
615 |
IPresence presence, boolean add) { |
616 |
this.parent = parent; |
610 |
this.parent = parent; |
617 |
this.user = user; |
611 |
this.user = user; |
618 |
this.presence = presence; |
612 |
this.presence = presence; |
619 |
this.add = add; |
|
|
620 |
} |
621 |
|
622 |
public AdditionalClient(IUser user) { |
623 |
this.user = user; |
624 |
this.add = false; |
625 |
} |
626 |
} |
627 |
|
628 |
private int countClientsInRosterGroup( |
629 |
org.eclipse.ecf.presence.roster.RosterGroup group, XMPPID oldID) { |
630 |
Collection groupItems = group.getEntries(); |
631 |
int count = 0; |
632 |
for (final Iterator i = groupItems.iterator(); i.hasNext();) { |
633 |
final IRosterItem item = (IRosterItem) i.next(); |
634 |
if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) { |
635 |
org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) item; |
636 |
XMPPID entryID = (XMPPID) entry.getUser().getID(); |
637 |
if (entryID.getUsernameAtHost().equals( |
638 |
oldID.getUsernameAtHost())) |
639 |
count++; |
640 |
} |
641 |
} |
613 |
} |
642 |
return count; |
|
|
643 |
} |
614 |
} |
644 |
|
615 |
|
645 |
private int countClientsInRoster(XMPPID oldID) { |
616 |
|
646 |
Collection rosterItems = roster.getItems(); |
617 |
private AdditionalClientRosterEntry updatePresenceForMatchingEntry( |
647 |
int count = 0; |
|
|
648 |
synchronized (rosterItems) { |
649 |
for (final Iterator i = rosterItems.iterator(); i.hasNext();) { |
650 |
final IRosterItem item = (IRosterItem) i.next(); |
651 |
if (item instanceof org.eclipse.ecf.presence.roster.RosterGroup) { |
652 |
final org.eclipse.ecf.presence.roster.RosterGroup group = (org.eclipse.ecf.presence.roster.RosterGroup) item; |
653 |
count += countClientsInRosterGroup(group, oldID); |
654 |
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) { |
655 |
org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) item; |
656 |
XMPPID entryID = (XMPPID) entry.getUser().getID(); |
657 |
if (entryID.getUsernameAtHost().equals( |
658 |
oldID.getUsernameAtHost())) { |
659 |
count++; |
660 |
} |
661 |
} |
662 |
} |
663 |
} |
664 |
return count; |
665 |
} |
666 |
|
667 |
private boolean rosterGroupContainsEntry( |
668 |
org.eclipse.ecf.presence.roster.RosterGroup group, XMPPID oldID) { |
669 |
Collection groupItems = group.getEntries(); |
670 |
for (final Iterator i = groupItems.iterator(); i.hasNext();) { |
671 |
final IRosterItem item = (IRosterItem) i.next(); |
672 |
if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) { |
673 |
org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) item; |
674 |
XMPPID entryID = (XMPPID) entry.getUser().getID(); |
675 |
if (entryID.equals(oldID)) |
676 |
return true; |
677 |
} |
678 |
} |
679 |
return false; |
680 |
} |
681 |
|
682 |
private boolean rosterContainsEntry(XMPPID oldID) { |
683 |
Collection rosterItems = roster.getItems(); |
684 |
synchronized (rosterItems) { |
685 |
for (final Iterator i = rosterItems.iterator(); i.hasNext();) { |
686 |
final IRosterItem item = (IRosterItem) i.next(); |
687 |
if (item instanceof org.eclipse.ecf.presence.roster.RosterGroup) { |
688 |
final org.eclipse.ecf.presence.roster.RosterGroup group = (org.eclipse.ecf.presence.roster.RosterGroup) item; |
689 |
if (rosterGroupContainsEntry(group, oldID)) |
690 |
return true; |
691 |
} else if (item instanceof org.eclipse.ecf.presence.roster.RosterEntry) { |
692 |
org.eclipse.ecf.presence.roster.RosterEntry entry = (org.eclipse.ecf.presence.roster.RosterEntry) item; |
693 |
XMPPID entryID = (XMPPID) entry.getUser().getID(); |
694 |
if (entryID.equals(oldID)) |
695 |
return true; |
696 |
} |
697 |
} |
698 |
} |
699 |
return false; |
700 |
} |
701 |
|
702 |
private AdditionalClient removeEntryFromRoster(XMPPID oldID, |
703 |
org.eclipse.ecf.presence.roster.RosterEntry entry, |
704 |
IPresence newPresence, IUser user) { |
705 |
if (countClientsInRoster(oldID) > 1) { |
706 |
// remove this client from roster |
707 |
return new AdditionalClient(user); |
708 |
} else { |
709 |
// Last one, so we set resource to null and set presence to |
710 |
// unavailable |
711 |
oldID.setResourceName(null); |
712 |
entry.setPresence(newPresence); |
713 |
rosterManager.notifyRosterUpdate(entry); |
714 |
return null; |
715 |
} |
716 |
} |
717 |
|
718 |
private AdditionalClient updatePresenceForMatchingEntry( |
719 |
org.eclipse.ecf.presence.roster.RosterEntry entry, XMPPID fromID, |
618 |
org.eclipse.ecf.presence.roster.RosterEntry entry, XMPPID fromID, |
720 |
IPresence newPresence) { |
619 |
IPresence newPresence) { |
721 |
final IUser user = entry.getUser(); |
620 |
final IUser user = entry.getUser(); |
722 |
XMPPID oldID = (XMPPID) user.getID(); |
621 |
XMPPID oldID = (XMPPID) user.getID(); |
723 |
if (newPresence.getType().equals(IPresence.Type.UNAVAILABLE)) { |
622 |
// If the username/host part matches that means we either have to update |
724 |
// This is an unavailable presence change |
623 |
// the resource, or create a new client |
725 |
if (oldID.equals(fromID)) |
624 |
if (oldID.equals(fromID)) { |
726 |
return removeEntryFromRoster(oldID, entry, newPresence, user); |
625 |
// set the new presence state |
727 |
} else { |
626 |
entry.setPresence(newPresence); |
728 |
// This is some other presence change |
627 |
// and notify with roster update |
729 |
// If the username/host part matches that means we either have to |
628 |
rosterManager.notifyRosterUpdate(entry); |
730 |
// update |
629 |
} else if (oldID.getUsernameAtHost().equals(fromID.getUsernameAtHost())) { |
731 |
// the resource, or create a new client |
630 |
if (oldID.getResourceName() == null) { |
732 |
if (oldID.equals(fromID)) { |
631 |
oldID.setResourceName(fromID.getResourceName()); |
733 |
// set the new presence state |
632 |
// set the new presence state |
734 |
entry.setPresence(newPresence); |
633 |
entry.setPresence(newPresence); |
735 |
// and notify with roster update |
634 |
// and notify with roster update |
736 |
rosterManager.notifyRosterUpdate(entry); |
635 |
rosterManager.notifyRosterUpdate(entry); |
737 |
} else if (oldID.getUsernameAtHost().equals( |
636 |
} else if (fromID.getResourceName() != null && !newPresence.getType().equals(IPresence.Type.UNAVAILABLE)) { |
738 |
fromID.getUsernameAtHost())) { |
637 |
return new AdditionalClientRosterEntry(entry.getParent(), new User(fromID, user.getName()), newPresence); |
739 |
if (oldID.getResourceName() == null) { |
|
|
740 |
oldID.setResourceName(fromID.getResourceName()); |
741 |
// set the new presence state |
742 |
entry.setPresence(newPresence); |
743 |
// and notify with roster update |
744 |
rosterManager.notifyRosterUpdate(entry); |
745 |
} else |
746 |
return new AdditionalClient(entry.getParent(), new User( |
747 |
fromID, user.getName()), newPresence, true); |
748 |
} |
638 |
} |
749 |
} |
639 |
} |
750 |
return null; |
640 |
return null; |
751 |
} |
641 |
} |
752 |
|
642 |
|
753 |
private AdditionalClient updatePresenceInGroup(IRosterGroup group, |
643 |
private AdditionalClientRosterEntry[] updatePresenceInGroup(IRosterGroup group, |
754 |
XMPPID fromID, IPresence newPresence) { |
644 |
XMPPID fromID, IPresence newPresence) { |
|
|
645 |
List results = new ArrayList(); |
755 |
final Collection groupEntries = group.getEntries(); |
646 |
final Collection groupEntries = group.getEntries(); |
756 |
AdditionalClient newEntry = null; |
|
|
757 |
synchronized (groupEntries) { |
647 |
synchronized (groupEntries) { |
758 |
for (final Iterator i = group.getEntries().iterator(); i.hasNext();) { |
648 |
for (final Iterator i = group.getEntries().iterator(); i.hasNext();) { |
759 |
AdditionalClient newClient = updatePresenceForMatchingEntry( |
649 |
AdditionalClientRosterEntry newEntry = updatePresenceForMatchingEntry( |
760 |
(org.eclipse.ecf.presence.roster.RosterEntry) i.next(), |
650 |
(org.eclipse.ecf.presence.roster.RosterEntry) i.next(), |
761 |
fromID, newPresence); |
651 |
fromID, newPresence); |
762 |
if (newClient != null) |
652 |
if (newEntry != null) |
763 |
newEntry = newClient; |
653 |
results.add(newEntry); |
764 |
} |
654 |
} |
765 |
} |
655 |
} |
766 |
return newEntry; |
656 |
return (AdditionalClientRosterEntry[]) results.toArray(new AdditionalClientRosterEntry[] {}); |
767 |
} |
657 |
} |
768 |
|
658 |
|
769 |
protected void handleRoster(Roster roster) { |
659 |
protected void handleRoster(Roster roster) { |