aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QXmppStream.cpp')
-rw-r--r--src/QXmppStream.cpp259
1 files changed, 0 insertions, 259 deletions
diff --git a/src/QXmppStream.cpp b/src/QXmppStream.cpp
deleted file mode 100644
index d9f7ff88..00000000
--- a/src/QXmppStream.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (C) 2008-2011 The QXmpp developers
- *
- * Authors:
- * Manjeet Dahiya
- * 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 "QXmppConstants.h"
-#include "QXmppLogger.h"
-#include "QXmppPacket.h"
-#include "QXmppStream.h"
-#include "QXmppUtils.h"
-
-#include <QBuffer>
-#include <QDomDocument>
-#include <QHostAddress>
-#include <QRegExp>
-#include <QSslSocket>
-#include <QStringList>
-#include <QTime>
-#include <QXmlStreamWriter>
-
-static bool randomSeeded = false;
-static const QByteArray streamRootElementEnd = "</stream:stream>";
-
-class QXmppStreamPrivate
-{
-public:
- QXmppStreamPrivate();
-
- QByteArray dataBuffer;
- QSslSocket* socket;
-
- // stream state
- QByteArray streamStart;
-};
-
-QXmppStreamPrivate::QXmppStreamPrivate()
- : socket(0)
-{
-}
-
-/// Constructs a base XMPP stream.
-///
-/// \param parent
-
-QXmppStream::QXmppStream(QObject *parent)
- : QXmppLoggable(parent),
- d(new QXmppStreamPrivate)
-{
- // Make sure the random number generator is seeded
- if (!randomSeeded)
- {
- qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
- randomSeeded = true;
- }
-}
-
-/// Destroys a base XMPP stream.
-
-QXmppStream::~QXmppStream()
-{
- delete d;
-}
-
-/// Disconnects from the remote host.
-///
-
-void QXmppStream::disconnectFromHost()
-{
- sendData(streamRootElementEnd);
- if (d->socket)
- {
- d->socket->flush();
- d->socket->disconnectFromHost();
- }
-}
-
-/// Handles a stream start event, which occurs when the underlying transport
-/// becomes ready (socket connected, encryption started).
-///
-/// If you redefine handleStart(), make sure to call the base class's method.
-
-void QXmppStream::handleStart()
-{
- d->dataBuffer.clear();
- d->streamStart.clear();
-}
-
-/// Returns true if the stream is connected.
-///
-
-bool QXmppStream::isConnected() const
-{
- return d->socket &&
- d->socket->state() == QAbstractSocket::ConnectedState;
-}
-
-/// Sends raw data to the peer.
-///
-/// \param data
-
-bool QXmppStream::sendData(const QByteArray &data)
-{
- logSent(QString::fromUtf8(data));
- if (!d->socket || d->socket->state() != QAbstractSocket::ConnectedState)
- return false;
- return d->socket->write(data) == data.size();
-}
-
-/// Sends an XMPP packet to the peer.
-///
-/// \param packet
-
-bool QXmppStream::sendPacket(const QXmppPacket &packet)
-{
- // prepare packet
- QByteArray data;
- QXmlStreamWriter xmlStream(&data);
- packet.toXml(&xmlStream);
-
- // send packet
- return sendData(data);
-}
-
-/// Returns the QSslSocket used for this stream.
-///
-
-QSslSocket *QXmppStream::socket() const
-{
- return d->socket;
-}
-
-/// Sets the QSslSocket used for this stream.
-///
-
-void QXmppStream::setSocket(QSslSocket *socket)
-{
- bool check;
- Q_UNUSED(check);
-
- d->socket = socket;
- if (!d->socket)
- return;
-
- // socket events
- check = connect(socket, SIGNAL(connected()),
- this, SLOT(_q_socketConnected()));
- Q_ASSERT(check);
-
- check = connect(socket, SIGNAL(disconnected()),
- this, SLOT(_q_socketDisconnected()));
- Q_ASSERT(check);
-
- check = connect(socket, SIGNAL(encrypted()),
- this, SLOT(_q_socketEncrypted()));
- Q_ASSERT(check);
-
- check = connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),
- this, SLOT(_q_socketError(QAbstractSocket::SocketError)));
-
- check = connect(socket, SIGNAL(readyRead()),
- this, SLOT(_q_socketReadyRead()));
- Q_ASSERT(check);
-
- // relay signals
- check = connect(socket, SIGNAL(disconnected()),
- this, SIGNAL(disconnected()));
- Q_ASSERT(check);
-}
-
-void QXmppStream::_q_socketConnected()
-{
- info(QString("Socket connected to %1 %2").arg(
- d->socket->peerAddress().toString(),
- QString::number(d->socket->peerPort())));
- handleStart();
-}
-
-void QXmppStream::_q_socketDisconnected()
-{
- info("Socket disconnected");
-}
-
-void QXmppStream::_q_socketEncrypted()
-{
- debug("Socket encrypted");
- handleStart();
-}
-
-void QXmppStream::_q_socketError(QAbstractSocket::SocketError socketError)
-{
- Q_UNUSED(socketError);
- warning(QString("Socket error: " + socket()->errorString()));
-}
-
-void QXmppStream::_q_socketReadyRead()
-{
- d->dataBuffer.append(d->socket->readAll());
-
- // FIXME : maybe these QRegExps could be static?
- QRegExp startStreamRegex("^(<\\?xml.*\\?>)?\\s*<stream:stream.*>");
- startStreamRegex.setMinimal(true);
- QRegExp endStreamRegex("</stream:stream>$");
- endStreamRegex.setMinimal(true);
-
- // check whether we need to add stream start / end elements
- QByteArray completeXml = d->dataBuffer;
- const QString strData = QString::fromUtf8(d->dataBuffer);
- bool streamStart = false;
- if (d->streamStart.isEmpty() && strData.contains(startStreamRegex))
- streamStart = true;
- else
- completeXml.prepend(d->streamStart);
- if (!strData.contains(endStreamRegex))
- completeXml.append(streamRootElementEnd);
-
- // check whether we have a valid XML document
- QDomDocument doc;
- if (!doc.setContent(completeXml, true))
- return;
-
- // remove data from buffer
- logReceived(strData);
- d->dataBuffer.clear();
- if (streamStart)
- d->streamStart = startStreamRegex.cap(0).toUtf8();
-
- // process stream start
- if (streamStart)
- handleStream(doc.documentElement());
-
- // process stanzas
- QDomElement nodeRecv = doc.documentElement().firstChildElement();
- while (!nodeRecv.isNull()) {
- handleStanza(nodeRecv);
- nodeRecv = nodeRecv.nextSiblingElement();
- }
-}
-
-