diff options
44 files changed, 4230 insertions, 1 deletions
diff --git a/src/com/isode/stroke/elements/HashElement.java b/src/com/isode/stroke/elements/HashElement.java new file mode 100644 index 0000000..8c85c53 --- /dev/null +++ b/src/com/isode/stroke/elements/HashElement.java @@ -0,0 +1,61 @@ +/* + * 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.elements; + +import com.isode.stroke.base.NotNull; +import com.isode.stroke.base.ByteArray; + +public class HashElement { + + private String algorithm_ = ""; + private ByteArray hash_; + + public HashElement(String algorithm, ByteArray hash) { + algorithm_ = algorithm; + hash_ = hash; + } + + /** + * @param algorithm, Not Null. + * @param hash, Not Null. + */ + public void setHashValue(String algorithm, ByteArray hash) { + NotNull.exceptIfNull(algorithm, "algorithm"); + NotNull.exceptIfNull(hash, "hash"); + algorithm_ = algorithm; + hash_ = hash; + } + + /** + * @return algorithm, Not Null. + */ + public String getAlgorithm() { + return algorithm_; + } + + /** + * @return hash, Not Null. + */ + public ByteArray getHashValue() { + return hash_; + } + + public boolean equals(Object other) { + + if ((!(other instanceof HashElement)) || other == null) { + return false; + } + + HashElement guest = (HashElement) other; + return (algorithm_.equals(guest.algorithm_)) && (hash_.equals(guest.hash_)); + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/elements/JingleContentPayload.java b/src/com/isode/stroke/elements/JingleContentPayload.java new file mode 100644 index 0000000..423a499 --- /dev/null +++ b/src/com/isode/stroke/elements/JingleContentPayload.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2011 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.elements; + +import com.isode.stroke.base.NotNull; +import com.isode.stroke.elements.Payload; +import com.isode.stroke.elements.JingleDescription; +import com.isode.stroke.elements.JingleTransportPayload; +import java.util.Vector; + +public class JingleContentPayload extends Payload { + + public enum Creator { + UnknownCreator, + InitiatorCreator, + ResponderCreator + }; + + /*public enum Senders { + NoSenders, + InitiatorSender, + ResponderSender, + BothSenders, + };*/ + + private Creator creator; + private String name = ""; + //private Senders senders; + private Vector<JingleDescription> descriptions = new Vector<JingleDescription>(); + private Vector<JingleTransportPayload> transports = new Vector<JingleTransportPayload>(); + + /** + * Default Constructor. + */ + public JingleContentPayload() { + this.creator = Creator.UnknownCreator; + } + + /** + * @return creator, Not Null. + */ + public Creator getCreator() { + return creator; + } + + /** + * @param creator, Not Null. + */ + public void setCreator(Creator creator) { + NotNull.exceptIfNull(creator, "creator"); + this.creator = creator; + } + + /** + * @return name, Not Null. + */ + public String getName() { + return name; + } + + /** + * @param name, Not Null. + */ + public void setName(String name) { + NotNull.exceptIfNull(name, "name"); + this.name = name; + } + + /** + * @return descriptions, Not Null. + */ + public Vector<JingleDescription> getDescriptions() { + return descriptions; + } + + /** + * @param description, Not Null. + */ + public void addDescription(JingleDescription description) { + NotNull.exceptIfNull(description, "description"); + descriptions.add(description); + } + + /** + * @return transports, Not Null. + */ + public Vector<JingleTransportPayload> getTransports() { + return transports; + } + + /** + * @param transport, Not Null. + */ + public void addTransport(JingleTransportPayload transport) { + NotNull.exceptIfNull(transport, "transport"); + transports.add(transport); + } + + /** + * Get the description of the given type. + * @param <T> type. + * @param type, not null. + * @return description of given type. + */ + public <T extends Payload> T getDescription(T type) { + for (JingleDescription description : descriptions) { + if (description.getClass().isAssignableFrom(type.getClass())) { + return (T)description; + } + } + return null; + } + + /** + * Get the transport of the given type. + * @param <T> type. + * @param type, not null. + * @return transport of given type. + */ + public <T extends Payload> T getTransport(T type) { + for (JingleTransportPayload transport : transports) { + if (transport.getClass().isAssignableFrom(type.getClass())) { + return (T)transport; + } + } + return null; + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/elements/JingleDescription.java b/src/com/isode/stroke/elements/JingleDescription.java new file mode 100644 index 0000000..5f454c2 --- /dev/null +++ b/src/com/isode/stroke/elements/JingleDescription.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2011 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.elements; + +import com.isode.stroke.base.NotNull; +import com.isode.stroke.elements.Payload; + +public class JingleDescription extends Payload { + + +}
\ No newline at end of file diff --git a/src/com/isode/stroke/elements/JingleFileTransferDescription.java b/src/com/isode/stroke/elements/JingleFileTransferDescription.java new file mode 100644 index 0000000..e883b37 --- /dev/null +++ b/src/com/isode/stroke/elements/JingleFileTransferDescription.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2011-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.elements; + +import com.isode.stroke.elements.JingleDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.base.NotNull; + +public class JingleFileTransferDescription extends JingleDescription { + + private JingleFileTransferFileInfo fileInfo_; + + /** + * Default Constructor. + */ + public JingleFileTransferDescription() { + + } + + /** + * @param fileInfo, Not Null. + */ + public void setFileInfo(JingleFileTransferFileInfo fileInfo) { + NotNull.exceptIfNull(fileInfo, "fileInfo"); + fileInfo_ = fileInfo; + } + + /** + * @return fileInfo, Not Null. + */ + public JingleFileTransferFileInfo getFileInfo() { + return fileInfo_; + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/elements/JingleFileTransferFileInfo.java b/src/com/isode/stroke/elements/JingleFileTransferFileInfo.java new file mode 100644 index 0000000..100afd9 --- /dev/null +++ b/src/com/isode/stroke/elements/JingleFileTransferFileInfo.java @@ -0,0 +1,222 @@ +/* + * 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.elements; + +import com.isode.stroke.elements.Payload; +import com.isode.stroke.elements.HashElement; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.NotNull; +import com.isode.stroke.base.ByteArray; +import java.util.Date; +import java.util.TimeZone; +import java.util.Map; +import java.util.HashMap; + +/** + * @brief This class represents the file info used in XEP-0234. + */ +public class JingleFileTransferFileInfo extends Payload { + + private String name_ = ""; + private String description_ = ""; + private String mediaType_ = ""; + private long size_; + private Date date_; + private boolean supportsRangeRequests_; + private long rangeOffset_; + private Map<String, ByteArray> hashes_ = new HashMap<String, ByteArray>(); + + /** + * Default Constructor. + */ + public JingleFileTransferFileInfo() { + this("", "", 0, new Date(0L)); + } + + /** + * Parameterized Constructor. + * @param name, NotNull. + */ + public JingleFileTransferFileInfo(String name) { + this(name, "", 0, new Date(0L)); + } + + /** + * Parameterized Constructor. + * @param name, NotNull. + * @param description, NotNull. + */ + public JingleFileTransferFileInfo(String name, String description) { + this(name, description, 0, new Date(0L)); + } + + /** + * Parameterized Constructor. + * @param name, NotNull. + * @param description, NotNull. + * @param size. + */ + public JingleFileTransferFileInfo(String name, String description, long size) { + this(name, description, size, new Date(0L)); + } + + /** + * Parameterized Constructor. + * @param name, NotNull. + * @param description, NotNull. + * @param size. + * @param date, NotNull. + */ + public JingleFileTransferFileInfo(String name, String description, long size, Date date) { + NotNull.exceptIfNull(name, "name"); + NotNull.exceptIfNull(description, "description"); + NotNull.exceptIfNull(date, "date"); + this.name_ = name; + this.description_ = description; + this.size_ = size; + this.date_ = date; + this.supportsRangeRequests_ = false; + this.rangeOffset_ = 0; + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + /** + * @param name, NotNull. + */ + public void setName(String name) { + NotNull.exceptIfNull(name, "name"); + name_ = name;; + } + + /** + * @return name, NotNull. + */ + public String getName() { + return name_; + } + + /** + * @param description, NotNull. + */ + public void setDescription(String description) { + NotNull.exceptIfNull(description, "description"); + description_ = description; + } + + /** + * @return description, NotNull. + */ + public String getDescription() { + return description_; + } + + /** + * @param mediaType, NotNull. + */ + public void setMediaType(String mediaType) { + NotNull.exceptIfNull(mediaType, "mediaType"); + mediaType_ = mediaType; + } + + /** + * @return mediaType, NotNull. + */ + public String getMediaType() { + return mediaType_; + } + + /** + * @param size. + */ + public void setSize(long size) { + size_ = size; + } + + /** + * @return size. + */ + public long getSize() { + return size_; + } + + /** + * @param date, NotNull. + */ + public void setDate(Date date) { + NotNull.exceptIfNull(date, "date"); + date_ = date; + } + + /** + * @return date, NotNull. + */ + public Date getDate() { + return date_; + } + + /** + * @param supportsRangeRequests_. + */ + public void setSupportsRangeRequests(boolean supportsIt) { + supportsRangeRequests_ = supportsIt; + } + + /** + * @return supportsRangeRequests_. + */ + public boolean getSupportsRangeRequests() { + return supportsRangeRequests_; + } + + /** + * @param offset. + */ + public void setRangeOffset(long offset) { + supportsRangeRequests_ = true; + rangeOffset_ = offset; + } + + /** + * @return offset. + */ + public long getRangeOffset() { + return rangeOffset_; + } + + /** + * @param hash, NotNull. + */ + public void addHash(HashElement hash) { + NotNull.exceptIfNull(hash, "hash"); + hashes_.put(hash.getAlgorithm(), hash.getHashValue()); + } + + /** + * @return hashes map. + */ + public Map<String, ByteArray> getHashes() { + return hashes_; + } + + /** + * @param algorithm, NotNull. + * @return ByteArray, can be null. + */ + public ByteArray getHash(String algorithm) { + NotNull.exceptIfNull(algorithm, "algorithm"); + ByteArray ret = null; + if(hashes_.containsKey(algorithm)) { + ret = new ByteArray(hashes_.get(algorithm)); + } + return ret; + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/elements/JingleFileTransferHash.java b/src/com/isode/stroke/elements/JingleFileTransferHash.java new file mode 100644 index 0000000..b018549 --- /dev/null +++ b/src/com/isode/stroke/elements/JingleFileTransferHash.java @@ -0,0 +1,49 @@ +/* + * 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.elements; + +import com.isode.stroke.elements.Payload; +import com.isode.stroke.elements.JingleDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.base.NotNull; + +public class JingleFileTransferHash extends Payload { + + private JingleFileTransferFileInfo fileInfo_; + + /** + * Default Constructor. + */ + public JingleFileTransferHash() { + + } + + /** + * @param fileInfo, NotNull. + */ + public void setFileInfo(JingleFileTransferFileInfo fileInfo) { + NotNull.exceptIfNull(fileInfo, "fileInfo"); + fileInfo_ = fileInfo; + } + + /** + * @return fileInfo, NotNull. + */ + public JingleFileTransferFileInfo getFileInfo() { + return fileInfo_; + } +} diff --git a/src/com/isode/stroke/elements/JingleIBBTransportPayload.java b/src/com/isode/stroke/elements/JingleIBBTransportPayload.java new file mode 100644 index 0000000..677bef3 --- /dev/null +++ b/src/com/isode/stroke/elements/JingleIBBTransportPayload.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2011-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.elements; + +import com.isode.stroke.elements.JingleTransportPayload; +import com.isode.stroke.base.NotNull; + +public class JingleIBBTransportPayload extends JingleTransportPayload { + + public enum StanzaType { + IQStanza, + MessageStanza + }; + + private Integer blockSize; + private StanzaType stanzaType; + + /** + * Default Constructor. + */ + public JingleIBBTransportPayload() { + this.stanzaType = StanzaType.IQStanza; + } + + /** + * @param stanzaType, NotNull. + */ + public void setStanzaType(StanzaType stanzaType) { + NotNull.exceptIfNull(stanzaType, "stanzaType"); + this.stanzaType = stanzaType; + } + + /** + * @return stanzaType, NotNull. + */ + public StanzaType getStanzaType() { + return stanzaType; + } + + /** + * @return blockSize. + */ + public Integer getBlockSize() { + return blockSize; + } + + /** + * @param blockSize. + */ + public void setBlockSize(Integer blockSize) { + this.blockSize = blockSize; + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/elements/JinglePayload.java b/src/com/isode/stroke/elements/JinglePayload.java new file mode 100644 index 0000000..c90e802 --- /dev/null +++ b/src/com/isode/stroke/elements/JinglePayload.java @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2011-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.elements; + +import com.isode.stroke.base.NotNull; +import com.isode.stroke.elements.Payload; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.jid.JID; +import java.util.Vector; + +public class JinglePayload extends Payload { + + public static class Reason extends Payload { + + public enum Type { + UnknownType, + AlternativeSession, + Busy, + Cancel, + ConnectivityError, + Decline, + Expired, + FailedApplication, + FailedTransport, + GeneralError, + Gone, + IncompatibleParameters, + MediaError, + SecurityError, + Success, + Timeout, + UnsupportedApplications, + UnsupportedTransports + }; + + public Type type; + public String text = ""; + + public Reason() { + this(Type.UnknownType, ""); + } + + public Reason(Type type) { + this(type, ""); + } + + public Reason(Type type, String text) { + NotNull.exceptIfNull(type, "type"); + NotNull.exceptIfNull(text, "text"); + this.type = type; + this.text = text; + } + + /** + * @return Type, NotNull. + */ + public Type getType() { + return this.type; + } + + /** + * @param Type, NotNull. + */ + public void setType(Type type) { + NotNull.exceptIfNull(type, "type"); + this.type = type; + } + + /** + * @return Text, NotNull. + */ + public String getText() { + return this.text; + } + + /** + * @param Text, NotNull. + */ + public void setText(String text) { + NotNull.exceptIfNull(text, "text"); + this.text = text; + } + } + + public enum Action { + UnknownAction, + ContentAccept, + ContentAdd, + ContentModify, + ContentReject, + ContentRemove, + DescriptionInfo, + SecurityInfo, + SessionAccept, + SessionInfo, + SessionInitiate, + SessionTerminate, + TransportAccept, + TransportInfo, + TransportReject, + TransportReplace + }; + + private Action action; + private JID initiator = new JID(); + private JID responder = new JID(); + private String sessionID = ""; + private Vector<Payload> payloads = new Vector<Payload>(); + private Reason reason = null; + + public JinglePayload() { + this(Action.SessionTerminate, ""); + } + + public JinglePayload(Action action, String sessionID) { + NotNull.exceptIfNull(action, "action"); + NotNull.exceptIfNull(sessionID, "sessionID"); + this.action = action; + this.sessionID = sessionID; + } + + /** + * @param action, NotNull. + */ + public void setAction(Action action) { + NotNull.exceptIfNull(action, "action"); + this.action = action; + } + + /** + * @return action, NotNull. + */ + public Action getAction() { + return action; + } + + /** + * @param initiator, NotNull. + */ + public void setInitiator(JID initiator) { + NotNull.exceptIfNull(initiator, "initiator"); + this.initiator = initiator; + } + + /** + * @return initiator, NotNull. + */ + public JID getInitiator() { + return initiator; + } + + /** + * @param responder, NotNull. + */ + public void setResponder(JID responder) { + NotNull.exceptIfNull(responder, "responder"); + this.responder = responder; + } + + /** + * @return responder, NotNull. + */ + public JID getResponder() { + return responder; + } + + /** + * @param sessionID, NotNull. + */ + public void setSessionID(String id) { + NotNull.exceptIfNull(id, "sessionID"); + sessionID = id; + } + + /** + * @return sessionID, NotNull. + */ + public String getSessionID() { + return sessionID; + } + + /** + * @param content. + */ + public void addContent(JingleContentPayload content) { + this.payloads.add(content); + } + + /** + * @param payload. + */ + public void addPayload(Payload payload) { + this.payloads.add(payload); + } + + /** + * @return payloads, of type JingleContentPayload. + */ + public Vector<JingleContentPayload> getContents() { + return getPayloads(new JingleContentPayload()); + } + + /** + * @return payloads. + */ + public Vector<Payload> getPayloads() { + return payloads; + } + + /** + * Get the payload of the given type from the stanza + * @param <T> payload type + * @param type payload type object instance, not null + * @return payload of given type, can be null + */ + @SuppressWarnings("unchecked") + public <T extends Payload> T getPayload(T type) { + for (Payload payload : payloads) { + if (payload.getClass().isAssignableFrom(type.getClass())) { + return (T)payload; + } + } + return null; + } + + /** + * Get the payloads of the given type from the stanza + * @param <T> payload type + * @param type payload type object instance, not null + * @return list of payloads of given type, not null but can be empty + */ + @SuppressWarnings("unchecked") + public <T extends Payload> Vector<T> getPayloads(T type) { + Vector<T> matched_payloads = new Vector<T>(); + for (Payload payload : payloads) { + if (payload.getClass().isAssignableFrom(type.getClass())) { + matched_payloads.add((T)payload); + } + } + return matched_payloads; + } + + /** + * @param reason. + */ + public void setReason(Reason reason) { + this.reason = reason; + } + + /** + * @return reason. + */ + public Reason getReason() { + return reason; + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/elements/JingleS5BTransportPayload.java b/src/com/isode/stroke/elements/JingleS5BTransportPayload.java new file mode 100644 index 0000000..e9ee67f --- /dev/null +++ b/src/com/isode/stroke/elements/JingleS5BTransportPayload.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2011-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.elements; + +import com.isode.stroke.elements.JingleTransportPayload; +import com.isode.stroke.elements.Bytestreams; +import com.isode.stroke.network.HostAddressPort; +import com.isode.stroke.jid.JID; +import com.isode.stroke.base.NotNull; +import java.util.Vector; + +public class JingleS5BTransportPayload extends JingleTransportPayload { + + public enum Mode { + TCPMode, // default case + UDPMode + }; + + public static class Candidate { + + public enum Type { + DirectType, // default case + AssistedType, + TunnelType, + ProxyType + }; + + public String cid = ""; + public JID jid = new JID(); + public HostAddressPort hostPort; + public int priority; + public Type type; + + public Candidate() { + this.priority = 0; + this.type = Type.DirectType; + } + } + + public class CompareCandidate { + public boolean compareTo(JingleS5BTransportPayload.Candidate c1, JingleS5BTransportPayload.Candidate c2) { + return (c1.priority < c2.priority); + } + } + + private Mode mode; + private Vector<Candidate> candidates = new Vector<Candidate>(); + + private String candidateUsedCID = ""; + private String activatedCID = ""; + private String dstAddr = ""; + private boolean candidateError; + private boolean proxyError; + + public JingleS5BTransportPayload() { + this.mode = Mode.TCPMode; + this.candidateError = false; + this.proxyError = false; + } + + /** + * @return mode, Not Null. + */ + public Mode getMode() { + return mode; + } + + /** + * @param mode, Not Null. + */ + public void setMode(Mode mode) { + NotNull.exceptIfNull(mode, "mode"); + this.mode = mode; + } + + /** + * @return candidates, Not Null. + */ + public Vector<Candidate> getCandidates() { + return candidates; + } + + /** + * @param candidate, NotNull. + */ + public void addCandidate(Candidate candidate) { + NotNull.exceptIfNull(candidate, "candidate"); + candidates.add(candidate); + } + + /** + * @param cid, NotNull. + */ + public void setCandidateUsed(String cid) { + NotNull.exceptIfNull(cid, "cid"); + candidateUsedCID = cid; + } + + /** + * @return candidateUsedCID, Not Null. + */ + public String getCandidateUsed() { + return candidateUsedCID; + } + + /** + * @param cid, NotNull. + */ + public void setActivated(String cid) { + NotNull.exceptIfNull(cid, "cid"); + activatedCID = cid; + } + + /** + * @return activatedCID, Not Null. + */ + public String getActivated() { + return activatedCID; + } + + /** + * @param addr, NotNull. + */ + public void setDstAddr(String addr) { + NotNull.exceptIfNull(addr, "addr"); + dstAddr = addr; + } + + /** + * @return dstAddr, Not Null. + */ + public String getDstAddr() { + return dstAddr; + } + + /** + * @param candidateError. + */ + public void setCandidateError(boolean hasError) { + candidateError = hasError; + } + + /** + * @return candidateError. + */ + public boolean hasCandidateError() { + return candidateError; + } + + /** + * @param proxyError. + */ + public void setProxyError(boolean hasError) { + proxyError = hasError; + } + + /** + * @return proxyError. + */ + public boolean hasProxyError() { + return proxyError; + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/elements/JingleTransportPayload.java b/src/com/isode/stroke/elements/JingleTransportPayload.java new file mode 100644 index 0000000..a474eae --- /dev/null +++ b/src/com/isode/stroke/elements/JingleTransportPayload.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2011 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.elements; + +import com.isode.stroke.base.NotNull; +import com.isode.stroke.elements.Payload; + +public class JingleTransportPayload extends Payload { + + private String sessionID = ""; + + /** + * @param Id, Not Null. + */ + public void setSessionID(String id) { + NotNull.exceptIfNull(id, "id"); + sessionID = id; + } + + /** + * @return Id, Not Null. + */ + public String getSessionID() { + return sessionID; + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/network/HostAddress.java b/src/com/isode/stroke/network/HostAddress.java index 7145fb3..c1b3600 100644 --- a/src/com/isode/stroke/network/HostAddress.java +++ b/src/com/isode/stroke/network/HostAddress.java @@ -53,7 +53,7 @@ public class HostAddress { return address_ != null; } - InetAddress getInetAddress() { + public InetAddress getInetAddress() { return address_; } diff --git a/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java b/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java index 84a0b43..08d9f28 100644 --- a/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java +++ b/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java @@ -21,6 +21,14 @@ public class FullPayloadParserFactoryCollection extends PayloadParserFactoryColl addFactory(new GenericPayloadParserFactory<LastParser>("query", "jabber:iq:last", LastParser.class)); addFactory(new GenericPayloadParserFactory<BodyParser>("body", BodyParser.class)); addFactory(new GenericPayloadParserFactory<SubjectParser>("subject", SubjectParser.class)); + addFactory(new JingleParserFactory(this)); + addFactory(new GenericPayloadParserFactory<JingleReasonParser>("reason", "urn:xmpp:jingle:1", JingleReasonParser.class)); + addFactory(new GenericPayloadParserFactory<JingleFileTransferFileInfoParser>("file", "", JingleFileTransferFileInfoParser.class)); + addFactory(new JingleFileTransferDescriptionParserFactory(this)); + addFactory(new GenericPayloadParserFactory<JingleFileTransferHashParser>("checksum", "urn:xmpp:jingle:apps:file-transfer:4", JingleFileTransferHashParser.class)); + addFactory(new GenericPayloadParserFactory<JingleIBBTransportMethodPayloadParser>("transport", "urn:xmpp:jingle:transports:ibb:1", JingleIBBTransportMethodPayloadParser.class)); + addFactory(new GenericPayloadParserFactory<JingleS5BTransportMethodPayloadParser>("transport", "urn:xmpp:jingle:transports:s5b:1", JingleS5BTransportMethodPayloadParser.class)); + addFactory(new JingleContentPayloadParserFactory(this)); //addFactory(new GenericPayloadParserFactory<PriorityParser>("priority", PriorityParser.class)); addFactory(new ErrorParserFactory(this)); addFactory(new SoftwareVersionParserFactory()); diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParser.java b/src/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParser.java new file mode 100644 index 0000000..5f114c2 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParser.java @@ -0,0 +1,119 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParser; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.parser.PayloadParserFactoryCollection; +import com.isode.stroke.parser.PayloadParserFactory; +import com.isode.stroke.parser.PayloadParser; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.elements.JingleTransportPayload; +import com.isode.stroke.elements.JingleDescription; +import com.isode.stroke.base.NotNull; + +public class JingleContentPayloadParser extends GenericPayloadParser<JingleContentPayload> { + + private PayloadParserFactoryCollection factories; + private int level; + private PayloadParser currentPayloadParser; + + public JingleContentPayloadParser(PayloadParserFactoryCollection factories) { + super(new JingleContentPayload()); + this.factories = factories; + this.level = 0; + } + + /** + * @param element, NotNull. + * @param ns. + * @param attributes, NotNull. + */ + @Override + public void handleStartElement(String element, String ns, AttributeMap attributes) { + NotNull.exceptIfNull(attributes, "attributes"); + if (level == 0) { + String creator = ""; + if(attributes.getAttributeValue("creator") != null) { + creator = attributes.getAttributeValue("creator"); + } else { + creator = ""; + } + if (creator.equals("initiator")) { + getPayloadInternal().setCreator(JingleContentPayload.Creator.InitiatorCreator); + } else if (creator.equals("responder")) { + getPayloadInternal().setCreator(JingleContentPayload.Creator.ResponderCreator); + } else { + getPayloadInternal().setCreator(JingleContentPayload.Creator.UnknownCreator); + } + if(attributes.getAttributeValue("name") != null) { + getPayloadInternal().setName(attributes.getAttributeValue("name")); + } else { + getPayloadInternal().setName(""); + } + } + + if (level == 1) { + PayloadParserFactory payloadParserFactory = factories.getPayloadParserFactory(element, ns, attributes); + if (payloadParserFactory != null) { + currentPayloadParser = payloadParserFactory.createPayloadParser(); + } + } + + if (level >= 1 && currentPayloadParser != null) { + currentPayloadParser.handleStartElement(element, ns, attributes); + } + + ++level; + } + + /** + * @param element, NotNull. + * @param ns. + */ + @Override + public void handleEndElement(String element, String ns) { + --level; + + if (currentPayloadParser != null) { + if (level >= 1) { + currentPayloadParser.handleEndElement(element, ns); + } + + if (level == 1) { + if(currentPayloadParser.getPayload() instanceof JingleTransportPayload) { + JingleTransportPayload transport = (JingleTransportPayload)(currentPayloadParser.getPayload()); + if (transport != null) { + getPayloadInternal().addTransport(transport); + } + } + if(currentPayloadParser.getPayload() instanceof JingleDescription) { + JingleDescription description = (JingleDescription)(currentPayloadParser.getPayload()); + if (description != null) { + getPayloadInternal().addDescription(description); + } + } + } + } + } + + /** + * @param data, NotNull. + */ + @Override + public void handleCharacterData(String data) { + NotNull.exceptIfNull(data, "data"); + if (level > 1 && currentPayloadParser != null) { + currentPayloadParser.handleCharacterData(data); + } + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParserFactory.java b/src/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParserFactory.java new file mode 100644 index 0000000..d31303e --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParserFactory.java @@ -0,0 +1,51 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParserFactory; +import com.isode.stroke.parser.PayloadParserFactoryCollection; +import com.isode.stroke.parser.payloadparsers.JingleContentPayloadParser; +import com.isode.stroke.parser.PayloadParserFactory; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.parser.PayloadParser; +import com.isode.stroke.base.NotNull; + +public class JingleContentPayloadParserFactory implements PayloadParserFactory { + + private PayloadParserFactoryCollection factories; + + /** + * JingleContentPayloadParserFactory(); + */ + public JingleContentPayloadParserFactory(PayloadParserFactoryCollection factories) { + this.factories = factories; + } + + /** + * @param attributes. + * @param element, Not Null. + * @param attributes, Not NUll. + */ + public boolean canParse(String element, String ns, AttributeMap attributes) { + NotNull.exceptIfNull(element, "element"); + NotNull.exceptIfNull(attributes, "attributes"); + return element.equals("content") && ns.equals("urn:xmpp:jingle:1"); + } + + /** + * @return PayloadParser() + */ + public PayloadParser createPayloadParser() { + return new JingleContentPayloadParser(factories); + } +} + diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParser.java b/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParser.java new file mode 100644 index 0000000..1b74fa9 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParser.java @@ -0,0 +1,88 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParser; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.parser.PayloadParserFactoryCollection; +import com.isode.stroke.parser.PayloadParser; +import com.isode.stroke.parser.PayloadParserFactory; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.base.NotNull; + +public class JingleFileTransferDescriptionParser extends GenericPayloadParser<JingleFileTransferDescription> { + + private PayloadParserFactoryCollection factories; + private int level = 0; + private PayloadParser currentPayloadParser; + + public JingleFileTransferDescriptionParser(PayloadParserFactoryCollection factories) { + super(new JingleFileTransferDescription()); + this.factories = factories; + this.level = 0; + } + + /** + * @param element. + * @param ns. + * @param attributes. + */ + @Override + public void handleStartElement(String element, String ns, AttributeMap attributes) { + if (level == 1) { + PayloadParserFactory payloadParserFactory = factories.getPayloadParserFactory(element, ns, attributes); + if (payloadParserFactory != null) { + currentPayloadParser = payloadParserFactory.createPayloadParser(); + } + } + + if (level >= 1 && currentPayloadParser != null) { + currentPayloadParser.handleStartElement(element, ns, attributes); + } + ++level; + } + + /** + * @param element. + * @param ns. + */ + @Override + public void handleEndElement(String element, String ns) { + --level; + if (level >= 1 && currentPayloadParser != null) { + currentPayloadParser.handleEndElement(element, ns); + } + + if (level == 0) { + JingleFileTransferFileInfo info = (JingleFileTransferFileInfo)(currentPayloadParser.getPayload()); + if (info != null) { + getPayloadInternal().setFileInfo(info); + } + } + } + + /** + * @param data, NotNull. + */ + @Override + public void handleCharacterData(String data) { + if (level >= 1 && currentPayloadParser != null) { + currentPayloadParser.handleCharacterData(data); + } + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParserFactory.java b/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParserFactory.java new file mode 100644 index 0000000..ec884ec --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParserFactory.java @@ -0,0 +1,56 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParserFactory; +import com.isode.stroke.parser.PayloadParserFactoryCollection; +import com.isode.stroke.parser.payloadparsers.JingleFileTransferDescriptionParser; +import com.isode.stroke.parser.PayloadParserFactory; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.parser.PayloadParser; +import com.isode.stroke.base.NotNull; + +public class JingleFileTransferDescriptionParserFactory implements PayloadParserFactory { + + private PayloadParserFactoryCollection factories; + + /** + * JingleFileTransferDescriptionParserFactory(); + */ + public JingleFileTransferDescriptionParserFactory(PayloadParserFactoryCollection factories) { + this.factories = factories; + } + + /** + * @param attributes. + * @param element, Not Null. + * @param attributes, Not NUll. + */ + public boolean canParse(String element, String ns, AttributeMap attributes) { + NotNull.exceptIfNull(element, "element"); + NotNull.exceptIfNull(ns, "ns"); + return element.equals("description") && ns.equals("urn:xmpp:jingle:apps:file-transfer:4"); + } + + /** + * @return PayloadParser() + */ + public PayloadParser createPayloadParser() { + return new JingleFileTransferDescriptionParser(factories); + } +} + diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferFileInfoParser.java b/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferFileInfoParser.java new file mode 100644 index 0000000..edb40f4 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferFileInfoParser.java @@ -0,0 +1,111 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParser; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.elements.HashElement; +import com.isode.stroke.base.NotNull; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.stringcodecs.Base64; + +public class JingleFileTransferFileInfoParser extends GenericPayloadParser<JingleFileTransferFileInfo> { + + private int level = 0; + private String charData = ""; + private String hashAlg = ""; + private Long rangeOffset = null; + + public JingleFileTransferFileInfoParser() { + super(new JingleFileTransferFileInfo()); + } + + /** + * @param element, NotNull. + * @param ns. + * @param attributes. + */ + @Override + public void handleStartElement(String element, String ns, AttributeMap attributes) { + NotNull.exceptIfNull(element, "element"); + charData = ""; + if (element.equals("hash")) { + if(attributes.getAttributeValue("algo") != null) { + hashAlg = attributes.getAttributeValue("algo"); + } else { + hashAlg = ""; + } + } + else if (element.equals("range")) { + if(attributes.getAttributeValue("offset") != null) { + try { + rangeOffset = Long.parseLong(attributes.getAttributeValue("offset")); + } + catch(NumberFormatException e) { + rangeOffset = null; + } + } else { + rangeOffset = null; + } + } + + ++level; + } + + /** + * @param element, NotNull. + * @param ns. + */ + @Override + public void handleEndElement(String element, String ns) { + NotNull.exceptIfNull(element, "element"); + --level; + if (level == 1) { + if (element.equals("date")) { + getPayloadInternal().setDate(DateTime.stringToDate(charData)); + } + else if (element.equals("desc")) { + getPayloadInternal().setDescription(charData); + } + else if (element.equals("media-type")) { + getPayloadInternal().setMediaType(charData); + } + else if (element.equals("name")) { + getPayloadInternal().setName(charData); + } + else if (element.equals("size")) { + getPayloadInternal().setSize(Long.parseLong(charData)); + } + else if (element.equals("range")) { + getPayloadInternal().setSupportsRangeRequests(true); + if (rangeOffset != null) { + getPayloadInternal().setRangeOffset(rangeOffset.longValue()); + } else { + getPayloadInternal().setRangeOffset(0L); + } + } + else if (element.equals("hash")) { + getPayloadInternal().addHash(new HashElement(hashAlg, Base64.decode(charData))); + } + } + } + + /** + * @param data, NotNull. + */ + @Override + public void handleCharacterData(String data) { + NotNull.exceptIfNull(data, "data"); + charData += data; + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferHashParser.java b/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferHashParser.java new file mode 100644 index 0000000..89d6817 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleFileTransferHashParser.java @@ -0,0 +1,82 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParser; +import com.isode.stroke.parser.PayloadParser; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.elements.JingleFileTransferHash; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.base.NotNull; + +public class JingleFileTransferHashParser extends GenericPayloadParser<JingleFileTransferHash> { + + private int level = 0; + private PayloadParser currentPayloadParser; + + public JingleFileTransferHashParser() { + super(new JingleFileTransferHash()); + this.level = 0; + } + + /** + * @param element, NotNull. + * @param ns. + * @param attributes. + */ + @Override + public void handleStartElement(String element, String ns, AttributeMap attributes) { + NotNull.exceptIfNull(element, "element"); + if (level == 1 && element.equals("file")) { + currentPayloadParser = new JingleFileTransferFileInfoParser(); + } + + if (level >= 1 && currentPayloadParser != null) { + currentPayloadParser.handleStartElement(element, ns, attributes); + } + ++level; + } + + /** + * @param element, NotNull. + * @param ns. + */ + @Override + public void handleEndElement(String element, String ns) { + --level; + if (level >= 1 && currentPayloadParser != null) { + currentPayloadParser.handleEndElement(element, ns); + } + + if (level == 1) { + JingleFileTransferFileInfo info = (JingleFileTransferFileInfo)(currentPayloadParser.getPayload()); + if (info != null) { + getPayloadInternal().setFileInfo(info); + } + } + } + + /** + * @param data, NotNull. + */ + @Override + public void handleCharacterData(String data) { + if (level >= 1 && currentPayloadParser != null) { + currentPayloadParser.handleCharacterData(data); + } + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleIBBTransportMethodPayloadParser.java b/src/com/isode/stroke/parser/payloadparsers/JingleIBBTransportMethodPayloadParser.java new file mode 100644 index 0000000..1883903 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleIBBTransportMethodPayloadParser.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParser; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.elements.JingleIBBTransportPayload; +import com.isode.stroke.base.NotNull; + +public class JingleIBBTransportMethodPayloadParser extends GenericPayloadParser<JingleIBBTransportPayload> { + + private int level = 0; + + public JingleIBBTransportMethodPayloadParser() { + super(new JingleIBBTransportPayload()); + this.level = 0; + } + + /** + * @param element, NotNull. + * @param ns. + * @param attributes. + */ + @Override + public void handleStartElement(String element, String ns, AttributeMap attributes) { + try { + String blockSize = attributes.getAttributeValue("block-size"); + if (blockSize != null) { + getPayloadInternal().setBlockSize(Integer.parseInt(blockSize)); + } + } + catch (NumberFormatException e) { + + } + if(attributes.getAttributeValue("sid") != null) { + getPayloadInternal().setSessionID(attributes.getAttributeValue("sid")); + } else { + getPayloadInternal().setSessionID(""); + } + ++level; + } + + /** + * @param element, NotNull. + * @param ns. + */ + @Override + public void handleEndElement(String element, String ns) { + --level; + } + + /** + * @param data, NotNull. + */ + @Override + public void handleCharacterData(String data) { + + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleParser.java b/src/com/isode/stroke/parser/payloadparsers/JingleParser.java new file mode 100644 index 0000000..1778b02 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleParser.java @@ -0,0 +1,174 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParser; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.parser.PayloadParserFactoryCollection; +import com.isode.stroke.parser.PayloadParser; +import com.isode.stroke.parser.PayloadParserFactory; +import com.isode.stroke.elements.JinglePayload; +import com.isode.stroke.elements.JingleFileTransferHash; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.base.NotNull; +import com.isode.stroke.jid.JID; + +public class JingleParser extends GenericPayloadParser<JinglePayload> { + + private PayloadParserFactoryCollection factories; + private int level = 0; + private PayloadParser currentPayloadParser; + + public JingleParser(PayloadParserFactoryCollection factories) { + super(new JinglePayload()); + this.factories = factories; + this.level = 0; + } + + private JinglePayload.Action stringToAction(String str) { + if (str.equals("content-accept")) { + return JinglePayload.Action.ContentAccept; + } else if (str.equals("content-add")) { + return JinglePayload.Action.ContentAdd; + } else if (str.equals("content-modify")) { + return JinglePayload.Action.ContentModify; + } else if (str.equals("content-reject")) { + return JinglePayload.Action.ContentReject; + } else if (str.equals("content-remove")) { + return JinglePayload.Action.ContentRemove; + } else if (str.equals("description-info")) { + return JinglePayload.Action.DescriptionInfo; + } else if (str.equals("security-info")) { + return JinglePayload.Action.SecurityInfo; + } else if (str.equals("session-accept")) { + return JinglePayload.Action.SessionAccept; + } else if (str.equals("session-info")) { + return JinglePayload.Action.SessionInfo; + } else if (str.equals("session-initiate")) { + return JinglePayload.Action.SessionInitiate; + } else if (str.equals("session-terminate")) { + return JinglePayload.Action.SessionTerminate; + } else if (str.equals("transport-accept")) { + return JinglePayload.Action.TransportAccept; + } else if (str.equals("transport-info")) { + return JinglePayload.Action.TransportInfo; + } else if (str.equals("transport-reject")) { + return JinglePayload.Action.TransportReject; + } else if (str.equals("transport-replace")) { + return JinglePayload.Action.TransportReplace; + } else { + return JinglePayload.Action.UnknownAction; + } + } + + /** + * @param element, NotNull. + * @param ns. + * @param attributes. + */ + @Override + public void handleStartElement(String element, String ns, AttributeMap attributes) { + NotNull.exceptIfNull(attributes, "attributes"); + if (level == 0) { + // <jingle > tag + JinglePayload payload = getPayloadInternal(); + if (attributes.getAttributeValue("action") != null) { + payload.setAction(stringToAction(attributes.getAttributeValue("action"))); + } else { + payload.setAction(stringToAction("")); + } + + if(attributes.getAttributeValue("initiator") != null) { + payload.setInitiator(new JID(attributes.getAttributeValue("initiator"))); + } else { + payload.setInitiator(new JID("")); + } + + if(attributes.getAttributeValue("responder") != null) { + payload.setResponder(new JID(attributes.getAttributeValue("responder"))); + } else { + payload.setResponder(new JID("")); + } + + if (attributes.getAttributeValue("sid") != null) { + payload.setSessionID(attributes.getAttributeValue("sid")); + } else { + payload.setSessionID(""); + } + } + + if (level == 1) { + PayloadParserFactory payloadParserFactory = factories.getPayloadParserFactory(element, ns, attributes); + if (payloadParserFactory != null) { + currentPayloadParser = payloadParserFactory.createPayloadParser(); + } + } + + if (level >= 1 && currentPayloadParser != null) { + currentPayloadParser.handleStartElement(element, ns, attributes); + } + + ++level; + } + + /** + * @param element, NotNull. + * @param ns. + */ + @Override + public void handleEndElement(String element, String ns) { + --level; + if (currentPayloadParser != null) { + if (level >= 1) { + currentPayloadParser.handleEndElement(element, ns); + } + + if (level == 1) { + if(currentPayloadParser.getPayload() instanceof JinglePayload.Reason) { + JinglePayload.Reason reason = (JinglePayload.Reason)(currentPayloadParser.getPayload()); + if (reason != null) { + getPayloadInternal().setReason(reason); + } + } + + if(currentPayloadParser.getPayload() instanceof JingleContentPayload) { + JingleContentPayload payload = (JingleContentPayload)(currentPayloadParser.getPayload()); + if (payload != null) { + getPayloadInternal().addContent(payload); + } + } + + if(currentPayloadParser.getPayload() instanceof JingleFileTransferHash) { + JingleFileTransferHash hash = (JingleFileTransferHash)(currentPayloadParser.getPayload()); + if (hash != null) { + getPayloadInternal().addPayload(hash); + } + } + } + } + } + + /** + * @param data, NotNull. + */ + @Override + public void handleCharacterData(String data) { + if (level > 1 && currentPayloadParser != null) { + currentPayloadParser.handleCharacterData(data); + } + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleParserFactory.java b/src/com/isode/stroke/parser/payloadparsers/JingleParserFactory.java new file mode 100644 index 0000000..3a6c2e9 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleParserFactory.java @@ -0,0 +1,51 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParserFactory; +import com.isode.stroke.parser.PayloadParserFactoryCollection; +import com.isode.stroke.parser.payloadparsers.JingleParser; +import com.isode.stroke.parser.PayloadParserFactory; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.parser.PayloadParser; +import com.isode.stroke.base.NotNull; + +public class JingleParserFactory implements PayloadParserFactory { + + private PayloadParserFactoryCollection factories; + + /** + * JingleParserFactory(); + */ + public JingleParserFactory(PayloadParserFactoryCollection factories) { + this.factories = factories; + } + + /** + * @param attributes. + * @param element, Not Null. + * @param attributes, Not NUll. + */ + public boolean canParse(String element, String ns, AttributeMap attributes) { + NotNull.exceptIfNull(element, "element"); + NotNull.exceptIfNull(ns, "ns"); + return element.equals("jingle") && ns.equals("urn:xmpp:jingle:1"); + } + + /** + * @return PayloadParser() + */ + public PayloadParser createPayloadParser() { + return new JingleParser(factories); + } +} + diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleReasonParser.java b/src/com/isode/stroke/parser/payloadparsers/JingleReasonParser.java new file mode 100644 index 0000000..5651c64 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleReasonParser.java @@ -0,0 +1,119 @@ +/* + * 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParser; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.parser.PayloadParserFactoryCollection; +import com.isode.stroke.parser.PayloadParser; +import com.isode.stroke.parser.PayloadParserFactory; +import com.isode.stroke.elements.JinglePayload; +import com.isode.stroke.elements.JingleFileTransferHash; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.base.NotNull; +import com.isode.stroke.jid.JID; + +public class JingleReasonParser extends GenericPayloadParser<JinglePayload.Reason> { + + private int level; + private boolean parseText; + private String text = ""; + + public JingleReasonParser() { + super(new JinglePayload.Reason()); + this.level = 0; + this.parseText = false; + } + + private JinglePayload.Reason.Type stringToReasonType(String type) { + if (type.equals("alternative-session")) { + return JinglePayload.Reason.Type.AlternativeSession; + } else if (type.equals("busy")) { + return JinglePayload.Reason.Type.Busy; + } else if (type.equals("cancel")) { + return JinglePayload.Reason.Type.Cancel; + } else if (type.equals("connectivity-error")) { + return JinglePayload.Reason.Type.ConnectivityError; + } else if (type.equals("decline")) { + return JinglePayload.Reason.Type.Decline; + } else if (type.equals("expired")) { + return JinglePayload.Reason.Type.Expired; + } else if (type.equals("failed-application")) { + return JinglePayload.Reason.Type.FailedApplication; + } else if (type.equals("failed-transport")) { + return JinglePayload.Reason.Type.FailedTransport; + } else if (type.equals("general-error")) { + return JinglePayload.Reason.Type.GeneralError; + } else if (type.equals("gone")) { + return JinglePayload.Reason.Type.Gone; + } else if (type.equals("incompatible-parameters")) { + return JinglePayload.Reason.Type.IncompatibleParameters; + } else if (type.equals("media-error")) { + return JinglePayload.Reason.Type.MediaError; + } else if (type.equals("security-error")) { + return JinglePayload.Reason.Type.SecurityError; + } else if (type.equals("success")) { + return JinglePayload.Reason.Type.Success; + } else if (type.equals("timeout")) { + return JinglePayload.Reason.Type.Timeout; + } else if (type.equals("unsupported-applications")) { + return JinglePayload.Reason.Type.UnsupportedApplications; + } else if (type.equals("unsupported-transports")) { + return JinglePayload.Reason.Type.UnsupportedTransports; + } else { + return JinglePayload.Reason.Type.UnknownType; + } + } + + /** + * @param element, NotNull. + * @param ns. + * @param attributes. + */ + @Override + public void handleStartElement(String element, String ns, AttributeMap attributes) { + NotNull.exceptIfNull(element, "element"); + if (level == 1) { + if (element.equals("text")) { + parseText = true; + } else { + // reason type + getPayloadInternal().type = stringToReasonType(element); + } + } + ++level; + } + + /** + * @param element, NotNull. + * @param ns. + */ + @Override + public void handleEndElement(String element, String ns) { + --level; + if (element.equals("text")) { + parseText = false; + getPayloadInternal().text = text; + } + } + + /** + * @param data, NotNull. + */ + @Override + public void handleCharacterData(String data) { + NotNull.exceptIfNull(data, "data"); + if (parseText) { + text += data; + } + } +}
\ No newline at end of file diff --git a/src/com/isode/stroke/parser/payloadparsers/JingleS5BTransportMethodPayloadParser.java b/src/com/isode/stroke/parser/payloadparsers/JingleS5BTransportMethodPayloadParser.java new file mode 100644 index 0000000..d4a1ae4 --- /dev/null +++ b/src/com/isode/stroke/parser/payloadparsers/JingleS5BTransportMethodPayloadParser.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2011 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ +/* +* Copyright (c) 2014-2015 Isode Limited. +* All rights reserved.v3. +* 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.parser.payloadparsers; + +import com.isode.stroke.parser.GenericPayloadParser; +import com.isode.stroke.parser.AttributeMap; +import com.isode.stroke.elements.JingleS5BTransportPayload; +import com.isode.stroke.base.NotNull; +import com.isode.stroke.jid.JID; +import com.isode.stroke.network.HostAddressPort; +import com.isode.stroke.network.HostAddress; +import java.util.logging.Logger; +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class JingleS5BTransportMethodPayloadParser extends GenericPayloadParser<JingleS5BTransportPayload> { + + private int level = 0; + private Logger logger_ = Logger.getLogger(this.getClass().getName()); + + public JingleS5BTransportMethodPayloadParser() { + super(new JingleS5BTransportPayload()); + this.level = 0; + } + + private JingleS5BTransportPayload.Candidate.Type stringToType(String str) { + if (str.equals("direct")) { + return JingleS5BTransportPayload.Candidate.Type.DirectType; + } else if (str.equals("assisted")) { + return JingleS5BTransportPayload.Candidate.Type.AssistedType; + } else if (str.equals("tunnel")) { + return JingleS5BTransportPayload.Candidate.Type.TunnelType; + } else if (str.equals("proxy")) { + return JingleS5BTransportPayload.Candidate.Type.ProxyType; + } else { + logger_.warning("Unknown candidate type; falling back to default!"); + return JingleS5BTransportPayload.Candidate.Type.DirectType; + } + } + /** + * @param element, NotNull. + * @param ns. + * @param attributes. + */ + @Override + public void handleStartElement(String element, String ns, AttributeMap attributes) { + + if (level == 0) { + if(attributes.getAttributeValue("sid") != null) { + getPayloadInternal().setSessionID(attributes.getAttributeValue("sid")); + } else { + getPayloadInternal().setSessionID(""); + } + + String mode = ""; + if(attributes.getAttributeValue("mode") != null) { + mode = attributes.getAttributeValue("mode"); + } else { + mode = "tcp"; + } + + if (mode.equals("tcp")) { + getPayloadInternal().setMode(JingleS5BTransportPayload.Mode.TCPMode); + } else if(mode.equals("udp")) { + getPayloadInternal().setMode(JingleS5BTransportPayload.Mode.UDPMode); + } else { + logger_.warning("Unknown S5B mode; falling back to default!"); + getPayloadInternal().setMode(JingleS5BTransportPayload.Mode.TCPMode); + } + + if(attributes.getAttributeValue("dstaddr") != null) { + getPayloadInternal().setDstAddr(attributes.getAttributeValue("dstaddr")); + } else { + getPayloadInternal().setDstAddr(""); + } + + } else if (level == 1) { + if (element.equals("candidate")) { + JingleS5BTransportPayload.Candidate candidate = new JingleS5BTransportPayload.Candidate(); + candidate.cid = ""; + if(attributes.getAttributeValue("cid") != null) { + candidate.cid = attributes.getAttributeValue("cid"); + } + + int port = -1; + try { + if(attributes.getAttributeValue("port") != null) { + port = Integer.parseInt(attributes.getAttributeValue("port")); + } + } catch (NumberFormatException e) { + + } + + try { + candidate.hostPort = new HostAddressPort(new HostAddress(InetAddress.getByName("")), port); + if(attributes.getAttributeValue("host") != null) { + candidate.hostPort = new HostAddressPort(new HostAddress(InetAddress.getByName(attributes.getAttributeValue("host"))), port); + } + } catch (UnknownHostException e) { + + } + + candidate.jid = new JID(""); + if(attributes.getAttributeValue("jid") != null) { + candidate.jid = new JID(attributes.getAttributeValue("jid")); + } + + int priority = -1; + try { + if(attributes.getAttributeValue("priority") != null) { + priority = Integer.parseInt(attributes.getAttributeValue("priority")); + } + } catch (NumberFormatException e) { + + } + candidate.priority = priority; + + candidate.type = stringToType("direct"); + if(attributes.getAttributeValue("type") != null) { + candidate.type = stringToType(attributes.getAttributeValue("type")); + } + getPayloadInternal().addCandidate(candidate); + + } else if (element.equals("candidate-used")) { + if(attributes.getAttributeValue("cid") != null) { + getPayloadInternal().setCandidateUsed(attributes.getAttributeValue("cid")); + } else { + getPayloadInternal().setCandidateUsed(""); + } + } else if (element.equals("candidate-error")) { + getPayloadInternal().setCandidateError(true); + } else if (element.equals("activated")) { + if(attributes.getAttributeValue("cid") != null) { + getPayloadInternal().setActivated(attributes.getAttributeValue("cid")); + } else { + getPayloadInternal().setActivated(""); + } + } else if (element.equals("proxy-error")) { + getPayloadInternal().setProxyError(true); + } + } + + ++level; + } + + /** + * @param element, NotNull. + * @param ns. + */ + @Override + public void handleEndElement(String element, String ns) { + --level; + } + + /** + * @param data, NotNull. + */ + @Override + public void handleCharacterData(String data) { + + } +}
\ No newline at end of file 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 diff --git a/test/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParserTest.java b/test/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParserTest.java new file mode 100644 index 0000000..3498287 --- /dev/null +++ b/test/com/isode/stroke/parser/payloadparsers/JingleContentPayloadParserTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.parser.payloadparsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import org.junit.Test; +import com.isode.stroke.serializer.payloadserializers.JingleContentPayloadSerializer; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.elements.JingleIBBTransportPayload; +import com.isode.stroke.elements.JingleS5BTransportPayload; +import com.isode.stroke.elements.HashElement; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.jid.JID; +import java.util.Date; +import java.util.TimeZone; +import com.isode.stroke.parser.payloadparsers.PayloadsParserTester; +import com.isode.stroke.eventloop.DummyEventLoop; + +public class JingleContentPayloadParserTest { + + public JingleContentPayloadParserTest() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + @Test + public void testParse() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<content xmlns=\"urn:xmpp:jingle:1\" creator=\"initiator\" name=\"Erin\"><description xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\">" + + "<file><date>2015-06-11T20:55:50Z</date><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><range offset=\"566\"/><size>513</size><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file>" + + "</description><transport block-size=\"4\" sid=\"546-45\" xmlns=\"urn:xmpp:jingle:transports:ibb:1\"/>" + + "<transport dstaddr=\"UK\" mode=\"tcp\" sid=\"\" xmlns=\"urn:xmpp:jingle:transports:s5b:1\">" + + "<candidate cid=\"cid\" host=\"173.194.36.112\" jid=\"blas@nal.vx\" port=\"-1\" priority=\"4\" type=\"assisted\"/><proxy-error/>" + + "<activated cid=\"Activity\"/><candidate-used cid=\"Candidate\"/></transport></content>")); + + JingleContentPayload content = (JingleContentPayload)parser.getPayload(); + + assertEquals (JingleContentPayload.Creator.InitiatorCreator, content.getCreator()); + assertEquals ("Erin", content.getName()); + + + assertEquals(1, content.getDescriptions().size()); + JingleFileTransferDescription description = content.getDescription(new JingleFileTransferDescription()); + assertNotNull(description); + JingleFileTransferFileInfo fileInfo = description.getFileInfo(); + assertNotNull(fileInfo); + assertEquals("Isaac", fileInfo.getName()); + assertEquals("It is good.", fileInfo.getDescription()); + assertEquals("MediaAAC", fileInfo.getMediaType()); + assertEquals(513L, fileInfo.getSize()); + assertEquals(DateTime.dateToString(new Date(1434056150620L)), DateTime.dateToString(fileInfo.getDate())); + assertEquals(true, fileInfo.getSupportsRangeRequests()); + assertEquals(566L, fileInfo.getRangeOffset()); + assertEquals(new ByteArray(), fileInfo.getHash("MD5")); + + assertEquals(2, content.getTransports().size()); + JingleIBBTransportPayload jingleIBBTransportPayload = content.getTransport(new JingleIBBTransportPayload()); + assertNotNull(jingleIBBTransportPayload); + assertEquals(Integer.valueOf(4), jingleIBBTransportPayload.getBlockSize()); + assertEquals("546-45", jingleIBBTransportPayload.getSessionID()); + + JingleS5BTransportPayload jingleS5BTransportPayload = content.getTransport(new JingleS5BTransportPayload()); + assertNotNull(jingleS5BTransportPayload); + assertEquals (JingleS5BTransportPayload.Mode.TCPMode, jingleS5BTransportPayload.getMode()); + assertEquals ("Candidate", jingleS5BTransportPayload.getCandidateUsed()); + assertEquals ("Activity", jingleS5BTransportPayload.getActivated()); + assertEquals ("UK", jingleS5BTransportPayload.getDstAddr()); + assertEquals (false, jingleS5BTransportPayload.hasCandidateError()); + assertEquals (true, jingleS5BTransportPayload.hasProxyError()); + + assertEquals(1, jingleS5BTransportPayload.getCandidates().size()); + JingleS5BTransportPayload.Candidate candidate = jingleS5BTransportPayload.getCandidates().get(0); + assertEquals("cid", candidate.cid); + assertEquals(new JID("blas@nal.vx"), candidate.jid); + assertEquals("/173.194.36.112", candidate.hostPort.getAddress().getInetAddress().toString()); + assertEquals(4, candidate.priority); + assertEquals(JingleS5BTransportPayload.Candidate.Type.AssistedType, candidate.type); + + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParserTest.java b/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParserTest.java new file mode 100644 index 0000000..765af5c --- /dev/null +++ b/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferDescriptionParserTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.parser.payloadparsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import org.junit.Test; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.parser.payloadparsers.JingleFileTransferDescriptionParser; +import com.isode.stroke.parser.payloadparsers.JingleFileTransferFileInfoParser; +import com.isode.stroke.parser.payloadparsers.PayloadsParserTester; +import com.isode.stroke.eventloop.DummyEventLoop; +import java.util.Date; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.ByteArray; +import java.util.TimeZone; + +public class JingleFileTransferDescriptionParserTest { + + public JingleFileTransferDescriptionParserTest() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + @Test + public void testParse_with_all_variables() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<description xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><date>2015-06-11T20:55:50Z</date><desc>It is good.</desc>" + + "<media-type>MediaAAC</media-type>" + + "<name>Isaac</name><range offset=\"566\"/><size>513</size>" + + "<hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></description>")); + + JingleFileTransferDescription description = (JingleFileTransferDescription)parser.getPayload(); + assertNotNull(description); + + JingleFileTransferFileInfo fileInfo = description.getFileInfo(); + assertNotNull(fileInfo); + + assertEquals("Isaac", fileInfo.getName()); + assertEquals("It is good.", fileInfo.getDescription()); + assertEquals("MediaAAC", fileInfo.getMediaType()); + assertEquals(513L, fileInfo.getSize()); + assertEquals(DateTime.dateToString(new Date(1434056150620L)), DateTime.dateToString(fileInfo.getDate())); + assertEquals(true, fileInfo.getSupportsRangeRequests()); + assertEquals(566L, fileInfo.getRangeOffset()); + assertEquals(new ByteArray(), fileInfo.getHash("MD5")); + } + + @Test + public void testParse_with_Some_variables() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<description xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></description>")); + + + JingleFileTransferDescription description = (JingleFileTransferDescription)parser.getPayload(); + assertNotNull(description); + + JingleFileTransferFileInfo fileInfo = description.getFileInfo(); + assertNotNull(fileInfo); + + assertEquals("Isaac", fileInfo.getName()); + assertEquals("It is good.", fileInfo.getDescription()); + assertEquals("MediaAAC", fileInfo.getMediaType()); + assertEquals(0L, fileInfo.getSize()); + assertEquals(DateTime.dateToString(new Date(0L)), DateTime.dateToString(fileInfo.getDate())); + assertEquals(false, fileInfo.getSupportsRangeRequests()); + assertEquals(0L, fileInfo.getRangeOffset()); + assertEquals(new ByteArray(), fileInfo.getHash("MD5")); + } + +}
\ No newline at end of file diff --git a/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferFileInfoParserTest.java b/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferFileInfoParserTest.java new file mode 100644 index 0000000..5225a6d --- /dev/null +++ b/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferFileInfoParserTest.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.parser.payloadparsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import org.junit.Test; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.parser.payloadparsers.JingleFileTransferFileInfoParser; +import com.isode.stroke.parser.payloadparsers.PayloadsParserTester; +import com.isode.stroke.eventloop.DummyEventLoop; +import java.util.Date; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.ByteArray; +import java.util.TimeZone; + +public class JingleFileTransferFileInfoParserTest { + + public JingleFileTransferFileInfoParserTest() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + @Test + public void testParse_with_all_variables() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<file><date>2015-06-11T20:55:50Z</date><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><range offset=\"566\"/><size>513</size>" + + "<hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file>")); + + JingleFileTransferFileInfo fileInfo = (JingleFileTransferFileInfo)parser.getPayload(); + assertEquals("Isaac", fileInfo.getName()); + assertEquals("It is good.", fileInfo.getDescription()); + assertEquals("MediaAAC", fileInfo.getMediaType()); + assertEquals(513L, fileInfo.getSize()); + assertEquals(DateTime.dateToString(new Date(1434056150620L)), DateTime.dateToString(fileInfo.getDate())); + assertEquals(true, fileInfo.getSupportsRangeRequests()); + assertEquals(566L, fileInfo.getRangeOffset()); + assertEquals(new ByteArray(), fileInfo.getHash("MD5")); + } + + @Test + public void testParse_with_Some_variables() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<file><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file>")); + + JingleFileTransferFileInfo fileInfo = (JingleFileTransferFileInfo)parser.getPayload(); + assertEquals("Isaac", fileInfo.getName()); + assertEquals("It is good.", fileInfo.getDescription()); + assertEquals("MediaAAC", fileInfo.getMediaType()); + assertEquals(0L, fileInfo.getSize()); + assertEquals(DateTime.dateToString(new Date(0L)), DateTime.dateToString(fileInfo.getDate())); + assertEquals(false, fileInfo.getSupportsRangeRequests()); + assertEquals(0L, fileInfo.getRangeOffset()); + assertEquals(new ByteArray(), fileInfo.getHash("MD5")); + } + +}
\ No newline at end of file diff --git a/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferHashParserTest.java b/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferHashParserTest.java new file mode 100644 index 0000000..8dc8a6c --- /dev/null +++ b/test/com/isode/stroke/parser/payloadparsers/JingleFileTransferHashParserTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.parser.payloadparsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import org.junit.Test; +import com.isode.stroke.elements.JingleFileTransferHash; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.parser.payloadparsers.JingleFileTransferHashParser; +import com.isode.stroke.parser.payloadparsers.JingleFileTransferFileInfoParser; +import com.isode.stroke.parser.payloadparsers.PayloadsParserTester; +import com.isode.stroke.eventloop.DummyEventLoop; +import java.util.Date; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.ByteArray; +import java.util.TimeZone; + +public class JingleFileTransferHashParserTest { + + public JingleFileTransferHashParserTest() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + @Test + public void testParse_with_all_variables() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<checksum xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><date>2015-06-11T20:55:50Z</date><desc>It is good.</desc>" + + "<media-type>MediaAAC</media-type>" + + "<name>Isaac</name><range offset=\"566\"/><size>513</size>" + + "<hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></checksum>")); + + JingleFileTransferHash hash = (JingleFileTransferHash)parser.getPayload(); + assertNotNull(hash); + + JingleFileTransferFileInfo fileInfo = hash.getFileInfo(); + assertNotNull(fileInfo); + + assertEquals("Isaac", fileInfo.getName()); + assertEquals("It is good.", fileInfo.getDescription()); + assertEquals("MediaAAC", fileInfo.getMediaType()); + assertEquals(513L, fileInfo.getSize()); + assertEquals(DateTime.dateToString(new Date(1434056150620L)), DateTime.dateToString(fileInfo.getDate())); + assertEquals(true, fileInfo.getSupportsRangeRequests()); + assertEquals(566L, fileInfo.getRangeOffset()); + assertEquals(new ByteArray(), fileInfo.getHash("MD5")); + } + + @Test + public void testParse_with_Some_variables() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<checksum xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></checksum>")); + + + JingleFileTransferHash hash = (JingleFileTransferHash)parser.getPayload(); + assertNotNull(hash); + + JingleFileTransferFileInfo fileInfo = hash.getFileInfo(); + assertNotNull(fileInfo); + + assertEquals("Isaac", fileInfo.getName()); + assertEquals("It is good.", fileInfo.getDescription()); + assertEquals("MediaAAC", fileInfo.getMediaType()); + assertEquals(0L, fileInfo.getSize()); + assertEquals(DateTime.dateToString(new Date(0L)), DateTime.dateToString(fileInfo.getDate())); + assertEquals(false, fileInfo.getSupportsRangeRequests()); + assertEquals(0L, fileInfo.getRangeOffset()); + assertEquals(new ByteArray(), fileInfo.getHash("MD5")); + } + +}
\ No newline at end of file diff --git a/test/com/isode/stroke/parser/payloadparsers/JingleIBBTransportMethodPayloadParserTest.java b/test/com/isode/stroke/parser/payloadparsers/JingleIBBTransportMethodPayloadParserTest.java new file mode 100644 index 0000000..46d9529 --- /dev/null +++ b/test/com/isode/stroke/parser/payloadparsers/JingleIBBTransportMethodPayloadParserTest.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.parser.payloadparsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import org.junit.Test; +import com.isode.stroke.elements.JingleIBBTransportPayload; +import com.isode.stroke.parser.payloadparsers.JingleIBBTransportMethodPayloadParser; +import com.isode.stroke.parser.payloadparsers.PayloadsParserTester; +import com.isode.stroke.eventloop.DummyEventLoop; + +public class JingleIBBTransportMethodPayloadParserTest { + + public JingleIBBTransportMethodPayloadParserTest() { + + } + + @Test + public void testParse() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<transport block-size=\"4\" sid=\"546-45\" xmlns=\"urn:xmpp:jingle:transports:ibb:1\"/>")); + + JingleIBBTransportPayload payload = (JingleIBBTransportPayload)parser.getPayload(); + assertEquals(Integer.valueOf(4), payload.getBlockSize()); + assertEquals("546-45", payload.getSessionID()); + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/parser/payloadparsers/JingleParserTest.java b/test/com/isode/stroke/parser/payloadparsers/JingleParserTest.java new file mode 100644 index 0000000..ec7f044 --- /dev/null +++ b/test/com/isode/stroke/parser/payloadparsers/JingleParserTest.java @@ -0,0 +1,649 @@ +/* + * 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.parser.payloadparsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import org.junit.Test; +import com.isode.stroke.serializer.payloadserializers.JingleContentPayloadSerializer; +import com.isode.stroke.elements.JinglePayload; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.elements.JingleIBBTransportPayload; +import com.isode.stroke.elements.JingleS5BTransportPayload; +import com.isode.stroke.elements.JingleFileTransferHash; +import com.isode.stroke.parser.payloadparsers.PayloadsParserTester; +import com.isode.stroke.eventloop.DummyEventLoop; +import com.isode.stroke.jid.JID; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.stringcodecs.Base64; +import java.util.Vector; +import java.util.logging.Logger; +import java.util.logging.Level; +import com.isode.stroke.network.HostAddress; +import com.isode.stroke.network.HostAddressPort; +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class JingleParserTest { + + private Logger logger_ = Logger.getLogger(this.getClass().getName()); + + public JingleParserTest() { + + } + + @Test + public void testParse_Xep0166_Example3() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-terminate'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <reason>\n" + + " <success/>\n" + + " </reason>\n" + + "</jingle>\n" + )); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionTerminate, jingle.getAction()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + assertEquals(JinglePayload.Reason.Type.Success, jingle.getReason().type); + } + + //http://xmpp.org/extensions/xep-0166.html#example-8 + @Test + public void testParse_Xep0166_Example8() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-terminate'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <reason>\n" + + " <success/>\n" + + " <text>Sorry, gotta go!</text>\n" + + " </reason>\n" + + "</jingle>\n")); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionTerminate, jingle.getAction()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + assertEquals(JinglePayload.Reason.Type.Success, jingle.getReason().type); + assertEquals("Sorry, gotta go!", jingle.getReason().text); + } + + // IBB Transport Method Examples + + // http://xmpp.org/extensions/xep-0261.html#example-1 + @Test + public void testParse_Xep0261_Example1() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-initiate'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <content creator='initiator' name='ex'>\n" + + " <description xmlns='urn:xmpp:example'/>\n" + + " <transport xmlns='urn:xmpp:jingle:transports:ibb:1'\n" + + " block-size='4096'\n" + + " sid='ch3d9s71'/>\n" + + " </content>\n" + + "</jingle>\n")); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionInitiate, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + + Vector<JingleContentPayload> payloads = jingle.getContents(); + assertEquals(1, payloads.size()); + JingleContentPayload payload = payloads.get(0); + assertEquals(JingleContentPayload.Creator.InitiatorCreator, payload.getCreator()); + assertEquals("ex", payload.getName()); + assertEquals(1, payload.getTransports().size()); + + JingleIBBTransportPayload transportPayload = payload.getTransport(new JingleIBBTransportPayload()); + assertNotNull(transportPayload); + assertEquals(Integer.valueOf(4096), transportPayload.getBlockSize()); + assertEquals("ch3d9s71", transportPayload.getSessionID()); + } + + // http://xmpp.org/extensions/xep-0261.html#example-1 + @Test + public void testParse_Xep0261_Example3() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-accept'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " responder='juliet@capulet.lit/balcony'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <content creator='initiator' name='ex'>\n" + + " <description xmlns='urn:xmpp:example'/>\n" + + " <transport xmlns='urn:xmpp:jingle:transports:ibb:1'\n" + + " block-size='2048'\n" + + " sid='ch3d9s71'/>\n" + + " </content>\n" + + " </jingle>\n" + )); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionAccept, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals(new JID("juliet@capulet.lit/balcony"), jingle.getResponder()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + + Vector<JingleContentPayload> payloads = jingle.getContents(); + assertEquals(1, payloads.size()); + JingleContentPayload payload = payloads.get(0); + assertEquals(JingleContentPayload.Creator.InitiatorCreator, payload.getCreator()); + assertEquals("ex", payload.getName()); + assertEquals(1, payload.getTransports().size()); + + JingleIBBTransportPayload transportPayload = payload.getTransport(new JingleIBBTransportPayload()); + assertNotNull(transportPayload); + assertEquals(Integer.valueOf(2048), transportPayload.getBlockSize()); + assertEquals("ch3d9s71", transportPayload.getSessionID()); + } + + // http://xmpp.org/extensions/xep-0261.html#example-9 + @Test + public void testParse_Xep0261_Example9() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='transport-info'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <content creator='initiator' name='ex'>\n" + + " <transport xmlns='urn:xmpp:jingle:transports:ibb:1'\n" + + " block-size='2048'\n" + + " sid='bt8a71h6'/>\n" + + " </content>\n" + + "</jingle>\n" + )); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.TransportInfo, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + + Vector<JingleContentPayload> payloads = jingle.getContents(); + assertEquals(1, payloads.size()); + JingleContentPayload payload = payloads.get(0); + assertEquals(JingleContentPayload.Creator.InitiatorCreator, payload.getCreator()); + assertEquals("ex", payload.getName()); + + JingleIBBTransportPayload transportPayload = payload.getTransport(new JingleIBBTransportPayload()); + assertNotNull(transportPayload); + assertEquals(Integer.valueOf(2048), transportPayload.getBlockSize()); + assertEquals("bt8a71h6", transportPayload.getSessionID()); + } + + // http://xmpp.org/extensions/xep-0261.html#example-13 + @Test + public void testParse_Xep0261_Example13() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-terminate'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <reason><success/></reason>\n" + + " </jingle>\n" + )); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionTerminate, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + assertEquals(JinglePayload.Reason.Type.Success, jingle.getReason().type); + } + + // Jingle File Transfer Examples + + // http://xmpp.org/extensions/xep-0234.html#example-1 + @Test + public void testParse_Xep0234_Example1() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-initiate'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='851ba2'>\n" + + "<content creator='initiator' name='a-file-offer'>\n" + + "<description xmlns='urn:xmpp:jingle:apps:file-transfer:4'>\n" + + "<file>\n" + + "<date>1969-07-21T02:56:15Z</date>\n" + + "<desc>This is a test. If this were a real file...</desc>\n" + + "<media-type>text/plain</media-type>\n" + + "<name>test.txt</name>\n" + + "<range/>\n" + + "<size>1022</size>\n" + + "<hash xmlns='urn:xmpp:hashes:1' algo='sha-1'>VS2nSZMIUsaa5dIUHTdmsQ==</hash>\n" + + "</file>\n" + + "</description>\n" + + "<transport xmlns='urn:xmpp:jingle:transports:s5b:1'\n" + + " mode='tcp'\n" + + " sid='vj3hs98y'>\n" + + "<candidate cid='hft54dqy'\n" + + " host='192.168.4.1'\n" + + " jid='romeo@montague.lit/orchard'\n" + + " port='5086'\n" + + " priority='8257636'\n" + + " type='direct'/>\n" + + "<candidate cid='hutr46fe'\n" + + " host='24.24.24.1'\n" + + " jid='romeo@montague.lit/orchard'\n" + + " port='5087'\n" + + " priority='8258636'\n" + + " type='direct'/>\n" + + "</transport>\n" + + "</content>\n" + + "</jingle>\n")); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionInitiate, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("851ba2", jingle.getSessionID()); + + Vector<JingleContentPayload> contents = jingle.getContents(); + assertEquals(1, contents.size()); + + JingleFileTransferDescription description = contents.get(0).getDescription(new JingleFileTransferDescription()); + + assertNotNull(description); + JingleFileTransferFileInfo fileInfo = description.getFileInfo(); + assertEquals("test.txt", fileInfo.getName()); + assertEquals("sha-1", fileInfo.getHashes().entrySet().iterator().next().getKey()); + assertEquals("VS2nSZMIUsaa5dIUHTdmsQ==", Base64.encode(fileInfo.getHashes().entrySet().iterator().next().getValue())); + assertEquals(1022L, fileInfo.getSize()); + assertEquals("This is a test. If this were a real file...", fileInfo.getDescription()); + assertEquals(true, fileInfo.getSupportsRangeRequests()); + assertEquals(DateTime.stringToDate("1969-07-21T02:56:15Z"), fileInfo.getDate()); + } + + // http://xmpp.org/extensions/xep-0234.html#example-3 + @Test + public void testParse_Xep0234_Example3() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-accept'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='851ba2'>\n" + + "<content creator='initiator' name='a-file-offer'>\n" + + "<description xmlns='urn:xmpp:jingle:apps:file-transfer:4'>\n" + + "<file>\n" + + "<date>1969-07-21T02:56:15Z</date>\n" + + "<desc>This is a test. If this were a real file...</desc>\n" + + "<media-type>text/plain</media-type>\n" + + "<name>test.txt</name>\n" + + "<range/>\n" + + "<size>1022</size>\n" + + "<hash xmlns='urn:xmpp:hashes:1' algo='sha-1'>VS2nSZMIUsaa5dIUHTdmsQ==</hash>\n" + + "</file>\n" + + "</description>\n" + + " <transport xmlns='urn:xmpp:jingle:transports:s5b:1'\n" + + " mode='tcp'\n" + + " sid='vj3hs98y'>\n" + + " <candidate cid='ht567dq'\n" + + " host='192.169.1.10'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='6539'\n" + + " priority='8257636'\n" + + " type='direct'/>\n" + + " <candidate cid='hr65dqyd'\n" + + " host='134.102.201.180'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='16453'\n" + + " priority='7929856'\n" + + " type='assisted'/>\n" + + " <candidate cid='grt654q2'\n" + + " host='2001:638:708:30c9:219:d1ff:fea4:a17d'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='6539'\n" + + " priority='8257606'\n" + + " type='direct'/>\n" + + " </transport>\n" + + " </content>\n" + + "</jingle>\n")); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionAccept, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("851ba2", jingle.getSessionID()); + + Vector<JingleContentPayload> contents = jingle.getContents(); + assertEquals(1, contents.size()); + + JingleFileTransferDescription description = contents.get(0).getDescription(new JingleFileTransferDescription()); + + assertNotNull(description); + + JingleFileTransferFileInfo fileInfo = description.getFileInfo(); + assertEquals("test.txt", fileInfo.getName()); + assertEquals("sha-1", fileInfo.getHashes().entrySet().iterator().next().getKey()); + assertEquals("VS2nSZMIUsaa5dIUHTdmsQ==", Base64.encode(fileInfo.getHashes().entrySet().iterator().next().getValue())); + assertEquals(1022L, fileInfo.getSize()); + assertEquals("This is a test. If this were a real file...", fileInfo.getDescription()); + assertEquals(true, fileInfo.getSupportsRangeRequests()); + assertEquals(DateTime.stringToDate("1969-07-21T02:56:15Z"), fileInfo.getDate()); + } + + // http://xmpp.org/extensions/xep-0234.html#example-5 + @Test + public void testParse_Xep0234_Example5() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='transport-info'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <content creator='initiator' name='ex'>\n" + + " <transport xmlns='urn:xmpp:jingle:transports:s5b:1'\n" + + " sid='vj3hs98y'>\n" + + " <candidate-used cid='hr65dqyd'/>\n" + + " </transport>\n" + + " </content>\n" + + "</jingle>\n")); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.TransportInfo, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + + Vector<JingleContentPayload> contents = jingle.getContents(); + assertEquals(1, contents.size()); + + JingleS5BTransportPayload transport = contents.get(0).getTransport(new JingleS5BTransportPayload()); + assertNotNull(transport); + + assertEquals("vj3hs98y", transport.getSessionID()); + assertEquals("hr65dqyd", transport.getCandidateUsed()); + } + + // http://xmpp.org/extensions/xep-0234.html#example-8 + @Test + public void testParse_Xep0234_Example8() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-info'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <checksum xmlns='urn:xmpp:jingle:apps:file-transfer:4'>\n" + + " <file>\n" + + " <hash xmlns='urn:xmpp:hashes:0' algo='sha-1'>VS2nSZMIUsaa5dIUHTdmsQ==</hash>\n" + + " </file>\n" + + " </checksum>\n" + + "</jingle>\n" + )); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionInfo, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + + JingleFileTransferHash hash = jingle.getPayload(new JingleFileTransferHash()); + assertNotNull(hash); + assertEquals("VS2nSZMIUsaa5dIUHTdmsQ==", Base64.encode(hash.getFileInfo().getHash("sha-1"))); + } + + // http://xmpp.org/extensions/xep-0234.html#example-10 + @Test + public void testParse_Xep0234_Example10() { + logger_.setLevel(Level.FINE); + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-initiate'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='uj3b2'>\n" + + " <content creator='initiator' name='a-file-request'>\n" + + " <description xmlns='urn:xmpp:jingle:apps:file-transfer:4'>\n" + + " <file>\n" + + " <hash xmlns='urn:xmpp:hashes:1' algo='sha-1'>VS2nSZMIUsaa5dIUHTdmsQ==</hash>\n" + + " <range offset='270336'/>\n" + + " </file>\n" + + " </description>\n" + + " <transport xmlns='urn:xmpp:jingle:transports:s5b:1'\n" + + " mode='tcp'\n" + + " sid='xig361fj'>\n" + + " <candidate cid='ht567dq'\n" + + " host='192.169.1.10'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='6539'\n" + + " priority='8257636'\n" + + " type='direct'/>\n" + + " <candidate cid='hr65dqyd'\n" + + " host='134.102.201.180'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='16453'\n" + + " priority='7929856'\n" + + " type='assisted'/>\n" + + " <candidate cid='grt654q2'\n" + + " host='2001:638:708:30c9:219:d1ff:fea4:a17d'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='6539'\n" + + " priority='8257606'\n" + + " type='direct'/>\n" + + " </transport>\n" + + " </content>\n" + + "</jingle>\n" + )); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionInitiate, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("uj3b2", jingle.getSessionID()); + + JingleContentPayload content = jingle.getPayload(new JingleContentPayload()); + assertNotNull(content); + + JingleFileTransferFileInfo file = content.getDescription(new JingleFileTransferDescription()).getFileInfo(); + assertEquals("sha-1", file.getHashes().entrySet().iterator().next().getKey()); + assertEquals("VS2nSZMIUsaa5dIUHTdmsQ==", Base64.encode(file.getHashes().entrySet().iterator().next().getValue())); + assertEquals(270336L, file.getRangeOffset()); + assertEquals(true, file.getSupportsRangeRequests()); + } + + // http://xmpp.org/extensions/xep-0260.html#example-1 + @Test + public void testParse_Xep0260_Example1() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-initiate'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <content creator='initiator' name='ex'>\n" + + " <description xmlns='urn:xmpp:example'/>\n" + + " <transport xmlns='urn:xmpp:jingle:transports:s5b:1'\n" + + " mode='tcp'\n" + + " sid='vj3hs98y'>\n" + + " <candidate cid='hft54dqy'\n" + + " host='192.168.4.1'\n" + + " jid='romeo@montague.lit/orchard'\n" + + " port='5086'\n" + + " priority='8257636'\n" + + " type='direct'/>\n" + + " <candidate cid='hutr46fe'\n" + + " host='24.24.24.1'\n" + + " jid='romeo@montague.lit/orchard'\n" + + " port='5087'\n" + + " priority='8258636'\n" + + " type='direct'/>\n" + + " </transport>\n" + + " </content>\n" + + "</jingle>\n" + )); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionInitiate, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + + JingleContentPayload content = jingle.getPayload(new JingleContentPayload()); + assertNotNull(content); + + JingleS5BTransportPayload s5bPayload = content.getTransport(new JingleS5BTransportPayload()); + assertNotNull(s5bPayload); + + assertEquals("vj3hs98y", s5bPayload.getSessionID()); + assertEquals(JingleS5BTransportPayload.Mode.TCPMode, s5bPayload.getMode()); + assertEquals(false, s5bPayload.hasCandidateError()); + assertEquals(false, s5bPayload.hasProxyError()); + assertEquals("", s5bPayload.getActivated()); + assertEquals("", s5bPayload.getCandidateUsed()); + assertEquals(2, s5bPayload.getCandidates().size()); + + try { + JingleS5BTransportPayload.Candidate candidate; + candidate = s5bPayload.getCandidates().get(0); + assertEquals("hft54dqy", candidate.cid); + assertEquals(new JID("romeo@montague.lit/orchard"), candidate.jid); + assertEquals(new HostAddressPort(new HostAddress(InetAddress.getByName("192.168.4.1")), 5086), candidate.hostPort); + assertEquals(8257636, candidate.priority); + assertEquals(JingleS5BTransportPayload.Candidate.Type.DirectType, candidate.type); + + candidate = s5bPayload.getCandidates().get(1); + assertEquals("hutr46fe", candidate.cid); + assertEquals(new JID("romeo@montague.lit/orchard"), candidate.jid); + assertEquals(new HostAddressPort(new HostAddress(InetAddress.getByName("24.24.24.1")), 5087), candidate.hostPort); + assertEquals(8258636, candidate.priority); + assertEquals(JingleS5BTransportPayload.Candidate.Type.DirectType, candidate.type); + } catch (UnknownHostException e) { + + } + } + + // http://xmpp.org/extensions/xep-0260.html#example-3 + @Test + public void testParse_Xep0260_Example3() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse( + "<jingle xmlns='urn:xmpp:jingle:1'\n" + + " action='session-accept'\n" + + " initiator='romeo@montague.lit/orchard'\n" + + " sid='a73sjjvkla37jfea'>\n" + + " <content creator='initiator' name='ex'>\n" + + " <description xmlns='urn:xmpp:example'/>\n" + + " <transport xmlns='urn:xmpp:jingle:transports:s5b:1'\n" + + " dstaddr='1a12fb7bc625e55f3ed5b29a53dbe0e4aa7d80ba'\n" + + " mode='tcp'\n" + + " sid='vj3hs98y'>\n" + + " <candidate cid='ht567dq'\n" + + " host='192.169.1.10'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='6539'\n" + + " priority='8257636'\n" + + " type='direct'/>\n" + + " <candidate cid='hr65dqyd'\n" + + " host='134.102.201.180'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='16453'\n" + + " priority='7929856'\n" + + " type='assisted'/>\n" + + " <candidate cid='grt654q2'\n" + + " host='2001:638:708:30c9:219:d1ff:fea4:a17d'\n" + + " jid='juliet@capulet.lit/balcony'\n" + + " port='6539'\n" + + " priority='8257606'\n" + + " type='direct'/>\n" + + " </transport>\n" + + " </content>\n" + + "</jingle>\n" + )); + + JinglePayload jingle = (JinglePayload)parser.getPayload(); + assertNotNull(jingle); + assertEquals(JinglePayload.Action.SessionAccept, jingle.getAction()); + assertEquals(new JID("romeo@montague.lit/orchard"), jingle.getInitiator()); + assertEquals("a73sjjvkla37jfea", jingle.getSessionID()); + + JingleContentPayload content = jingle.getPayload(new JingleContentPayload()); + assertNotNull(content); + + JingleS5BTransportPayload s5bPayload = content.getTransport(new JingleS5BTransportPayload()); + assertNotNull(s5bPayload); + + assertEquals("vj3hs98y", s5bPayload.getSessionID()); + assertEquals(JingleS5BTransportPayload.Mode.TCPMode, s5bPayload.getMode()); + assertEquals("1a12fb7bc625e55f3ed5b29a53dbe0e4aa7d80ba", s5bPayload.getDstAddr()); + assertEquals(false, s5bPayload.hasCandidateError()); + assertEquals(false, s5bPayload.hasProxyError()); + assertEquals("", s5bPayload.getActivated()); + assertEquals("", s5bPayload.getCandidateUsed()); + assertEquals(3, s5bPayload.getCandidates().size()); + + try { + JingleS5BTransportPayload.Candidate candidate; + candidate = s5bPayload.getCandidates().get(0); + assertEquals("ht567dq", candidate.cid); + assertEquals(new JID("juliet@capulet.lit/balcony"), candidate.jid); + assertEquals(new HostAddressPort(new HostAddress(InetAddress.getByName("192.169.1.10")), 6539), candidate.hostPort); + assertEquals(8257636, candidate.priority); + assertEquals(JingleS5BTransportPayload.Candidate.Type.DirectType, candidate.type); + + candidate = s5bPayload.getCandidates().get(1); + assertEquals("hr65dqyd", candidate.cid); + assertEquals(new JID("juliet@capulet.lit/balcony"), candidate.jid); + assertEquals(new HostAddressPort(new HostAddress(InetAddress.getByName("134.102.201.180")), 16453), candidate.hostPort); + assertEquals(7929856, candidate.priority); + assertEquals(JingleS5BTransportPayload.Candidate.Type.AssistedType, candidate.type); + + candidate = s5bPayload.getCandidates().get(2); + assertEquals("grt654q2", candidate.cid); + assertEquals(new JID("juliet@capulet.lit/balcony"), candidate.jid); + assertEquals(new HostAddressPort(new HostAddress(InetAddress.getByName("2001:638:708:30c9:219:d1ff:fea4:a17d")), 6539), candidate.hostPort); + assertEquals(8257606, candidate.priority); + assertEquals(JingleS5BTransportPayload.Candidate.Type.DirectType, candidate.type); + } catch (UnknownHostException e) { + + } + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/parser/payloadparsers/JingleS5BTransportMethodPayloadParserTest.java b/test/com/isode/stroke/parser/payloadparsers/JingleS5BTransportMethodPayloadParserTest.java new file mode 100644 index 0000000..ac9e03f --- /dev/null +++ b/test/com/isode/stroke/parser/payloadparsers/JingleS5BTransportMethodPayloadParserTest.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.parser.payloadparsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import org.junit.Test; +import com.isode.stroke.elements.JingleS5BTransportPayload; +import com.isode.stroke.elements.JingleTransportPayload; +import com.isode.stroke.parser.payloadparsers.JingleS5BTransportMethodPayloadParser; +import com.isode.stroke.parser.payloadparsers.PayloadsParserTester; +import com.isode.stroke.eventloop.DummyEventLoop; +import com.isode.stroke.jid.JID; + +public class JingleS5BTransportMethodPayloadParserTest { + + public JingleS5BTransportMethodPayloadParserTest() { + + } + + @Test + public void testParse() { + DummyEventLoop eventLoop = new DummyEventLoop(); + PayloadsParserTester parser = new PayloadsParserTester(eventLoop); + assertNotNull(parser.parse("<transport dstaddr=\"UK\" mode=\"tcp\" sid=\"\" xmlns=\"urn:xmpp:jingle:transports:s5b:1\">" + + "<candidate cid=\"cid\" host=\"173.194.36.112\" jid=\"blas@nal.vx\" port=\"-1\" priority=\"4\" type=\"assisted\"/>" + + "<proxy-error/><activated cid=\"Activity\"/><candidate-used cid=\"Candidate\"/></transport>")); + + JingleS5BTransportPayload payload = (JingleS5BTransportPayload)parser.getPayload(); + assertEquals (JingleS5BTransportPayload.Mode.TCPMode, payload.getMode()); + assertEquals ("Candidate", payload.getCandidateUsed()); + assertEquals ("Activity", payload.getActivated()); + assertEquals ("UK", payload.getDstAddr()); + assertEquals (false, payload.hasCandidateError()); + assertEquals (true, payload.hasProxyError()); + + assertEquals(1, payload.getCandidates().size()); + JingleS5BTransportPayload.Candidate candidate = payload.getCandidates().get(0); + assertEquals("cid", candidate.cid); + assertEquals(new JID("blas@nal.vx"), candidate.jid); + assertEquals("/173.194.36.112", candidate.hostPort.getAddress().getInetAddress().toString()); + assertEquals(4, candidate.priority); + assertEquals(JingleS5BTransportPayload.Candidate.Type.AssistedType, candidate.type); + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/serializer/payloadserializers/JingleContentPayloadSerializerTest.java b/test/com/isode/stroke/serializer/payloadserializers/JingleContentPayloadSerializerTest.java new file mode 100644 index 0000000..686ad7e --- /dev/null +++ b/test/com/isode/stroke/serializer/payloadserializers/JingleContentPayloadSerializerTest.java @@ -0,0 +1,189 @@ +/* + * 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 static org.junit.Assert.assertEquals; +import org.junit.Test; +import com.isode.stroke.serializer.payloadserializers.JingleContentPayloadSerializer; +import com.isode.stroke.elements.JingleContentPayload; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.elements.JingleIBBTransportPayload; +import com.isode.stroke.elements.JingleS5BTransportPayload; +import com.isode.stroke.elements.HashElement; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.jid.JID; +import com.isode.stroke.network.HostAddress; +import com.isode.stroke.network.HostAddressPort; +import java.util.Date; +import java.util.TimeZone; +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class JingleContentPayloadSerializerTest { + + /** + * Default Constructor. + */ + public JingleContentPayloadSerializerTest() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + @Test + public void testSerialize() { + JingleContentPayloadSerializer testling = new JingleContentPayloadSerializer(); + JingleContentPayload content = new JingleContentPayload(); + content.setCreator(JingleContentPayload.Creator.InitiatorCreator); + content.setName("Erin"); + + JingleFileTransferDescription description = new JingleFileTransferDescription(); + JingleFileTransferFileInfo fileInfo = new JingleFileTransferFileInfo(); + fileInfo.setName("Isaac"); + fileInfo.setDescription("It is good."); + fileInfo.setMediaType("MediaAAC"); + fileInfo.setSize(513L); + fileInfo.setDate(new Date(1434056150620L)); + fileInfo.setSupportsRangeRequests(true); + fileInfo.setRangeOffset(566L); + fileInfo.addHash(new HashElement("MD5", new ByteArray())); + description.setFileInfo(fileInfo); + content.addDescription(description); + + JingleIBBTransportPayload jingleIBBTransportPayload = new JingleIBBTransportPayload(); + jingleIBBTransportPayload.setBlockSize(4); + jingleIBBTransportPayload.setSessionID("546-45"); + content.addTransport(jingleIBBTransportPayload); + + JingleS5BTransportPayload jingleS5BTransportPayload = new JingleS5BTransportPayload(); + jingleS5BTransportPayload.setMode(JingleS5BTransportPayload.Mode.TCPMode); + JingleS5BTransportPayload.Candidate candidate = new JingleS5BTransportPayload.Candidate(); + candidate.cid = "cid"; + candidate.jid = new JID("blas@nal.vx"); + try { + candidate.hostPort = new HostAddressPort(new HostAddress(InetAddress.getByName("173.194.36.112"))); + } catch (UnknownHostException e) { + + } + candidate.priority = 4; + candidate.type = JingleS5BTransportPayload.Candidate.Type.AssistedType; + jingleS5BTransportPayload.addCandidate(candidate); + jingleS5BTransportPayload.setCandidateUsed("Candidate"); + jingleS5BTransportPayload.setActivated("Activity"); + jingleS5BTransportPayload.setDstAddr("UK"); + jingleS5BTransportPayload.setCandidateError(false); + jingleS5BTransportPayload.setProxyError(true); + content.addTransport(jingleS5BTransportPayload); + + String expectedResult = "<content creator=\"initiator\" name=\"Erin\"><description xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\">" + + "<file><date>2015-06-11T20:55:50Z</date><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><range offset=\"566\"/><size>513</size><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file>" + + "</description><transport block-size=\"4\" sid=\"546-45\" xmlns=\"urn:xmpp:jingle:transports:ibb:1\"/>" + + "<transport dstaddr=\"UK\" mode=\"tcp\" sid=\"\" xmlns=\"urn:xmpp:jingle:transports:s5b:1\">" + + "<candidate cid=\"cid\" host=\"173.194.36.112\" jid=\"blas@nal.vx\" port=\"-1\" priority=\"4\" type=\"assisted\"/><proxy-error/>" + + "<activated cid=\"Activity\"/><candidate-used cid=\"Candidate\"/></transport></content>"; + assertEquals(expectedResult, testling.serialize(content)); + } + + @Test + public void testSerialize_MultiplePayloads() { + JingleContentPayloadSerializer testling = new JingleContentPayloadSerializer(); + JingleContentPayload content = new JingleContentPayload(); + content.setCreator(JingleContentPayload.Creator.InitiatorCreator); + content.setName("Erin"); + + JingleFileTransferDescription description = new JingleFileTransferDescription(); + JingleFileTransferFileInfo fileInfo = new JingleFileTransferFileInfo(); + fileInfo.setName("Isaac"); + fileInfo.setDescription("It is good."); + fileInfo.setMediaType("MediaAAC"); + fileInfo.setSize(513L); + fileInfo.setDate(new Date(1434056150620L)); + fileInfo.setSupportsRangeRequests(true); + fileInfo.setRangeOffset(566L); + fileInfo.addHash(new HashElement("MD5", new ByteArray())); + description.setFileInfo(fileInfo); + content.addDescription(description); + + JingleFileTransferDescription description2 = new JingleFileTransferDescription(); + JingleFileTransferFileInfo fileInfo2 = new JingleFileTransferFileInfo(); + fileInfo2.setName("Newton"); + fileInfo2.setDescription("It is bad."); + fileInfo2.setMediaType("MediaJPG"); + fileInfo2.setSize(556L); + fileInfo2.setSupportsRangeRequests(false); + fileInfo2.addHash(new HashElement("SHA-1", new ByteArray())); + description2.setFileInfo(fileInfo2); + content.addDescription(description2); + + JingleIBBTransportPayload jingleIBBTransportPayload = new JingleIBBTransportPayload(); + jingleIBBTransportPayload.setBlockSize(4); + jingleIBBTransportPayload.setSessionID("546-45"); + content.addTransport(jingleIBBTransportPayload); + + + JingleIBBTransportPayload jingleIBBTransportPayload2 = new JingleIBBTransportPayload(); + jingleIBBTransportPayload2.setBlockSize(43); + jingleIBBTransportPayload2.setSessionID("546-452"); + content.addTransport(jingleIBBTransportPayload2); + + JingleS5BTransportPayload jingleS5BTransportPayload = new JingleS5BTransportPayload(); + jingleS5BTransportPayload.setMode(JingleS5BTransportPayload.Mode.TCPMode); + JingleS5BTransportPayload.Candidate candidate = new JingleS5BTransportPayload.Candidate(); + candidate.cid = "cid"; + candidate.jid = new JID("blas@nal.vx"); + try { + candidate.hostPort = new HostAddressPort(new HostAddress(InetAddress.getByName("173.194.36.112"))); + } catch (UnknownHostException e) { + + } + candidate.priority = 4; + candidate.type = JingleS5BTransportPayload.Candidate.Type.AssistedType; + jingleS5BTransportPayload.addCandidate(candidate); + jingleS5BTransportPayload.setCandidateUsed("Candidate"); + jingleS5BTransportPayload.setActivated("Activity"); + jingleS5BTransportPayload.setDstAddr("UK"); + jingleS5BTransportPayload.setCandidateError(false); + jingleS5BTransportPayload.setProxyError(true); + content.addTransport(jingleS5BTransportPayload); + + JingleS5BTransportPayload jingleS5BTransportPayload2 = new JingleS5BTransportPayload(); + jingleS5BTransportPayload2.setMode(JingleS5BTransportPayload.Mode.TCPMode); + JingleS5BTransportPayload.Candidate candidate2 = new JingleS5BTransportPayload.Candidate(); + candidate2.cid = "cid"; + candidate2.jid = new JID("blas@nal.vx"); + try { + candidate2.hostPort = new HostAddressPort(new HostAddress(InetAddress.getByName("173.194.36.112"))); + } catch (UnknownHostException e) { + + } + candidate2.priority = 4; + candidate2.type = JingleS5BTransportPayload.Candidate.Type.AssistedType; + jingleS5BTransportPayload2.addCandidate(candidate2); + jingleS5BTransportPayload2.setCandidateUsed("Candy"); + jingleS5BTransportPayload2.setActivated("Active"); + jingleS5BTransportPayload2.setDstAddr("USA"); + jingleS5BTransportPayload2.setCandidateError(true); + jingleS5BTransportPayload2.setProxyError(false); + content.addTransport(jingleS5BTransportPayload2); + + String expectedResult = "<content creator=\"initiator\" name=\"Erin\"><description xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file>" + + "<date>2015-06-11T20:55:50Z</date><desc>It is good.</desc><media-type>MediaAAC</media-type><name>Isaac</name>" + + "<range offset=\"566\"/><size>513</size><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></description>" + + "<description xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><desc>It is bad.</desc><media-type>MediaJPG</media-type>" + + "<name>Newton</name><size>556</size><hash algo=\"SHA-1\" xmlns=\"urn:xmpp:hashes:1\"/></file></description>" + + "<transport block-size=\"4\" sid=\"546-45\" xmlns=\"urn:xmpp:jingle:transports:ibb:1\"/>" + + "<transport block-size=\"43\" sid=\"546-452\" xmlns=\"urn:xmpp:jingle:transports:ibb:1\"/>" + + "<transport dstaddr=\"UK\" mode=\"tcp\" sid=\"\" xmlns=\"urn:xmpp:jingle:transports:s5b:1\">" + + "<candidate cid=\"cid\" host=\"173.194.36.112\" jid=\"blas@nal.vx\" port=\"-1\" priority=\"4\" type=\"assisted\"/><proxy-error/>" + + "<activated cid=\"Activity\"/><candidate-used cid=\"Candidate\"/></transport>" + + "<transport dstaddr=\"USA\" mode=\"tcp\" sid=\"\" xmlns=\"urn:xmpp:jingle:transports:s5b:1\">" + + "<candidate cid=\"cid\" host=\"173.194.36.112\" jid=\"blas@nal.vx\" port=\"-1\" priority=\"4\" type=\"assisted\"/><candidate-error/>" + + "<activated cid=\"Active\"/><candidate-used cid=\"Candy\"/></transport></content>"; + assertEquals(expectedResult, testling.serialize(content)); + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferDescriptionSerializerTest.java b/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferDescriptionSerializerTest.java new file mode 100644 index 0000000..720aa65 --- /dev/null +++ b/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferDescriptionSerializerTest.java @@ -0,0 +1,66 @@ +/* + * 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 static org.junit.Assert.assertEquals; +import org.junit.Test; +import com.isode.stroke.serializer.payloadserializers.JingleFileTransferDescriptionSerializer; +import com.isode.stroke.elements.JingleFileTransferDescription; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.elements.HashElement; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.ByteArray; +import java.util.Date; +import java.util.TimeZone; + +public class JingleFileTransferDescriptionSerializerTest { + + /** + * Default Constructor. + */ + public JingleFileTransferDescriptionSerializerTest() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + @Test + public void testSerialize_FileInfo_withAllVariables() { + JingleFileTransferDescriptionSerializer testling = new JingleFileTransferDescriptionSerializer(); + JingleFileTransferDescription description = new JingleFileTransferDescription(); + + JingleFileTransferFileInfo fileInfo = new JingleFileTransferFileInfo(); + fileInfo.setName("Isaac"); + fileInfo.setDescription("It is good."); + fileInfo.setMediaType("MediaAAC"); + fileInfo.setSize(513L); + fileInfo.setDate(new Date(1434056150620L)); + fileInfo.setSupportsRangeRequests(true); + fileInfo.setRangeOffset(566L); + fileInfo.addHash(new HashElement("MD5", new ByteArray())); + + description.setFileInfo(fileInfo); + String expectedResult = "<description xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><date>2015-06-11T20:55:50Z</date>" + + "<desc>It is good.</desc><media-type>MediaAAC</media-type><name>Isaac</name><range offset=\"566\"/>" + + "<size>513</size><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></description>"; + assertEquals(expectedResult, testling.serialize(description)); + } + + @Test + public void testSerialize_FileInfo_withSomeVariables() { + JingleFileTransferDescriptionSerializer testling = new JingleFileTransferDescriptionSerializer(); + JingleFileTransferDescription description = new JingleFileTransferDescription(); + + JingleFileTransferFileInfo fileInfo = new JingleFileTransferFileInfo(); + fileInfo.setName("Isaac"); + fileInfo.setDescription("It is good."); + fileInfo.setMediaType("MediaAAC"); + fileInfo.addHash(new HashElement("MD5", new ByteArray())); + description.setFileInfo(fileInfo); + String expectedResult = "<description xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></description>"; + assertEquals(expectedResult, testling.serialize(description)); + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferFileInfoSerializerTest.java b/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferFileInfoSerializerTest.java new file mode 100644 index 0000000..69e5606 --- /dev/null +++ b/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferFileInfoSerializerTest.java @@ -0,0 +1,57 @@ +/* + * 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 static org.junit.Assert.assertEquals; +import org.junit.Test; +import com.isode.stroke.serializer.payloadserializers.JingleFileTransferFileInfoSerializer; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.elements.HashElement; +import com.isode.stroke.base.ByteArray; +import java.util.Date; +import java.util.TimeZone; + +public class JingleFileTransferFileInfoSerializerTest { + + /** + * Default Constructor. + */ + public JingleFileTransferFileInfoSerializerTest() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + @Test + public void testSerialize_withAllVariables() { + JingleFileTransferFileInfoSerializer testling = new JingleFileTransferFileInfoSerializer(); + JingleFileTransferFileInfo fileInfo = new JingleFileTransferFileInfo(); + fileInfo.setName("Isaac"); + fileInfo.setDescription("It is good."); + fileInfo.setMediaType("MediaAAC"); + fileInfo.setSize(513L); + fileInfo.setDate(new Date(1434056150620L)); + fileInfo.setSupportsRangeRequests(true); + fileInfo.setRangeOffset(566L); + fileInfo.addHash(new HashElement("MD5", new ByteArray())); + String expectedResult = "<file><date>2015-06-11T20:55:50Z</date><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><range offset=\"566\"/><size>513</size>" + + "<hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file>"; + assertEquals(expectedResult, testling.serialize(fileInfo)); + } + + @Test + public void testSerialize_withSomeVariables() { + JingleFileTransferFileInfoSerializer testling = new JingleFileTransferFileInfoSerializer(); + JingleFileTransferFileInfo fileInfo = new JingleFileTransferFileInfo(); + fileInfo.setName("Isaac"); + fileInfo.setDescription("It is good."); + fileInfo.setMediaType("MediaAAC"); + fileInfo.addHash(new HashElement("MD5", new ByteArray())); + String expectedResult = "<file><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file>"; + assertEquals(expectedResult, testling.serialize(fileInfo)); + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferHashSerializerTest.java b/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferHashSerializerTest.java new file mode 100644 index 0000000..96410bf --- /dev/null +++ b/test/com/isode/stroke/serializer/payloadserializers/JingleFileTransferHashSerializerTest.java @@ -0,0 +1,65 @@ +/* + * 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 static org.junit.Assert.assertEquals; +import org.junit.Test; +import com.isode.stroke.serializer.payloadserializers.JingleFileTransferHashSerializer; +import com.isode.stroke.elements.JingleFileTransferHash; +import com.isode.stroke.elements.JingleFileTransferFileInfo; +import com.isode.stroke.elements.HashElement; +import com.isode.stroke.base.DateTime; +import com.isode.stroke.base.ByteArray; +import java.util.Date; + +public class JingleFileTransferHashSerializerTest { + + /** + * Default Constructor. + */ + public JingleFileTransferHashSerializerTest() { + + } + + @Test + public void testSerialize_FileInfo_withAllVariables() { + JingleFileTransferHashSerializer testling = new JingleFileTransferHashSerializer(); + JingleFileTransferHash hash = new JingleFileTransferHash(); + + JingleFileTransferFileInfo fileInfo = new JingleFileTransferFileInfo(); + fileInfo.setName("Isaac"); + fileInfo.setDescription("It is good."); + fileInfo.setMediaType("MediaAAC"); + fileInfo.setSize(513L); + fileInfo.setDate(new Date(1434056150620L)); + fileInfo.setSupportsRangeRequests(true); + fileInfo.setRangeOffset(566L); + fileInfo.addHash(new HashElement("MD5", new ByteArray())); + + hash.setFileInfo(fileInfo); + String expectedResult = "<checksum xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><date>2015-06-11T20:55:50Z</date>" + + "<desc>It is good.</desc><media-type>MediaAAC</media-type><name>Isaac</name><range offset=\"566\"/>" + + "<size>513</size><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></checksum>"; + assertEquals(expectedResult, testling.serialize(hash)); + } + + @Test + public void testSerialize_FileInfo_withSomeVariables() { + JingleFileTransferHashSerializer testling = new JingleFileTransferHashSerializer(); + JingleFileTransferHash hash = new JingleFileTransferHash(); + + JingleFileTransferFileInfo fileInfo = new JingleFileTransferFileInfo(); + fileInfo.setName("Isaac"); + fileInfo.setDescription("It is good."); + fileInfo.setMediaType("MediaAAC"); + fileInfo.addHash(new HashElement("MD5", new ByteArray())); + hash.setFileInfo(fileInfo); + String expectedResult = "<checksum xmlns=\"urn:xmpp:jingle:apps:file-transfer:4\"><file><desc>It is good.</desc><media-type>MediaAAC</media-type>" + + "<name>Isaac</name><hash algo=\"MD5\" xmlns=\"urn:xmpp:hashes:1\"/></file></checksum>"; + assertEquals(expectedResult, testling.serialize(hash)); + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/serializer/payloadserializers/JingleIBBTransportPayloadSerializerTest.java b/test/com/isode/stroke/serializer/payloadserializers/JingleIBBTransportPayloadSerializerTest.java new file mode 100644 index 0000000..3f1f576 --- /dev/null +++ b/test/com/isode/stroke/serializer/payloadserializers/JingleIBBTransportPayloadSerializerTest.java @@ -0,0 +1,32 @@ +/* + * 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 static org.junit.Assert.assertEquals; +import org.junit.Test; +import com.isode.stroke.serializer.payloadserializers.JingleIBBTransportPayloadSerializer; +import com.isode.stroke.elements.JingleIBBTransportPayload; + +public class JingleIBBTransportPayloadSerializerTest { + + /** + * Default Constructor. + */ + public JingleIBBTransportPayloadSerializerTest() { + + } + + @Test + public void testSerialize() { + JingleIBBTransportPayloadSerializer testling = new JingleIBBTransportPayloadSerializer(); + JingleIBBTransportPayload jingleIBBTransportPayload = new JingleIBBTransportPayload(); + jingleIBBTransportPayload.setBlockSize(4); + jingleIBBTransportPayload.setSessionID("546-45"); + String expectedResult = "<transport block-size=\"4\" sid=\"546-45\" xmlns=\"urn:xmpp:jingle:transports:ibb:1\"/>"; + assertEquals(expectedResult, testling.serialize(jingleIBBTransportPayload)); + } +}
\ No newline at end of file diff --git a/test/com/isode/stroke/serializer/payloadserializers/JingleS5BTransportPayloadSerializerTest.java b/test/com/isode/stroke/serializer/payloadserializers/JingleS5BTransportPayloadSerializerTest.java new file mode 100644 index 0000000..6a76c8c --- /dev/null +++ b/test/com/isode/stroke/serializer/payloadserializers/JingleS5BTransportPayloadSerializerTest.java @@ -0,0 +1,55 @@ +/* + * 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 static org.junit.Assert.assertEquals; +import org.junit.Test; +import com.isode.stroke.serializer.payloadserializers.JingleS5BTransportPayloadSerializer; +import com.isode.stroke.elements.JingleS5BTransportPayload; +import com.isode.stroke.jid.JID; +import com.isode.stroke.network.HostAddressPort; +import com.isode.stroke.network.HostAddress; +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class JingleS5BTransportPayloadSerializerTest { + + /** + * Default Constructor. + */ + public JingleS5BTransportPayloadSerializerTest() { + + } + + @Test + public void testSerialize() { + JingleS5BTransportPayloadSerializer testling = new JingleS5BTransportPayloadSerializer(); + JingleS5BTransportPayload jingleS5BTransportPayload = new JingleS5BTransportPayload(); + jingleS5BTransportPayload.setMode(JingleS5BTransportPayload.Mode.TCPMode); + JingleS5BTransportPayload.Candidate candidate = new JingleS5BTransportPayload.Candidate(); + candidate.cid = "cid"; + candidate.jid = new JID("blas@nal.vx"); + try { + candidate.hostPort = new HostAddressPort(new HostAddress(InetAddress.getByName("173.194.36.112"))); + } catch (UnknownHostException e) { + + } + candidate.priority = 4; + candidate.type = JingleS5BTransportPayload.Candidate.Type.AssistedType; + jingleS5BTransportPayload.addCandidate(candidate); + jingleS5BTransportPayload.setCandidateUsed("Candidate"); + jingleS5BTransportPayload.setActivated("Activity"); + jingleS5BTransportPayload.setDstAddr("UK"); + jingleS5BTransportPayload.setCandidateError(false); + jingleS5BTransportPayload.setProxyError(true); + + String expectedResult = "<transport dstaddr=\"UK\" mode=\"tcp\" sid=\"\" xmlns=\"urn:xmpp:jingle:transports:s5b:1\">" + + "<candidate cid=\"cid\" host=\"173.194.36.112\" jid=\"blas@nal.vx\" port=\"-1\" priority=\"4\" type=\"assisted\"/>" + + "<proxy-error/><activated cid=\"Activity\"/><candidate-used cid=\"Candidate\"/></transport>"; + assertEquals(expectedResult, testling.serialize(jingleS5BTransportPayload)); + } +}
\ No newline at end of file |