/* * Copyright 2006-2010 Daniel Henninger. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */ package net.sf.kraken.protocols.oscar; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import net.kano.joscar.ssiitem.BuddyItem; import net.sf.kraken.roster.TransportBuddy; import net.sf.kraken.roster.TransportBuddyManager; /** * Representation of a AIM or ICQ specific {@link TransportBuddy}. * * OSCAR contacts are represented by the {@link BuddyItem} class. Each instance * is linked to exactly one group. A person on ones OSCAR list can exist in * multiple groups though. If this happens, multiple {@link BuddyItem}s will * exist for the same person. This implementation of Krakens {@link OSCARBuddy} * can combine multiple {@link BuddyItem} instances. In this way, it allows for * one contact list entity that is assigned to multiple groups. * * @author Daniel Henninger */ public class OSCARBuddy extends TransportBuddy { /** * The {@link BuddyItem} instances of which this {@link OSCARBuddy} instance * is a representation. Each BuddyItem is mapped by its unique ID (obtained * through {@link BuddyItem#getId()}. */ public Map<Integer,BuddyItem> buddyItems = new ConcurrentHashMap<Integer,BuddyItem>(); public OSCARBuddy(TransportBuddyManager<OSCARBuddy> manager, BuddyItem buddyItem) { super(manager, buddyItem.getScreenname(), buddyItem.getAlias(), null); buddyItems.put(buddyItem.getGroupId(), buddyItem); } /** * Runs through group id list, matching to finished collection of groups to get names. */ public void populateGroupList() { List<String> groupList = new ArrayList<String>(); final SSIHierarchy ssi = ((OSCARSession) this.getManager().getSession()).getSsiHierarchy(); for (BuddyItem buddyItem : buddyItems.values()) { try { // resolve the group name that matches the ID in the buddy item. final int groupID = buddyItem.getGroupId(); final String groupName = ssi.getGroupName(groupID); groupList.add(groupName); } catch (Exception e) { // Hrm, unknown group. Don't include. } } setGroups(groupList); } /** * Links this instance to a {@link BuddyItem} instance. Multiple BuddyItem * instances can be linked to one {@link OSCARBuddy}. This is used to * simulate one contact belonging to multiple groups on the contact list. * * This method adds the provided BuddyItem, replacing any previous BuddyItem * that has the same ID (obtained through {@link BuddyItem#getId()}. * * @param buddyItem Buddy item to attach. * @param autoPopulate Trigger an automatic regeneration of group list. */ public synchronized void tieBuddyItem(BuddyItem buddyItem, boolean autoPopulate) { buddyItems.put(buddyItem.getGroupId(), buddyItem); if (autoPopulate) { populateGroupList(); } } /** * Retrieves one of the buddy items, as tied to a group. * * @param groupId Group id of buddy item to retrieve. * @return Buddy item in said group. */ public BuddyItem getBuddyItem(int groupId) { return buddyItems.get(groupId); } /** * Removes a buddy item from the list as specified by a group id. * * @param groupId Group id of buddy item to be removed. * @param autoPopulate Trigger an automatic regeneration of group list. */ public synchronized void removeBuddyItem(int groupId, boolean autoPopulate) { buddyItems.remove(groupId); if (autoPopulate) { populateGroupList(); } } /** * Retrieves all of the buddy items associated with the buddy. * * @return List of buddy items associated with the buddy. */ public Collection<BuddyItem> getBuddyItems() { return buddyItems.values(); } /** * Updates the status of the buddy given an OSCAR FullUserInfo packet. * * @param info FullUserInfo packet to parse and set status based off of. */ // public void parseFullUserInfo(FullUserInfo info) { // PresenceType pType = PresenceType.available; // String vStatus = ""; // if (info.getAwayStatus()) { // pType = PresenceType.away; // } // // if (getManager().getSession().getTransport().getType().equals(TransportType.icq) && info.getScreenname().matches("/^\\d+$/")) { // pType = ((OSCARTransport)getManager().getSession().getTransport()).convertICQStatusToXMPP(info.getIcqStatus()); // } // // List<ExtraInfoBlock> extraInfo = info.getExtraInfoBlocks(); // if (extraInfo != null) { // for (ExtraInfoBlock i : extraInfo) { // ExtraInfoData data = i.getExtraData(); // // if (i.getType() == ExtraInfoBlock.TYPE_AVAILMSG) { // ByteBlock msgBlock = data.getData(); // int len = BinaryTools.getUShort(msgBlock, 0); // if (len >= 0) { // byte[] msgBytes = msgBlock.subBlock(2, len).toByteArray(); // String msg; // try { // msg = new String(msgBytes, "UTF-8"); // } // catch (UnsupportedEncodingException e1) { // continue; // } // if (msg.length() > 0) { // vStatus = msg; // } // } // } // } // } // // setPresenceAndStatus(pType, vStatus); // } }