diff options
author | Kevin Smith <git@kismith.co.uk> | 2011-07-01 09:19:49 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2011-07-01 09:19:49 (GMT) |
commit | 2da71a8a85486a494343f1662d64fb5ae5a2a44e (patch) | |
tree | 23992f9f2a00bac23b345e5c2cc9c1194efc25be /src/com/isode/stroke/queries | |
download | stroke-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.java | 44 | ||||
-rw-r--r-- | src/com/isode/stroke/queries/GetRosterRequest.java | 24 | ||||
-rw-r--r-- | src/com/isode/stroke/queries/GetVersionRequest.java | 24 | ||||
-rw-r--r-- | src/com/isode/stroke/queries/IQChannel.java | 24 | ||||
-rw-r--r-- | src/com/isode/stroke/queries/IQHandler.java | 19 | ||||
-rw-r--r-- | src/com/isode/stroke/queries/IQReceivedHandler.java | 16 | ||||
-rw-r--r-- | src/com/isode/stroke/queries/IQRouter.java | 73 | ||||
-rw-r--r-- | src/com/isode/stroke/queries/Request.java | 86 |
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 |