@@ -76,7 +76,7 @@ class QXmppServerPrivate
7676public:
7777 QXmppServerPrivate (QXmppServer *qq);
7878 void loadExtensions (QXmppServer *server);
79- bool routeData (const QString &to, const QByteArray &data);
79+ bool routeData (const QString &to, const QByteArray &data, const QString& resource );
8080 void startExtensions ();
8181 void stopExtensions ();
8282
@@ -125,7 +125,7 @@ QXmppServerPrivate::QXmppServerPrivate(QXmppServer *qq)
125125// / \param data
126126// /
127127
128- bool QXmppServerPrivate::routeData (const QString &to, const QByteArray &data)
128+ bool QXmppServerPrivate::routeData (const QString &to, const QByteArray &data, const QString& resource )
129129{
130130 // refuse to route packets to empty destination, own domain or sub-domains
131131 const QString toDomain = QXmppUtils::jidToDomain (to);
@@ -136,7 +136,17 @@ bool QXmppServerPrivate::routeData(const QString &to, const QByteArray &data)
136136
137137 // look for a client connection
138138 QList<QXmppIncomingClient*> found;
139- if (QXmppUtils::jidToResource (to).isEmpty ()) {
139+ // issue#7: Is a specific destination resource requested?
140+ if (!resource.isEmpty ()){
141+ if (QXmppUtils::jidToResource (to).isEmpty ()) {
142+ QXmppIncomingClient *conn = incomingClientsByJid.value (to + " /" + resource);
143+ if (conn)
144+ found << conn;
145+ } else {
146+ // refuse to route to a specific resource if stanza is for a full JID already
147+ return false ;
148+ }
149+ } else if (QXmppUtils::jidToResource (to).isEmpty ()) {
140150 foreach (QXmppIncomingClient *conn, incomingClientsByBareJid.value (to))
141151 found << conn;
142152 } else {
@@ -646,12 +656,7 @@ bool QXmppServer::sendElement(const QDomElement &element, const QString& resourc
646656 helperToXmlAddDomElement (&xmlStream, element, omitNamespaces);
647657
648658 // route data
649- if (!resource.isEmpty ()) {
650- // ... to explicitly specified resource. Override original resource from "to" (if any)
651- return d->routeData (QXmppUtils::jidToBareJid (element.attribute (" to" )) + " /" + resource, data);
652- } else {
653- return d->routeData (element.attribute (" to" ), data);
654- }
659+ return d->routeData (element.attribute (" to" ), data, resource);
655660}
656661
657662// / Route an XMPP packet.
@@ -667,12 +672,7 @@ bool QXmppServer::sendPacket(const QXmppStanza &packet, const QString& resource)
667672 packet.toXml (&xmlStream);
668673
669674 // route data
670- if (!resource.isEmpty ()) {
671- // ... to explicitly specified resource. Override original resource from "to" (if any)
672- return d->routeData (QXmppUtils::jidToBareJid (packet.to ()) + " /" + resource, data);
673- } else {
674- return d->routeData (packet.to (), data);
675- }
675+ return d->routeData (packet.to (), data, resource);
676676}
677677
678678// / Add a new incoming client \a stream.
0 commit comments