diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-02-08 12:33:41 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-02-08 12:33:41 +0000 |
| commit | 21acd67e9b65bea87902032b12709675905aa922 (patch) | |
| tree | ed5ae9066b10400c4fe6e67dfaf2f4c37a09c32e /src/client/QXmppBookmarkManager.cpp | |
| parent | cea7ae1e702b82d2d0d0a851de1aae58270b14f6 (diff) | |
| download | qxmpp-21acd67e9b65bea87902032b12709675905aa922.tar.gz | |
start moving client-specific code
Diffstat (limited to 'src/client/QXmppBookmarkManager.cpp')
| -rw-r--r-- | src/client/QXmppBookmarkManager.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/src/client/QXmppBookmarkManager.cpp b/src/client/QXmppBookmarkManager.cpp new file mode 100644 index 00000000..367b9384 --- /dev/null +++ b/src/client/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; +} + |
