/**
*
*/
package it.yup.xmpp;
import it.yup.xml.Element;
import it.yup.xmlstream.BasicXmlStream;
import it.yup.xmlstream.EventQuery;
import it.yup.xmpp.packets.Iq;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
/**
* @author luca
*
*/
class IqManager extends IQResultListener {
private static IqManager _instance = null;
/**
*
*/
private IqManager() {
// TODO Auto-generated constructor stub
}
private Hashtable iqs = new Hashtable();
public void streamInitialized(){
// prepare the Iq listener
EventQuery eq = new EventQuery("iq", new String[] { "type" },
new String[] { "error" });
BasicXmlStream.addEventListener(eq, _instance);
eq = new EventQuery("iq", new String[] { "type" },
new String[] { "result" });
BasicXmlStream.addEventListener(eq, _instance);
}
public static IqManager getInstance() {
if (_instance == null) {
_instance = new IqManager();
}
return _instance;
}
public void handleError(Element e) {
handleAnswer(e, false);
}
public void handleResult(Element e) {
handleAnswer(e, true);
}
private void handleAnswer(Element e, boolean result) {
String id = e.getAttribute(Iq.ATT_ID);
IQResultListener listener = null;
synchronized (iqs) {
listener = (IQResultListener) iqs.remove(id);
// #mdebug
//@ if (listener != null) {
//@ System.out.println("IQM Removed: " + id);
//@ }
// #enddebug
}
if (listener != null) if (result) listener.handleResult(e);
else
listener.handleError(e);
purge();
}
private void purge() {
synchronized (iqs) {
Enumeration en = iqs.keys();
Vector keysToRemove = new Vector();
while (en.hasMoreElements()) {
Object key = (Object) en.nextElement();
IQResultListener listener = (IQResultListener) iqs.get(key);
if (listener.registerTime + Config.MAX_PERM_TIME < System
.currentTimeMillis()) keysToRemove.addElement(key);
}
en = keysToRemove.elements();
while (en.hasMoreElements()) {
Object key = en.nextElement();
iqs.remove(key);
// #mdebug
//@ System.out.println("IQM Purged: " + key);
// #enddebug
}
}
}
public void addRegistration(Iq iq, IQResultListener listener) {
synchronized (iqs) {
listener.registerTime = System.currentTimeMillis();
iqs.put(iq.getAttribute(Iq.ATT_ID), listener);
// #mdebug
//@ System.out.println("IQM Added: " + iq.getAttribute(Iq.ATT_ID));
// #enddebug
}
}
}