package eu.siacs.conversations.parser; import android.util.Log; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.jid.Jid; public abstract class AbstractParser { protected XmppConnectionService mXmppConnectionService; protected AbstractParser(XmppConnectionService service) { this.mXmppConnectionService = service; } /** * Gets the timestamp from the 'delay' element. * Refer to XEP-0203: Delayed Delivery for details. @link{http://xmpp.org/extensions/xep-0203.html} * @param packet the element to find the child element 'delay' in. * @return the time in milli seconds of the attribute 'stamp' of the * element 'delay'. In case there is no 'delay' element or no 'stamp' * attribute or the current time is less than the value of the 'stamp' * attribute the current time is returned. */ protected long getTimestamp(Element packet) { long now = System.currentTimeMillis(); Element delay = packet.findChild("delay"); if (delay == null) { return now; } String stamp = delay.getAttribute("stamp"); if (stamp == null) { return now; } /*long time = parseTimestamp(stamp).getTime(); return now < time ? now : time;*/ try { long time = parseTimestamp(stamp).getTime(); return now < time ? now : time; } catch (ParseException e) { return now; } } /** * Parses the timestamp according to XEP-0082: XMPP Date and Time Profiles. * @link{http://xmpp.org/extensions/xep-0082.html} * * @param timestamp the timestamp to parse * @return Date * @throws ParseException */ public static Date parseTimestamp(String timestamp) throws ParseException { /*try { Log.d("TIMESTAMP", timestamp); return DatatypeFactory.newInstance().newXMLGregorianCalendar(timestamp).toGregorianCalendar().getTime(); } catch (DatatypeConfigurationException e) { Log.d("TIMESTAMP", e.getMessage()); return new Date(); }*/ timestamp = timestamp.replace("Z", "+0000"); SimpleDateFormat dateFormat; timestamp = timestamp.substring(0,19)+timestamp.substring(timestamp.length() -5,timestamp.length()); dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",Locale.US); return dateFormat.parse(timestamp); } protected void updateLastseen(final Element packet, final Account account, final boolean presenceOverwrite) { final Jid from = packet.getAttributeAsJid("from"); updateLastseen(packet, account, from, presenceOverwrite); } protected void updateLastseen(final Element packet, final Account account, final Jid from, final boolean presenceOverwrite) { final String presence = from == null || from.isBareJid() ? "" : from.getResourcepart(); final Contact contact = account.getRoster().getContact(from); final long timestamp = getTimestamp(packet); if (timestamp >= contact.lastseen.time) { contact.lastseen.time = timestamp; if (!presence.isEmpty() && presenceOverwrite) { contact.lastseen.presence = presence; } } } protected String avatarData(Element items) { Element item = items.findChild("item"); if (item == null) { return null; } Element data = item.findChild("data", "urn:xmpp:avatar:data"); if (data == null) { return null; } return data.getContent(); } }