• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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      */
addAddress(String type, String jid, String node, String desc, boolean delivered, String uri)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      */
setNoReply()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      */
getAddressesOfType(String type)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 
getElementName()99     public String getElementName() {
100         return "addresses";
101     }
102 
getNamespace()103     public String getNamespace() {
104         return "http://jabber.org/protocol/address";
105     }
106 
toXML()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 
Address(String type)129         private Address(String type) {
130             this.type = type;
131         }
132 
getType()133         public String getType() {
134             return type;
135         }
136 
getJid()137         public String getJid() {
138             return jid;
139         }
140 
setJid(String jid)141         private void setJid(String jid) {
142             this.jid = jid;
143         }
144 
getNode()145         public String getNode() {
146             return node;
147         }
148 
setNode(String node)149         private void setNode(String node) {
150             this.node = node;
151         }
152 
getDescription()153         public String getDescription() {
154             return description;
155         }
156 
setDescription(String description)157         private void setDescription(String description) {
158             this.description = description;
159         }
160 
isDelivered()161         public boolean isDelivered() {
162             return delivered;
163         }
164 
setDelivered(boolean delivered)165         private void setDelivered(boolean delivered) {
166             this.delivered = delivered;
167         }
168 
getUri()169         public String getUri() {
170             return uri;
171         }
172 
setUri(String uri)173         private void setUri(String uri) {
174             this.uri = uri;
175         }
176 
toXML()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