summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2011-07-01 09:19:49 (GMT)
committerKevin Smith <git@kismith.co.uk>2011-07-01 09:19:49 (GMT)
commit2da71a8a85486a494343f1662d64fb5ae5a2a44e (patch)
tree23992f9f2a00bac23b345e5c2cc9c1194efc25be /src/com/isode/stroke/queries
downloadstroke-2da71a8a85486a494343f1662d64fb5ae5a2a44e.zip
stroke-2da71a8a85486a494343f1662d64fb5ae5a2a44e.tar.bz2
Initial import
Diffstat (limited to 'src/com/isode/stroke/queries')
-rw-r--r--src/com/isode/stroke/queries/GenericRequest.java44
-rw-r--r--src/com/isode/stroke/queries/GetRosterRequest.java24
-rw-r--r--src/com/isode/stroke/queries/GetVersionRequest.java24
-rw-r--r--src/com/isode/stroke/queries/IQChannel.java24
-rw-r--r--src/com/isode/stroke/queries/IQHandler.java19
-rw-r--r--src/com/isode/stroke/queries/IQReceivedHandler.java16
-rw-r--r--src/com/isode/stroke/queries/IQRouter.java73
-rw-r--r--src/com/isode/stroke/queries/Request.java86
8 files changed, 310 insertions, 0 deletions
diff --git a/src/com/isode/stroke/queries/GenericRequest.java b/src/com/isode/stroke/queries/GenericRequest.java
new file mode 100644
index 0000000..cfbfb52
--- /dev/null
+++ b/src/com/isode/stroke/queries/GenericRequest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2010, 2011 Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tron¨on.
+ * All rights reserved.
+ */
+
+package com.isode.stroke.queries;
+
+import com.isode.stroke.elements.ErrorPayload;
+import com.isode.stroke.elements.IQ;
+import com.isode.stroke.elements.Payload;
+import com.isode.stroke.jid.JID;
+import com.isode.stroke.signals.Signal2;
+
+/**
+ * IQ Request for standard payload.
+ */
+public class GenericRequest<T extends Payload> extends Request {
+
+ public Signal2<T, ErrorPayload> onResponse = new Signal2<T, ErrorPayload>();
+
+ public GenericRequest(IQ.Type type, JID receiver, Payload payload, IQRouter router) {
+ super(type, receiver, payload, router);
+ }
+
+ @Override
+ protected void handleResponse(Payload payload, ErrorPayload error) {
+ T genericPayload = null;
+ try {
+ genericPayload = (T)payload;
+ } catch (Exception ex) {
+ /* This isn't legal XMPP, so treat as NULL.*/
+ }
+ onResponse.emit(genericPayload, error);
+ }
+
+ protected T getPayloadGeneric() {
+ return (T)getPayload();
+ }
+
+}
diff --git a/src/com/isode/stroke/queries/GetRosterRequest.java b/src/com/isode/stroke/queries/GetRosterRequest.java
new file mode 100644
index 0000000..1c7ea6e
--- /dev/null
+++ b/src/com/isode/stroke/queries/GetRosterRequest.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2010, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tron¨on.
+ * All rights reserved.
+ */
+
+package com.isode.stroke.queries;
+
+import com.isode.stroke.elements.IQ.Type;
+import com.isode.stroke.elements.RosterPayload;
+import com.isode.stroke.jid.JID;
+
+public class GetRosterRequest extends GenericRequest<RosterPayload> {
+ public GetRosterRequest(JID target, IQRouter iqRouter) {
+ super(Type.Get, target, new RosterPayload(), iqRouter);
+ }
+
+ public GetRosterRequest(IQRouter iqRouter) {
+ super(Type.Get, new JID(), new RosterPayload(), iqRouter);
+ }
+}
diff --git a/src/com/isode/stroke/queries/GetVersionRequest.java b/src/com/isode/stroke/queries/GetVersionRequest.java
new file mode 100644
index 0000000..75db384
--- /dev/null
+++ b/src/com/isode/stroke/queries/GetVersionRequest.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2010 Remko Tron¨on
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010 Isode Limited, London, England.
+ * All rights reserved.
+ */
+
+package com.isode.stroke.queries;
+
+import com.isode.stroke.elements.IQ.Type;
+import com.isode.stroke.elements.Version;
+import com.isode.stroke.jid.JID;
+
+public class GetVersionRequest extends GenericRequest<Version> {
+ public GetVersionRequest(JID target, IQRouter iqRouter) {
+ super(Type.Get, target, new Version(), iqRouter);
+ }
+
+ public GetVersionRequest(IQRouter iqRouter) {
+ super(Type.Get, new JID(), new Version(), iqRouter);
+ }
+}
diff --git a/src/com/isode/stroke/queries/IQChannel.java b/src/com/isode/stroke/queries/IQChannel.java
new file mode 100644
index 0000000..fd5fe8e
--- /dev/null
+++ b/src/com/isode/stroke/queries/IQChannel.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2010, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tron¨on.
+ * All rights reserved.
+ */
+
+package com.isode.stroke.queries;
+
+import com.isode.stroke.elements.IQ;
+import com.isode.stroke.signals.Signal1;
+
+public abstract class IQChannel {
+
+ public abstract void sendIQ(IQ iq);
+
+ public abstract String getNewIQID();
+
+ public abstract boolean isAvailable();
+
+ public final Signal1<IQ> onIQReceived = new Signal1<IQ>();
+}
diff --git a/src/com/isode/stroke/queries/IQHandler.java b/src/com/isode/stroke/queries/IQHandler.java
new file mode 100644
index 0000000..2d6f35e
--- /dev/null
+++ b/src/com/isode/stroke/queries/IQHandler.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2010, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tron¨on.
+ * All rights reserved.
+ */
+
+package com.isode.stroke.queries;
+
+import com.isode.stroke.elements.IQ;
+
+/**
+ * Thing reacting to IQs.
+ */
+public interface IQHandler {
+ boolean handleIQ(IQ iq);
+}
diff --git a/src/com/isode/stroke/queries/IQReceivedHandler.java b/src/com/isode/stroke/queries/IQReceivedHandler.java
new file mode 100644
index 0000000..37db43a
--- /dev/null
+++ b/src/com/isode/stroke/queries/IQReceivedHandler.java
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2010, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tron¨on.
+ * All rights reserved.
+ */
+
+package com.isode.stroke.queries;
+
+import com.isode.stroke.elements.IQ;
+
+interface IQReceivedHandler {
+ void handleIQ(IQ iq);
+}
diff --git a/src/com/isode/stroke/queries/IQRouter.java b/src/com/isode/stroke/queries/IQRouter.java
new file mode 100644
index 0000000..04ddb20
--- /dev/null
+++ b/src/com/isode/stroke/queries/IQRouter.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2010, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tron¨on.
+ * All rights reserved.
+ */
+package com.isode.stroke.queries;
+
+import com.isode.stroke.elements.ErrorPayload;
+import com.isode.stroke.elements.IQ;
+import com.isode.stroke.signals.Slot1;
+import java.util.Vector;
+
+/**
+ * Route IQs to handlers
+ */
+public class IQRouter {
+
+ private final Vector<IQHandler> handlers_ = new Vector<IQHandler>();
+ private final IQChannel channel_;
+
+ public IQRouter(IQChannel channel) {
+ channel_ = channel;
+ final IQRouter thisObject = this;
+ channel_.onIQReceived.connect(new Slot1<IQ>() {
+
+ public void call(IQ p1) {
+ handleIQ(p1);
+ }
+ });
+ }
+
+ public void addHandler(IQHandler handler) {
+ synchronized (handlers_) {
+ handlers_.add(handler);
+ }
+ }
+
+ public void removeHandler(IQHandler handler) {
+ synchronized (handlers_) {
+ handlers_.remove(handler);
+ }
+ }
+
+ public void sendIQ(IQ iq) {
+ channel_.sendIQ(iq);
+ }
+
+ public String getNewIQID() {
+ return channel_.getNewIQID();
+ }
+
+ public boolean isAvailable() {
+ return channel_.isAvailable();
+ }
+
+ private void handleIQ(IQ iq) {
+ boolean handled = false;
+ synchronized (handlers_) {
+ for (IQHandler handler : handlers_) {
+ handled |= handler.handleIQ(iq);
+ if (handled) {
+ break;
+ }
+ }
+ }
+ if (!handled && (iq.getType().equals(IQ.Type.Get) || iq.getType().equals(IQ.Type.Set))) {
+ sendIQ(IQ.createError(iq.getFrom(), iq.getID(), ErrorPayload.Condition.FeatureNotImplemented, ErrorPayload.Type.Cancel));
+ }
+ }
+}
diff --git a/src/com/isode/stroke/queries/Request.java b/src/com/isode/stroke/queries/Request.java
new file mode 100644
index 0000000..df38b10
--- /dev/null
+++ b/src/com/isode/stroke/queries/Request.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2010, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2010, Remko Tron¨on.
+ * All rights reserved.
+ */
+
+package com.isode.stroke.queries;
+
+import com.isode.stroke.elements.ErrorPayload;
+import com.isode.stroke.elements.IQ;
+import com.isode.stroke.elements.IQ.Type;
+import com.isode.stroke.elements.Payload;
+import com.isode.stroke.jid.JID;
+
+/**
+ * Base class for IQ requests.
+ */
+public abstract class Request implements IQHandler {
+ protected final Type type_;
+ protected final IQRouter router_;
+ protected final JID receiver_;
+ private boolean sent_;
+ private Payload payload_;
+ private String id_;
+
+ public Request(IQ.Type type, JID receiver, IQRouter router) {
+ this(type, receiver, null, router);
+ }
+
+ public Request(IQ.Type type, JID receiver, Payload payload, IQRouter router) {
+ type_ = type;
+ router_ = router;
+ receiver_ = receiver;
+ payload_ = payload;
+ sent_ = false;
+ }
+
+ public void send() {
+ assert payload_ != null;
+ assert !sent_;
+ sent_ = true;
+
+ IQ iq = new IQ(type_);
+ iq.setTo(receiver_);
+ iq.addPayload(payload_);
+ id_ = router_.getNewIQID();
+ iq.setID(id_);
+
+ router_.addHandler(this);
+
+ router_.sendIQ(iq);
+ }
+
+ protected void setPayload(Payload payload) {
+ payload_ = payload;
+ }
+
+ protected Payload getPayload() {
+ return payload_;
+ }
+
+ protected abstract void handleResponse(Payload payload, ErrorPayload error);
+
+ public boolean handleIQ(IQ iq) {
+ boolean handled = false;
+ if (sent_ && iq.getID().equals(id_)) {
+ if (iq.getType().equals(IQ.Type.Result)) {
+ handleResponse(iq.getPayload(payload_), null);
+ } else {
+ ErrorPayload errorPayload = iq.getPayload(new ErrorPayload());
+ if (errorPayload != null) {
+ handleResponse(null, errorPayload);
+ } else {
+ handleResponse(null, new ErrorPayload(ErrorPayload.Condition.UndefinedCondition));
+ }
+ }
+ router_.removeHandler(this);
+ handled = true;
+ }
+ return handled;
+ }
+
+} \ No newline at end of file