QXmpp
Introduction
QXmpp is a cross-platform C++ XMPP client and server library built on top of the Qt framework (Qt 6.4+). It implements a large number of XMPP Extension Protocols (XEPs) and exposes a modern, reactive API based on C++20 and Qt's property system.
Getting Started
The central class is QXmppClient. Create one, register the managers you need, then connect:
auto *client = new QXmppClient(this);
// Register managers
auto *pubsub = client->addNewExtension<QXmppPubSubManager>();
auto *disco = client->addNewExtension<QXmppDiscoveryManager>();
auto *muc = client->addNewExtension<QXmppMucManagerV2>();
// Connect
QXmppConfiguration config;
config.setJid("user@example.org");
config.setPassword("secret");
client->connectToServer(config);
Async API
All network operations return a QXmppTask<T>, which represents a pending result. QXmppTask supports co_await, making sequential async code straightforward:
QXmppTask<void> MyManager::doSomething()
{
auto result = co_await muc->joinRoom("room@conference.example.org", "MyNick").withContext(this);
if (auto *err = std::get_if<QXmppError>(&result)) {
qWarning() << "Join failed:" << err->description;
co_return;
}
// continue ...
}
Alternatively, use .then() to attach a callback:
muc->joinRoom("room@conference.example.org", "MyNick").then(this, [](auto result) {
if (auto *err = std::get_if<QXmppError>(&result)) {
qWarning() << "Join failed:" << err->description;
}
});
Results are typically QXmpp::Result<T>, a std::variant<T, QXmppError>. Always pass a context object (this) to .then() or .withContext() to ensure the callback is not invoked after the object has been destroyed.
Reactive Properties
Selected APIs expose observable state via QBindable<T>, backed by Qt's QProperty system. QXmppMucRoomV2 is the primary example — room info, config, and participant state are all exposed as bindable properties that update automatically when the server reports changes:
auto room = *muc->findRoom("room@conference.example.org");
room.setWatchAvatar(true);
// m_avatarNotifier is a QPropertyNotifier member: discarding the handle
// returned by addNotifier() unsubscribes the callback immediately.
m_avatarNotifier = room.avatar().addNotifier([room]() {
// called whenever the room avatar changes
auto val = room.avatar().value();
});
Observer lifetime, addNotifier() versus subscribe(), and how to bridge bindable state into classic signals are covered in Reactive Properties.
Managers
Managers are the primary way to use XMPP features. Register them with QXmppClient and extend QXmppClient by subclassing QXmppClientExtension. See the Managers module for the full list.
Messaging
- QXmppCarbonManagerV2 — Message carbons (XEP-0280)
- QXmppMamManager — Message archive management (XEP-0313)
- QXmppMessageReceiptManager — Message delivery receipts (XEP-0184)
- QXmppAttentionManager — Attention requests (XEP-0224)
Contacts and Roster
- QXmppRosterManager — Contact list (XEP-0162)
- QXmppVCardManager — vCards (vcard-temp)
- QXmppUserLocationManager — User location (XEP-0080)
- QXmppUserTuneManager — User tune (XEP-0118)
- QXmppVersionManager — Software version (XEP-0092)
- QXmppEntityTimeManager — Entity time (XEP-0202)
Groupchat
- QXmppMucManagerV2 — Multi-user chat with reactive API (XEP-0045)
- QXmppMixManager — Mediated Information eXchange (XEP-0369)
File Sharing
- QXmppFileSharingManager — Stateless file sharing (XEP-0447)
- QXmppHttpUploadManager — HTTP file upload service (XEP-0363)
- QXmppUploadRequestManager — HTTP upload slot requests (XEP-0363)
- QXmppTransferManager — In-band / SOCKS5 file transfer (XEP-0047, XEP-0065)
End-to-End Encryption
- QXmppOmemoManager — OMEMO 2 end-to-end encryption (XEP-0384)
- QXmppAtmManager — Automatic trust management (XEP-0450)
- QXmppTrustManager — Trust level storage and queries
Calls
- QXmppCallManager — Jingle audio/video calls (XEP-0166)
- QXmppCallInviteManager — Call invites (XEP-0482)
- QXmppJingleMessageInitiationManager — Jingle message initiation (XEP-0353)
Bookmarks and PubSub
- QXmppPepBookmarkManager — PEP native bookmarks (XEP-0402)
- QXmppPubSubManager — Publish-subscribe (XEP-0060)
Service Discovery and Utilities
- QXmppDiscoveryManager — Service discovery (XEP-0030)
- QXmppBlockingManager — Contact blocking (XEP-0191)
- QXmppExternalServiceDiscoveryManager — External service discovery (XEP-0215)
- QXmppRegistrationManager — In-band registration (XEP-0077)
- QXmppAccountMigrationManager — Account data migration (XEP-0227)
- QXmppMovedManager — Account migration hints (XEP-0283)
Legacy (deprecated)
- QXmppMucManager — superseded by QXmppMucManagerV2
- QXmppCarbonManager — superseded by QXmppCarbonManagerV2
- QXmppBookmarkManager — superseded by QXmppPepBookmarkManager
- QXmppArchiveManager — superseded by QXmppMamManager
- QXmppRpcManager — RPC (XEP-0009)
Low-Level Stanza API
For direct access to XMPP stanzas: