/* * Copyright (c) 2002-2003, The Joust Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * - Neither the name of the Joust Project nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * File created by keith @ Feb 24, 2003 * */ package edu.tufts.vue.collab.im; import net.kano.joscar.snac.SnacRequest; import java.util.ArrayList; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; public class SnacManager { protected Map conns = new HashMap(); protected PendingSnacMgr pendingSnacs = new PendingSnacMgr(); protected List listeners = new ArrayList(); protected Map supportedFamilies = new IdentityHashMap(); public SnacManager() { } public SnacManager(PendingSnacListener listener) { addListener(listener); } public void register(BasicConn conn) { int[] families = conn.getSnacFamilies(); supportedFamilies.put(conn, families); for (int i = 0; i < families.length; i++) { int familyCode = families[i]; Integer family = new Integer(familyCode); List handlers = (List) conns.get(family); if (handlers == null) { handlers = new LinkedList(); conns.put(family, handlers); } if (!handlers.contains(conn)) handlers.add(conn); } } public void dequeueSnacs(BasicConn conn) { int[] infos = (int[]) supportedFamilies.get(conn); if (infos != null) { for (int i = 0; i < infos.length; i++) { int familyCode = infos[i]; if (pendingSnacs.isPending(familyCode)) { dequeueSnacs(familyCode); } } } } protected void dequeueSnacs(int familyCode) { SnacRequest[] pending = pendingSnacs.getPending(familyCode); pendingSnacs.setPending(familyCode, false); for (Iterator it = listeners.iterator(); it.hasNext();) { PendingSnacListener listener = (PendingSnacListener) it.next(); listener.dequeueSnacs(pending); } } public void unregister(BasicConn conn) { for (Iterator it = conns.values().iterator(); it.hasNext();) { List handlers = (List) it.next(); handlers.remove(conn); } } public BasicConn getConn(int familyCode) { Integer family = new Integer(familyCode); List handlers = (List) conns.get(family); if (handlers == null || handlers.size() == 0) return null; return (BasicConn) handlers.get(0); } public boolean isPending(int familyCode) { return pendingSnacs.isPending(familyCode); } public void addRequest(SnacRequest request) { pendingSnacs.add(request); } public void addListener(PendingSnacListener l) { if (!listeners.contains(l)) listeners.add(l); } public void removeListener(PendingSnacListener l) { listeners.remove(l); } public void setPending(int family, boolean pending) { pendingSnacs.setPending(family, pending); } }