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