summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/serializer')
-rw-r--r--src/com/isode/stroke/serializer/AuthChallengeSerializer.java38
-rw-r--r--src/com/isode/stroke/serializer/AuthFailureSerializer.java26
-rw-r--r--src/com/isode/stroke/serializer/AuthRequestSerializer.java38
-rw-r--r--src/com/isode/stroke/serializer/AuthResponseSerializer.java35
-rw-r--r--src/com/isode/stroke/serializer/AuthSuccessSerializer.java38
-rw-r--r--src/com/isode/stroke/serializer/CompressFailureSerializer.java26
-rw-r--r--src/com/isode/stroke/serializer/CompressRequestSerializer.java27
-rw-r--r--src/com/isode/stroke/serializer/ElementSerializer.java17
-rw-r--r--src/com/isode/stroke/serializer/EnableStreamManagementSerializer.java26
-rw-r--r--src/com/isode/stroke/serializer/GenericElementSerializer.java28
-rw-r--r--src/com/isode/stroke/serializer/GenericPayloadSerializer.java34
-rw-r--r--src/com/isode/stroke/serializer/GenericStanzaSerializer.java33
-rw-r--r--src/com/isode/stroke/serializer/IQSerializer.java37
-rw-r--r--src/com/isode/stroke/serializer/MessageSerializer.java38
-rw-r--r--src/com/isode/stroke/serializer/PayloadSerializer.java20
-rw-r--r--src/com/isode/stroke/serializer/PayloadSerializerCollection.java34
-rw-r--r--src/com/isode/stroke/serializer/PresenceSerializer.java36
-rw-r--r--src/com/isode/stroke/serializer/StanzaAckRequestSerializer.java26
-rw-r--r--src/com/isode/stroke/serializer/StanzaAckSerializer.java28
-rw-r--r--src/com/isode/stroke/serializer/StanzaSerializer.java63
-rw-r--r--src/com/isode/stroke/serializer/StartTLSFailureSerializer.java26
-rw-r--r--src/com/isode/stroke/serializer/StartTLSRequestSerializer.java26
-rw-r--r--src/com/isode/stroke/serializer/StreamManagementEnabledSerializer.java32
-rw-r--r--src/com/isode/stroke/serializer/StreamManagementFailedSerializer.java26
-rw-r--r--src/com/isode/stroke/serializer/StreamResumeSerializer.java32
-rw-r--r--src/com/isode/stroke/serializer/StreamResumedSerializer.java32
-rw-r--r--src/com/isode/stroke/serializer/TLSProceedSerializer.java26
-rw-r--r--src/com/isode/stroke/serializer/XMPPSerializer.java93
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/BodySerializer.java29
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/ErrorSerializer.java70
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java52
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/LastSerializer.java24
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/RawXMLPayloadSerializer.java25
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/ResourceBindSerializer.java38
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/RosterSerializer.java64
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/SearchPayloadSerializer.java66
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/SoftwareVersionSerializer.java39
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/StartSessionSerializer.java27
-rw-r--r--src/com/isode/stroke/serializer/xml/XMLElement.java70
-rw-r--r--src/com/isode/stroke/serializer/xml/XMLNode.java14
-rw-r--r--src/com/isode/stroke/serializer/xml/XMLRawTextNode.java22
-rw-r--r--src/com/isode/stroke/serializer/xml/XMLTextNode.java25
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("&", "&amp;");
+ escapedValue.replaceAll("<", "&lt;");
+ escapedValue.replaceAll(">", "&gt;");
+ escapedValue.replaceAll("'", "&apos;");
+ escapedValue.replaceAll("\"", "&quot;");
+ 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("&", "&amp;"); // Should come first
+ text_.replaceAll("<", "&lt;");
+ text_.replaceAll(">", "&gt;");
+ }
+
+ public String serialize() {
+ return text_;
+ }
+}