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.entities.DownloadableFile;
10import eu.siacs.conversations.services.MessageArchiveService;
11import eu.siacs.conversations.services.XmppConnectionService;
12import eu.siacs.conversations.utils.PhoneHelper;
13import eu.siacs.conversations.utils.Xmlns;
14import eu.siacs.conversations.xml.Element;
15import eu.siacs.conversations.xmpp.forms.Data;
16import eu.siacs.conversations.xmpp.jid.Jid;
17import eu.siacs.conversations.xmpp.pep.Avatar;
18import eu.siacs.conversations.xmpp.stanzas.IqPacket;
19
20public class IqGenerator extends AbstractGenerator {
21
22 public IqGenerator(final XmppConnectionService service) {
23 super(service);
24 }
25
26 public IqPacket discoResponse(final IqPacket request) {
27 final IqPacket packet = new IqPacket(IqPacket.TYPE.RESULT);
28 packet.setId(request.getId());
29 packet.setTo(request.getFrom());
30 final Element query = packet.addChild("query",
31 "http://jabber.org/protocol/disco#info");
32 query.setAttribute("node", request.query().getAttribute("node"));
33 final Element identity = query.addChild("identity");
34 identity.setAttribute("category", "client");
35 identity.setAttribute("type", IDENTITY_TYPE);
36 identity.setAttribute("name", getIdentityName());
37 for (final String feature : getFeatures()) {
38 query.addChild("feature").setAttribute("var", feature);
39 }
40 return packet;
41 }
42
43 public IqPacket versionResponse(final IqPacket request) {
44 final IqPacket packet = request.generateResponse(IqPacket.TYPE.RESULT);
45 Element query = packet.query("jabber:iq:version");
46 query.addChild("name").setContent(IDENTITY_NAME);
47 query.addChild("version").setContent(getIdentityVersion());
48 return packet;
49 }
50
51 protected IqPacket publish(final String node, final Element item) {
52 final IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
53 final Element pubsub = packet.addChild("pubsub",
54 "http://jabber.org/protocol/pubsub");
55 final Element publish = pubsub.addChild("publish");
56 publish.setAttribute("node", node);
57 publish.addChild(item);
58 return packet;
59 }
60
61 protected IqPacket retrieve(String node, Element item) {
62 final IqPacket packet = new IqPacket(IqPacket.TYPE.GET);
63 final Element pubsub = packet.addChild("pubsub",
64 "http://jabber.org/protocol/pubsub");
65 final Element items = pubsub.addChild("items");
66 items.setAttribute("node", node);
67 if (item != null) {
68 items.addChild(item);
69 }
70 return packet;
71 }
72
73 public IqPacket publishAvatar(Avatar avatar) {
74 final Element item = new Element("item");
75 item.setAttribute("id", avatar.sha1sum);
76 final Element data = item.addChild("data", "urn:xmpp:avatar:data");
77 data.setContent(avatar.image);
78 return publish("urn:xmpp:avatar:data", item);
79 }
80
81 public IqPacket publishAvatarMetadata(final Avatar avatar) {
82 final Element item = new Element("item");
83 item.setAttribute("id", avatar.sha1sum);
84 final Element metadata = item
85 .addChild("metadata", "urn:xmpp:avatar:metadata");
86 final Element info = metadata.addChild("info");
87 info.setAttribute("bytes", avatar.size);
88 info.setAttribute("id", avatar.sha1sum);
89 info.setAttribute("height", avatar.height);
90 info.setAttribute("width", avatar.height);
91 info.setAttribute("type", avatar.type);
92 return publish("urn:xmpp:avatar:metadata", item);
93 }
94
95 public IqPacket retrievePepAvatar(final Avatar avatar) {
96 final Element item = new Element("item");
97 item.setAttribute("id", avatar.sha1sum);
98 final IqPacket packet = retrieve("urn:xmpp:avatar:data", item);
99 packet.setTo(avatar.owner);
100 return packet;
101 }
102
103 public IqPacket retrieveVcardAvatar(final Avatar avatar) {
104 final IqPacket packet = new IqPacket(IqPacket.TYPE.GET);
105 packet.setTo(avatar.owner);
106 packet.addChild("vCard", "vcard-temp");
107 return packet;
108 }
109
110 public IqPacket retrieveAvatarMetaData(final Jid to) {
111 final IqPacket packet = retrieve("urn:xmpp:avatar:metadata", null);
112 if (to != null) {
113 packet.setTo(to);
114 }
115 return packet;
116 }
117
118 public IqPacket queryMessageArchiveManagement(final MessageArchiveService.Query mam) {
119 final IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
120 final Element query = packet.query("urn:xmpp:mam:0");
121 query.setAttribute("queryid",mam.getQueryId());
122 final Data data = new Data();
123 data.setFormType("urn:xmpp:mam:0");
124 if (mam.muc()) {
125 packet.setTo(mam.getWith());
126 } else if (mam.getWith()!=null) {
127 data.put("with", mam.getWith().toString());
128 }
129 data.put("start",getTimestamp(mam.getStart()));
130 data.put("end",getTimestamp(mam.getEnd()));
131 query.addChild(data);
132 if (mam.getPagingOrder() == MessageArchiveService.PagingOrder.REVERSE) {
133 query.addChild("set", "http://jabber.org/protocol/rsm").addChild("before").setContent(mam.getReference());
134 } else if (mam.getReference() != null) {
135 query.addChild("set", "http://jabber.org/protocol/rsm").addChild("after").setContent(mam.getReference());
136 }
137 return packet;
138 }
139 public IqPacket generateGetBlockList() {
140 final IqPacket iq = new IqPacket(IqPacket.TYPE.GET);
141 iq.addChild("blocklist", Xmlns.BLOCKING);
142
143 return iq;
144 }
145
146 public IqPacket generateSetBlockRequest(final Jid jid) {
147 final IqPacket iq = new IqPacket(IqPacket.TYPE.SET);
148 final Element block = iq.addChild("block", Xmlns.BLOCKING);
149 block.addChild("item").setAttribute("jid", jid.toBareJid().toString());
150 return iq;
151 }
152
153 public IqPacket generateSetUnblockRequest(final Jid jid) {
154 final IqPacket iq = new IqPacket(IqPacket.TYPE.SET);
155 final Element block = iq.addChild("unblock", Xmlns.BLOCKING);
156 block.addChild("item").setAttribute("jid", jid.toBareJid().toString());
157 return iq;
158 }
159
160 public IqPacket generateSetPassword(final Account account, final String newPassword) {
161 final IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
162 packet.setTo(account.getServer());
163 final Element query = packet.addChild("query", Xmlns.REGISTER);
164 final Jid jid = account.getJid();
165 query.addChild("username").setContent(jid.getLocalpart());
166 query.addChild("password").setContent(newPassword);
167 return packet;
168 }
169
170 public IqPacket changeAffiliation(Conversation conference, Jid jid, String affiliation) {
171 List<Jid> jids = new ArrayList<>();
172 jids.add(jid);
173 return changeAffiliation(conference,jids,affiliation);
174 }
175
176 public IqPacket changeAffiliation(Conversation conference, List<Jid> jids, String affiliation) {
177 IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
178 packet.setTo(conference.getJid().toBareJid());
179 packet.setFrom(conference.getAccount().getJid());
180 Element query = packet.query("http://jabber.org/protocol/muc#admin");
181 for(Jid jid : jids) {
182 Element item = query.addChild("item");
183 item.setAttribute("jid", jid.toString());
184 item.setAttribute("affiliation", affiliation);
185 }
186 return packet;
187 }
188
189 public IqPacket changeRole(Conversation conference, String nick, String role) {
190 IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
191 packet.setTo(conference.getJid().toBareJid());
192 packet.setFrom(conference.getAccount().getJid());
193 Element item = packet.query("http://jabber.org/protocol/muc#admin").addChild("item");
194 item.setAttribute("nick", nick);
195 item.setAttribute("role", role);
196 return packet;
197 }
198
199 public IqPacket requestHttpUploadSlot(Jid host, DownloadableFile file) {
200 IqPacket packet = new IqPacket(IqPacket.TYPE.GET);
201 packet.setTo(host);
202 Element request = packet.addChild("request",Xmlns.HTTP_UPLOAD);
203 request.addChild("filename").setContent(file.getName());
204 request.addChild("size").setContent(String.valueOf(file.getExpectedSize()));
205 return packet;
206 }
207}