package org.societies.comm.xmpp.client.impl;
import java.io.IOException;
import java.util.List;
import java.util.Map.Entry;
import javax.xml.parsers.ParserConfigurationException;
import org.societies.api.comm.xmpp.datatypes.Stanza;
import org.societies.api.comm.xmpp.datatypes.StanzaError;
import org.societies.api.comm.xmpp.exceptions.XMPPError;
import org.societies.api.comm.xmpp.interfaces.ICommCallback;
import org.societies.api.identity.IIdentity;
import org.societies.api.identity.IIdentityManager;
import org.societies.api.identity.InvalidFormatException;
import org.societies.identity.IdentityManagerImpl;
import org.societies.interfaces.Callback;
import org.xml.sax.SAXException;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Packet;
import android.content.Context;
import android.content.ServiceConnection;
import android.util.Log;
public class CallbackAdapter implements Callback {
private static final String LOG_TAG = CallbackAdapter.class.getName();
private ICommCallback callback;
private Context context;
private ServiceConnection service;
private PacketMarshaller marshaller;
public CallbackAdapter(ICommCallback callback, Context context, ServiceConnection service, PacketMarshaller marshaller) {
Log.d(LOG_TAG, "CallbackAdapter created");
this.callback = callback;
this.context = context;
this.service = service;
this.marshaller = marshaller;
}
@Override
public void receiveResult(String xml) {
// Log.d(LOG_TAG, "receiveResult result: " + xml );
unbindService();
try {
Packet packet = marshaller.unmarshallIq(xml);
Object payload = marshaller.unmarshallPayload(packet);
callback.receiveResult(stanzaFromPacket(packet), payload);
} catch (Exception e) {
Log.e(LOG_TAG, e.getMessage(), e);
}
}
@Override
public void receiveError(String xml) {
// Log.d(LOG_TAG, "receiveError error: " + xml );
unbindService();
try {
Packet packet = marshaller.unmarshallIq(xml);
XMPPError error = marshaller.unmarshallError(packet);
callback.receiveError(stanzaFromPacket(packet), error);
} catch (Exception e) {
Log.e(LOG_TAG, e.getMessage(), e);
}
}
public void receiveItems(String xml) {
// Log.d(LOG_TAG, "receiveItems items: " + xml );
unbindService();
try {
Packet packet = marshaller.unmarshallIq(xml);
Entry<String, List<String>> nodeMap = marshaller.parseItemsResult(packet);
callback.receiveItems(stanzaFromPacket(packet), nodeMap.getKey(), nodeMap.getValue());
} catch (Exception e) {
Log.e(LOG_TAG, e.getMessage(), e);
}
}
public void receiveMessage(String xml) {
// Log.d(LOG_TAG, "receiveMessage message: " + xml );
try {
Packet packet = marshaller.unmarshallMessage(xml);
Object payload = marshaller.unmarshallPayload(packet);
callback.receiveMessage(stanzaFromPacket(packet), payload);
} catch (Exception e) {
Log.e(LOG_TAG, e.getMessage(), e);
}
}
private void unbindService() {
Log.d(LOG_TAG, "unbindService for: " + service.toString() + " " + System.currentTimeMillis());
context.unbindService(service);
}
private Stanza stanzaFromPacket(Packet packet) {
Log.d(LOG_TAG, "stanzaFromPacket packet: " + packet.getPacketID());
try {
IIdentity to = IdentityManagerImpl.staticfromJid(packet.getTo().toString());
IIdentity from =IdentityManagerImpl.staticfromJid(packet.getFrom().toString());
Stanza returnStanza = new Stanza(packet.getPacketID(), from, to);
return returnStanza;
} catch (InvalidFormatException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}