package info.guardianproject.otr.app.im.plugin.xmpp; import info.guardianproject.otr.OtrChatManager; import info.guardianproject.otr.app.im.engine.ChatSession; import info.guardianproject.otr.app.im.engine.Contact; import info.guardianproject.otr.app.im.engine.Message; import java.util.Date; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.packet.Packet; import android.util.Log; public class XmppChatPacketListener implements PacketListener { private XmppConnection xConn; private OtrChatManager otrMgr; private final static String TAG = "Xmpp"; private final static String OTR_INIT_STRING = "?OTR?v2?"; private final static String OTR_HEADER_STRING = "?OTR"; public XmppChatPacketListener (XmppConnection xConn) { this.xConn = xConn; } /** * @return the otrMgr */ public OtrChatManager getOtrMgr() { return otrMgr; } /** * @param otrMgr the otrMgr to set */ public void setOtrMgr(OtrChatManager otrMgr) { this.otrMgr = otrMgr; } @Override public void processPacket(Packet packet) { org.jivesoftware.smack.packet.Message message = (org.jivesoftware.smack.packet.Message) packet; if (message != null && message.getBody()!=null) { //android.os.Debug.waitForDebugger(); String msgBody = message.getBody(); Log.i(TAG, "msg.id: " + message.getPacketID()); Log.i(TAG, "msg.from: " + message.getFrom()); Log.i(TAG, "msg.to: " + message.getTo()); Log.i(TAG, "msg.body: " + message.getBody()); if (msgBody.indexOf(OTR_INIT_STRING)!=-1) { //start a new session if (otrMgr == null) { otrMgr = new OtrChatManager(xConn); xConn.setOtrManager(otrMgr); } } else if ((otrMgr == null && msgBody.indexOf(OTR_HEADER_STRING)!=-1)) { //restart session otrMgr = new OtrChatManager(xConn); xConn.setOtrManager(otrMgr); otrMgr.refreshSession(message.getTo(), message.getFrom()); } if (otrMgr != null) { msgBody = (otrMgr.receiveMessage(message.getTo(), message.getFrom(), msgBody)); } Message rec = new Message(msgBody); rec.setBody(msgBody); String address = parseAddressBase(message.getFrom()); ChatSession session = findOrCreateSession(address); rec.setFrom(session.getParticipant().getAddress()); rec.setDateTime(new Date()); session.onReceiveMessage(rec); } } protected static String parseAddressBase(String from) { return from.replaceFirst("/.*", ""); } private ChatSession findOrCreateSession(String address) { ChatSession session = xConn.findSession(address); if (session == null) { Contact contact = xConn.findOrCreateContact(address); session = xConn.createChatSession(contact); } return session; } }