package info.guardianproject.otr;
import info.guardianproject.otr.OtrDataHandler.Transfer;
import info.guardianproject.otr.app.im.engine.ChatSession;
import info.guardianproject.otr.app.im.engine.ImErrorInfo;
import info.guardianproject.otr.app.im.engine.Message;
import info.guardianproject.otr.app.im.engine.MessageListener;
import info.guardianproject.util.Debug;
import java.util.ArrayList;
import java.util.List;
import net.java.otr4j.OtrException;
import net.java.otr4j.session.SessionStatus;
import net.java.otr4j.session.TLV;
public class OtrChatListener implements MessageListener {
public static final int TLV_DATA_REQUEST = 0x100;
public static final int TLV_DATA_RESPONSE = 0x101;
private OtrChatManager mOtrChatManager;
private MessageListener mMessageListener;
public OtrChatListener(OtrChatManager otrChatManager, MessageListener listener) {
this.mOtrChatManager = otrChatManager;
this.mMessageListener = listener;
}
@Override
public boolean onIncomingMessage(ChatSession session, Message msg) {
OtrDebugLogger.log("processing incoming message: " + msg.getID());
String body = msg.getBody();
String from = msg.getFrom().getAddress();
String to = msg.getTo().getAddress();
body = Debug.injectErrors(body);
SessionStatus otrStatus = mOtrChatManager.getSessionStatus(to, from);
OtrDebugLogger.log("session status: " + otrStatus.name());
List<TLV> tlvs = new ArrayList<TLV>();
try {
// No OTR for groups (yet)
if (!session.getParticipant().isGroup()) {
body = mOtrChatManager.decryptMessage(to, from, body, tlvs);
}
if (body != null) {
msg.setBody(body);
mMessageListener.onIncomingMessage(session, msg);
}
} catch (OtrException e) {
OtrDebugLogger.log("error decrypting message", e);
msg.setBody("[You received an unreadable encrypted message]");
mMessageListener.onIncomingMessage(session, msg);
}
for (TLV tlv : tlvs) {
if (tlv.getType() == TLV_DATA_REQUEST) {
mMessageListener.onIncomingDataRequest(session, msg, tlv.getValue());
} else if (tlv.getType() == TLV_DATA_RESPONSE) {
mMessageListener.onIncomingDataResponse(session, msg, tlv.getValue());
}
}
if (mOtrChatManager.getSessionStatus(to, from) != otrStatus) {
mMessageListener.onStatusChanged(session);
}
return true;
}
@Override
public void onIncomingDataRequest(ChatSession session, Message msg, byte[] value) {
throw new UnsupportedOperationException();
}
@Override
public void onIncomingDataResponse(ChatSession session, Message msg, byte[] value) {
throw new UnsupportedOperationException();
}
@Override
public void onSendMessageError(ChatSession session, Message msg, ImErrorInfo error) {
mMessageListener.onSendMessageError(session, msg, error);
OtrDebugLogger.log("onSendMessageError: " + msg.toString());
}
@Override
public void onIncomingReceipt(ChatSession ses, String id) {
mMessageListener.onIncomingReceipt(ses, id);
}
@Override
public void onMessagePostponed(ChatSession ses, String id) {
mMessageListener.onMessagePostponed(ses, id);
}
@Override
public void onReceiptsExpected(ChatSession ses) {
mMessageListener.onReceiptsExpected(ses);
}
@Override
public void onStatusChanged(ChatSession session) {
mMessageListener.onStatusChanged(session);
}
@Override
public void onIncomingTransferRequest(Transfer transfer) {
mMessageListener.onIncomingTransferRequest(transfer);
}
}