/* * Copyright 2006-2010 Daniel Henninger. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */ package net.sf.kraken.protocols.xmpp.packet; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.provider.IQProvider; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.apache.log4j.Logger; import java.util.Vector; import java.util.Date; import java.util.ArrayList; import java.util.Arrays; import java.io.IOException; /** * See: http://code.google.com/apis/talk/jep_extensions/gmail.html * * @author mecevit * @author Daniel Henninger */ public class GoogleMailBoxPacket extends IQ { static Logger Log = Logger.getLogger(GoogleMailBoxPacket.class); public static String MAILBOX_ELEMENT = "mailbox"; public static String MAILBOX_NAMESPACE = "google:mail:notify"; private Date resultTime; private Integer totalMatched; private Boolean totalIsEstimate; private String url; private Vector<GoogleMailThread> mailThreads = new Vector<GoogleMailThread>(); public GoogleMailBoxPacket() { } @Override public void addExtension(PacketExtension extension) { } public void addMailThread(GoogleMailThread thread) { mailThreads.add(thread); } public Vector<GoogleMailThread> getMailThreads() { return mailThreads; } public Date getResultTime() { return resultTime; } public void setResultTime(Date resultTime) { this.resultTime = resultTime; } public Integer getTotalMatched() { return totalMatched; } public void setTotalMatched(Integer totalMatched) { this.totalMatched = totalMatched; } public Boolean getTotalIsEstimate() { return totalIsEstimate; } public void setTotalIsEstimate(Boolean totalIsEstimate) { this.totalIsEstimate = totalIsEstimate; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @Override public String getChildElementXML() { StringBuffer buf = new StringBuffer(); buf.append("<mailbox xmlns=\"").append(MAILBOX_NAMESPACE).append("\""); if (resultTime != null) { buf.append(" result-time=\"").append(resultTime.getTime()).append("\""); } if (totalMatched != null) { buf.append(" total-matched=\"").append(totalMatched).append("\""); } if (totalIsEstimate != null && totalIsEstimate) { buf.append(" total-estimate=\"1\""); } if (url != null) { buf.append(" url=\"").append(url).append("\""); } buf.append(">"); for (GoogleMailThread thread : mailThreads) { buf.append(thread.toXML()); } buf.append("</mailbox>"); return buf.toString(); } public static class Provider implements IQProvider { public Provider() { super(); } public IQ parseIQ(XmlPullParser parser) throws Exception { GoogleMailBoxPacket mailPacket = new GoogleMailBoxPacket(); try { GoogleMailThread thread = null; boolean done = false; int eventType = parser.getEventType(); while (!done) { if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("mailbox")) { String dateString = parser.getAttributeValue("", "result-time"); try { mailPacket.setResultTime(new Date(Long.valueOf(dateString))); } catch (Exception ex) { // Well crap, ok then, ignore it. } try { mailPacket.setTotalMatched(Integer.valueOf(parser.getAttributeValue("", "total-matched"), 0)); } catch (NumberFormatException ex) { // Well crap, ok then, ignore it. } String estimateString = parser.getAttributeValue("", "total-estimate"); mailPacket.setTotalIsEstimate(estimateString != null && estimateString.equals("1")); mailPacket.setUrl(parser.getAttributeValue("", "url")); } else if (parser.getName().equals("mail-thread-info")) { Long tid = Long.valueOf(parser.getAttributeValue("", "tid")); Integer numParts = null; try { numParts = Integer.valueOf(parser.getAttributeValue("", "participation"), 0); } catch (NumberFormatException ex) { // Well crap, ok then, ignore it. } Integer numMsgs = null; try { numMsgs = Integer.valueOf(parser.getAttributeValue("", "messages"), 0); } catch (NumberFormatException ex) { // Well crap, ok then, ignore it. } String url = parser.getAttributeValue("", "url"); String dateString = parser.getAttributeValue("", "date"); Date date = null; try { date = new Date(Long.valueOf(dateString)); } catch (Exception ex) { // Well crap, ok then, ignore it. } thread = new GoogleMailThread( tid, numParts, numMsgs, date, url, new ArrayList<GoogleMailSender>(), null, null, null ); } else if (parser.getName().equals("sender")) { String address = parser.getAttributeValue("", "address"); String name = parser.getAttributeValue("", "name"); String origString = parser.getAttributeValue("", "originator"); String unreadString = parser.getAttributeValue("", "unread"); thread.getSenders().add(new GoogleMailSender( address, name, origString != null && origString.equals("1"), unreadString != null && unreadString.equals("1") )); } else if (parser.getName().equals("labels")) { thread.setLabels(Arrays.asList(parser.nextText().split("|"))); } else if (parser.getName().equals("subject")) { thread.setSubject(parser.nextText()); } else if (parser.getName().equals("snippet")) { thread.setSnippit(parser.nextText()); } } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals("mail-thread-info")) { mailPacket.addMailThread(thread); thread = null; } else if (parser.getName().equals("mailbox")) { done = true; break; } } eventType = parser.next(); } } catch (IOException ex) { Log.debug("XMPP: IO exception while parsing mailbox packet:", ex); } catch (XmlPullParserException ex) { Log.debug("XMPP: XML pull exception while parsing mailbox packet:", ex); } catch (Exception ex) { Log.debug("XMPP: Unknown exception while parsing mailbox packet:", ex); } return mailPacket; } } }