1package eu.siacs.conversations.generator;
2
3import java.util.Arrays;
4import java.util.Collections;
5import java.util.List;
6
7import eu.siacs.conversations.services.MessageArchiveService;
8import eu.siacs.conversations.services.XmppConnectionService;
9import eu.siacs.conversations.utils.Xmlns;
10import eu.siacs.conversations.xml.Element;
11import eu.siacs.conversations.xmpp.forms.Data;
12import eu.siacs.conversations.xmpp.jid.Jid;
13import eu.siacs.conversations.xmpp.pep.Avatar;
14import eu.siacs.conversations.xmpp.stanzas.IqPacket;
15
16public class IqGenerator extends AbstractGenerator {
17
18 public IqGenerator(final XmppConnectionService service) {
19 super(service);
20 }
21
22 public IqPacket discoResponse(final IqPacket request) {
23 final IqPacket packet = new IqPacket(IqPacket.TYPE_RESULT);
24 packet.setId(request.getId());
25 packet.setTo(request.getFrom());
26 final Element query = packet.addChild("query",
27 "http://jabber.org/protocol/disco#info");
28 query.setAttribute("node", request.query().getAttribute("node"));
29 final Element identity = query.addChild("identity");
30 identity.setAttribute("category", "client");
31 identity.setAttribute("type", this.IDENTITY_TYPE);
32 identity.setAttribute("name", IDENTITY_NAME);
33 final List<String> features = Arrays.asList(FEATURES);
34 Collections.sort(features);
35 for (final String feature : features) {
36 query.addChild("feature").setAttribute("var", feature);
37 }
38 return packet;
39 }
40
41 protected IqPacket publish(final String node, final Element item) {
42 final IqPacket packet = new IqPacket(IqPacket.TYPE_SET);
43 final Element pubsub = packet.addChild("pubsub",
44 "http://jabber.org/protocol/pubsub");
45 final Element publish = pubsub.addChild("publish");
46 publish.setAttribute("node", node);
47 publish.addChild(item);
48 return packet;
49 }
50
51 protected IqPacket retrieve(String node, Element item) {
52 final IqPacket packet = new IqPacket(IqPacket.TYPE_GET);
53 final Element pubsub = packet.addChild("pubsub",
54 "http://jabber.org/protocol/pubsub");
55 final Element items = pubsub.addChild("items");
56 items.setAttribute("node", node);
57 if (item != null) {
58 items.addChild(item);
59 }
60 return packet;
61 }
62
63 public IqPacket publishAvatar(Avatar avatar) {
64 final Element item = new Element("item");
65 item.setAttribute("id", avatar.sha1sum);
66 final Element data = item.addChild("data", "urn:xmpp:avatar:data");
67 data.setContent(avatar.image);
68 return publish("urn:xmpp:avatar:data", item);
69 }
70
71 public IqPacket publishAvatarMetadata(final Avatar avatar) {
72 final Element item = new Element("item");
73 item.setAttribute("id", avatar.sha1sum);
74 final Element metadata = item
75 .addChild("metadata", "urn:xmpp:avatar:metadata");
76 final Element info = metadata.addChild("info");
77 info.setAttribute("bytes", avatar.size);
78 info.setAttribute("id", avatar.sha1sum);
79 info.setAttribute("height", avatar.height);
80 info.setAttribute("width", avatar.height);
81 info.setAttribute("type", avatar.type);
82 return publish("urn:xmpp:avatar:metadata", item);
83 }
84
85 public IqPacket retrieveAvatar(final Avatar avatar) {
86 final Element item = new Element("item");
87 item.setAttribute("id", avatar.sha1sum);
88 final IqPacket packet = retrieve("urn:xmpp:avatar:data", item);
89 packet.setTo(avatar.owner);
90 return packet;
91 }
92
93 public IqPacket retrieveAvatarMetaData(final Jid to) {
94 final IqPacket packet = retrieve("urn:xmpp:avatar:metadata", null);
95 if (to != null) {
96 packet.setTo(to);
97 }
98 return packet;
99 }
100
101 public IqPacket queryMessageArchiveManagement(final MessageArchiveService.Query mam) {
102 final IqPacket packet = new IqPacket(IqPacket.TYPE_SET);
103 final Element query = packet.query("urn:xmpp:mam:0");
104 query.setAttribute("queryid",mam.getQueryId());
105 final Data data = new Data();
106 data.setFormType("urn:xmpp:mam:0");
107 if (mam.getWith()!=null) {
108 data.put("with", mam.getWith().toString());
109 }
110 data.put("start",getTimestamp(mam.getStart()));
111 data.put("end",getTimestamp(mam.getEnd()));
112 query.addChild(data);
113 if (mam.getPagingOrder() == MessageArchiveService.PagingOrder.REVERSE) {
114 query.addChild("set", "http://jabber.org/protocol/rsm").addChild("before").setContent(mam.getReference());
115 } else if (mam.getReference() != null) {
116 query.addChild("set", "http://jabber.org/protocol/rsm").addChild("after").setContent(mam.getReference());
117 }
118 return packet;
119 }
120
121 public IqPacket generateGetBlockList() {
122 final IqPacket iq = new IqPacket(IqPacket.TYPE_GET);
123 iq.addChild("blocklist", Xmlns.BLOCKING);
124
125 return iq;
126 }
127
128 public IqPacket generateSetBlockRequest(final Jid jid) {
129 final IqPacket iq = new IqPacket(IqPacket.TYPE_SET);
130 final Element block = iq.addChild("block", Xmlns.BLOCKING);
131 block.addChild("item").setAttribute("jid", jid.toBareJid().toString());
132 return iq;
133 }
134
135 public IqPacket generateSetUnblockRequest(final Jid jid) {
136 final IqPacket iq = new IqPacket(IqPacket.TYPE_SET);
137 final Element block = iq.addChild("unblock", Xmlns.BLOCKING);
138 block.addChild("item").setAttribute("jid", jid.toBareJid().toString());
139 return iq;
140 }
141}