diff options
Diffstat (limited to 'src/com/isode/stroke/serializer')
8 files changed, 555 insertions, 0 deletions
diff --git a/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java b/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java index d8f90c3..8c1f14b 100644 --- a/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java +++ b/src/com/isode/stroke/serializer/payloadserializers/FullPayloadSerializerCollection.java @@ -24,6 +24,12 @@ public class FullPayloadSerializerCollection extends PayloadSerializerCollection addSerializer(new ErrorSerializer()); addSerializer(new InBandRegistrationPayloadSerializer()); addSerializer(new IBBSerializer()); + addSerializer(new JingleIBBTransportPayloadSerializer()); + addSerializer(new JingleS5BTransportPayloadSerializer()); + addSerializer(new JingleFileTransferFileInfoSerializer()); + addSerializer(new JingleFileTransferDescriptionSerializer()); + addSerializer(new JingleFileTransferHashSerializer()); + addSerializer(new JingleContentPayloadSerializer()); addSerializer(new RosterSerializer()); addSerializer(new MUCPayloadSerializer()); addSerializer(new MUCDestroyPayloadSerializer()); diff --git a/src/com/isode/stroke/serializer/payloadserializers/JingleContentPayloadSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/JingleContentPayloadSerializer.java new file mode 100644 index 0000000..b295807 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/JingleContentPayloadSerializer.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2011 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ +/* + * Copyright (c) 2014 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLNode; +import com.isode.stroke.serializer.xml.XMLRawTextNode; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.elements.JingleS5BTransportPayload; +import com.isode.stroke.elements.JingleIBBTransportPayload; +import com.isode.stroke.elements.JingleTransportPayload; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleDescription; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.serializer.payloadserializers.JingleFileTransferDescriptionSerializer; +import com.isode.stroke.serializer.payloadserializers.JingleIBBTransportPayloadSerializer; +import com.isode.stroke.serializer.payloadserializers.JingleS5BTransportPayloadSerializer; +import java.util.logging.Logger; + +public class JingleContentPayloadSerializer extends GenericPayloadSerializer<JingleContentPayload> { + + private Logger logger_ = Logger.getLogger(this.getClass().getName()); + + public JingleContentPayloadSerializer() { + super(JingleContentPayload.class); + } + + private String creatorToString(JingleContentPayload.Creator creator) { + switch(creator) { + case InitiatorCreator: + return "initiator"; + case ResponderCreator: + return "responder"; + case UnknownCreator: + logger_.warning("Serializing unknown creator value."); + return "ERROR ERROR ERROR"; + } + assert(false); + return ""; + } + + public String serializePayload(JingleContentPayload payload) { + + XMLElement payloadXML = new XMLElement("content"); + payloadXML.setAttribute("creator", creatorToString(payload.getCreator())); + payloadXML.setAttribute("name", payload.getName()); + + if (!payload.getDescriptions().isEmpty()) { + // JingleFileTransferDescription + JingleFileTransferDescriptionSerializer ftSerializer = new JingleFileTransferDescriptionSerializer(); + JingleFileTransferDescription filetransfer; + + for(JingleDescription desc : payload.getDescriptions()) { + if(desc instanceof JingleFileTransferDescription) { + filetransfer = (JingleFileTransferDescription)(desc); + payloadXML.addNode(new XMLRawTextNode(ftSerializer.serializePayload(filetransfer))); + } + } + } + + if (!payload.getTransports().isEmpty()) { + // JingleIBBTransportPayload + JingleIBBTransportPayloadSerializer ibbSerializer = new JingleIBBTransportPayloadSerializer(); + JingleIBBTransportPayload ibb; + + // JingleS5BTransportPayload + JingleS5BTransportPayloadSerializer s5bSerializer = new JingleS5BTransportPayloadSerializer(); + JingleS5BTransportPayload s5b; + + for(JingleTransportPayload transport: payload.getTransports()) { + if(transport instanceof JingleIBBTransportPayload) { + ibb = (JingleIBBTransportPayload)(transport); + payloadXML.addNode(new XMLRawTextNode(ibbSerializer.serializePayload(ibb))); + } else if (transport instanceof JingleS5BTransportPayload) { + s5b = (JingleS5BTransportPayload)(transport); + payloadXML.addNode(new XMLRawTextNode(s5bSerializer.serializePayload(s5b))); + } + } + } + return payloadXML.serialize(); + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferDescriptionSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferDescriptionSerializer.java new file mode 100644 index 0000000..5bc14b8 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferDescriptionSerializer.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2011 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ +/* + * Copyright (c) 2015 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.serializer.payloadserializers.JingleFileTransferFileInfoSerializer; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLRawTextNode; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.base.NotNull; + +public class JingleFileTransferDescriptionSerializer extends GenericPayloadSerializer<JingleFileTransferDescription> { + + public JingleFileTransferDescriptionSerializer() { + super(JingleFileTransferDescription.class); + } + + public String serializePayload(JingleFileTransferDescription payload) { + XMLElement description = new XMLElement("description", "urn:xmpp:jingle:apps:file-transfer:4"); + + JingleFileTransferFileInfoSerializer fileInfoSerializer = new JingleFileTransferFileInfoSerializer(); + XMLRawTextNode fileInfoXML = new XMLRawTextNode(fileInfoSerializer.serialize((JingleFileTransferFileInfo)(payload.getFileInfo()))); + description.addNode(fileInfoXML); + return description.serialize(); + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferFileInfoSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferFileInfoSerializer.java new file mode 100644 index 0000000..a9ae722 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferFileInfoSerializer.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2014 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLTextNode; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.base.NotNull; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.stringcodecs.Base64; +import java.util.Map; +import java.util.HashMap; +import java.util.Date; + +public class JingleFileTransferFileInfoSerializer extends GenericPayloadSerializer<JingleFileTransferFileInfo> { + + public JingleFileTransferFileInfoSerializer() { + super(JingleFileTransferFileInfo.class); + } + + public String serializePayload(JingleFileTransferFileInfo fileInfo) { + XMLElement fileElement = new XMLElement("file", ""); + + if (fileInfo.getDate().getTime() != 0L) { + fileElement.addNode(new XMLElement("date", "", DateTime.dateToString(fileInfo.getDate()))); + } + + if (fileInfo.getDescription().length() != 0) { + fileElement.addNode(new XMLElement("desc", "", fileInfo.getDescription())); + } + + if (fileInfo.getMediaType().length() != 0) { + fileElement.addNode(new XMLElement("media-type", "", fileInfo.getMediaType())); + } + + if (fileInfo.getName().length() != 0) { + fileElement.addNode(new XMLElement("name", "", fileInfo.getName())); + } + + if (fileInfo.getSupportsRangeRequests()) { + XMLElement range = new XMLElement("range"); + if (fileInfo.getRangeOffset() != 0) { + range.setAttribute("offset", Long.toString(fileInfo.getRangeOffset())); + } + fileElement.addNode(range); + } + + if (fileInfo.getSize() > 0) { + fileElement.addNode(new XMLElement("size", "", Long.toString(fileInfo.getSize()))); + } + + for (Map.Entry<String, ByteArray> entry : fileInfo.getHashes().entrySet()) { + XMLElement hash = new XMLElement("hash", "urn:xmpp:hashes:1", Base64.encode(entry.getValue())); + hash.setAttribute("algo", entry.getKey()); + fileElement.addNode(hash); + } + + return fileElement.serialize(); + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferHashSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferHashSerializer.java new file mode 100644 index 0000000..73a3fd6 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/JingleFileTransferHashSerializer.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2011 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ +/* + * Copyright (c) 2015 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.serializer.payloadserializers.JingleFileTransferFileInfoSerializer; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLRawTextNode; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.elements.JingleFileTransferHash; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.base.NotNull; + +public class JingleFileTransferHashSerializer extends GenericPayloadSerializer<JingleFileTransferHash> { + + public JingleFileTransferHashSerializer() { + super(JingleFileTransferHash.class); + } + + public String serializePayload(JingleFileTransferHash payload) { + // code for version urn:xmpp:jingle:apps:file-transfer:2 + //XMLElement hash("hash", "urn:xmpp:jingle:apps:file-transfer:info:2", payload->getHash()); + + // code for version urn:xmpp:jingle:apps:file-transfer:4 + XMLElement checksum = new XMLElement("checksum", "urn:xmpp:jingle:apps:file-transfer:4"); + + JingleFileTransferFileInfoSerializer fileSerializer = new JingleFileTransferFileInfoSerializer(); + + XMLRawTextNode file = new XMLRawTextNode(fileSerializer.serialize((JingleFileTransferFileInfo)(payload.getFileInfo()))); + + checksum.addNode(file); + + return checksum.serialize(); + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/serializer/payloadserializers/JingleIBBTransportPayloadSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/JingleIBBTransportPayloadSerializer.java new file mode 100644 index 0000000..3633ba9 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/JingleIBBTransportPayloadSerializer.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.serializer.GenericPayloadSerializer; + +import com.isode.stroke.serializer.xml.XMLRawTextNode; +import com.isode.stroke.serializer.xml.XMLNode; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.elements.JingleIBBTransportPayload; +import com.isode.stroke.base.NotNull; + +public class JingleIBBTransportPayloadSerializer extends GenericPayloadSerializer<JingleIBBTransportPayload> { + + public JingleIBBTransportPayloadSerializer() { + super(JingleIBBTransportPayload.class); + } + + public String serializePayload(JingleIBBTransportPayload payload) { + XMLElement payloadXML = new XMLElement("transport", "urn:xmpp:jingle:transports:ibb:1"); + if (payload.getBlockSize() > 0) { + payloadXML.setAttribute("block-size", Integer.toString(payload.getBlockSize())); + } + payloadXML.setAttribute("sid", payload.getSessionID()); + + return payloadXML.serialize(); + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/serializer/payloadserializers/JinglePayloadSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/JinglePayloadSerializer.java new file mode 100644 index 0000000..a529f5b --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/JinglePayloadSerializer.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2011 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ +/* + * Copyright (c) 2015 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.serializer.payloadserializers.JingleContentPayloadSerializer; +import com.isode.stroke.serializer.payloadserializers.JingleFileTransferHashSerializer; +import com.isode.stroke.serializer.PayloadSerializerCollection; +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.PayloadSerializer; +import com.isode.stroke.serializer.xml.XMLTextNode; +import com.isode.stroke.serializer.xml.XMLRawTextNode; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.elements.JinglePayload; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.elements.JingleIBBTransportPayload; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleFileTransferHash; +import com.isode.stroke.elements.Payload; +import com.isode.stroke.base.NotNull; +import java.util.Vector; +import java.util.logging.Logger; + +public class JinglePayloadSerializer extends GenericPayloadSerializer<JinglePayload> { + + private PayloadSerializerCollection serializers; + private Logger logger_ = Logger.getLogger(this.getClass().getName()); + + public JinglePayloadSerializer(PayloadSerializerCollection serializers) { + super(JinglePayload.class); + this.serializers = serializers; + } + + private String actionToString(JinglePayload.Action action) { + switch(action) { + case ContentAccept: + return "content-accept"; + case ContentAdd: + return "content-add"; + case ContentModify: + return "content-modify"; + case ContentReject: + return "content-reject"; + case ContentRemove: + return "content-remove"; + case DescriptionInfo: + return "description-info"; + case SecurityInfo: + return "security-info"; + case SessionAccept: + return "session-accept"; + case SessionInfo: + return "session-info"; + case SessionInitiate: + return "session-initiate"; + case SessionTerminate: + return "session-terminate"; + case TransportAccept: + return "transport-accept"; + case TransportInfo: + return "transport-info"; + case TransportReject: + return "transport-reject"; + case TransportReplace: + return "transport-replace"; + case UnknownAction: + logger_.warning("Serializing unknown action value.\n"); + return ""; + } + assert(false); + return ""; + } + + private String reasonTypeToString(JinglePayload.Reason.Type type) { + switch(type) { + case UnknownType: + logger_.warning("Unknown jingle reason type!\n"); + return ""; + case AlternativeSession: + return "alternative-session"; + case Busy: + return "busy"; + case Cancel: + return "cancel"; + case ConnectivityError: + return "connectivity-error"; + case Decline: + return "decline"; + case Expired: + return "expired"; + case FailedApplication: + return "failed-application"; + case FailedTransport: + return "failed-transport"; + case GeneralError: + return "general-error"; + case Gone: + return "gone"; + case IncompatibleParameters: + return "incompatible-parameters"; + case MediaError: + return "media-error"; + case SecurityError: + return "security-error"; + case Success: + return "success"; + case Timeout: + return "timeout"; + case UnsupportedApplications: + return "unsupported-applications"; + case UnsupportedTransports: + return "unsupported-transports"; + } + assert(false); + return ""; + } + + public String serializePayload(JinglePayload payload) { + XMLElement jinglePayload = new XMLElement("jingle", "urn:xmpp:jingle:1"); + jinglePayload.setAttribute("action", actionToString(payload.getAction())); + jinglePayload.setAttribute("initiator", payload.getInitiator().toString()); + jinglePayload.setAttribute("sid", payload.getSessionID()); + + Vector<Payload> payloads = payload.getPayloads(); + if (!payloads.isEmpty()) { + for(Payload subPayload : payloads) { + PayloadSerializer serializer = serializers.getPayloadSerializer(subPayload); + if (serializer != null) { + jinglePayload.addNode(new XMLRawTextNode(serializer.serialize(subPayload))); + } + } + } + + if (payload.getReason() != null) { + XMLElement reason = new XMLElement("reason"); + reason.addNode(new XMLElement(reasonTypeToString(payload.getReason().type))); + if (payload.getReason().text.length() != 0) { + reason.addNode(new XMLElement("desc", "", payload.getReason().text)); + } + jinglePayload.addNode(reason); + } + + return jinglePayload.serialize(); + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/serializer/payloadserializers/JingleS5BTransportPayloadSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/JingleS5BTransportPayloadSerializer.java new file mode 100644 index 0000000..f6cc205 --- /dev/null +++ b/src/com/isode/stroke/serializer/payloadserializers/JingleS5BTransportPayloadSerializer.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2011 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ +/* + * Copyright (c) 2015 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.serializer.payloadserializers; + +import com.isode.stroke.serializer.GenericPayloadSerializer; +import com.isode.stroke.serializer.xml.XMLNode; +import com.isode.stroke.serializer.xml.XMLRawTextNode; +import com.isode.stroke.serializer.xml.XMLElement; +import com.isode.stroke.serializer.PayloadSerializerCollection; +import com.isode.stroke.elements.JingleS5BTransportPayload; + +public class JingleS5BTransportPayloadSerializer extends GenericPayloadSerializer<JingleS5BTransportPayload> { + + public JingleS5BTransportPayloadSerializer() { + super(JingleS5BTransportPayload.class); + } + + private String modeToString(JingleS5BTransportPayload.Mode mode) { + switch(mode) { + case TCPMode: + return "tcp"; + case UDPMode: + return "udp"; + } + assert(false); + return ""; + } + + private String typeToString(JingleS5BTransportPayload.Candidate.Type type) { + switch(type) { + case AssistedType: + return "assisted"; + case DirectType: + return "direct"; + case ProxyType: + return "proxy"; + case TunnelType: + return "tunnel"; + } + assert(false); + return ""; + } + + public String serializePayload(JingleS5BTransportPayload payload) { + + XMLElement payloadXML = new XMLElement("transport", "urn:xmpp:jingle:transports:s5b:1"); + payloadXML.setAttribute("sid", payload.getSessionID()); + payloadXML.setAttribute("mode", modeToString(payload.getMode())); + if (payload.getDstAddr().length() != 0) { + payloadXML.setAttribute("dstaddr", payload.getDstAddr()); + } + + for(JingleS5BTransportPayload.Candidate candidate : payload.getCandidates()) { + XMLElement candidateXML = new XMLElement("candidate"); + candidateXML.setAttribute("cid", candidate.cid); + candidateXML.setAttribute("host", candidate.hostPort.getAddress().toString()); + candidateXML.setAttribute("jid", candidate.jid.toString()); + candidateXML.setAttribute("port", Integer.toString(candidate.hostPort.getPort())); + candidateXML.setAttribute("priority", Integer.toString(candidate.priority)); + candidateXML.setAttribute("type", typeToString(candidate.type)); + payloadXML.addNode(candidateXML); + } + + if (payload.hasCandidateError()) { + payloadXML.addNode(new XMLElement("candidate-error")); + } + if (payload.hasProxyError()) { + payloadXML.addNode(new XMLElement("proxy-error")); + } + + if (payload.getActivated().length() != 0) { + XMLElement activatedXML = new XMLElement("activated"); + activatedXML.setAttribute("cid", payload.getActivated()); + payloadXML.addNode(activatedXML); + } + if (payload.getCandidateUsed().length() != 0) { + XMLElement candusedXML = new XMLElement("candidate-used"); + candusedXML.setAttribute("cid", payload.getCandidateUsed()); + payloadXML.addNode(candusedXML); + } + + return payloadXML.serialize(); + } +}
\ No newline at end of file |