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/IQRouter.java
downloadstroke-2da71a8a85486a494343f1662d64fb5ae5a2a44e.zip
stroke-2da71a8a85486a494343f1662d64fb5ae5a2a44e.tar.bz2
Initial import
Diffstat (limited to 'src/com/isode/stroke/queries/IQRouter.java')
-rw-r--r--src/com/isode/stroke/queries/IQRouter.java73
1 files changed, 73 insertions, 0 deletions
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));
+ }
+ }
+}