summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/parser')
-rw-r--r--src/com/isode/stroke/parser/AuthRequestParser.java3
-rw-r--r--src/com/isode/stroke/parser/AuthResponseParser.java3
-rw-r--r--src/com/isode/stroke/parser/XMLParserFactory.java20
-rw-r--r--src/com/isode/stroke/parser/XMPPParser.java119
-rw-r--r--src/com/isode/stroke/parser/payloadparsers/FullPayloadParserFactoryCollection.java3
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",