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