@@ -76,7 +76,7 @@ class QXmppServerPrivate
76
76
public:
77
77
QXmppServerPrivate (QXmppServer *qq);
78
78
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 );
80
80
void startExtensions ();
81
81
void stopExtensions ();
82
82
@@ -125,7 +125,7 @@ QXmppServerPrivate::QXmppServerPrivate(QXmppServer *qq)
125
125
// / \param data
126
126
// /
127
127
128
- bool QXmppServerPrivate::routeData (const QString &to, const QByteArray &data)
128
+ bool QXmppServerPrivate::routeData (const QString &to, const QByteArray &data, const QString& resource )
129
129
{
130
130
// refuse to route packets to empty destination, own domain or sub-domains
131
131
const QString toDomain = QXmppUtils::jidToDomain (to);
@@ -136,7 +136,17 @@ bool QXmppServerPrivate::routeData(const QString &to, const QByteArray &data)
136
136
137
137
// look for a client connection
138
138
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 ()) {
140
150
foreach (QXmppIncomingClient *conn, incomingClientsByBareJid.value (to))
141
151
found << conn;
142
152
} else {
@@ -646,12 +656,7 @@ bool QXmppServer::sendElement(const QDomElement &element, const QString& resourc
646
656
helperToXmlAddDomElement (&xmlStream, element, omitNamespaces);
647
657
648
658
// 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);
655
660
}
656
661
657
662
// / Route an XMPP packet.
@@ -667,12 +672,7 @@ bool QXmppServer::sendPacket(const QXmppStanza &packet, const QString& resource)
667
672
packet.toXml (&xmlStream);
668
673
669
674
// 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);
676
676
}
677
677
678
678
// / Add a new incoming client \a stream.
0 commit comments