MessageGenerator.java

  1package eu.siacs.conversations.generator;
  2
  3import java.text.SimpleDateFormat;
  4import java.util.Date;
  5import java.util.Locale;
  6import java.util.TimeZone;
  7
  8import net.java.otr4j.OtrException;
  9import net.java.otr4j.session.Session;
 10import eu.siacs.conversations.entities.Account;
 11import eu.siacs.conversations.entities.Conversation;
 12import eu.siacs.conversations.entities.Message;
 13import eu.siacs.conversations.services.XmppConnectionService;
 14import eu.siacs.conversations.xml.Element;
 15import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
 16
 17public class MessageGenerator extends AbstractGenerator {
 18	public MessageGenerator(XmppConnectionService service) {
 19		super(service);
 20	}
 21
 22	private MessagePacket preparePacket(Message message, boolean addDelay) {
 23		Conversation conversation = message.getConversation();
 24		Account account = conversation.getAccount();
 25		MessagePacket packet = new MessagePacket();
 26		if (conversation.getMode() == Conversation.MODE_SINGLE) {
 27			packet.setTo(message.getCounterpart());
 28			packet.setType(MessagePacket.TYPE_CHAT);
 29			packet.addChild("markable", "urn:xmpp:chat-markers:0");
 30			if (this.mXmppConnectionService.indicateReceived()) {
 31				packet.addChild("request", "urn:xmpp:receipts");
 32			}
 33		} else if (message.getType() == Message.TYPE_PRIVATE) {
 34			packet.setTo(message.getCounterpart());
 35			packet.setType(MessagePacket.TYPE_CHAT);
 36		} else {
 37			packet.setTo(message.getCounterpart().split("/", 2)[0]);
 38			packet.setType(MessagePacket.TYPE_GROUPCHAT);
 39		}
 40		packet.setFrom(account.getFullJid());
 41		packet.setId(message.getUuid());
 42		if (addDelay) {
 43			addDelay(packet, message.getTimeSent());
 44		}
 45		return packet;
 46	}
 47
 48	private void addDelay(MessagePacket packet, long timestamp) {
 49		final SimpleDateFormat mDateFormat = new SimpleDateFormat(
 50				"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
 51		mDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
 52		Element delay = packet.addChild("delay", "urn:xmpp:delay");
 53		Date date = new Date(timestamp);
 54		delay.setAttribute("stamp", mDateFormat.format(date));
 55	}
 56
 57	public MessagePacket generateOtrChat(Message message) {
 58		return generateOtrChat(message, false);
 59	}
 60
 61	public MessagePacket generateOtrChat(Message message, boolean addDelay) {
 62		Session otrSession = message.getConversation().getOtrSession();
 63		if (otrSession == null) {
 64			return null;
 65		}
 66		MessagePacket packet = preparePacket(message, addDelay);
 67		packet.addChild("private", "urn:xmpp:carbons:2");
 68		packet.addChild("no-copy", "urn:xmpp:hints");
 69		try {
 70			packet.setBody(otrSession.transformSending(message.getBody()));
 71			return packet;
 72		} catch (OtrException e) {
 73			return null;
 74		}
 75	}
 76
 77	public MessagePacket generateChat(Message message) {
 78		return generateChat(message, false);
 79	}
 80
 81	public MessagePacket generateChat(Message message, boolean addDelay) {
 82		MessagePacket packet = preparePacket(message, addDelay);
 83		packet.setBody(message.getBody());
 84		return packet;
 85	}
 86
 87	public MessagePacket generatePgpChat(Message message) {
 88		return generatePgpChat(message, false);
 89	}
 90
 91	public MessagePacket generatePgpChat(Message message, boolean addDelay) {
 92		MessagePacket packet = preparePacket(message, addDelay);
 93		packet.setBody("This is an XEP-0027 encryted message");
 94		if (message.getEncryption() == Message.ENCRYPTION_DECRYPTED) {
 95			packet.addChild("x", "jabber:x:encrypted").setContent(
 96					message.getEncryptedBody());
 97		} else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
 98			packet.addChild("x", "jabber:x:encrypted").setContent(
 99					message.getBody());
100		}
101		return packet;
102	}
103
104	public MessagePacket generateNotAcceptable(MessagePacket origin) {
105		MessagePacket packet = generateError(origin);
106		Element error = packet.addChild("error");
107		error.setAttribute("type", "modify");
108		error.setAttribute("code", "406");
109		error.addChild("not-acceptable");
110		return packet;
111	}
112
113	private MessagePacket generateError(MessagePacket origin) {
114		MessagePacket packet = new MessagePacket();
115		packet.setId(origin.getId());
116		packet.setTo(origin.getFrom());
117		packet.setBody(origin.getBody());
118		packet.setType(MessagePacket.TYPE_ERROR);
119		return packet;
120	}
121
122	public MessagePacket confirm(Account account, String to, String id) {
123		MessagePacket packet = new MessagePacket();
124		packet.setType(MessagePacket.TYPE_NORMAL);
125		packet.setTo(to);
126		packet.setFrom(account.getFullJid());
127		Element received = packet.addChild("displayed",
128				"urn:xmpp:chat-markers:0");
129		received.setAttribute("id", id);
130		return packet;
131	}
132
133	public MessagePacket conferenceSubject(Conversation conversation,
134			String subject) {
135		MessagePacket packet = new MessagePacket();
136		packet.setType(MessagePacket.TYPE_GROUPCHAT);
137		packet.setTo(conversation.getContactJid().split("/", 2)[0]);
138		Element subjectChild = new Element("subject");
139		subjectChild.setContent(subject);
140		packet.addChild(subjectChild);
141		packet.setFrom(conversation.getAccount().getJid());
142		return packet;
143	}
144
145	public MessagePacket directInvite(Conversation conversation, String contact) {
146		MessagePacket packet = new MessagePacket();
147		packet.setType(MessagePacket.TYPE_NORMAL);
148		packet.setTo(contact);
149		packet.setFrom(conversation.getAccount().getFullJid());
150		Element x = packet.addChild("x", "jabber:x:conference");
151		x.setAttribute("jid", conversation.getContactJid().split("/", 2)[0]);
152		return packet;
153	}
154
155	public MessagePacket invite(Conversation conversation, String contact) {
156		MessagePacket packet = new MessagePacket();
157		packet.setTo(conversation.getContactJid().split("/", 2)[0]);
158		packet.setFrom(conversation.getAccount().getFullJid());
159		Element x = new Element("x");
160		x.setAttribute("xmlns", "http://jabber.org/protocol/muc#user");
161		Element invite = new Element("invite");
162		invite.setAttribute("to", contact);
163		x.addChild(invite);
164		packet.addChild(x);
165		return packet;
166	}
167
168	public MessagePacket received(Account account,
169			MessagePacket originalMessage, String namespace) {
170		MessagePacket receivedPacket = new MessagePacket();
171		receivedPacket.setType(MessagePacket.TYPE_NORMAL);
172		receivedPacket.setTo(originalMessage.getFrom());
173		receivedPacket.setFrom(account.getFullJid());
174		Element received = receivedPacket.addChild("received", namespace);
175		received.setAttribute("id", originalMessage.getId());
176		return receivedPacket;
177	}
178}