diff options
Diffstat (limited to 'src/com/isode/stroke/serializer')
42 files changed, 1506 insertions, 0 deletions
diff --git a/src/com/isode/stroke/serializer/AuthChallengeSerializer.java b/src/com/isode/stroke/serializer/AuthChallengeSerializer.java new file mode 100644 index 0000000..eee392e --- /dev/null +++ b/src/com/isode/stroke/serializer/AuthChallengeSerializer.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.elements.AuthChallenge; +import com.isode.stroke.elements.Element; +import com.isode.stroke.stringcodecs.Base64; + +class AuthChallengeSerializer extends GenericElementSerializer<AuthChallenge> { + + public AuthChallengeSerializer() { + super(AuthChallenge.class); + } + + public String serialize(Element element) { + AuthChallenge authChallenge = (AuthChallenge)element; + String value = ""; + ByteArray message = authChallenge.getValue(); + if (message != null) { + if (message.isEmpty()) { + value = "="; + } + else { + value = Base64.encode(message); + } + } + return "<challenge xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" + value + "</challenge>"; + } + +} diff --git a/src/com/isode/stroke/serializer/AuthFailureSerializer.java b/src/com/isode/stroke/serializer/AuthFailureSerializer.java new file mode 100644 index 0000000..e75a0f4 --- /dev/null +++ b/src/com/isode/stroke/serializer/AuthFailureSerializer.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.AuthFailure; +import com.isode.stroke.elements.Element; +import com.isode.stroke.serializer.xml.XMLElement; + +class AuthFailureSerializer extends GenericElementSerializer<AuthFailure>{ + + public AuthFailureSerializer() { + super(AuthFailure.class); + } + + public String serialize(Element element) { + return new XMLElement("failure", "urn:ietf:params:xml:ns:xmpp-sasl").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/AuthRequestSerializer.java b/src/com/isode/stroke/serializer/AuthRequestSerializer.java new file mode 100644 index 0000000..eb3fbd5 --- /dev/null +++ b/src/com/isode/stroke/serializer/AuthRequestSerializer.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.elements.AuthRequest; +import com.isode.stroke.elements.Element; +import com.isode.stroke.stringcodecs.Base64; + +class AuthRequestSerializer extends GenericElementSerializer<AuthRequest> { + + public AuthRequestSerializer() { + super(AuthRequest.class); + } + + public String serialize(Element element) { + AuthRequest authRequest = (AuthRequest)element; + String value = ""; + ByteArray message = authRequest.getMessage(); + if (message != null) { + if (message.isEmpty()) { + value = "="; + } + else { + value = Base64.encode(message); + } + } + return "<auth xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\" mechanism=\"" + authRequest.getMechanism() + "\">" + value + "</auth>"; + } + +} diff --git a/src/com/isode/stroke/serializer/AuthResponseSerializer.java b/src/com/isode/stroke/serializer/AuthResponseSerializer.java new file mode 100644 index 0000000..b65f4b1 --- /dev/null +++ b/src/com/isode/stroke/serializer/AuthResponseSerializer.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.elements.AuthResponse; +import com.isode.stroke.elements.Element; +import com.isode.stroke.stringcodecs.Base64; + +class AuthResponseSerializer extends GenericElementSerializer<AuthResponse> { + + public AuthResponseSerializer() { + super(AuthResponse.class); + } + + public String serialize(Element element) { + AuthResponse authResponse = (AuthResponse) element; + String value = ""; + ByteArray message = authResponse.getValue(); + if (message != null) { + if (message.isEmpty()) { + value = "="; + } else { + value = Base64.encode(message); + } + } + return "<response xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" + value + "</response>"; + } +} diff --git a/src/com/isode/stroke/serializer/AuthSuccessSerializer.java b/src/com/isode/stroke/serializer/AuthSuccessSerializer.java new file mode 100644 index 0000000..1b8be25 --- /dev/null +++ b/src/com/isode/stroke/serializer/AuthSuccessSerializer.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.elements.AuthSuccess; +import com.isode.stroke.elements.Element; +import com.isode.stroke.stringcodecs.Base64; + + +class AuthSuccessSerializer extends GenericElementSerializer<AuthSuccess> { + + public AuthSuccessSerializer() { + super(AuthSuccess.class); + } + + public String serialize(Element element) { + AuthSuccess authSuccess = (AuthSuccess)element; + String value = ""; + ByteArray message = authSuccess.getValue(); + if (message != null) { + if (message.isEmpty()) { + value = "="; + } + else { + value = Base64.encode(message); + } + } + return "<success xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" + value + "</success>"; + } + +} diff --git a/src/com/isode/stroke/serializer/CompressFailureSerializer.java b/src/com/isode/stroke/serializer/CompressFailureSerializer.java new file mode 100644 index 0000000..fe31f27 --- /dev/null +++ b/src/com/isode/stroke/serializer/CompressFailureSerializer.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.CompressFailure; +import com.isode.stroke.elements.Element; +import com.isode.stroke.serializer.xml.XMLElement; + +class CompressFailureSerializer extends GenericElementSerializer<CompressFailure> { + + public CompressFailureSerializer() { + super(CompressFailure.class); + } + + public String serialize(Element element) { + return new XMLElement("failure", "http://jabber.org/protocol/compress").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/CompressRequestSerializer.java b/src/com/isode/stroke/serializer/CompressRequestSerializer.java new file mode 100644 index 0000000..512e178 --- /dev/null +++ b/src/com/isode/stroke/serializer/CompressRequestSerializer.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.CompressRequest; +import com.isode.stroke.elements.Element; + +class CompressRequestSerializer implements ElementSerializer { + + public CompressRequestSerializer() { + } + + public String serialize(Element element) { + CompressRequest compressRequest = (CompressRequest) element; + return "<compress xmlns='http://jabber.org/protocol/compress'><method>" + compressRequest.getMethod() + "</method></compress>"; + } + + public boolean canSerialize(Element element) { + return element instanceof CompressRequest; + } +} diff --git a/src/com/isode/stroke/serializer/ElementSerializer.java b/src/com/isode/stroke/serializer/ElementSerializer.java new file mode 100644 index 0000000..8f4ade7 --- /dev/null +++ b/src/com/isode/stroke/serializer/ElementSerializer.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; + +public interface ElementSerializer { + String serialize(Element element); + boolean canSerialize(Element element); +} diff --git a/src/com/isode/stroke/serializer/EnableStreamManagementSerializer.java b/src/com/isode/stroke/serializer/EnableStreamManagementSerializer.java new file mode 100644 index 0000000..8862bb3 --- /dev/null +++ b/src/com/isode/stroke/serializer/EnableStreamManagementSerializer.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.EnableStreamManagement; +import com.isode.stroke.serializer.xml.XMLElement; + +class EnableStreamManagementSerializer extends GenericElementSerializer<EnableStreamManagement> { + + public EnableStreamManagementSerializer() { + super(EnableStreamManagement.class); + } + + public String serialize(Element element) { + return new XMLElement("enable", "urn:xmpp:sm:2").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/GenericElementSerializer.java b/src/com/isode/stroke/serializer/GenericElementSerializer.java new file mode 100644 index 0000000..ecd5bf4 --- /dev/null +++ b/src/com/isode/stroke/serializer/GenericElementSerializer.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; + +public abstract class GenericElementSerializer<T> implements ElementSerializer { + + private final Class elementClass_; + + GenericElementSerializer(Class elementClass) { + elementClass_ = elementClass; + } + + public boolean canSerialize(Element element) { + return elementClass_.isAssignableFrom(element.getClass()); + } + + +}
\ No newline at end of file diff --git a/src/com/isode/stroke/serializer/GenericPayloadSerializer.java b/src/com/isode/stroke/serializer/GenericPayloadSerializer.java new file mode 100644 index 0000000..3f5c92e --- /dev/null +++ b/src/com/isode/stroke/serializer/GenericPayloadSerializer.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Payload; + +public abstract class GenericPayloadSerializer<T extends Payload> extends PayloadSerializer { + + private final Class class_; + + public GenericPayloadSerializer(Class c) { + class_ = c; + } + + @Override + public boolean canSerialize(Payload payload) { + return class_.isAssignableFrom(payload.getClass()); + } + + @Override + public String serialize(Payload payload) { + return serializePayload((T)payload); + } + + protected abstract String serializePayload(T payload); + +} diff --git a/src/com/isode/stroke/serializer/GenericStanzaSerializer.java b/src/com/isode/stroke/serializer/GenericStanzaSerializer.java new file mode 100644 index 0000000..89ac1d1 --- /dev/null +++ b/src/com/isode/stroke/serializer/GenericStanzaSerializer.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.Stanza; +import com.isode.stroke.serializer.xml.XMLElement; + +public abstract class GenericStanzaSerializer<T extends Stanza> extends StanzaSerializer { + + private final Class stanzaClass_; + + GenericStanzaSerializer(Class stanzaClass, String tag, PayloadSerializerCollection payloadSerializers) { + super(tag, payloadSerializers); + stanzaClass_ = stanzaClass; + } + + public boolean canSerialize(Element element) { + return stanzaClass_.isAssignableFrom(element.getClass()); + } + + public void setStanzaSpecificAttributes(Element stanza, XMLElement element) { + setStanzaSpecificAttributesGeneric((T)stanza, element); + } + + abstract void setStanzaSpecificAttributesGeneric(T stanza, XMLElement element); +} diff --git a/src/com/isode/stroke/serializer/IQSerializer.java b/src/com/isode/stroke/serializer/IQSerializer.java new file mode 100644 index 0000000..0025aad --- /dev/null +++ b/src/com/isode/stroke/serializer/IQSerializer.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.IQ; +import com.isode.stroke.serializer.xml.XMLElement; + +public class IQSerializer extends GenericStanzaSerializer<IQ> { + + public IQSerializer(PayloadSerializerCollection payloadSerializers) { + super(IQ.class, "iq", payloadSerializers); + } + + @Override + void setStanzaSpecificAttributesGeneric(IQ iq, XMLElement element) { + switch (iq.getType()) { + case Get: + element.setAttribute("type", "get"); + break; + case Set: + element.setAttribute("type", "set"); + break; + case Result: + element.setAttribute("type", "result"); + break; + case Error: + element.setAttribute("type", "error"); + break; + } + } +} diff --git a/src/com/isode/stroke/serializer/MessageSerializer.java b/src/com/isode/stroke/serializer/MessageSerializer.java new file mode 100644 index 0000000..27d5c73 --- /dev/null +++ b/src/com/isode/stroke/serializer/MessageSerializer.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Message; +import com.isode.stroke.elements.Stanza; +import com.isode.stroke.serializer.xml.XMLElement; + +public class MessageSerializer extends GenericStanzaSerializer<Message>{ + + public MessageSerializer(PayloadSerializerCollection payloadSerializers) { + super(Message.class, "message", payloadSerializers); + } + + @Override + void setStanzaSpecificAttributesGeneric(Message message, XMLElement element) { + if (message.getType().equals(Message.Type.Chat)) { + element.setAttribute("type", "chat"); + } + else if (message.getType().equals(Message.Type.Groupchat)) { + element.setAttribute("type", "groupchat"); + } + else if (message.getType().equals(Message.Type.Headline)) { + element.setAttribute("type", "headline"); + } + else if (message.getType().equals(Message.Type.Error)) { + element.setAttribute("type", "error"); + } + } + +} diff --git a/src/com/isode/stroke/serializer/PayloadSerializer.java b/src/com/isode/stroke/serializer/PayloadSerializer.java new file mode 100644 index 0000000..2d15408 --- /dev/null +++ b/src/com/isode/stroke/serializer/PayloadSerializer.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Payload; + +/** + * Serialise a particular payload. + */ +public abstract class PayloadSerializer { + public abstract boolean canSerialize(Payload payload); + public abstract String serialize(Payload payload); +} diff --git a/src/com/isode/stroke/serializer/PayloadSerializerCollection.java b/src/com/isode/stroke/serializer/PayloadSerializerCollection.java new file mode 100644 index 0000000..49ffe41 --- /dev/null +++ b/src/com/isode/stroke/serializer/PayloadSerializerCollection.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Payload; +import java.util.Vector; + +public class PayloadSerializerCollection { + + private final Vector<PayloadSerializer> serializers_ = new Vector<PayloadSerializer>(); + + public void addSerializer(PayloadSerializer serializer) { + synchronized (serializers_) { + serializers_.add(serializer); + } + } + + public PayloadSerializer getPayloadSerializer(Payload payload) { + synchronized (serializers_) { + for (PayloadSerializer serializer : serializers_) { + if (serializer.canSerialize(payload)) { + return serializer; + } + } + } + return null; + } +} diff --git a/src/com/isode/stroke/serializer/PresenceSerializer.java b/src/com/isode/stroke/serializer/PresenceSerializer.java new file mode 100644 index 0000000..a7439f7 --- /dev/null +++ b/src/com/isode/stroke/serializer/PresenceSerializer.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Presence; +import com.isode.stroke.elements.Stanza; +import com.isode.stroke.serializer.xml.XMLElement; + +public class PresenceSerializer extends GenericStanzaSerializer<Presence> { +public PresenceSerializer(PayloadSerializerCollection payloadSerializers) { + super(Presence.class, "presence", payloadSerializers); +} + + @Override + void setStanzaSpecificAttributesGeneric(Presence presence, XMLElement element) { + switch (presence.getType()) { + case Unavailable: element.setAttribute("type","unavailable"); break; + case Probe: element.setAttribute("type","probe"); break; + case Subscribe: element.setAttribute("type","subscribe"); break; + case Subscribed: element.setAttribute("type","subscribed"); break; + case Unsubscribe: element.setAttribute("type","unsubscribe"); break; + case Unsubscribed: element.setAttribute("type","unsubscribed"); break; + case Error: element.setAttribute("type","error"); break; + case Available: break; + } + } + + +} diff --git a/src/com/isode/stroke/serializer/StanzaAckRequestSerializer.java b/src/com/isode/stroke/serializer/StanzaAckRequestSerializer.java new file mode 100644 index 0000000..2721518 --- /dev/null +++ b/src/com/isode/stroke/serializer/StanzaAckRequestSerializer.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.StanzaAckRequest; +import com.isode.stroke.serializer.xml.XMLElement; + +class StanzaAckRequestSerializer extends GenericElementSerializer<StanzaAckRequest> { + + public StanzaAckRequestSerializer() { + super(StanzaAckRequest.class); + } + + public String serialize(Element element) { + return new XMLElement("r", "urn:xmpp:sm:2").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/StanzaAckSerializer.java b/src/com/isode/stroke/serializer/StanzaAckSerializer.java new file mode 100644 index 0000000..e8051a6 --- /dev/null +++ b/src/com/isode/stroke/serializer/StanzaAckSerializer.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.StanzaAck; +import com.isode.stroke.serializer.xml.XMLElement; + +class StanzaAckSerializer extends GenericElementSerializer<StanzaAck> { + + public StanzaAckSerializer() { + super(StanzaAck.class); + } + + public String serialize(Element element) { + StanzaAck stanzaAck = (StanzaAck) element; + assert stanzaAck.isValid(); + XMLElement result = new XMLElement("a", "urn:xmpp:sm:2"); + result.setAttribute("h", Double.toString(stanzaAck.getHandledStanzasCount())); + return result.serialize(); + } +} diff --git a/src/com/isode/stroke/serializer/StanzaSerializer.java b/src/com/isode/stroke/serializer/StanzaSerializer.java new file mode 100644 index 0000000..950ccf7 --- /dev/null +++ b/src/com/isode/stroke/serializer/StanzaSerializer.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.Payload; +import com.isode.stroke.elements.Stanza; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.serializer.xml.XMLRawTextNode; +import java.util.logging.Logger; + +public abstract class StanzaSerializer implements ElementSerializer { + + private final String tag_; + private final PayloadSerializerCollection payloadSerializers_; + private final Logger logger_ = Logger.getLogger(this.getClass().getName()); + + public StanzaSerializer(String tag, PayloadSerializerCollection payloadSerializers) { + payloadSerializers_ = payloadSerializers; + tag_ = tag; + } + + public String serialize(Element element) { + assert element != null; + assert payloadSerializers_ != null; + Stanza stanza = (Stanza) element; + XMLElement stanzaElement = new XMLElement(tag_); + if (stanza.getFrom() != null && stanza.getFrom().isValid()) { + stanzaElement.setAttribute("from", stanza.getFrom().toString()); + } + if (stanza.getTo() != null && stanza.getTo().isValid()) { + stanzaElement.setAttribute("to", stanza.getTo().toString()); + } + if (stanza.getID() != null && (stanza.getID().length()!=0)) { + stanzaElement.setAttribute("id", stanza.getID()); + } + setStanzaSpecificAttributes(stanza, stanzaElement); + + StringBuilder serializedPayloads = new StringBuilder(); + for (Payload payload : stanza.getPayloads()) { + PayloadSerializer serializer = payloadSerializers_.getPayloadSerializer(payload); + if (serializer != null) { + serializedPayloads.append(serializer.serialize(payload)); + } else { + /*TODO: port*/ + assert false; + //std::cerr << "Could not find serializer for " << typeid(*(payload.get())).name() << std::endl; + } + } + if (serializedPayloads.toString().length()!=0) { + stanzaElement.addNode(new XMLRawTextNode(serializedPayloads.toString())); + } + return stanzaElement.serialize(); + } + + public abstract void setStanzaSpecificAttributes(Element element, XMLElement xmlElement); +} diff --git a/src/com/isode/stroke/serializer/StartTLSFailureSerializer.java b/src/com/isode/stroke/serializer/StartTLSFailureSerializer.java new file mode 100644 index 0000000..2de5193 --- /dev/null +++ b/src/com/isode/stroke/serializer/StartTLSFailureSerializer.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.StartTLSFailure; +import com.isode.stroke.serializer.xml.XMLElement; + +class StartTLSFailureSerializer extends GenericElementSerializer<StartTLSFailure> { + + public StartTLSFailureSerializer() { + super(StartTLSFailure.class); + } + + public String serialize(Element element) { + return new XMLElement("failure", "urn:ietf:params:xml:ns:xmpp-tls").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/StartTLSRequestSerializer.java b/src/com/isode/stroke/serializer/StartTLSRequestSerializer.java new file mode 100644 index 0000000..afa6b7b --- /dev/null +++ b/src/com/isode/stroke/serializer/StartTLSRequestSerializer.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.StartTLSRequest; +import com.isode.stroke.serializer.xml.XMLElement; + +class StartTLSRequestSerializer extends GenericElementSerializer<StartTLSRequest> { + + public StartTLSRequestSerializer() { + super(StartTLSRequest.class); + } + + public String serialize(Element element) { + return new XMLElement("starttls", "urn:ietf:params:xml:ns:xmpp-tls").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/StreamManagementEnabledSerializer.java b/src/com/isode/stroke/serializer/StreamManagementEnabledSerializer.java new file mode 100644 index 0000000..84b127b --- /dev/null +++ b/src/com/isode/stroke/serializer/StreamManagementEnabledSerializer.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.StreamManagementEnabled; +import com.isode.stroke.serializer.xml.XMLElement; + +class StreamManagementEnabledSerializer extends GenericElementSerializer<StreamManagementEnabled> { + + public StreamManagementEnabledSerializer() { + super(StreamManagementEnabled.class); + } + + public String serialize(Element el) { + StreamManagementEnabled e = (StreamManagementEnabled) el; + XMLElement element = new XMLElement("enabled", "urn:xmpp:sm:2"); + if (!e.getResumeID().isEmpty()) { + element.setAttribute("id", e.getResumeID()); + } + if (e.getResumeSupported()) { + element.setAttribute("resume", "true"); + } + return element.serialize(); + } +} diff --git a/src/com/isode/stroke/serializer/StreamManagementFailedSerializer.java b/src/com/isode/stroke/serializer/StreamManagementFailedSerializer.java new file mode 100644 index 0000000..7f4fb6b --- /dev/null +++ b/src/com/isode/stroke/serializer/StreamManagementFailedSerializer.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.StreamManagementFailed; +import com.isode.stroke.serializer.xml.XMLElement; + +class StreamManagementFailedSerializer extends GenericElementSerializer<StreamManagementFailed> { + + public StreamManagementFailedSerializer() { + super(StreamManagementFailed.class); + } + + public String serialize(Element element) { + return new XMLElement("failed", "urn:xmpp:sm:2").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/StreamResumeSerializer.java b/src/com/isode/stroke/serializer/StreamResumeSerializer.java new file mode 100644 index 0000000..9e40f44 --- /dev/null +++ b/src/com/isode/stroke/serializer/StreamResumeSerializer.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2011, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.StreamResume; +import com.isode.stroke.serializer.xml.XMLElement; + +class StreamResumeSerializer extends GenericElementSerializer<StreamResume> { + + public StreamResumeSerializer() { + super(StreamResume.class); + } + + public String serialize(Element el) { + StreamResume e = (StreamResume)el; + XMLElement element = new XMLElement("resume", "urn:xmpp:sm:2"); + element.setAttribute("previd", e.getResumeID()); + if (e.getHandledStanzasCount() != null) { + element.setAttribute("h", Long.toString(e.getHandledStanzasCount())); + } + return element.serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/StreamResumedSerializer.java b/src/com/isode/stroke/serializer/StreamResumedSerializer.java new file mode 100644 index 0000000..8fe6f53 --- /dev/null +++ b/src/com/isode/stroke/serializer/StreamResumedSerializer.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2011, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.StreamResumed; +import com.isode.stroke.serializer.xml.XMLElement; + +class StreamResumedSerializer extends GenericElementSerializer<StreamResumed> { + + public StreamResumedSerializer() { + super(StreamResumed.class); + } + + public String serialize(Element el) { + StreamResumed e = (StreamResumed)el; + XMLElement element = new XMLElement("resumed", "urn:xmpp:sm:2"); + element.setAttribute("previd", e.getResumeID()); + if (e.getHandledStanzasCount() != null) { + element.setAttribute("h", Long.toString(e.getHandledStanzasCount())); + } + return element.serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/TLSProceedSerializer.java b/src/com/isode/stroke/serializer/TLSProceedSerializer.java new file mode 100644 index 0000000..ca73456 --- /dev/null +++ b/src/com/isode/stroke/serializer/TLSProceedSerializer.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.TLSProceed; +import com.isode.stroke.serializer.xml.XMLElement; + +class TLSProceedSerializer extends GenericElementSerializer<TLSProceed>{ + + public TLSProceedSerializer() { + super(TLSProceed.class); + } + + public String serialize(Element element) { + return new XMLElement("proceed", "urn:ietf:params:xml:ns:xmpp-tls").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/XMPPSerializer.java b/src/com/isode/stroke/serializer/XMPPSerializer.java new file mode 100644 index 0000000..b51a4dc --- /dev/null +++ b/src/com/isode/stroke/serializer/XMPPSerializer.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2010-2011, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer; + +import com.isode.stroke.elements.Element; +import com.isode.stroke.elements.ProtocolHeader; +import com.isode.stroke.elements.StreamType; +import java.util.Vector; + +public class XMPPSerializer { + + private final Vector<ElementSerializer> serializers_ = new Vector<ElementSerializer>(); + private final StreamType type_; + + public XMPPSerializer(PayloadSerializerCollection payloadSerializers, StreamType type) { + type_ = type; + serializers_.add(new PresenceSerializer(payloadSerializers)); + serializers_.add(new IQSerializer(payloadSerializers)); + serializers_.add(new MessageSerializer(payloadSerializers)); + serializers_.add(new CompressRequestSerializer()); + serializers_.add(new CompressFailureSerializer()); + serializers_.add(new AuthRequestSerializer()); + serializers_.add(new AuthFailureSerializer()); + serializers_.add(new AuthSuccessSerializer()); + serializers_.add(new AuthChallengeSerializer()); + serializers_.add(new AuthResponseSerializer()); + serializers_.add(new StartTLSRequestSerializer()); + serializers_.add(new StartTLSFailureSerializer()); + serializers_.add(new TLSProceedSerializer()); + //serializers_.add(new StreamFeaturesSerializer()); //TODO: Port + //serializers_.add(new StreamErrorSerializer()); //FIXME!!!: Port + serializers_.add(new EnableStreamManagementSerializer()); + serializers_.add(new StreamManagementEnabledSerializer()); + serializers_.add(new StreamManagementFailedSerializer()); + serializers_.add(new StreamResumeSerializer()); + serializers_.add(new StreamResumedSerializer()); + serializers_.add(new StanzaAckSerializer()); + serializers_.add(new StanzaAckRequestSerializer()); + //serializers_.add(new ComponentHandshakeSerializer()); + } + + public String serializeHeader(ProtocolHeader header) { + String result = "<?xml version=\"1.0\"?><stream:stream xmlns=\"" + getDefaultNamespace() + "\" xmlns:stream=\"http://etherx.jabber.org/streams\""; + if (header.getFrom().length() != 0) { + result += " from=\"" + header.getFrom() + "\""; + } + if (header.getTo().length() != 0) { + result += " to=\"" + header.getTo() + "\""; + } + if (header.getID().length() != 0) { + result += " id=\"" + header.getID() + "\""; + } + if (header.getVersion().length() != 0) { + result += " version=\"" + header.getVersion() + "\""; + } + result += ">"; + return result; + } + + public String serializeFooter() { + return "</stream:stream>"; + } + + public String getDefaultNamespace() { + switch (type_) { + case ClientStreamType: + return "jabber:client"; + case ServerStreamType: + return "jabber:server"; + case ComponentStreamType: + return "jabber:component:accept"; + } + assert false; + return ""; + } + + public String serializeElement(Element element) { + for (ElementSerializer serializer : serializers_) { + if (serializer.canSerialize(element)) { + return serializer.serialize(element); + } + } + throw new IllegalStateException("Trying to send an unknown element"); + //assert false; /* UNKNOWN ELEMENT */ + //return ""; + } +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/BodySerializer.java b/src/com/isode/stroke/serializer/payloadserializers/BodySerializer.java new file mode 100644 index 0000000..31037db --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/BodySerializer.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.Body; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLTextNode; + +/** + * Body to String. + */ +public class BodySerializer extends GenericPayloadSerializer<Body> { + + public BodySerializer() { + super(Body.class); + } + + @Override + protected String serializePayload(Body body) { + XMLTextNode textNode = new XMLTextNode(body.getText()); + return "<body>" + textNode.serialize() + "</body>"; + } +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/ErrorSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/ErrorSerializer.java new file mode 100644 index 0000000..9c34d53 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/ErrorSerializer.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.ErrorPayload; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLTextNode; + +class ErrorSerializer extends GenericPayloadSerializer<ErrorPayload> { + + public ErrorSerializer() { + super(ErrorPayload.class); + } + + @Override + protected String serializePayload(ErrorPayload error) { + String result = "<error type=\""; + switch (error.getType()) { + case Continue: result += "continue"; break; + case Modify: result += "modify"; break; + case Auth: result += "auth"; break; + case Wait: result += "wait"; break; + default: result += "cancel"; break; + } + result += "\">"; + + String conditionElement; + switch (error.getCondition()) { + case BadRequest: conditionElement = "bad-request"; break; + case Conflict: conditionElement = "conflict"; break; + case FeatureNotImplemented: conditionElement = "feature-not-implemented"; break; + case Forbidden: conditionElement = "forbidden"; break; + case Gone: conditionElement = "gone"; break; + case InternalServerError: conditionElement = "internal-server-error"; break; + case ItemNotFound: conditionElement = "item-not-found"; break; + case JIDMalformed: conditionElement = "jid-malformed"; break; + case NotAcceptable: conditionElement = "not-acceptable"; break; + case NotAllowed: conditionElement = "not-allowed"; break; + case NotAuthorized: conditionElement = "not-authorized"; break; + case PaymentRequired: conditionElement = "payment-required"; break; + case RecipientUnavailable: conditionElement = "recipient-unavailable"; break; + case Redirect: conditionElement = "redirect"; break; + case RegistrationRequired: conditionElement = "registration-required"; break; + case RemoteServerNotFound: conditionElement = "remote-server-not-found"; break; + case RemoteServerTimeout: conditionElement = "remote-server-timeout"; break; + case ResourceConstraint: conditionElement = "resource-constraint"; break; + case ServiceUnavailable: conditionElement = "service-unavailable"; break; + case SubscriptionRequired: conditionElement = "subscription-required"; break; + case UnexpectedRequest: conditionElement = "unexpected-request"; break; + default: conditionElement = "undefined-condition"; break; + } + result += "<" + conditionElement + " xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"; + + if (error.getText().length() != 0) { + XMLTextNode textNode = new XMLTextNode(error.getText()); + result += "<text xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\">" + textNode.serialize() + "</text>"; + } + + result += "</error>"; + return result; + } + +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java b/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java new file mode 100644 index 0000000..52de35b --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.serializer.PayloadSerializerCollection; + +public class FullPayloadSerializerCollection extends PayloadSerializerCollection { + + public FullPayloadSerializerCollection() { + /*FIXME: Implement what's needed. */ + //addSerializer(new IBBSerializer()); + addSerializer(new BodySerializer()); + //addSerializer(new SubjectSerializer()); + //addSerializer(new ChatStateSerializer()); + //addSerializer(new PrioritySerializer()); + addSerializer(new ErrorSerializer()); + addSerializer(new RosterSerializer()); + //addSerializer(new MUCPayloadSerializer()); + //addSerializer(new MUCUserPayloadSerializer()); + //addSerializer(new MUCOwnerPayloadSerializer(this)); + addSerializer(new SoftwareVersionSerializer()); + //addSerializer(new StatusSerializer()); + //addSerializer(new StatusShowSerializer()); + //addSerializer(new DiscoInfoSerializer()); + //addSerializer(new DiscoItemsSerializer()); + //addSerializer(new CapsInfoSerializer()); + addSerializer(new ResourceBindSerializer()); + addSerializer(new StartSessionSerializer()); + //addSerializer(new SecurityLabelSerializer()); + //addSerializer(new SecurityLabelsCatalogSerializer()); + //addSerializer(new StreamInitiationSerializer()); + //addSerializer(new BytestreamsSerializer()); + //addSerializer(new VCardSerializer()); + //addSerializer(new VCardUpdateSerializer()); + addSerializer(new RawXMLPayloadSerializer()); + //addSerializer(new StorageSerializer()); + //addSerializer(new DelaySerializer()); + //addSerializer(new FormSerializer()); + //addSerializer(new PrivateStorageSerializer(this)); + //addSerializer(new CommandSerializer()); + //addSerializer(new NicknameSerializer()); + addSerializer(new SearchPayloadSerializer()); + addSerializer(new LastSerializer()); + } + +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/LastSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/LastSerializer.java new file mode 100644 index 0000000..e78a724 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/LastSerializer.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2011 Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2011 Kevin Smith + * All rights reserved. + */ +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.Last; +import com.isode.stroke.serializer.GenericPayloadSerializer; + +public class LastSerializer extends GenericPayloadSerializer<Last> { + + public LastSerializer() { + super(Last.class); + } + + @Override + protected String serializePayload(Last last) { + return "<query xmlns='jabber:iq:last' seconds='" + Integer.toString(last.getSeconds()) + "'/>"; + } +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/RawXMLPayloadSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/RawXMLPayloadSerializer.java new file mode 100644 index 0000000..4128537 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/RawXMLPayloadSerializer.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.RawXMLPayload; +import com.isode.stroke.serializer.GenericPayloadSerializer; + +class RawXMLPayloadSerializer extends GenericPayloadSerializer<RawXMLPayload> { + + public RawXMLPayloadSerializer() { + super(RawXMLPayloadSerializer.class); + } + + @Override + protected String serializePayload(RawXMLPayload payload) { + return payload.getRawXML(); + } + +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/ResourceBindSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/ResourceBindSerializer.java new file mode 100644 index 0000000..a33627b --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/ResourceBindSerializer.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.ResourceBind; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.serializer.xml.XMLTextNode; + +class ResourceBindSerializer extends GenericPayloadSerializer<ResourceBind> { + + public ResourceBindSerializer() { + super(ResourceBind.class); + } + + @Override + protected String serializePayload(ResourceBind resourceBind) { + XMLElement bindElement = new XMLElement("bind", "urn:ietf:params:xml:ns:xmpp-bind"); + if (resourceBind.getJID().isValid()) { + XMLElement jidNode = new XMLElement("jid"); + jidNode.addNode(new XMLTextNode(resourceBind.getJID().toString())); + bindElement.addNode(jidNode); + } + else if (resourceBind.getResource().length() != 0) { + XMLElement resourceNode = new XMLElement("resource"); + resourceNode.addNode(new XMLTextNode(resourceBind.getResource())); + bindElement.addNode(resourceNode); + } + return bindElement.serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/RosterSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/RosterSerializer.java new file mode 100644 index 0000000..08a4b8e --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/RosterSerializer.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.RosterItemPayload; +import com.isode.stroke.elements.RosterPayload; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.serializer.xml.XMLTextNode; + +/** + * Roster to string. + */ +public class RosterSerializer extends GenericPayloadSerializer<RosterPayload> { + + public RosterSerializer() { + super(RosterPayload.class); + } + + @Override + protected String serializePayload(RosterPayload roster) { + XMLElement queryElement = new XMLElement("query", "jabber:iq:roster"); + for (RosterItemPayload item : roster.getItems()) { + XMLElement itemElement = new XMLElement("item"); + itemElement.setAttribute("jid", item.getJID().toString()); + if (item.getName() != null) { + itemElement.setAttribute("name", item.getName()); + } + + if (item.getSubscription() != null) { + switch (item.getSubscription()) { + case To: itemElement.setAttribute("subscription", "to"); break; + case From: itemElement.setAttribute("subscription", "from"); break; + case Both: itemElement.setAttribute("subscription", "both"); break; + case Remove: itemElement.setAttribute("subscription", "remove"); break; + case None: itemElement.setAttribute("subscription", "none"); break; + } + } + + if (item.getSubscriptionRequested()) { + itemElement.setAttribute("ask", "subscribe"); + } + + for (String group : item.getGroups()) { + XMLElement groupElement = new XMLElement("group"); + groupElement.addNode(new XMLTextNode(group)); + itemElement.addNode(groupElement); + } + + queryElement.addNode(itemElement); + } + + return queryElement.serialize(); + + + + } +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/SearchPayloadSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/SearchPayloadSerializer.java new file mode 100644 index 0000000..6928c97 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/SearchPayloadSerializer.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.SearchPayload; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.serializer.xml.XMLTextNode; + +/** + * SearchPayload to String. + */ +public class SearchPayloadSerializer extends GenericPayloadSerializer<SearchPayload> { + + public SearchPayloadSerializer() { + super(SearchPayload.class); + } + + @Override + protected String serializePayload(SearchPayload searchPayload) { + XMLElement searchElement = new XMLElement("query", "jabber:iq:search"); + + if (searchPayload.getInstructions() != null) { + searchElement.addNode(new XMLElement("instructions", "", searchPayload.getInstructions())); + } + + if (searchPayload.getNick() != null) { + searchElement.addNode(new XMLElement("nick", "", searchPayload.getNick())); + } + + if (searchPayload.getFirst() != null) { + searchElement.addNode(new XMLElement("first", "", searchPayload.getFirst())); + } + + if (searchPayload.getLast() != null) { + searchElement.addNode(new XMLElement("last", "", searchPayload.getLast())); + } + + if (searchPayload.getEMail() != null) { + searchElement.addNode(new XMLElement("email", "", searchPayload.getEMail())); + } + + for (SearchPayload.Item item : searchPayload.getItems()) { + XMLElement itemElement = new XMLElement("item"); + itemElement.setAttribute("jid", item.jid.toString()); + itemElement.addNode(new XMLElement("first", "", item.first)); + itemElement.addNode(new XMLElement("last", "", item.last)); + itemElement.addNode(new XMLElement("nick", "", item.nick)); + itemElement.addNode(new XMLElement("email", "", item.email)); + + searchElement.addNode(itemElement); + } + + //if (Form::ref form = searchPayload->getForm()) { + // searchElement.addNode(boost::shared_ptr<XMLRawTextNode>(new XMLRawTextNode(FormSerializer().serialize(form)))); + //} /* Not ported yet. When the time comes, look at Swiften to check if it's changed. It will have. */ + + return searchElement.serialize(); + } +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/SoftwareVersionSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/SoftwareVersionSerializer.java new file mode 100644 index 0000000..cb2b653 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/SoftwareVersionSerializer.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2010 Remko Tron¨on + * All rights reserved. + */ +/* + * Copyright (c) 2010 Isode Limited, London, England. + * All rights reserved. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.Version; +import com.isode.stroke.serializer.GenericPayloadSerializer; + +public class SoftwareVersionSerializer extends GenericPayloadSerializer<Version>{ + + public SoftwareVersionSerializer() { + super(Version.class); + } + + @Override + protected String serializePayload(Version version) { + StringBuilder result = new StringBuilder(); + result.append("<query xmlns=\"jabber:iq:version\">"); + if (version.getName() != null && version.getName().length() > 0) { + result.append("<name>").append(version.getName()).append("</name>"); + } + if (version.getVersion() != null && version.getVersion().length() > 0) { + result.append("<version>").append(version.getVersion()).append("</version>"); + } + if (version.getOS() != null && version.getOS().length() > 0) { + result.append("<os>").append(version.getOS()).append("</os>"); + } + result.append("</query>"); + return result.toString(); + + } + +} diff --git a/src/com/isode/stroke/serializer/payloadserializers/StartSessionSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/StartSessionSerializer.java new file mode 100644 index 0000000..8d36b8c --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/StartSessionSerializer.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.elements.StartSession; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLElement; + +class StartSessionSerializer extends GenericPayloadSerializer<StartSession> { + + public StartSessionSerializer() { + super(StartSession.class); + } + + @Override + protected String serializePayload(StartSession payload) { + return new XMLElement("session", "urn:ietf:params:xml:ns:xmpp-session").serialize(); + } + +} diff --git a/src/com/isode/stroke/serializer/xml/XMLElement.java b/src/com/isode/stroke/serializer/xml/XMLElement.java new file mode 100644 index 0000000..909f277 --- /dev/null +++ b/src/com/isode/stroke/serializer/xml/XMLElement.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer.xml; + +import java.util.HashMap; +import java.util.Vector; + +public class XMLElement implements XMLNode { + + private final String tag_; + private final HashMap<String, String> attributes_ = new HashMap<String, String>(); + private final Vector<XMLNode> childNodes_ = new Vector<XMLNode>(); + + public XMLElement(String tag) { + this(tag, ""); + } + + public XMLElement(String tag, String xmlns) { + tag_ = tag; + if (xmlns.length()!=0) { + setAttribute("xmlns", xmlns); + } + } + + public XMLElement(String tag, String xmlns, String text) { + this(tag, xmlns); + if (text.length() > 0) { + addNode(new XMLTextNode(text)); + } + } + + public String serialize() { + String result = ""; + result += "<" + tag_; + for (String key : attributes_.keySet()) { + result += " " + key + "=\"" + attributes_.get(key) + "\""; + } + + if (childNodes_.size() > 0) { + result += ">"; + for (XMLNode node : childNodes_) { + result += node.serialize(); + } + result += "</" + tag_ + ">"; + } else { + result += "/>"; + } + return result; + } + + public void setAttribute(String attribute, String value) { + String escapedValue = value; + escapedValue.replaceAll("&", "&"); + escapedValue.replaceAll("<", "<"); + escapedValue.replaceAll(">", ">"); + escapedValue.replaceAll("'", "'"); + escapedValue.replaceAll("\"", """); + attributes_.put(attribute, escapedValue); + } + + public void addNode(XMLNode node) { + childNodes_.add(node); + } +} diff --git a/src/com/isode/stroke/serializer/xml/XMLNode.java b/src/com/isode/stroke/serializer/xml/XMLNode.java new file mode 100644 index 0000000..0b64f85 --- /dev/null +++ b/src/com/isode/stroke/serializer/xml/XMLNode.java @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer.xml; + +public interface XMLNode { + public String serialize(); +} diff --git a/src/com/isode/stroke/serializer/xml/XMLRawTextNode.java b/src/com/isode/stroke/serializer/xml/XMLRawTextNode.java new file mode 100644 index 0000000..ad726bc --- /dev/null +++ b/src/com/isode/stroke/serializer/xml/XMLRawTextNode.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ + +package com.isode.stroke.serializer.xml; + +public class XMLRawTextNode implements XMLNode { + private final String text_; + + public XMLRawTextNode(String text) { + text_ = text; + } + + public String serialize() { + return text_; + } +} diff --git a/src/com/isode/stroke/serializer/xml/XMLTextNode.java b/src/com/isode/stroke/serializer/xml/XMLTextNode.java new file mode 100644 index 0000000..af11c27 --- /dev/null +++ b/src/com/isode/stroke/serializer/xml/XMLTextNode.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +/* + * Copyright (c) 2010, Remko Tron¨on. + * All rights reserved. + */ +package com.isode.stroke.serializer.xml; + +public class XMLTextNode implements XMLNode { + + private final String text_; + + public XMLTextNode(String text) { + text_ = text; + text_.replaceAll("&", "&"); // Should come first + text_.replaceAll("<", "<"); + text_.replaceAll(">", ">"); + } + + public String serialize() { + return text_; + } +} |