diff options
Diffstat (limited to 'src/com/isode/stroke/parser')
5 files changed, 83 insertions, 65 deletions
diff --git a/src/com/isode/stroke/parser/AuthRequestParser.java b/src/com/isode/stroke/parser/AuthRequestParser.java index b56ff89..d787cbb 100644 --- a/src/com/isode/stroke/parser/AuthRequestParser.java +++ b/src/com/isode/stroke/parser/AuthRequestParser.java @@ -10,6 +10,7 @@ package com.isode.stroke.parser; import com.isode.stroke.elements.AuthRequest; import com.isode.stroke.stringcodecs.Base64; +import com.isode.stroke.base.SafeByteArray; class AuthRequestParser extends GenericElementParser<AuthRequest> { @@ -29,7 +30,7 @@ class AuthRequestParser extends GenericElementParser<AuthRequest> { public void handleEndElement(String a, String b) { --depth_; if (depth_ == 0) { - getElementGeneric().setMessage(Base64.decode(text_)); + getElementGeneric().setMessage(new SafeByteArray(Base64.decode(text_))); } } diff --git a/src/com/isode/stroke/parser/AuthResponseParser.java b/src/com/isode/stroke/parser/AuthResponseParser.java index 63d2a60..cae6fbb 100644 --- a/src/com/isode/stroke/parser/AuthResponseParser.java +++ b/src/com/isode/stroke/parser/AuthResponseParser.java @@ -11,6 +11,7 @@ package com.isode.stroke.parser; import com.isode.stroke.elements.AuthResponse; import com.isode.stroke.stringcodecs.Base64; +import com.isode.stroke.base.SafeByteArray; class AuthResponseParser extends GenericElementParser<AuthResponse> { @@ -27,7 +28,7 @@ class AuthResponseParser extends GenericElementParser<AuthResponse> { public void handleEndElement(String unused1, String unused2) { --depth; if (depth == 0) { - getElementGeneric().setValue(Base64.decode(text)); + getElementGeneric().setValue(new SafeByteArray(Base64.decode(text))); } } diff --git a/src/com/isode/stroke/parser/XMLParserFactory.java b/src/com/isode/stroke/parser/XMLParserFactory.java new file mode 100644 index 0000000..a5fcdb0 --- /dev/null +++ b/src/com/isode/stroke/parser/XMLParserFactory.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2010 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; + +import com.isode.stroke.parser.XMLParser; +import com.isode.stroke.parser.XMLParserClient; + +public abstract class XMLParserFactory { + + public abstract XMLParser createParser(XMLParserClient xmlParserClient); +} diff --git a/src/com/isode/stroke/parser/XMPPParser.java b/src/com/isode/stroke/parser/XMPPParser.java index 85d0e1f..8fd7763 100644 --- a/src/com/isode/stroke/parser/XMPPParser.java +++ b/src/com/isode/stroke/parser/XMPPParser.java @@ -9,95 +9,90 @@ import java.util.logging.Logger; public class XMPPParser implements XMLParserClient { - private final XMLParser xmlParser_; - private final XMPPParserClient client_; - private final PayloadParserFactoryCollection payloadParserFactories_; - private int currentDepth_ = 0; + private XMLParser xmlParser_; + private XMPPParserClient client_; + private PayloadParserFactoryCollection payloadParserFactories_; + private int level_ = 0; private ElementParser currentElementParser_ = null; private boolean parseErrorOccurred_ = false; private Logger logger_ = Logger.getLogger(this.getClass().getName()); - + private final int TopLevel = 0; + private final int StreamLevel = 1; + private final int ElementLevel = 2; + public XMPPParser(XMPPParserClient parserClient, PayloadParserFactoryCollection payloadParserFactories) { + xmlParser_ = null; client_ = parserClient; payloadParserFactories_ = payloadParserFactories; + level_ = 0; + currentElementParser_ = null; + parseErrorOccurred_ = false; xmlParser_ = PlatformXMLParserFactory.createXMLParser(this); } public boolean parse(String data) { - parseErrorOccurred_ = false; - boolean xmlParseResult = false; - try { - xmlParseResult = xmlParser_.parse(data); - } catch (Exception e) { - parseErrorOccurred_ = true; - logger_.log(java.util.logging.Level.WARNING, "Data " + data + " caused:\n" + e.getMessage(), e); - } - if (parseErrorOccurred_ || !xmlParseResult) { - logger_.warning(String.format("When parsing, %b and %b", - parseErrorOccurred_, xmlParseResult)); - if (data != null) { - logger_.warning("xml that caused failure: " + data); - } - } + boolean xmlParseResult = xmlParser_.parse(data); return xmlParseResult && !parseErrorOccurred_; } public void handleStartElement(String element, String ns, AttributeMap attributes) { - if (!inStream()) { - if (element.equals("stream") - && ns.equals("http://etherx.jabber.org/streams")) { - ProtocolHeader header = new ProtocolHeader(); - header.setFrom(attributes.getAttribute("from")); - header.setTo(attributes.getAttribute("to")); - header.setID(attributes.getAttribute("id")); - header.setVersion(attributes.getAttribute("version")); - client_.handleStreamStart(header); - } else { - parseErrorOccurred_ = true; + if (!parseErrorOccurred_) { + if (level_ == TopLevel) { + if (element.equals("stream") && ns.equals("http://etherx.jabber.org/streams")) { + ProtocolHeader header = new ProtocolHeader(); + header.setFrom(attributes.getAttribute("from")); + header.setTo(attributes.getAttribute("to")); + header.setID(attributes.getAttribute("id")); + header.setVersion(attributes.getAttribute("version")); + client_.handleStreamStart(header); + } + else { + parseErrorOccurred_ = true; + } } - } else { - if (!inElement()) { - assert currentElementParser_ == null; - currentElementParser_ = createElementParser(element, ns); + else { + if (level_ == StreamLevel) { + assert(currentElementParser_ == null); + currentElementParser_ = createElementParser(element, ns); + } + currentElementParser_.handleStartElement(element, ns, attributes); } - currentElementParser_.handleStartElement(element, ns, attributes); } - ++currentDepth_; + ++level_; } public void handleEndElement(String element, String ns) { - assert (inStream()); - if (inElement()) { - assert currentElementParser_ != null; - currentElementParser_.handleEndElement(element, ns); - --currentDepth_; - if (!inElement()) { - client_.handleElement(currentElementParser_.getElement()); - currentElementParser_ = null; + assert(level_ > TopLevel); + --level_; + if (!parseErrorOccurred_) { + if (level_ == TopLevel) { + assert(element.equals("stream")); + client_.handleStreamEnd(); + } + else { + assert(currentElementParser_ != null); + currentElementParser_.handleEndElement(element, ns); + if (level_ == StreamLevel) { + client_.handleElement(currentElementParser_.getElement()); + currentElementParser_ = null; + } } - } else { - assert (element.equals("stream")); - --currentDepth_; - client_.handleStreamEnd(); } } public void handleCharacterData(String data) { - if (currentElementParser_ != null) { - currentElementParser_.handleCharacterData(data); + if (!parseErrorOccurred_) { + if (currentElementParser_ != null) { + currentElementParser_.handleCharacterData(data); + } + //else { + // std::cerr << "XMPPParser: Ignoring stray character data: " << data << std::endl; + //} } } - - private boolean inStream() { - return currentDepth_ > 0; - } - - private boolean inElement() { - return currentDepth_ > 1; - } - + private ElementParser createElementParser(String element, String xmlns) { if (element.equals("presence")) { return new PresenceParser(payloadParserFactories_); @@ -108,6 +103,8 @@ public class XMPPParser implements XMLParserClient { } else if (element.equals("features") && xmlns.equals("http://etherx.jabber.org/streams")) { return new StreamFeaturesParser(); + } else if (element.equals("error") && xmlns.equals("http://etherx.jabber.org/streams")) { + return new StreamErrorParser(); } else if (element.equals("auth")) { return new AuthRequestParser(); } else if (element.equals("success")) { @@ -149,6 +146,8 @@ public class XMPPParser implements XMLParserClient { return new StanzaAckParser(); } else if (element.equals("r") && xmlns.equals("urn:xmpp:sm:2")) { return new StanzaAckRequestParser(); + } else if (element.equals("handshake")) { + return new ComponentHandshakeParser(); } return new UnknownElementParser(); diff --git a/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java b/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java index 0a46d75..87b84d8 100644 --- a/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java +++ b/src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java @@ -12,8 +12,6 @@ import com.isode.stroke.parser.payloadparsers.PubSubOwnerPubSubParser; public class FullPayloadParserFactoryCollection extends PayloadParserFactoryCollection { public FullPayloadParserFactoryCollection() { - /* TODO: Port more */ - //addFactory(new GenericPayloadParserFactory<IBBParser>("", "http://jabber.org/protocol/ibb")); addFactory(new GenericPayloadParserFactory<CarbonsDisableParser>("disable", "urn:xmpp:carbons:2", CarbonsDisableParser.class)); addFactory(new GenericPayloadParserFactory<CarbonsEnableParser>("enable", "urn:xmpp:carbons:2", CarbonsEnableParser.class)); addFactory(new GenericPayloadParserFactory<CarbonsPrivateParser>("private", "urn:xmpp:carbons:2", CarbonsPrivateParser.class)); @@ -62,7 +60,6 @@ public class FullPayloadParserFactoryCollection extends PayloadParserFactoryColl addFactory(new GenericPayloadParserFactory<VCardParser>("vCard", "vcard-temp", VCardParser.class)); addFactory(new PrivateStorageParserFactory(this)); addFactory(new ChatStateParserFactory()); - //addFactory(new DelayParserFactory()); addFactory(new MUCUserPayloadParserFactory(this)); addFactory(new MUCOwnerPayloadParserFactory(this)); addFactory(new GenericPayloadParserFactory<MUCInvitationPayloadParser>("x", |