3
* Copyright (C) 2006 Remko Troncon
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this library; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
#include <QApplication>
25
#include <QDomElement>
27
#include "xmpp_features.h"
28
#include "capsregistry.h"
32
// -----------------------------------------------------------------------------
34
CapsRegistry::CapsInfo::CapsInfo()
39
const XMPP::Features& CapsRegistry::CapsInfo::features() const
44
const DiscoItem::Identities& CapsRegistry::CapsInfo::identities() const
49
void CapsRegistry::CapsInfo::setIdentities(const DiscoItem::Identities& i)
54
void CapsRegistry::CapsInfo::setFeatures(const XMPP::Features& f)
59
void CapsRegistry::CapsInfo::updateLastSeen()
61
lastSeen_ = QDateTime::currentDateTime();
64
QDomElement CapsRegistry::CapsInfo::toXml(QDomDocument *doc) const
66
QDomElement info = doc->createElement("info");
67
info.setAttribute("last-seen",lastSeen_.toString(Qt::ISODate));
70
for (DiscoItem::Identities::ConstIterator i = identities_.begin(); i != identities_.end(); ++i) {
71
QDomElement identity = doc->createElement("identity");
72
identity.setAttribute("category",(*i).category);
73
identity.setAttribute("name",(*i).name);
74
identity.setAttribute("type",(*i).type);
75
info.appendChild(identity);
79
foreach(QString f, features_.list()) {
80
QDomElement feature = doc->createElement("feature");
81
feature.setAttribute("node",f);
82
info.appendChild(feature);
88
void CapsRegistry::CapsInfo::fromXml(const QDomElement& e)
90
if (e.tagName() != "info") {
91
qWarning("caps.cpp: Invalid info element");
95
if (!e.attribute("last-seen").isEmpty()) {
96
QDateTime last = QDateTime::fromString(e.attribute("last-seen"),Qt::ISODate);
100
qWarning("Invalid date in caps registry");
103
for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) {
104
QDomElement i = n.toElement();
106
qWarning("caps.cpp: Null element");
110
if(i.tagName() == "identity") {
111
DiscoItem::Identity id;
112
id.category = i.attribute("category");
113
id.name = i.attribute("name");
114
id.type = i.attribute("type");
117
else if (i.tagName() == "feature") {
118
features_.addFeature(i.attribute("node"));
121
qWarning("caps.cpp: Unknown element");
126
// -----------------------------------------------------------------------------
128
* \class CapsRegistry
129
* \brief A singleton class managing the capabilities of clients.
133
* \brief Default constructor.
135
CapsRegistry::CapsRegistry() : QObject(qApp)
137
connect(QCoreApplication::instance(),SIGNAL(aboutToQuit()),SLOT(save()));
141
* \brief Destructor. Saves data before exiting.
143
CapsRegistry::~CapsRegistry()
150
* \brief Convert all capabilities info to XML.
152
void CapsRegistry::save()
154
//qDebug() << QString("Saving caps to '%1'").arg(fileName_);
156
if (fileName_.isEmpty())
161
QDomElement capabilities = doc.createElement("capabilities");
162
doc.appendChild(capabilities);
163
QMap<CapsSpec,CapsInfo>::ConstIterator i = capsInfo_.begin();
164
for( ; i != capsInfo_.end(); i++) {
165
QDomElement info = i.value().toXml(&doc);
166
info.setAttribute("node",i.key().node());
167
info.setAttribute("ver",i.key().version());
168
info.setAttribute("ext",i.key().extensions());
169
capabilities.appendChild(info);
174
if(!f.open(QIODevice::WriteOnly)) {
175
qWarning("caps.cpp: Unable to open caps file");
180
t.setCodec(QTextCodec::codecForName("UTF-8"));
186
* \brief Sets the file to save the capabilities info to
188
void CapsRegistry::setFile(const QString& fileName)
190
fileName_ = fileName;
193
//qDebug() << "Loading " << fileName;
196
if (!f.open(QIODevice::ReadOnly))
198
if (!doc.setContent(&f))
202
QDomElement caps = doc.documentElement();
203
if (caps.tagName() != "capabilities") {
204
qWarning("caps.cpp: Invalid capabilities element");
208
for(QDomNode n = caps.firstChild(); !n.isNull(); n = n.nextSibling()) {
209
QDomElement i = n.toElement();
211
qWarning("capsregistry.cpp: Null element");
215
if(i.tagName() == "info") {
218
CapsSpec spec(i.attribute("node"),i.attribute("ver"),i.attribute("ext"));
219
capsInfo_[spec] = info;
220
//qDebug() << QString("Read %1 %2 %3").arg(spec.node()).arg(spec.version()).arg(spec.extensions());
223
qWarning("capsregistry.cpp: Unknown element");
229
* \brief Registers capabilities of a client.
231
void CapsRegistry::registerCaps(const CapsSpec& spec,const XMPP::DiscoItem::Identities& identities,const XMPP::Features& features)
233
if (!isRegistered(spec)) {
235
info.setIdentities(identities);
236
info.setFeatures(features);
237
capsInfo_[spec] = info;
239
emit registered(spec);
244
* \brief Checks if capabilities have been registered.
246
bool CapsRegistry::isRegistered(const CapsSpec& spec) const
248
return capsInfo_.contains(spec);
253
* \brief Retrieves the features of a given caps spec.
255
XMPP::Features CapsRegistry::features(const CapsSpec& spec) const
257
return capsInfo_[spec].features();
261
* \brief Retrieves the identities of a given caps spec.
263
XMPP::DiscoItem::Identities CapsRegistry::identities(const CapsSpec& spec) const
265
return capsInfo_[spec].identities();
269
* \brief Retrieves the instance of the CapsRegistry.
270
* If no instance existed, a new one is created.
272
CapsRegistry* CapsRegistry::instance()
275
instance_ = new CapsRegistry();
281
* \brief The instance of the CapsRegistry.
283
CapsRegistry* CapsRegistry::instance_ = NULL;