package nl.topicus.konijn.violet.factories; import java.io.ByteArrayOutputStream; import java.util.List; import nl.topicus.konijn.WicketApplication; import nl.topicus.konijn.violet.Message; import nl.topicus.konijn.violet.SOURCE; import nl.topicus.konijn.xmpp.MyXMPPServer; import nl.topicus.konijn.xmpp.util.BunniePresenceCache; import org.apache.commons.codec.binary.Base64; import org.apache.vysper.xmpp.addressing.Entity; import org.apache.vysper.xmpp.delivery.failure.DeliveryException; import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy; import org.apache.vysper.xmpp.stanza.StanzaBuilder; import org.apache.wicket.Application; public class MessagePacketFactory extends AbstractVioletFactory { public static boolean sendMessage(String connectedUid, List<Message> messages) { MyXMPPServer server = ((WicketApplication) Application.get()) .getXmppFactory().getServer(); BunniePresenceCache cache = (BunniePresenceCache) server .getServerRuntimeContext().getPresenceCache(); Entity nab = cache.getNode(connectedUid); Entity serverEnt = server.getServerRuntimeContext().getServerEnitity(); if (nab == null) { LOGGER.warn("Sending message to unconnected nabaztag " + connectedUid + " failed"); return false; } else { LOGGER.info("Sending message to: " + nab.getFullQualifiedName()); } byte[] strMessage = Base64.encodeBase64(MessagePacketFactory .composeSimpleMessage(messages)); StanzaBuilder stanzaBuilder = StanzaBuilder .createMessageStanza(serverEnt, nab, null, null) .addAttribute("id", "message-12626205") .startInnerElement("packet", "violet:packet") .addText(new String(strMessage)) .addAttribute("to", nab.getFullQualifiedName()) .addAttribute("format", "1.0").addAttribute("ttl", "604800") .endInnerElement(); try { server.getServerRuntimeContext() .getStanzaRelay() .relay(nab, stanzaBuilder.build(), new IgnoreFailureStrategy()); } catch (DeliveryException e) { LOGGER.warn("Could not deliver message packet to " + connectedUid); return false; } return true; } public static byte[] composeSimpleMessage(List<Message> messages) { String dataArray = ""; ByteArrayOutputStream packArray = new ByteArrayOutputStream(); for (Message msg : messages) { if (msg.getValue() != null) dataArray += msg.getSource() + " " + msg.getValue() + "\n"; else dataArray += msg.getSource() + "\n"; } byte[] encrypted = crypt8(dataArray, 0x47, 47); packArray.write(SOURCE.PACKET_START.getId()); packArray.write(SOURCE.MESSAGE.getId()); writeIntTo3Bytes(packArray, 1 + encrypted.length); packArray.write(0x0); packArray.write(encrypted, 0, encrypted.length); packArray.write(SOURCE.EOF.getId()); return packArray.toByteArray(); } }