1package eu.siacs.conversations.parser;
2
3
4import java.text.ParseException;
5import java.text.SimpleDateFormat;
6import java.util.Date;
7import java.util.Locale;
8
9import eu.siacs.conversations.entities.Account;
10import eu.siacs.conversations.entities.Contact;
11import eu.siacs.conversations.entities.Conversation;
12import eu.siacs.conversations.entities.MucOptions;
13import eu.siacs.conversations.services.XmppConnectionService;
14import eu.siacs.conversations.xml.Element;
15import eu.siacs.conversations.xmpp.jid.InvalidJidException;
16import eu.siacs.conversations.xmpp.jid.Jid;
17import eu.siacs.conversations.xmpp.stanzas.AbstractStanza;
18
19public abstract class AbstractParser {
20
21 protected XmppConnectionService mXmppConnectionService;
22
23 protected AbstractParser(XmppConnectionService service) {
24 this.mXmppConnectionService = service;
25 }
26
27 public static Long getTimestamp(Element element, Long defaultValue) {
28 Element delay = element.findChild("delay","urn:xmpp:delay");
29 if (delay != null) {
30 String stamp = delay.getAttribute("stamp");
31 if (stamp != null) {
32 try {
33 return AbstractParser.parseTimestamp(delay.getAttribute("stamp")).getTime();
34 } catch (ParseException e) {
35 return defaultValue;
36 }
37 }
38 }
39 return defaultValue;
40 }
41
42 protected long getTimestamp(Element packet) {
43 return getTimestamp(packet,System.currentTimeMillis());
44 }
45
46 public static Date parseTimestamp(String timestamp) throws ParseException {
47 timestamp = timestamp.replace("Z", "+0000");
48 SimpleDateFormat dateFormat;
49 timestamp = timestamp.substring(0,19)+timestamp.substring(timestamp.length() -5,timestamp.length());
50 dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",Locale.US);
51 return dateFormat.parse(timestamp);
52 }
53
54 protected void updateLastseen(long timestamp, final Account account, final Jid from) {
55 final String presence = from == null || from.isBareJid() ? "" : from.getResourcepart();
56 final Contact contact = account.getRoster().getContact(from);
57 if (timestamp >= contact.lastseen.time) {
58 contact.lastseen.time = timestamp;
59 if (!presence.isEmpty()) {
60 contact.lastseen.presence = presence;
61 }
62 }
63 }
64
65 protected String avatarData(Element items) {
66 Element item = items.findChild("item");
67 if (item == null) {
68 return null;
69 }
70 return item.findChildContent("data", "urn:xmpp:avatar:data");
71 }
72
73 public static MucOptions.User parseItem(Conversation conference, Element item) {
74 final String local = conference.getJid().getLocalpart();
75 final String domain = conference.getJid().getDomainpart();
76 String affiliation = item.getAttribute("affiliation");
77 String role = item.getAttribute("role");
78 String nick = item.getAttribute("nick");
79 Jid fullJid;
80 try {
81 fullJid = nick != null ? Jid.fromParts(local, domain, nick) : null;
82 } catch (InvalidJidException e) {
83 fullJid = null;
84 }
85 Jid realJid = item.getAttributeAsJid("jid");
86 MucOptions.User user = new MucOptions.User(conference.getMucOptions(), nick == null ? null : fullJid);
87 user.setRealJid(realJid);
88 user.setAffiliation(affiliation);
89 user.setRole(role);
90 return user;
91 }
92}