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