/** * $RCSfile$ * $Revision: 2407 $ * $Date: 2004-11-02 15:37:00 -0800 (Tue, 02 Nov 2004) $ * * Copyright 2003-2007 Jive Software. * * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.smackx.packet; import java.io.IOException; import org.jivesoftware.smack.PacketCollector; import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.PacketIDFilter; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.provider.IQProvider; import org.jivesoftware.smack.util.StringUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; /** * A last activity IQ for retrieving information about the last activity associated with a Jabber ID. * LastActivity (XEP-0012) allows for retrieval of how long a particular user has been idle and the * message the specified when doing so. Use {@link org.jivesoftware.smackx.LastActivityManager} * to get the last activity of a user. * * @author Derek DeMoro */ public class LastActivity extends IQ { public static final String NAMESPACE = "jabber:iq:last"; public long lastActivity = -1; public String message; public LastActivity() { setType(IQ.Type.GET); } public String getChildElementXML() { StringBuilder buf = new StringBuilder(); buf.append("<query xmlns=\"" + NAMESPACE + "\""); if (lastActivity != -1) { buf.append(" seconds=\"").append(lastActivity).append("\""); } buf.append("></query>"); return buf.toString(); } public void setLastActivity(long lastActivity) { this.lastActivity = lastActivity; } private void setMessage(String message) { this.message = message; } /** * Returns number of seconds that have passed since the user last logged out. * If the user is offline, 0 will be returned. * * @return the number of seconds that have passed since the user last logged out. */ public long getIdleTime() { return lastActivity; } /** * Returns the status message of the last unavailable presence received from the user. * * @return the status message of the last unavailable presence received from the user */ public String getStatusMessage() { return message; } /** * The IQ Provider for LastActivity. * * @author Derek DeMoro */ public static class Provider implements IQProvider { public Provider() { super(); } public IQ parseIQ(XmlPullParser parser) throws XMPPException, XmlPullParserException { if (parser.getEventType() != XmlPullParser.START_TAG) { throw new XMPPException("Parser not in proper position, or bad XML."); } LastActivity lastActivity = new LastActivity(); String seconds = parser.getAttributeValue("", "seconds"); String message = null; try { message = parser.nextText(); } catch (IOException e1) { // Ignore } if (seconds != null) { try { lastActivity.setLastActivity(Long.parseLong(seconds)); } catch (NumberFormatException e) { // Ignore } } if (message != null) { lastActivity.setMessage(message); } return lastActivity; } } /** * Retrieve the last activity of a particular jid. * @param con the current Connection. * @param jid the JID of the user. * @return the LastActivity packet of the jid. * @throws XMPPException thrown if a server error has occured. * @deprecated This method only retreives the lapsed time since the last logout of a particular jid. * Replaced by {@link org.jivesoftware.smackx.LastActivityManager#getLastActivity(Connection, String) getLastActivity} */ public static LastActivity getLastActivity(Connection con, String jid) throws XMPPException { LastActivity activity = new LastActivity(); jid = StringUtils.parseBareAddress(jid); activity.setTo(jid); PacketCollector collector = con.createPacketCollector(new PacketIDFilter(activity.getPacketID())); con.sendPacket(activity); LastActivity response = (LastActivity) collector.nextResult(SmackConfiguration.getPacketReplyTimeout()); // Cancel the collector. collector.cancel(); if (response == null) { throw new XMPPException("No response from server on status set."); } if (response.getError() != null) { throw new XMPPException(response.getError()); } return response; } }