AbstractParser.java

 1package eu.siacs.conversations.parser;
 2
 3import java.text.ParseException;
 4import java.text.SimpleDateFormat;
 5import java.util.ArrayList;
 6import java.util.Collections;
 7import java.util.Date;
 8import java.util.Locale;
 9
10import eu.siacs.conversations.entities.Account;
11import eu.siacs.conversations.entities.Contact;
12import eu.siacs.conversations.services.XmppConnectionService;
13import eu.siacs.conversations.xml.Element;
14
15public abstract class AbstractParser {
16
17	protected XmppConnectionService mXmppConnectionService;
18
19	protected AbstractParser(XmppConnectionService service) {
20		this.mXmppConnectionService = service;
21	}
22
23	protected long getTimestamp(Element packet) {
24		long now = System.currentTimeMillis();
25		ArrayList<String> stamps = new ArrayList<String>();
26		for (Element child : packet.getChildren()) {
27			if (child.getName().equals("delay")) {
28				stamps.add(child.getAttribute("stamp").replace("Z", "+0000"));
29			}
30		}
31		Collections.sort(stamps);
32		if (stamps.size() >= 1) {
33			try {
34				String stamp = stamps.get(stamps.size() - 1);
35				if (stamp.contains(".")) {
36					Date date = new SimpleDateFormat(
37							"yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US)
38							.parse(stamp);
39					if (now < date.getTime()) {
40						return now;
41					} else {
42						return date.getTime();
43					}
44				} else {
45					Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",
46							Locale.US).parse(stamp);
47					if (now < date.getTime()) {
48						return now;
49					} else {
50						return date.getTime();
51					}
52				}
53			} catch (ParseException e) {
54				return now;
55			}
56		} else {
57			return now;
58		}
59	}
60
61	protected void updateLastseen(Element packet, Account account,
62			boolean presenceOverwrite) {
63		String[] fromParts = packet.getAttribute("from").split("/", 2);
64		String from = fromParts[0];
65		String presence = null;
66		if (fromParts.length >= 2) {
67			presence = fromParts[1];
68		} else {
69			presence = "";
70		}
71		Contact contact = account.getRoster().getContact(from);
72		long timestamp = getTimestamp(packet);
73		if (timestamp >= contact.lastseen.time) {
74			contact.lastseen.time = timestamp;
75			if ((presence != null) && (presenceOverwrite)) {
76				contact.lastseen.presence = presence;
77			}
78		}
79	}
80
81	protected String avatarData(Element items) {
82		Element item = items.findChild("item");
83		if (item == null) {
84			return null;
85		}
86		Element data = item.findChild("data", "urn:xmpp:avatar:data");
87		if (data == null) {
88			return null;
89		}
90		return data.getContent();
91	}
92}