Home | History | Annotate | Download | only in packet
      1 /**
      2  * $RCSfile$
      3  * $Revision$
      4  * $Date$
      5  *
      6  * Copyright 2003-2007 Jive Software.
      7  *
      8  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *     http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  */
     20 
     21 package org.jivesoftware.smackx.packet;
     22 
     23 import org.jivesoftware.smack.packet.IQ;
     24 import org.jivesoftware.smack.provider.IQProvider;
     25 import org.xmlpull.v1.XmlPullParser;
     26 
     27 import java.util.ArrayList;
     28 import java.util.Collections;
     29 import java.util.Iterator;
     30 import java.util.List;
     31 
     32 /**
     33  * Represents a request to get some or all the offline messages of a user. This class can also
     34  * be used for deleting some or all the offline messages of a user.
     35  *
     36  * @author Gaston Dombiak
     37  */
     38 public class OfflineMessageRequest extends IQ {
     39 
     40     private List<Item> items = new ArrayList<Item>();
     41     private boolean purge = false;
     42     private boolean fetch = false;
     43 
     44     /**
     45      * Returns an Iterator for item childs that holds information about offline messages to
     46      * view or delete.
     47      *
     48      * @return an Iterator for item childs that holds information about offline messages to
     49      *         view or delete.
     50      */
     51     public Iterator<Item> getItems() {
     52         synchronized (items) {
     53             return Collections.unmodifiableList(new ArrayList<Item>(items)).iterator();
     54         }
     55     }
     56 
     57     /**
     58      * Adds an item child that holds information about offline messages to view or delete.
     59      *
     60      * @param item the item child that holds information about offline messages to view or delete.
     61      */
     62     public void addItem(Item item) {
     63         synchronized (items) {
     64             items.add(item);
     65         }
     66     }
     67 
     68     /**
     69      * Returns true if all the offline messages of the user should be deleted.
     70      *
     71      * @return true if all the offline messages of the user should be deleted.
     72      */
     73     public boolean isPurge() {
     74         return purge;
     75     }
     76 
     77     /**
     78      * Sets if all the offline messages of the user should be deleted.
     79      *
     80      * @param purge true if all the offline messages of the user should be deleted.
     81      */
     82     public void setPurge(boolean purge) {
     83         this.purge = purge;
     84     }
     85 
     86     /**
     87      * Returns true if all the offline messages of the user should be retrieved.
     88      *
     89      * @return true if all the offline messages of the user should be retrieved.
     90      */
     91     public boolean isFetch() {
     92         return fetch;
     93     }
     94 
     95     /**
     96      * Sets if all the offline messages of the user should be retrieved.
     97      *
     98      * @param fetch true if all the offline messages of the user should be retrieved.
     99      */
    100     public void setFetch(boolean fetch) {
    101         this.fetch = fetch;
    102     }
    103 
    104     public String getChildElementXML() {
    105         StringBuilder buf = new StringBuilder();
    106         buf.append("<offline xmlns=\"http://jabber.org/protocol/offline\">");
    107         synchronized (items) {
    108             for (int i = 0; i < items.size(); i++) {
    109                 Item item = items.get(i);
    110                 buf.append(item.toXML());
    111             }
    112         }
    113         if (purge) {
    114             buf.append("<purge/>");
    115         }
    116         if (fetch) {
    117             buf.append("<fetch/>");
    118         }
    119         // Add packet extensions, if any are defined.
    120         buf.append(getExtensionsXML());
    121         buf.append("</offline>");
    122         return buf.toString();
    123     }
    124 
    125     /**
    126      * Item child that holds information about offline messages to view or delete.
    127      *
    128      * @author Gaston Dombiak
    129      */
    130     public static class Item {
    131         private String action;
    132         private String jid;
    133         private String node;
    134 
    135         /**
    136          * Creates a new item child.
    137          *
    138          * @param node the actor's affiliation to the room
    139          */
    140         public Item(String node) {
    141             this.node = node;
    142         }
    143 
    144         public String getNode() {
    145             return node;
    146         }
    147 
    148         /**
    149          * Returns "view" or "remove" that indicate if the server should return the specified
    150          * offline message or delete it.
    151          *
    152          * @return "view" or "remove" that indicate if the server should return the specified
    153          *         offline message or delete it.
    154          */
    155         public String getAction() {
    156             return action;
    157         }
    158 
    159         /**
    160          * Sets if the server should return the specified offline message or delete it. Possible
    161          * values are "view" or "remove".
    162          *
    163          * @param action if the server should return the specified offline message or delete it.
    164          */
    165         public void setAction(String action) {
    166             this.action = action;
    167         }
    168 
    169         public String getJid() {
    170             return jid;
    171         }
    172 
    173         public void setJid(String jid) {
    174             this.jid = jid;
    175         }
    176 
    177         public String toXML() {
    178             StringBuilder buf = new StringBuilder();
    179             buf.append("<item");
    180             if (getAction() != null) {
    181                 buf.append(" action=\"").append(getAction()).append("\"");
    182             }
    183             if (getJid() != null) {
    184                 buf.append(" jid=\"").append(getJid()).append("\"");
    185             }
    186             if (getNode() != null) {
    187                 buf.append(" node=\"").append(getNode()).append("\"");
    188             }
    189             buf.append("/>");
    190             return buf.toString();
    191         }
    192     }
    193 
    194     public static class Provider implements IQProvider {
    195 
    196         public IQ parseIQ(XmlPullParser parser) throws Exception {
    197             OfflineMessageRequest request = new OfflineMessageRequest();
    198             boolean done = false;
    199             while (!done) {
    200                 int eventType = parser.next();
    201                 if (eventType == XmlPullParser.START_TAG) {
    202                     if (parser.getName().equals("item")) {
    203                         request.addItem(parseItem(parser));
    204                     }
    205                     else if (parser.getName().equals("purge")) {
    206                         request.setPurge(true);
    207                     }
    208                     else if (parser.getName().equals("fetch")) {
    209                         request.setFetch(true);
    210                     }
    211                 } else if (eventType == XmlPullParser.END_TAG) {
    212                     if (parser.getName().equals("offline")) {
    213                         done = true;
    214                     }
    215                 }
    216             }
    217 
    218             return request;
    219         }
    220 
    221         private Item parseItem(XmlPullParser parser) throws Exception {
    222             boolean done = false;
    223             Item item = new Item(parser.getAttributeValue("", "node"));
    224             item.setAction(parser.getAttributeValue("", "action"));
    225             item.setJid(parser.getAttributeValue("", "jid"));
    226             while (!done) {
    227                 int eventType = parser.next();
    228                 if (eventType == XmlPullParser.END_TAG) {
    229                     if (parser.getName().equals("item")) {
    230                         done = true;
    231                     }
    232                 }
    233             }
    234             return item;
    235         }
    236     }
    237 }
    238