Bernd Fondermann wrote:
Gerolf Seitz wrote:
heya,
i just committed my first take on handling subscription
requests/approvals/cancellations
and unsubscriptions.
there are a lot of TODOs in there regarding persistance and
determining the
correct
set of resources a stanza needs to be relayed to.
until now, i used the RFC3921bis-04 version as a reference, as it's
nicer to
read...
i plan to revise it to reflect the conformance to the original RFC3921.
except of the TODOs, the basic handling described in RFC3921bis-04#3
should be finished.
I cannot await further presence commits! :-)
A quick test reveiled that some clients send 'id' attributes on presence
stanzas and some do send inner elements (which is allowed as far as I
understand it).
Hi Gerolf,
I had to put my hands on this. Now it is working better for the clients
I use (Smack & Coccinella).
Since you are probably working on this or already fixed it locally, here
is my patch per email:
Index:
src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/PresenceHandler.java
===================================================================
---
src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/PresenceHandler.java
(revision 652621)
+++
src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/PresenceHandler.java
Fri May 02 20:56:31 CEST 2008
@@ -34,6 +34,7 @@
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
+import org.apache.vysper.xmpp.stanza.XMPPCoreStanzaVerifier;
import org.apache.vysper.xmpp.xmlfragment.XMLElementVerifier;
/**
@@ -55,16 +56,17 @@
// or in case of multiple resources, use the from attribute or
return an
// error if the from attribute is not present.
Entity initiatingEntity = sessionContext.getInitiatingEntity();
- XMLElementVerifier verifier = stanza.getVerifier();
+ XMPPCoreStanzaVerifier verifier = stanza.getCoreVerifier();
- int nrOfAttributes = stanza.getAttributes().size();
- if ((nrOfAttributes == 0 ||
verifier.onlyAttributesPresent("from"))
- && verifier.subElementsPresentExact(0)) {
+ boolean hasFrom = verifier.attributePresent("from");
+ boolean hasTo = verifier.attributePresent("to");
+ boolean hasType = verifier.attributePresent("type");
+
+ if (!hasTo && !hasType) {
// RFC3921bis-04#4.2.2 Initial Presence
handleOutboundInitialPresence(stanza, sessionContext,
initiatingEntity);
- } else if (verifier.onlyAttributesPresent("type", "to")
- && sessionContext.isServerToServer() == false) {
+ } else if (hasType && hasTo && !hasFrom &&
!sessionContext.isServerToServer()) {
// this is an outbound subscription
// request/approval/cancellation/unsubscription
// stamp it with the bare JID of the user
@@ -88,10 +90,10 @@
handleOutboundSubscriptionCancellation(stampedStanza,
sessionContext);
}
- } else if (verifier.onlyAttributesPresent("from", "to")) {
+ } else if (hasFrom && hasTo && !hasType) {
// RFC3921bis-04#4.2.3
handleInboundInitialPresence(stanza, sessionContext);
- } else if (verifier.onlyAttributesPresent("type", "to",
"from")) {
+ } else if (hasFrom && hasTo && hasType) {
String type = stanza.getType();
if ("subscribe".equals(type)) {
// RFC3921bis-04#3.1.3
@@ -109,7 +111,7 @@
}
- } else if (verifier.allAttributesPresent("from", "to")) {
+ } else if (hasFrom && hasTo) {
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]