diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-02-08 10:15:40 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-02-08 10:15:40 +0000 |
| commit | e3c2c0114e6ac3f6366620ec8560263a44cafb5a (patch) | |
| tree | 626054e3125311b8ee13af29000450b059aa8a28 /src | |
| parent | 0675f3654c9572b98f98414217b576e41ab90b5e (diff) | |
| download | qxmpp-e3c2c0114e6ac3f6366620ec8560263a44cafb5a.tar.gz | |
add support for XEP-0048: Bookmarks
Diffstat (limited to 'src')
| -rw-r--r-- | src/QXmppBookmarkManager.cpp | 207 | ||||
| -rw-r--r-- | src/QXmppBookmarkManager.h | 71 | ||||
| -rw-r--r-- | src/QXmppBookmarkSet.cpp | 232 | ||||
| -rw-r--r-- | src/QXmppBookmarkSet.h | 101 | ||||
| -rw-r--r-- | src/src.pro | 4 |
5 files changed, 615 insertions, 0 deletions
diff --git a/src/QXmppBookmarkManager.cpp b/src/QXmppBookmarkManager.cpp new file mode 100644 index 00000000..367b9384 --- /dev/null +++ b/src/QXmppBookmarkManager.cpp @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2008-2011 The QXmpp developers + * + * Author: + * Jeremy Lainé + * + * Source: + * http://code.google.com/p/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include <QDomElement> + +#include "QXmppBookmarkManager.h" +#include "QXmppBookmarkSet.h" +#include "QXmppClient.h" +#include "QXmppIq.h" +#include "QXmppUtils.h" + +static const char * ns_private_storage = "jabber:iq:private"; + +// The QXmppPrivateStorageIq class represents an XML private storage IQ +// as defined by XEP-0049: Private XML Storage. +// +// FIXME: currently, we only handle bookmarks + +class QXmppPrivateStorageIq : public QXmppIq +{ +public: + QXmppBookmarkSet bookmarks() const; + void setBookmarks(const QXmppBookmarkSet &bookmark); + + static bool isPrivateStorageIq(const QDomElement &element); + +protected: + void parseElementFromChild(const QDomElement &element); + void toXmlElementFromChild(QXmlStreamWriter *writer) const; + +private: + QXmppBookmarkSet m_bookmarks; +}; + +QXmppBookmarkSet QXmppPrivateStorageIq::bookmarks() const +{ + return m_bookmarks; +} + +void QXmppPrivateStorageIq::setBookmarks(const QXmppBookmarkSet &bookmarks) +{ + m_bookmarks = bookmarks; +} + +bool QXmppPrivateStorageIq::isPrivateStorageIq(const QDomElement &element) +{ + const QDomElement queryElement = element.firstChildElement("query"); + return queryElement.namespaceURI() == ns_private_storage && + QXmppBookmarkSet::isBookmarkSet(queryElement.firstChildElement()); +} + +void QXmppPrivateStorageIq::parseElementFromChild(const QDomElement &element) +{ + const QDomElement queryElement = element.firstChildElement("query"); + m_bookmarks.parse(queryElement.firstChildElement()); +} + +void QXmppPrivateStorageIq::toXmlElementFromChild(QXmlStreamWriter *writer) const +{ + writer->writeStartElement("query"); + writer->writeAttribute("xmlns", ns_private_storage); + m_bookmarks.toXml(writer); + writer->writeEndElement(); +} + +class QXmppBookmarkManagerPrivate +{ +public: + QXmppBookmarkSet bookmarks; + QXmppBookmarkSet pendingBookmarks; + QString pendingId; + bool bookmarksReceived; +}; + +/// Constructs a new bookmark manager. +/// +QXmppBookmarkManager::QXmppBookmarkManager() + : d(new QXmppBookmarkManagerPrivate) +{ + d->bookmarksReceived = false; +} + +/// Destroys a bookmark manager. +/// +QXmppBookmarkManager::~QXmppBookmarkManager() +{ + delete d; +} + +/// Returns true if the bookmarks have been received from the server, +/// false otherwise. +/// +bool QXmppBookmarkManager::areBookmarksReceived() const +{ + return d->bookmarksReceived; +} + +/// Returns the bookmarks stored on the server. +/// +/// Before calling this method, check that the bookmarks +/// have indeed been received by calling areBookmarksReceived(). +/// + +QXmppBookmarkSet QXmppBookmarkManager::bookmarks() const +{ + return d->bookmarks; +} + +/// Stores the bookmarks on the server. +/// +/// \param bookmarks + +bool QXmppBookmarkManager::setBookmarks(const QXmppBookmarkSet &bookmarks) +{ + QXmppPrivateStorageIq iq; + iq.setType(QXmppIq::Set); + iq.setBookmarks(bookmarks); + if (!client()->sendPacket(iq)) + return false; + + d->pendingBookmarks = bookmarks; + d->pendingId = iq.id(); + return true; +} + +void QXmppBookmarkManager::setClient(QXmppClient *client) +{ + bool check; + Q_UNUSED(check); + + QXmppClientExtension::setClient(client); + + check = connect(client, SIGNAL(connected()), + this, SLOT(slotConnected())); + Q_ASSERT(check); + + check = connect(client, SIGNAL(disconnected()), + this, SLOT(slotDisconnected())); + Q_ASSERT(check); +} + +bool QXmppBookmarkManager::handleStanza(const QDomElement &stanza) +{ + if (stanza.tagName() == "iq") + { + if (QXmppPrivateStorageIq::isPrivateStorageIq(stanza)) + { + QXmppPrivateStorageIq iq; + iq.parse(stanza); + + if (iq.type() == QXmppIq::Result) + { + d->bookmarks = iq.bookmarks(); + d->bookmarksReceived = true; + emit bookmarksReceived(d->bookmarks); + } + return true; + } + else if (!d->pendingId.isEmpty() && stanza.attribute("id") == d->pendingId) + { + QXmppIq iq; + iq.parse(stanza); + if (iq.type() == QXmppIq::Result) + { + d->bookmarks = d->pendingBookmarks; + emit bookmarksReceived(d->bookmarks); + } + d->pendingId = QString(); + return true; + } + } + return false; +} + +void QXmppBookmarkManager::slotConnected() +{ + QXmppPrivateStorageIq iq; + iq.setType(QXmppIq::Get); + client()->sendPacket(iq); +} + +void QXmppBookmarkManager::slotDisconnected() +{ + d->bookmarks = QXmppBookmarkSet(); + d->bookmarksReceived = false; +} + diff --git a/src/QXmppBookmarkManager.h b/src/QXmppBookmarkManager.h new file mode 100644 index 00000000..40c4be0b --- /dev/null +++ b/src/QXmppBookmarkManager.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2008-2011 The QXmpp developers + * + * Author: + * Jeremy Lainé + * + * Source: + * http://code.google.com/p/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#ifndef QXMPPBOOKMARKMANAGER_H +#define QXMPPBOOKMARKMANAGER_H + +#include <QUrl> + +#include "QXmppClientExtension.h" + +class QXmppBookmarkManagerPrivate; +class QXmppBookmarkSet; + +/// \brief The QXmppBookmarkManager class allows you to store and retrieve +/// bookmarks as defined by XEP-0048: Bookmarks. +/// + +class QXmppBookmarkManager : public QXmppClientExtension +{ + Q_OBJECT + +public: + QXmppBookmarkManager(); + ~QXmppBookmarkManager(); + + bool areBookmarksReceived() const; + QXmppBookmarkSet bookmarks() const; + bool setBookmarks(const QXmppBookmarkSet &bookmarks); + + /// \cond + bool handleStanza(const QDomElement &stanza); + /// \endcond + +signals: + /// This signal is emitted when bookmarks are received. + void bookmarksReceived(const QXmppBookmarkSet &bookmarks); + +protected: + /// \cond + void setClient(QXmppClient* client); + /// \endcond + +private slots: + void slotConnected(); + void slotDisconnected(); + +private: + QXmppBookmarkManagerPrivate * const d; +}; + +#endif diff --git a/src/QXmppBookmarkSet.cpp b/src/QXmppBookmarkSet.cpp new file mode 100644 index 00000000..b418d498 --- /dev/null +++ b/src/QXmppBookmarkSet.cpp @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2008-2011 The QXmpp developers + * + * Author: + * Jeremy Lainé + * + * Source: + * http://code.google.com/p/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include <QDomElement> + +#include "QXmppBookmarkSet.h" +#include "QXmppUtils.h" + +static const char *ns_bookmarks = "storage:bookmarks"; + +/// Constructs a new conference room bookmark. +/// + +QXmppBookmarkConference::QXmppBookmarkConference() + : m_autoJoin(false) +{ +} + +/// Returns whether the client should automatically join the conference room +/// on login. +/// + +bool QXmppBookmarkConference::autoJoin() const +{ + return m_autoJoin; +} + +/// Sets whether the client should automatically join the conference room +/// on login. +/// +/// \param autoJoin + +void QXmppBookmarkConference::setAutoJoin(bool autoJoin) +{ + m_autoJoin = autoJoin; +} + +/// Returns the JID of the conference room. +/// + +QString QXmppBookmarkConference::jid() const +{ + return m_jid; +} + +/// Sets the JID of the conference room. +/// +/// \param jid + +void QXmppBookmarkConference::setJid(const QString &jid) +{ + m_jid = jid; +} + +/// Returns the friendly name for the bookmark. +/// + +QString QXmppBookmarkConference::name() const +{ + return m_name; +} + +/// Sets the friendly name for the bookmark. +/// +/// \param name + +void QXmppBookmarkConference::setName(const QString &name) +{ + m_name = name; +} + +/// Returns the preferred nickname for the conference room. +/// + +QString QXmppBookmarkConference::nickName() const +{ + return m_nickName; +} + +/// Sets the preferred nickname for the conference room. +/// +/// \param nickName + +void QXmppBookmarkConference::setNickName(const QString &nickName) +{ + m_nickName = nickName; +} + +/// Returns the friendly name for the bookmark. +/// + +QString QXmppBookmarkUrl::name() const +{ + return m_name; +} + +/// Sets the friendly name for the bookmark. +/// +/// \param name + +void QXmppBookmarkUrl::setName(const QString &name) +{ + m_name = name; +} + +/// Returns the URL for the web page. +/// + +QUrl QXmppBookmarkUrl::url() const +{ + return m_url; +} + +/// Sets the URL for the web page. +/// +/// \param url + +void QXmppBookmarkUrl::setUrl(const QUrl &url) +{ + m_url = url; +} + +/// Returns the conference rooms bookmarks in this bookmark set. +/// + +QList<QXmppBookmarkConference> QXmppBookmarkSet::conferences() const +{ + return m_conferences; +} + +/// Sets the conference rooms bookmarks in this bookmark set. +/// +/// \param conferences + +void QXmppBookmarkSet::setConferences(const QList<QXmppBookmarkConference> &conferences) +{ + m_conferences = conferences; +} + +/// Returns the web page bookmarks in this bookmark set. +/// + +QList<QXmppBookmarkUrl> QXmppBookmarkSet::urls() const +{ + return m_urls; +} + +/// Sets the web page bookmarks in this bookmark set. +/// +/// \param urls + +void QXmppBookmarkSet::setUrls(const QList<QXmppBookmarkUrl> &urls) +{ + m_urls = urls; +} + +bool QXmppBookmarkSet::isBookmarkSet(const QDomElement &element) +{ + return element.tagName() == "storage" && + element.namespaceURI() == ns_bookmarks; +} + +void QXmppBookmarkSet::parse(const QDomElement &element) +{ + QDomElement childElement = element.firstChildElement(); + while (!childElement.isNull()) + { + if (childElement.tagName() == "conference") + { + QXmppBookmarkConference conference; + conference.setAutoJoin(childElement.attribute("autojoin") == "true"); + conference.setJid(childElement.attribute("jid")); + conference.setName(childElement.attribute("name")); + conference.setNickName(childElement.firstChildElement("nick").text()); + m_conferences << conference; + } + else if (childElement.tagName() == "url") + { + QXmppBookmarkUrl url; + url.setName(childElement.attribute("name")); + url.setUrl(childElement.attribute("url")); + m_urls << url; + } + childElement = childElement.nextSiblingElement(); + } +} + +void QXmppBookmarkSet::toXml(QXmlStreamWriter *writer) const +{ + writer->writeStartElement("storage"); + writer->writeAttribute("xmlns", ns_bookmarks); + foreach (const QXmppBookmarkConference &conference, m_conferences) + { + writer->writeStartElement("conference"); + if (conference.autoJoin()) + helperToXmlAddAttribute(writer, "autojoin", "true"); + helperToXmlAddAttribute(writer, "jid", conference.jid()); + helperToXmlAddAttribute(writer, "name", conference.name()); + if (!conference.nickName().isEmpty()) + helperToXmlAddTextElement(writer, "nick", conference.nickName()); + writer->writeEndElement(); + } + foreach (const QXmppBookmarkUrl &url, m_urls) + { + writer->writeStartElement("url"); + helperToXmlAddAttribute(writer, "name", url.name()); + helperToXmlAddAttribute(writer, "url", url.url().toString()); + writer->writeEndElement(); + } + writer->writeEndElement(); +} + diff --git a/src/QXmppBookmarkSet.h b/src/QXmppBookmarkSet.h new file mode 100644 index 00000000..aa90f2cf --- /dev/null +++ b/src/QXmppBookmarkSet.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2008-2011 The QXmpp developers + * + * Author: + * Jeremy Lainé + * + * Source: + * http://code.google.com/p/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#ifndef QXMPPBOOKMARKSET_H +#define QXMPPBOOKMARKSET_H + +#include <QList> +#include <QString> +#include <QUrl> +#include <QXmlStreamWriter> + +class QDomElement; + +/// \brief The QXmppBookmarkConference class represents a bookmark for a conference room, +/// as defined by XEP-0048: Bookmarks. +/// +class QXmppBookmarkConference +{ +public: + QXmppBookmarkConference(); + + bool autoJoin() const; + void setAutoJoin(bool autoJoin); + + QString jid() const; + void setJid(const QString &jid); + + QString name() const; + void setName(const QString &name); + + QString nickName() const; + void setNickName(const QString &nickName); + +private: + bool m_autoJoin; + QString m_jid; + QString m_name; + QString m_nickName; +}; + +/// \brief The QXmppBookmarkUrl class represents a bookmark for a web page, +/// as defined by XEP-0048: Bookmarks. +/// +class QXmppBookmarkUrl +{ +public: + QString name() const; + void setName(const QString &name); + + QUrl url() const; + void setUrl(const QUrl &url); + +private: + QString m_name; + QUrl m_url; +}; + +/// \brief The QXmppbookmarkSets class represents a set of bookmarks, as defined +/// by XEP-0048: Bookmarks. +/// +class QXmppBookmarkSet +{ +public: + QList<QXmppBookmarkConference> conferences() const; + void setConferences(const QList<QXmppBookmarkConference> &conferences); + + QList<QXmppBookmarkUrl> urls() const; + void setUrls(const QList<QXmppBookmarkUrl> &urls); + + /// \cond + static bool isBookmarkSet(const QDomElement &element); + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + /// \endconf + +private: + QList<QXmppBookmarkConference> m_conferences; + QList<QXmppBookmarkUrl> m_urls; +}; + +#endif diff --git a/src/src.pro b/src/src.pro index f163d288..b0e9fe98 100644 --- a/src/src.pro +++ b/src/src.pro @@ -30,6 +30,8 @@ INSTALL_HEADERS = QXmppUtils.h \ QXmppArchiveIq.h \ QXmppArchiveManager.h \ QXmppBindIq.h \ + QXmppBookmarkManager.h \ + QXmppBookmarkSet.h \ QXmppByteStreamIq.h \ QXmppCallManager.h \ QXmppClient.h \ @@ -95,6 +97,8 @@ SOURCES += QXmppUtils.cpp \ QXmppArchiveIq.cpp \ QXmppArchiveManager.cpp \ QXmppBindIq.cpp \ + QXmppBookmarkManager.cpp \ + QXmppBookmarkSet.cpp \ QXmppByteStreamIq.cpp \ QXmppCallManager.cpp \ QXmppClient.cpp \ |
