aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorCochise César <cochisecesar@zoho.com>2022-01-10 01:27:06 -0300
committerLinus Jahn <lnj@kaidan.im>2022-03-09 18:29:46 +0100
commitf2aadfefa283aafc88131c643b97acd28989ac20 (patch)
tree2c5bfcf4f3634ba4435151ad1ba51321691d6ae4 /src/client
parenta69475d8b196605b19e532d62d1fc375630ea8f1 (diff)
downloadqxmpp-f2aadfefa283aafc88131c643b97acd28989ac20.tar.gz
Implement XEP-0080: User Location
Diffstat (limited to 'src/client')
-rw-r--r--src/client/QXmppUserLocationManager.cpp96
-rw-r--r--src/client/QXmppUserLocationManager.h39
2 files changed, 135 insertions, 0 deletions
diff --git a/src/client/QXmppUserLocationManager.cpp b/src/client/QXmppUserLocationManager.cpp
new file mode 100644
index 00000000..d85a47d5
--- /dev/null
+++ b/src/client/QXmppUserLocationManager.cpp
@@ -0,0 +1,96 @@
+// SPDX-FileCopyrightText: 2022 Cochise César <cochisecesar@zoho.com>
+// SPDX-FileCopyrightText: 2022 Linus Jahn <lnj@kaidan.im>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#include "QXmppUserLocationManager.h"
+
+#include "QXmppConstants_p.h"
+#include "QXmppGeolocItem.h"
+#include "QXmppPep_p.h"
+
+using namespace QXmpp::Private;
+
+///
+/// \class QXmppUserLocationManager
+///
+/// The QXmppUserLocationManager implements \xep{0080, User Location}. You'll receive
+/// location updates from all presence subscriptions. You can publish location
+/// information on the user's account (publish()) and request location information
+/// from specific accounts (request()).
+///
+/// The manager needs to be added to the client first and also requires the
+/// QXmppPubSubManager.
+/// \code
+/// QXmppClient client;
+/// auto *pubSubManager = client.addNewExtension<QXmppPubSubManager>();
+/// auto *locationManager = client.addNewExtension<QXmppUserLocationManager>();
+/// \endcode
+///
+/// \since QXmpp 1.5
+///
+/// \ingroup Managers
+///
+
+///
+/// \typedef QXmppUserLocationManager::Item
+///
+/// Used pubsub item type.
+///
+
+///
+/// \typedef QXmppUserLocationManager::GetResult
+///
+/// Contains the User Location information or an error.
+///
+
+///
+/// \typedef QXmppUserLocationManager::PublishResult
+///
+/// Contains the ID of the published item on success or a stanza error.
+///
+
+///
+/// \fn QXmppUserLocationManager::itemReceived()
+///
+/// Emitted whenever a \xep{0080, User Location} items event arrives.
+///
+
+QXmppUserLocationManager::QXmppUserLocationManager() = default;
+
+QStringList QXmppUserLocationManager::discoveryFeatures() const
+{
+ return {
+ ns_geoloc,
+ ns_geoloc_notify,
+ };
+}
+
+///
+/// Request User Location information from an account.
+///
+/// \param jid The account JID to request.
+///
+auto QXmppUserLocationManager::request(const QString &jid)
+ -> QFuture<GetResult>
+{
+ return Pep::request<Item>(pubSub(), jid, ns_geoloc, this);
+}
+
+///
+/// Publishes User Location information on the user's account.
+///
+/// \param item The User Location item to be published.
+///
+auto QXmppUserLocationManager::publish(const QXmppGeolocItem &item)
+ -> QFuture<PublishResult>
+{
+ return pubSub()->publishPepItem(ns_geoloc, item);
+}
+
+/// \cond
+bool QXmppUserLocationManager::handlePubSubEvent(const QDomElement &element, const QString &pubSubService, const QString &nodeName)
+{
+ return Pep::handlePubSubEvent<Item>(element, pubSubService, nodeName, ns_geoloc, this, &QXmppUserLocationManager::itemReceived);
+}
+/// \endcond
diff --git a/src/client/QXmppUserLocationManager.h b/src/client/QXmppUserLocationManager.h
new file mode 100644
index 00000000..9033d512
--- /dev/null
+++ b/src/client/QXmppUserLocationManager.h
@@ -0,0 +1,39 @@
+// SPDX-FileCopyrightText: 2022 Linus Jahn <lnj@kaidan.im>
+// SPDX-FileCopyrightText: 2022 Cochise César <cochisecesar@zoho.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#ifndef QXMPPUSERLOCATIONMANAGER_H
+#define QXMPPUSERLOCATIONMANAGER_H
+
+#include "QXmppPubSubEventManager.h"
+
+#include <variant>
+
+class QXmppGeolocItem;
+
+class QXMPP_EXPORT QXmppUserLocationManager : public QXmppPubSubEventManager
+{
+ Q_OBJECT
+
+public:
+ using Item = QXmppGeolocItem;
+ using GetResult = std::variant<Item, QXmppStanza::Error>;
+ using PublishResult = std::variant<QString, QXmppStanza::Error>;
+
+ QXmppUserLocationManager();
+
+ QStringList discoveryFeatures() const override;
+
+ QFuture<GetResult> request(const QString &jid);
+ QFuture<PublishResult> publish(const Item &);
+
+ Q_SIGNAL void itemReceived(const QString &jid, const QXmppGeolocItem &);
+
+protected:
+ /// \cond
+ bool handlePubSubEvent(const QDomElement &element, const QString &pubSubService, const QString &nodeName) override;
+ /// \endcond
+};
+
+#endif // QXMPPUSERLOCATIONMANAGER_H