diff --git a/src/server/QXmppServer.cpp b/src/server/QXmppServer.cpp index 192a00932..83c2939f9 100644 --- a/src/server/QXmppServer.cpp +++ b/src/server/QXmppServer.cpp @@ -76,7 +76,7 @@ class QXmppServerPrivate public: QXmppServerPrivate(QXmppServer *qq); void loadExtensions(QXmppServer *server); - bool routeData(const QString &to, const QByteArray &data); + bool routeData(const QString &to, const QByteArray &data, const QString& resource); void startExtensions(); void stopExtensions(); @@ -125,7 +125,7 @@ QXmppServerPrivate::QXmppServerPrivate(QXmppServer *qq) /// \param data /// -bool QXmppServerPrivate::routeData(const QString &to, const QByteArray &data) +bool QXmppServerPrivate::routeData(const QString &to, const QByteArray &data, const QString& resource) { // refuse to route packets to empty destination, own domain or sub-domains const QString toDomain = QXmppUtils::jidToDomain(to); @@ -136,7 +136,17 @@ bool QXmppServerPrivate::routeData(const QString &to, const QByteArray &data) // look for a client connection QList<QXmppIncomingClient*> found; - if (QXmppUtils::jidToResource(to).isEmpty()) { + // issue#7: Is a specific destination resource requested? + if (!resource.isEmpty()){ + if (QXmppUtils::jidToResource(to).isEmpty()) { + QXmppIncomingClient *conn = incomingClientsByJid.value(to + "/" + resource); + if (conn) + found << conn; + } else { + // refuse to route to a specific resource if stanza is for a full JID already + return false; + } + } else if (QXmppUtils::jidToResource(to).isEmpty()) { foreach (QXmppIncomingClient *conn, incomingClientsByBareJid.value(to)) found << conn; } else { @@ -635,8 +645,9 @@ bool QXmppServer::listenForServers(const QHostAddress &address, quint16 port) /// Route an XMPP stanza. /// /// \param element +/// \param recipient -bool QXmppServer::sendElement(const QDomElement &element) +bool QXmppServer::sendElement(const QDomElement &element, const QString& resource) { // serialize data QByteArray data; @@ -645,14 +656,15 @@ bool QXmppServer::sendElement(const QDomElement &element) helperToXmlAddDomElement(&xmlStream, element, omitNamespaces); // route data - return d->routeData(element.attribute("to"), data); + return d->routeData(element.attribute("to"), data, resource); } /// Route an XMPP packet. /// /// \param packet +/// \param recipient -bool QXmppServer::sendPacket(const QXmppStanza &packet) +bool QXmppServer::sendPacket(const QXmppStanza &packet, const QString& resource) { // serialize data QByteArray data; @@ -660,7 +672,7 @@ bool QXmppServer::sendPacket(const QXmppStanza &packet) packet.toXml(&xmlStream); // route data - return d->routeData(packet.to(), data); + return d->routeData(packet.to(), data, resource); } /// Add a new incoming client \a stream. diff --git a/src/server/QXmppServer.h b/src/server/QXmppServer.h index f6866f92f..52d9f143e 100644 --- a/src/server/QXmppServer.h +++ b/src/server/QXmppServer.h @@ -89,8 +89,8 @@ class QXMPP_EXPORT QXmppServer : public QXmppLoggable bool listenForClients(const QHostAddress &address = QHostAddress::Any, quint16 port = 5222); bool listenForServers(const QHostAddress &address = QHostAddress::Any, quint16 port = 5269); - bool sendElement(const QDomElement &element); - bool sendPacket(const QXmppStanza &stanza); + bool sendElement(const QDomElement &element, const QString& resource = QString()); + bool sendPacket(const QXmppStanza &stanza, const QString& resource = QString()); void addIncomingClient(QXmppIncomingClient *stream);