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.xml.Element;
10import eu.siacs.conversations.xmpp.forms.Data;
11import eu.siacs.conversations.xmpp.jid.Jid;
12import eu.siacs.conversations.xmpp.pep.Avatar;
13import eu.siacs.conversations.xmpp.stanzas.IqPacket;
14
15public class IqGenerator extends AbstractGenerator {
16
17 public IqGenerator(XmppConnectionService service) {
18 super(service);
19 }
20
21 public IqPacket discoResponse(IqPacket request) {
22 IqPacket packet = new IqPacket(IqPacket.TYPE_RESULT);
23 packet.setId(request.getId());
24 packet.setTo(request.getFrom());
25 Element query = packet.addChild("query",
26 "http://jabber.org/protocol/disco#info");
27 query.setAttribute("node", request.query().getAttribute("node"));
28 Element identity = query.addChild("identity");
29 identity.setAttribute("category", "client");
30 identity.setAttribute("type", this.IDENTITY_TYPE);
31 identity.setAttribute("name", IDENTITY_NAME);
32 List<String> features = Arrays.asList(FEATURES);
33 Collections.sort(features);
34 for (String feature : features) {
35 query.addChild("feature").setAttribute("var", feature);
36 }
37 return packet;
38 }
39
40 protected IqPacket publish(String node, Element item) {
41 IqPacket packet = new IqPacket(IqPacket.TYPE_SET);
42 Element pubsub = packet.addChild("pubsub",
43 "http://jabber.org/protocol/pubsub");
44 Element publish = pubsub.addChild("publish");
45 publish.setAttribute("node", node);
46 publish.addChild(item);
47 return packet;
48 }
49
50 protected IqPacket retrieve(String node, Element item) {
51 IqPacket packet = new IqPacket(IqPacket.TYPE_GET);
52 Element pubsub = packet.addChild("pubsub",
53 "http://jabber.org/protocol/pubsub");
54 Element items = pubsub.addChild("items");
55 items.setAttribute("node", node);
56 if (item != null) {
57 items.addChild(item);
58 }
59 return packet;
60 }
61
62 public IqPacket publishAvatar(Avatar avatar) {
63 Element item = new Element("item");
64 item.setAttribute("id", avatar.sha1sum);
65 Element data = item.addChild("data", "urn:xmpp:avatar:data");
66 data.setContent(avatar.image);
67 return publish("urn:xmpp:avatar:data", item);
68 }
69
70 public IqPacket publishAvatarMetadata(Avatar avatar) {
71 Element item = new Element("item");
72 item.setAttribute("id", avatar.sha1sum);
73 Element metadata = item
74 .addChild("metadata", "urn:xmpp:avatar:metadata");
75 Element info = metadata.addChild("info");
76 info.setAttribute("bytes", avatar.size);
77 info.setAttribute("id", avatar.sha1sum);
78 info.setAttribute("height", avatar.height);
79 info.setAttribute("width", avatar.height);
80 info.setAttribute("type", avatar.type);
81 return publish("urn:xmpp:avatar:metadata", item);
82 }
83
84 public IqPacket retrieveAvatar(Avatar avatar) {
85 Element item = new Element("item");
86 item.setAttribute("id", avatar.sha1sum);
87 IqPacket packet = retrieve("urn:xmpp:avatar:data", item);
88 packet.setTo(avatar.owner);
89 return packet;
90 }
91
92 public IqPacket retrieveAvatarMetaData(final Jid to) {
93 final IqPacket packet = retrieve("urn:xmpp:avatar:metadata", null);
94 if (to != null) {
95 packet.setTo(to);
96 }
97 return packet;
98 }
99
100 public IqPacket queryMessageArchiveManagement(MessageArchiveService.Query mam) {
101 final IqPacket packet = new IqPacket(IqPacket.TYPE_SET);
102 Element query = packet.query("urn:xmpp:mam:0");
103 query.setAttribute("queryid",mam.getQueryId());
104 Data data = new Data();
105 data.setFormType("urn:xmpp:mam:0");
106 data.put("with",mam.getWith().toString());
107 data.put("start",getTimestamp(mam.getStart()));
108 data.put("end",getTimestamp(mam.getEnd()));
109 query.addChild(data);
110 if (mam.getAfter() != null) {
111 query.addChild("set", "http://jabber.org/protocol/rsm").addChild("after").setContent(mam.getAfter());
112 }
113 return packet;
114 }
115}