/* * Juick * Copyright (C) 2008-2011, Ugnich Anton * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package com.juick.xmpp.extensions; import com.juick.Tag; import com.juick.util.DateFormattersHolder; import com.juick.xmpp.StanzaChild; import com.juick.xmpp.utils.XmlUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.text.ParseException; /** * @author Ugnich Anton */ public class JuickMessage extends com.juick.Message implements StanzaChild { public final static String XMLNS = "http://juick.com/message"; public final static String TagName = "juick"; public JuickMessage() { } public JuickMessage(com.juick.Message msg) { super(msg); } @Override public String getXMLNS() { return XMLNS; } @Override public JuickMessage parse(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException { JuickMessage jmsg = new JuickMessage(); final String sMID = parser.getAttributeValue(null, "mid"); if (sMID != null) { jmsg.setMid(Integer.parseInt(sMID)); } final String sRID = parser.getAttributeValue(null, "rid"); if (sRID != null) { jmsg.setRid(Integer.parseInt(sRID)); } final String sReplyTo = parser.getAttributeValue(null, "replyto"); if (sReplyTo != null) { jmsg.setReplyto(Integer.parseInt(sReplyTo)); } final String sPrivacy = parser.getAttributeValue(null, "privacy"); if (sPrivacy != null) { jmsg.setPrivacy(Integer.parseInt(sPrivacy)); } final String sFriendsOnly = parser.getAttributeValue(null, "friendsonly"); if (sFriendsOnly != null) { jmsg.FriendsOnly = true; } final String sReadOnly = parser.getAttributeValue(null, "readonly"); if (sReadOnly != null) { jmsg.ReadOnly = true; } String ts = parser.getAttributeValue(null, "ts"); if (ts != null) { jmsg.setDate(DateFormattersHolder.getMessageFormatterInstance().parse(ts)); } jmsg.setAttachmentType(parser.getAttributeValue(null, "attach")); while (parser.next() == XmlPullParser.START_TAG) { final String tag = parser.getName(); final String xmlns = parser.getNamespace(); if (tag.equals("body")) { jmsg.setText(XmlUtils.getTagText(parser)); } else if (tag.equals(JuickUser.TagName) && xmlns != null && xmlns.equals(JuickUser.XMLNS)) { jmsg.setUser(new JuickUser().parse(parser)); } else if (tag.equals("tag")) { jmsg.getTags().add(new Tag(XmlUtils.getTagText(parser))); } else { XmlUtils.skip(parser); } } return jmsg; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("<").append(TagName).append(" xmlns=\"").append(XMLNS).append("\""); if (getMid() > 0) builder.append(" mid=\"").append(getMid()).append("\""); if (getRid() > 0) builder.append(" rid=\"").append(getRid()).append("\""); if (getReplyto() > 0) builder.append(" replyto=\"").append(getReplyto()).append("\""); builder.append(" privacy=\"").append(getPrivacy()).append("\""); if (FriendsOnly) builder.append(" friendsonly=\"1\""); if (ReadOnly) builder.append(" readonly=\"1\""); if (getDate() != null) builder.append(" ts=\"") .append(DateFormattersHolder.getMessageFormatterInstance().format(getDate())) .append("\""); if (getAttachmentType() != null) builder.append(" attach=\"").append(getAttachmentType()).append("\""); builder.append(">"); if (getUser() != null) builder.append(JuickUser.toString(getUser())); if (getText() != null) builder.append("").append(XmlUtils.escape(getText())).append(""); for (com.juick.Tag tag : getTags()) builder.append("").append(XmlUtils.escape(tag.getName())).append(""); builder.append(""); return builder.toString(); } @Override public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof JuickMessage)) return false; JuickMessage jmsg = (JuickMessage) obj; return (this.getMid() == jmsg.getMid() && this.getRid() == jmsg.getRid()); } @Override public int compareTo(Object obj) throws ClassCastException { if (obj == this) return 0; if (!(obj instanceof JuickMessage)) throw new ClassCastException(); JuickMessage jmsg = (JuickMessage) obj; int cmp = Integer.compare(jmsg.getMid(), getMid()); if (cmp == 0) cmp = Integer.compare(getRid(), jmsg.getRid()); return cmp; } }