From b9123796e79b1f9c08b5b113900826008f5d6dc8 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Thu, 25 Feb 2010 12:21:53 +0000 Subject: add code for handling SOCKS5 bytestreams --- source/QXmppByteStreamIq.cpp | 163 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 source/QXmppByteStreamIq.cpp (limited to 'source/QXmppByteStreamIq.cpp') diff --git a/source/QXmppByteStreamIq.cpp b/source/QXmppByteStreamIq.cpp new file mode 100644 index 00000000..3f9f3ecb --- /dev/null +++ b/source/QXmppByteStreamIq.cpp @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2010 Bolloré telecom + * + * 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 + +#include "QXmppByteStreamIq.h" +#include "QXmppConstants.h" +#include "QXmppUtils.h" + +QHostAddress QXmppByteStreamIq::StreamHost::host() const +{ + return m_host; +} + +void QXmppByteStreamIq::StreamHost::setHost(const QHostAddress &host) +{ + m_host = host; +} + +QString QXmppByteStreamIq::StreamHost::jid() const +{ + return m_jid; +} + +void QXmppByteStreamIq::StreamHost::setJid(const QString &jid) +{ + m_jid = jid; +} + +quint16 QXmppByteStreamIq::StreamHost::port() const +{ + return m_port; +} + +void QXmppByteStreamIq::StreamHost::setPort(quint16 port) +{ + m_port = port; +} + +QXmppByteStreamIq::Mode QXmppByteStreamIq::mode() const +{ + return m_mode; +} + +void QXmppByteStreamIq::setMode(QXmppByteStreamIq::Mode mode) +{ + m_mode = mode; +} + +QString QXmppByteStreamIq::sid() const +{ + return m_sid; +} + +void QXmppByteStreamIq::setSid(const QString &sid) +{ + m_sid = sid; +} + +QList QXmppByteStreamIq::streamHosts() const +{ + return m_streamHosts; +} + +void QXmppByteStreamIq::setStreamHosts(const QList &streamHosts) +{ + m_streamHosts = streamHosts; +} + +QString QXmppByteStreamIq::streamHostUsed() const +{ + return m_streamHostUsed; +} + +void QXmppByteStreamIq::setStreamHostUsed(const QString &jid) +{ + m_streamHostUsed = jid; +} + +bool QXmppByteStreamIq::isByteStreamIq(QDomElement &element) +{ + return element.firstChildElement("query").namespaceURI() == ns_bytestreams; +} + +void QXmppByteStreamIq::parse(QDomElement &element) +{ + setId(element.attribute("id")); + setFrom(element.attribute("from")); + setTo(element.attribute("to")); + setTypeFromStr(element.attribute("type")); + + QDomElement queryElement = element.firstChildElement("query"); + m_sid = queryElement.attribute("sid"); + const QString modeStr = queryElement.attribute("mode"); + if (modeStr == "tcp") + m_mode = Tcp; + else if (modeStr == "udp") + m_mode = Udp; + else + m_mode = None; + + QDomElement hostElement = queryElement.firstChildElement("streamhost"); + while (!hostElement.isNull()) + { + StreamHost streamHost; + streamHost.setHost(QHostAddress(hostElement.attribute("host"))); + streamHost.setJid(hostElement.attribute("jid")); + streamHost.setPort(hostElement.attribute("port").toInt()); + m_streamHosts.append(streamHost); + + hostElement = hostElement.nextSiblingElement("streamhost"); + } + m_streamHostUsed = queryElement.firstChildElement("streamhost-used").attribute("jid"); +} + +void QXmppByteStreamIq::toXmlElementFromChild(QXmlStreamWriter *writer) const +{ + writer->writeStartElement("query"); + helperToXmlAddAttribute(writer, "xmlns", ns_bytestreams); + helperToXmlAddAttribute(writer, "sid", m_sid); + QString modeStr; + if (m_mode == Tcp) + modeStr = "tcp"; + else if (m_mode == Udp) + modeStr = "udp"; + helperToXmlAddAttribute(writer, "mode", modeStr); + foreach (const StreamHost& streamHost, m_streamHosts) + { + writer->writeStartElement("streamhost"); + helperToXmlAddAttribute(writer, "host", streamHost.host().toString()); + helperToXmlAddAttribute(writer, "jid", streamHost.jid()); + helperToXmlAddAttribute(writer, "port", QString::number(streamHost.port())); + writer->writeEndElement(); + } + if (!m_streamHostUsed.isEmpty()) + { + writer->writeStartElement("streamhost-used"); + helperToXmlAddAttribute(writer, "jid", m_streamHostUsed); + writer->writeEndElement(); + } + + writer->writeEndElement(); +} -- cgit v1.2.3