package org.limewire.xmpp.client.impl.messages.address; import java.io.IOException; import org.apache.commons.codec.binary.Base64; import org.jivesoftware.smack.packet.IQ; import org.limewire.io.Address; import org.limewire.net.address.AddressFactory; import org.limewire.net.address.AddressSerializer; import org.limewire.util.StringUtils; import org.limewire.xmpp.client.impl.messages.InvalidIQException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; public class AddressIQ extends IQ { private final Address address; private final AddressFactory factory; public AddressIQ(XmlPullParser parser, AddressFactory factory) throws IOException, XmlPullParserException, InvalidIQException { this.factory = factory; Address parsedAddress = null; do { int eventType = parser.getEventType(); if(eventType == XmlPullParser.START_TAG) { if(parser.getName().equals("address")) { if(!parser.isEmptyElementTag()) { eventType = parser.next(); if(eventType == XmlPullParser.START_TAG) { String type = parser.getName(); String value = parser.getAttributeValue(null, "value"); if (value == null) { throw new InvalidIQException("no value attribute"); } try { parsedAddress = factory.deserialize(type, Base64.decodeBase64(StringUtils.toUTF8Bytes(value))); } catch (IOException ie) { throw new InvalidIQException("invalid address: " + value, ie); } } } } } if (eventType == XmlPullParser.END_TAG) { if(parser.getName().equals("address")) { break; } } } while (parser.nextTag() != XmlPullParser.END_DOCUMENT); if (parsedAddress == null) { throw new InvalidIQException("no address to be parsed"); } this.address = parsedAddress; } public AddressIQ(Address address, AddressFactory factory) { this.address = address; this.factory = factory; } public Address getAddress() { return address; } @Override public String getChildElementXML() { StringBuilder pushEndpoint = new StringBuilder("<address xmlns=\"jabber:iq:lw-address\">"); if(address != null) { try { AddressSerializer addressSerializer = factory.getSerializer(address); pushEndpoint.append("<" + addressSerializer.getAddressType()); pushEndpoint.append(" value=\"").append(StringUtils.toUTF8String(Base64.encodeBase64(addressSerializer.serialize(address)))).append("\"/>"); } catch (IOException e) { throw new RuntimeException(e); } } pushEndpoint.append("</address>"); return pushEndpoint.toString(); } }