Home | History | Annotate | Download | only in packet
      1 /**
      2  * $RCSfile$
      3  * $Revision$
      4  * $Date$
      5  *
      6  * Copyright 2003-2006 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.PacketExtension;
     24 
     25 import java.util.ArrayList;
     26 import java.util.Iterator;
     27 import java.util.List;
     28 
     29 /**
     30  * Packet extension that contains the list of addresses that a packet should be sent or was sent.
     31  *
     32  * @author Gaston Dombiak
     33  */
     34 public class MultipleAddresses implements PacketExtension {
     35 
     36     public static final String BCC = "bcc";
     37     public static final String CC = "cc";
     38     public static final String NO_REPLY = "noreply";
     39     public static final String REPLY_ROOM = "replyroom";
     40     public static final String REPLY_TO = "replyto";
     41     public static final String TO = "to";
     42 
     43 
     44     private List<Address> addresses = new ArrayList<Address>();
     45 
     46     /**
     47      * Adds a new address to which the packet is going to be sent or was sent.
     48      *
     49      * @param type on of the static type (BCC, CC, NO_REPLY, REPLY_ROOM, etc.)
     50      * @param jid the JID address of the recipient.
     51      * @param node used to specify a sub-addressable unit at a particular JID, corresponding to
     52      *             a Service Discovery node.
     53      * @param desc used to specify human-readable information for this address.
     54      * @param delivered true when the packet was already delivered to this address.
     55      * @param uri used to specify an external system address, such as a sip:, sips:, or im: URI.
     56      */
     57     public void addAddress(String type, String jid, String node, String desc, boolean delivered,
     58             String uri) {
     59         // Create a new address with the specificed configuration
     60         Address address = new Address(type);
     61         address.setJid(jid);
     62         address.setNode(node);
     63         address.setDescription(desc);
     64         address.setDelivered(delivered);
     65         address.setUri(uri);
     66         // Add the new address to the list of multiple recipients
     67         addresses.add(address);
     68     }
     69 
     70     /**
     71      * Indicate that the packet being sent should not be replied.
     72      */
     73     public void setNoReply() {
     74         // Create a new address with the specificed configuration
     75         Address address = new Address(NO_REPLY);
     76         // Add the new address to the list of multiple recipients
     77         addresses.add(address);
     78     }
     79 
     80     /**
     81      * Returns the list of addresses that matches the specified type. Examples of address
     82      * type are: TO, CC, BCC, etc..
     83      *
     84      * @param type Examples of address type are: TO, CC, BCC, etc.
     85      * @return the list of addresses that matches the specified type.
     86      */
     87     public List<Address> getAddressesOfType(String type) {
     88         List<Address> answer = new ArrayList<Address>(addresses.size());
     89         for (Iterator<Address> it = addresses.iterator(); it.hasNext();) {
     90             Address address = (Address) it.next();
     91             if (address.getType().equals(type)) {
     92                 answer.add(address);
     93             }
     94         }
     95 
     96         return answer;
     97     }
     98 
     99     public String getElementName() {
    100         return "addresses";
    101     }
    102 
    103     public String getNamespace() {
    104         return "http://jabber.org/protocol/address";
    105     }
    106 
    107     public String toXML() {
    108         StringBuilder buf = new StringBuilder();
    109         buf.append("<").append(getElementName());
    110         buf.append(" xmlns=\"").append(getNamespace()).append("\">");
    111         // Loop through all the addresses and append them to the string buffer
    112         for (Iterator<Address> i = addresses.iterator(); i.hasNext();) {
    113             Address address = (Address) i.next();
    114             buf.append(address.toXML());
    115         }
    116         buf.append("</").append(getElementName()).append(">");
    117         return buf.toString();
    118     }
    119 
    120     public static class Address {
    121 
    122         private String type;
    123         private String jid;
    124         private String node;
    125         private String description;
    126         private boolean delivered;
    127         private String uri;
    128 
    129         private Address(String type) {
    130             this.type = type;
    131         }
    132 
    133         public String getType() {
    134             return type;
    135         }
    136 
    137         public String getJid() {
    138             return jid;
    139         }
    140 
    141         private void setJid(String jid) {
    142             this.jid = jid;
    143         }
    144 
    145         public String getNode() {
    146             return node;
    147         }
    148 
    149         private void setNode(String node) {
    150             this.node = node;
    151         }
    152 
    153         public String getDescription() {
    154             return description;
    155         }
    156 
    157         private void setDescription(String description) {
    158             this.description = description;
    159         }
    160 
    161         public boolean isDelivered() {
    162             return delivered;
    163         }
    164 
    165         private void setDelivered(boolean delivered) {
    166             this.delivered = delivered;
    167         }
    168 
    169         public String getUri() {
    170             return uri;
    171         }
    172 
    173         private void setUri(String uri) {
    174             this.uri = uri;
    175         }
    176 
    177         private String toXML() {
    178             StringBuilder buf = new StringBuilder();
    179             buf.append("<address type=\"");
    180             // Append the address type (e.g. TO/CC/BCC)
    181             buf.append(type).append("\"");
    182             if (jid != null) {
    183                 buf.append(" jid=\"");
    184                 buf.append(jid).append("\"");
    185             }
    186             if (node != null) {
    187                 buf.append(" node=\"");
    188                 buf.append(node).append("\"");
    189             }
    190             if (description != null && description.trim().length() > 0) {
    191                 buf.append(" desc=\"");
    192                 buf.append(description).append("\"");
    193             }
    194             if (delivered) {
    195                 buf.append(" delivered=\"true\"");
    196             }
    197             if (uri != null) {
    198                 buf.append(" uri=\"");
    199                 buf.append(uri).append("\"");
    200             }
    201             buf.append("/>");
    202             return buf.toString();
    203         }
    204     }
    205 }
    206