1package eu.siacs.conversations.generator;
2
3
4import java.util.ArrayList;
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 for (final String feature : getFeatures()) {
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.muc()) {
108 packet.setTo(mam.getWith());
109 } else 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 List<Jid> jids = new ArrayList<>();
155 jids.add(jid);
156 return changeAffiliation(conference,jids,affiliation);
157 }
158
159 public IqPacket changeAffiliation(Conversation conference, List<Jid> jids, String affiliation) {
160 IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
161 packet.setTo(conference.getJid().toBareJid());
162 packet.setFrom(conference.getAccount().getJid());
163 Element query = packet.query("http://jabber.org/protocol/muc#admin");
164 for(Jid jid : jids) {
165 Element item = query.addChild("item");
166 item.setAttribute("jid", jid.toString());
167 item.setAttribute("affiliation", affiliation);
168 }
169 return packet;
170 }
171
172 public IqPacket changeRole(Conversation conference, String nick, String role) {
173 IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
174 packet.setTo(conference.getJid().toBareJid());
175 packet.setFrom(conference.getAccount().getJid());
176 Element item = packet.query("http://jabber.org/protocol/muc#admin").addChild("item");
177 item.setAttribute("nick", nick);
178 item.setAttribute("role", role);
179 return packet;
180 }
181}