aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppCallManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QXmppCallManager.cpp')
-rw-r--r--src/QXmppCallManager.cpp482
1 files changed, 116 insertions, 366 deletions
diff --git a/src/QXmppCallManager.cpp b/src/QXmppCallManager.cpp
index e858f84e..a7221251 100644
--- a/src/QXmppCallManager.cpp
+++ b/src/QXmppCallManager.cpp
@@ -29,6 +29,7 @@
#include "QXmppCodec.h"
#include "QXmppConstants.h"
#include "QXmppJingleIq.h"
+#include "QXmppRtpChannel.h"
#include "QXmppStun.h"
#include "QXmppUtils.h"
@@ -37,68 +38,65 @@ static int typeId = qRegisterMetaType<QXmppCall::State>();
const int RTP_COMPONENT = 1;
const int RTCP_COMPONENT = 2;
-const quint8 RTP_VERSION = 0x02;
-
-enum CodecId {
- G711u = 0,
- GSM = 3,
- G723 = 4,
- G711a = 8,
- G722 = 9,
- L16Stereo = 10,
- L16Mono = 11,
- G728 = 15,
- G729 = 18,
-};
+class QXmppCallPrivate
+{
+public:
+ QXmppCall::Direction direction;
+ QString jid;
+ QString sid;
+ QXmppCall::State state;
+ QString contentCreator;
+ QString contentName;
+
+ QList<QXmppJingleIq> requests;
-#define SAMPLE_BYTES 2
+ // ICE-UDP
+ QXmppIceConnection *connection;
+
+ // RTP
+ QXmppRtpChannel *audioChannel;
+ QList<QXmppJinglePayloadType> commonPayloadTypes;
+};
QXmppCall::QXmppCall(const QString &jid, QXmppCall::Direction direction, QObject *parent)
- : QIODevice(parent),
- m_direction(direction),
- m_jid(jid),
- m_state(OfferState),
- m_signalsEmitted(false),
- m_writtenSinceLastEmit(0),
- m_codec(0),
- m_incomingBuffering(true),
- m_incomingMinimum(0),
- m_incomingMaximum(0),
- m_incomingSequence(0),
- m_incomingStamp(0),
- m_outgoingMarker(true),
- m_outgoingSequence(0),
- m_outgoingStamp(0)
+ : QXmppLoggable(parent),
+ d(new QXmppCallPrivate)
{
- m_contentCreator = QLatin1String("initiator");
- m_contentName = QLatin1String("voice");
+ d->direction = direction;
+ d->jid = jid;
+ d->contentCreator = QLatin1String("initiator");
+ d->contentName = QLatin1String("voice");
// ICE connection
- bool iceControlling = (m_direction == OutgoingDirection);
- m_connection = new QXmppIceConnection(iceControlling, this);
- //m_connection->setStunServer("stun.ekiga.net");
- m_connection->addComponent(RTP_COMPONENT);
- m_connection->addComponent(RTCP_COMPONENT);
-
- bool check = connect(m_connection, SIGNAL(logMessage(QXmppLogger::MessageType, QString)),
- this, SIGNAL(logMessage(QXmppLogger::MessageType, QString)));
- Q_ASSERT(check);
+ bool iceControlling = (d->direction == OutgoingDirection);
+ d->connection = new QXmppIceConnection(iceControlling, this);
+ //d->connection->setStunServer("stun.ekiga.net");
+ d->connection->addComponent(RTP_COMPONENT);
+ d->connection->addComponent(RTCP_COMPONENT);
- check = connect(m_connection, SIGNAL(localCandidatesChanged()),
+ bool check = connect(d->connection, SIGNAL(localCandidatesChanged()),
this, SIGNAL(localCandidatesChanged()));
Q_ASSERT(check);
- check = connect(m_connection, SIGNAL(connected()),
+ check = connect(d->connection, SIGNAL(connected()),
this, SLOT(updateOpenMode()));
Q_ASSERT(check);
- check = connect(m_connection, SIGNAL(disconnected()),
+ check = connect(d->connection, SIGNAL(disconnected()),
this, SLOT(hangup()));
Q_ASSERT(check);
- check = connect(m_connection, SIGNAL(datagramReceived(int,QByteArray)),
+ check = connect(d->connection, SIGNAL(datagramReceived(int,QByteArray)),
this, SLOT(datagramReceived(int, QByteArray)));
Q_ASSERT(check);
+
+ // RTP channel
+ d->audioChannel = new QXmppRtpChannel(this);
+}
+
+QXmppCall::~QXmppCall()
+{
+ delete d;
}
/// Call this method if you wish to accept an incoming call.
@@ -106,27 +104,33 @@ QXmppCall::QXmppCall(const QString &jid, QXmppCall::Direction direction, QObject
void QXmppCall::accept()
{
- if (m_direction == IncomingDirection && m_state == OfferState)
+ if (d->direction == IncomingDirection && d->state == OfferState)
setState(QXmppCall::ConnectingState);
}
-/// Returns the number of bytes that are available for reading.
+/// Returns the RTP channel for the audio data.
+///
+/// It acts as a QIODevice so that you can read / write audio samples, for
+/// instance using a QAudioOutput and a QAudioInput.
///
-qint64 QXmppCall::bytesAvailable() const
+QXmppRtpChannel *QXmppCall::audioChannel() const
{
- return m_incomingBuffer.size();
+ return d->audioChannel;
}
+/// Returns the number of bytes that are available for reading.
+///
+
void QXmppCall::terminate()
{
- if (m_state == FinishedState)
+ if (d->state == FinishedState)
return;
- m_state = QXmppCall::FinishedState;
+ d->state = QXmppCall::FinishedState;
- close();
- m_connection->close();
+ d->audioChannel->close();
+ d->connection->close();
// emit signals later
QTimer::singleShot(0, this, SLOT(terminated()));
@@ -134,7 +138,7 @@ void QXmppCall::terminate()
void QXmppCall::terminated()
{
- emit stateChanged(m_state);
+ emit stateChanged(d->state);
emit finished();
}
@@ -143,14 +147,7 @@ void QXmppCall::terminated()
QXmppCall::Direction QXmppCall::direction() const
{
- return m_direction;
-}
-
-void QXmppCall::emitSignals()
-{
- emit bytesWritten(m_writtenSinceLastEmit);
- m_writtenSinceLastEmit = 0;
- m_signalsEmitted = false;
+ return d->direction;
}
/// Hangs up the call.
@@ -158,75 +155,35 @@ void QXmppCall::emitSignals()
void QXmppCall::hangup()
{
- if (m_state != QXmppCall::FinishedState)
+ if (d->state != QXmppCall::FinishedState)
setState(QXmppCall::DisconnectingState);
}
-bool QXmppCall::isSequential() const
-{
- return true;
-}
-
/// Returns the remote party's JID.
///
QString QXmppCall::jid() const
{
- return m_jid;
-}
-
-/// Returns the negociated payload type.
-///
-/// You can use this to determine the QAudioFormat to use with your
-/// QAudioInput/QAudioOutput.
-
-QXmppJinglePayloadType QXmppCall::payloadType() const
-{
- return m_payloadType;
+ return d->jid;
}
void QXmppCall::setPayloadType(const QXmppJinglePayloadType &payloadType)
{
- m_payloadType = payloadType;
- if (payloadType.id() == G711u)
- m_codec = new QXmppG711uCodec(payloadType.clockrate());
- else if (payloadType.id() == G711a)
- m_codec = new QXmppG711aCodec(payloadType.clockrate());
-#ifdef QXMPP_USE_SPEEX
- else if (payloadType.name().toLower() == "speex")
- m_codec = new QXmppSpeexCodec(payloadType.clockrate());
-#endif
- else
- {
- emit logMessage(QXmppLogger::WarningMessage,
- QString("QXmppCall got an unknown codec : %1 (%2)")
- .arg(QString::number(payloadType.id()))
- .arg(payloadType.name()));
- return;
- }
-
- // size in bytes of an unencoded packet
- m_outgoingChunk = SAMPLE_BYTES * payloadType.ptime() * payloadType.clockrate() / 1000;
-
- // initial number of bytes to buffer
- m_incomingMinimum = m_outgoingChunk * 5;
- m_incomingMaximum = m_outgoingChunk * 8;
-
+ d->audioChannel->setPayloadType(payloadType);
updateOpenMode();
}
void QXmppCall::addRemoteCandidates(const QList<QXmppJingleCandidate> &candidates)
{
foreach (const QXmppJingleCandidate &candidate, candidates)
- m_connection->addRemoteCandidate(candidate);
+ d->connection->addRemoteCandidate(candidate);
}
void QXmppCall::updateOpenMode()
{
// determine mode
- if (m_codec && m_connection->isConnected() && m_state != ActiveState)
+ if (d->audioChannel->isOpen() && d->connection->isConnected() && d->state != ActiveState)
{
- open(QIODevice::ReadWrite | QIODevice::Unbuffered);
setState(ActiveState);
emit connected();
}
@@ -237,89 +194,7 @@ void QXmppCall::datagramReceived(int component, const QByteArray &buffer)
if (component != RTP_COMPONENT)
return;
- if (!m_codec)
- {
- emit logMessage(QXmppLogger::WarningMessage,
- QLatin1String("QXmppCall:datagramReceived before codec selection"));
- return;
- }
-
- if (buffer.size() < 12 || (quint8(buffer.at(0)) >> 6) != RTP_VERSION)
- {
- emit logMessage(QXmppLogger::WarningMessage,
- QLatin1String("QXmppCall::datagramReceived got an invalid RTP packet"));
- return;
- }
-
- // parse RTP header
- QDataStream stream(buffer);
- quint8 version, type;
- quint32 ssrc;
- quint16 sequence;
- quint32 stamp;
- stream >> version;
- stream >> type;
- stream >> sequence;
- stream >> stamp;
- stream >> ssrc;
- const qint64 packetLength = buffer.size() - 12;
-
-#ifdef QXMPP_DEBUG_RTP
- emit logMessage(QXmppLogger::ReceivedMessage,
- QString("RTP packet seq %1 stamp %2 size %3")
- .arg(QString::number(sequence))
- .arg(QString::number(stamp))
- .arg(QString::number(packetLength)));
-#endif
-
- // check sequence number
- if (sequence != m_incomingSequence + 1)
- emit logMessage(QXmppLogger::WarningMessage,
- QString("RTP packet seq %1 is out of order, previous was %2")
- .arg(QString::number(sequence))
- .arg(QString::number(m_incomingSequence)));
- m_incomingSequence = sequence;
-
- // determine packet's position in the buffer (in bytes)
- qint64 packetOffset = 0;
- if (!buffer.isEmpty())
- {
- packetOffset = (stamp - m_incomingStamp) * SAMPLE_BYTES;
- if (packetOffset < 0)
- {
- emit logMessage(QXmppLogger::WarningMessage,
- QString("RTP packet stamp %1 is too old, buffer start is %2")
- .arg(QString::number(stamp))
- .arg(QString::number(m_incomingStamp)));
- return;
- }
- } else {
- m_incomingStamp = stamp;
- }
-
- // allocate space for new packet
- if (packetOffset + packetLength > m_incomingBuffer.size())
- m_incomingBuffer += QByteArray(packetOffset + packetLength - m_incomingBuffer.size(), 0);
- QDataStream output(&m_incomingBuffer, QIODevice::WriteOnly);
- output.device()->seek(packetOffset);
- output.setByteOrder(QDataStream::LittleEndian);
- m_codec->decode(stream, output);
-
- // check whether we are running late
- if (m_incomingBuffer.size() > m_incomingMaximum)
- {
- const qint64 droppedSize = m_incomingBuffer.size() - m_incomingMinimum;
- emit logMessage(QXmppLogger::DebugMessage,
- QString("RTP buffer is too full, dropping %1 bytes")
- .arg(QString::number(droppedSize)));
- m_incomingBuffer = m_incomingBuffer.right(m_incomingMinimum);
- m_incomingStamp += droppedSize / SAMPLE_BYTES;
- }
- // check whether we have filled the initial buffer
- if (m_incomingBuffer.size() >= m_incomingMinimum)
- m_incomingBuffering = false;
- if (!m_incomingBuffering)
- emit readyRead();
+ d->audioChannel->datagramReceived(buffer);
}
/// Returns the call's session identifier.
@@ -327,7 +202,7 @@ void QXmppCall::datagramReceived(int component, const QByteArray &buffer)
QString QXmppCall::sid() const
{
- return m_sid;
+ return d->sid;
}
/// Returns the call's state.
@@ -336,95 +211,16 @@ QString QXmppCall::sid() const
QXmppCall::State QXmppCall::state() const
{
- return m_state;
+ return d->state;
}
void QXmppCall::setState(QXmppCall::State state)
{
- if (m_state != state)
- {
- m_state = state;
- emit stateChanged(m_state);
- }
-}
-
-qint64 QXmppCall::readData(char * data, qint64 maxSize)
-{
- // if we are filling the buffer, return empty samples
- if (m_incomingBuffering)
- {
- memset(data, 0, maxSize);
- return maxSize;
- }
-
- qint64 readSize = qMin(maxSize, qint64(m_incomingBuffer.size()));
- memcpy(data, m_incomingBuffer.constData(), readSize);
- m_incomingBuffer.remove(0, readSize);
- if (readSize < maxSize)
- {
- emit logMessage(QXmppLogger::InformationMessage,
- QString("QXmppCall::readData missing %1 bytes").arg(QString::number(maxSize - readSize)));
- memset(data + readSize, 0, maxSize - readSize);
- }
- m_incomingStamp += readSize / SAMPLE_BYTES;
- return maxSize;
-}
-
-qint64 QXmppCall::writeData(const char * data, qint64 maxSize)
-{
- if (!m_codec)
+ if (d->state != state)
{
- emit logMessage(QXmppLogger::WarningMessage,
- QLatin1String("QXmppCall::writeData before codec was set"));
- return -1;
+ d->state = state;
+ emit stateChanged(d->state);
}
-
- m_outgoingBuffer += QByteArray::fromRawData(data, maxSize);
- while (m_outgoingBuffer.size() >= m_outgoingChunk)
- {
- QByteArray header;
- QDataStream stream(&header, QIODevice::WriteOnly);
- quint8 version = RTP_VERSION << 6;
- stream << version;
- quint8 type = m_payloadType.id();
- if (m_outgoingMarker)
- {
- type |= 0x80;
- m_outgoingMarker= false;
- }
- stream << type;
- stream << ++m_outgoingSequence;
- stream << m_outgoingStamp;
- const quint32 ssrc = 0;
- stream << ssrc;
-
- QByteArray chunk = m_outgoingBuffer.left(m_outgoingChunk);
- QDataStream input(chunk);
- input.setByteOrder(QDataStream::LittleEndian);
- m_outgoingStamp += m_codec->encode(input, stream);
-
- if (m_connection->writeDatagram(RTP_COMPONENT, header) < 0)
- emit logMessage(QXmppLogger::WarningMessage,
- QLatin1String("QXmppCall:writeData could not send audio data"));
-#ifdef QXMPP_DEBUG_RTP
- else
- emit logMessage(QXmppLogger::SentMessage,
- QString("RTP packet seq %1 stamp %2 size %3")
- .arg(QString::number(m_outgoingSequence))
- .arg(QString::number(m_outgoingStamp))
- .arg(QString::number(header.size() - 12)));
-#endif
-
- m_outgoingBuffer.remove(0, chunk.size());
- }
-
- m_writtenSinceLastEmit += maxSize;
- if (!m_signalsEmitted && !signalsBlocked()) {
- m_signalsEmitted = true;
- QMetaObject::invokeMethod(this, "emitSignals", Qt::QueuedConnection);
- }
-
- return maxSize;
}
QXmppCallManager::QXmppCallManager(QXmppClient *client)
@@ -468,7 +264,7 @@ bool QXmppCallManager::handleStanza(const QDomElement &element)
QXmppCall *QXmppCallManager::call(const QString &jid)
{
QXmppCall *call = new QXmppCall(jid, QXmppCall::OutgoingDirection, this);
- call->m_sid = generateStanzaHash();
+ call->d->sid = generateStanzaHash();
// register call
m_calls << call;
@@ -478,28 +274,26 @@ QXmppCall *QXmppCallManager::call(const QString &jid)
this, SLOT(callStateChanged(QXmppCall::State)));
connect(call, SIGNAL(localCandidatesChanged()),
this, SLOT(localCandidatesChanged()));
- connect(call, SIGNAL(logMessage(QXmppLogger::MessageType, QString)),
- this, SIGNAL(logMessage(QXmppLogger::MessageType, QString)));
QXmppJingleIq iq;
iq.setTo(jid);
iq.setType(QXmppIq::Set);
iq.setAction(QXmppJingleIq::SessionInitiate);
iq.setInitiator(client()->configuration().jid());
- iq.setSid(call->m_sid);
- iq.content().setCreator(call->m_contentCreator);
- iq.content().setName(call->m_contentName);
+ iq.setSid(call->sid());
+ iq.content().setCreator(call->d->contentCreator);
+ iq.content().setName(call->d->contentName);
iq.content().setSenders("both");
// description
iq.content().setDescriptionMedia("audio");
- foreach (const QXmppJinglePayloadType &payload, localPayloadTypes())
+ foreach (const QXmppJinglePayloadType &payload, call->d->audioChannel->supportedPayloadTypes())
iq.content().addPayloadType(payload);
// transport
- iq.content().setTransportUser(call->m_connection->localUser());
- iq.content().setTransportPassword(call->m_connection->localPassword());
- foreach (const QXmppJingleCandidate &candidate, call->m_connection->localCandidates())
+ iq.content().setTransportUser(call->d->connection->localUser());
+ iq.content().setTransportPassword(call->d->connection->localPassword());
+ foreach (const QXmppJingleCandidate &candidate, call->d->connection->localCandidates())
iq.content().addTransportCandidate(candidate);
sendRequest(call, iq);
@@ -531,7 +325,7 @@ void QXmppCallManager::callStateChanged(QXmppCall::State state)
iq.setTo(call->jid());
iq.setType(QXmppIq::Set);
iq.setAction(QXmppJingleIq::SessionTerminate);
- iq.setSid(call->m_sid);
+ iq.setSid(call->sid());
sendRequest(call, iq);
// schedule forceful termination in 5s
@@ -546,25 +340,25 @@ void QXmppCallManager::callStateChanged(QXmppCall::State state)
iq.setType(QXmppIq::Set);
iq.setAction(QXmppJingleIq::SessionAccept);
iq.setResponder(client()->configuration().jid());
- iq.setSid(call->m_sid);
- iq.content().setCreator(call->m_contentCreator);
- iq.content().setName(call->m_contentName);
+ iq.setSid(call->sid());
+ iq.content().setCreator(call->d->contentCreator);
+ iq.content().setName(call->d->contentName);
// description
iq.content().setDescriptionMedia("audio");
- foreach (const QXmppJinglePayloadType &payload, call->m_commonPayloadTypes)
+ foreach (const QXmppJinglePayloadType &payload, call->d->commonPayloadTypes)
iq.content().addPayloadType(payload);
// transport
- iq.content().setTransportUser(call->m_connection->localUser());
- iq.content().setTransportPassword(call->m_connection->localPassword());
- foreach (const QXmppJingleCandidate &candidate, call->m_connection->localCandidates())
+ iq.content().setTransportUser(call->d->connection->localUser());
+ iq.content().setTransportPassword(call->d->connection->localPassword());
+ foreach (const QXmppJingleCandidate &candidate, call->d->connection->localCandidates())
iq.content().addTransportCandidate(candidate);
sendRequest(call, iq);
// perform ICE negotiation
- call->m_connection->connectToHost();
+ call->d->connection->connectToHost();
}
}
@@ -573,16 +367,15 @@ void QXmppCallManager::callStateChanged(QXmppCall::State state)
bool QXmppCallManager::checkPayloadTypes(QXmppCall *call, const QList<QXmppJinglePayloadType> &remotePayloadTypes)
{
- foreach (const QXmppJinglePayloadType &payload, localPayloadTypes())
+ foreach (const QXmppJinglePayloadType &payload, call->d->audioChannel->supportedPayloadTypes())
{
int payloadIndex = remotePayloadTypes.indexOf(payload);
if (payloadIndex >= 0)
- call->m_commonPayloadTypes << remotePayloadTypes[payloadIndex];
+ call->d->commonPayloadTypes << remotePayloadTypes[payloadIndex];
}
- if (call->m_commonPayloadTypes.isEmpty())
+ if (call->d->commonPayloadTypes.isEmpty())
{
- emit logMessage(QXmppLogger::WarningMessage,
- QString("Remote party %1 did not provide any known payload types for call %2").arg(call->jid(), call->sid()));
+ warning(QString("Remote party %1 did not provide any known payload types for call %2").arg(call->jid(), call->sid()));
// terminate call
QXmppJingleIq iq;
@@ -594,7 +387,7 @@ bool QXmppCallManager::checkPayloadTypes(QXmppCall *call, const QList<QXmppJingl
sendRequest(call, iq);
return false;
} else {
- call->setPayloadType(call->m_commonPayloadTypes.first());
+ call->setPayloadType(call->d->commonPayloadTypes.first());
return true;
}
}
@@ -602,7 +395,7 @@ bool QXmppCallManager::checkPayloadTypes(QXmppCall *call, const QList<QXmppJingl
QXmppCall *QXmppCallManager::findCall(const QString &sid) const
{
foreach (QXmppCall *call, m_calls)
- if (call->m_sid == sid)
+ if (call->sid() == sid)
return call;
return 0;
}
@@ -610,48 +403,11 @@ QXmppCall *QXmppCallManager::findCall(const QString &sid) const
QXmppCall *QXmppCallManager::findCall(const QString &sid, QXmppCall::Direction direction) const
{
foreach (QXmppCall *call, m_calls)
- if (call->m_sid == sid && call->m_direction == direction)
+ if (call->sid() == sid && call->direction() == direction)
return call;
return 0;
}
-/// Returns the list of locally supported payload types.
-///
-
-QList<QXmppJinglePayloadType> QXmppCallManager::localPayloadTypes() const
-{
- QList<QXmppJinglePayloadType> payloads;
- QXmppJinglePayloadType payload;
-
-#ifdef QXMPP_USE_SPEEX
- payload.setId(96);
- payload.setChannels(1);
- payload.setName("SPEEX");
- payload.setClockrate(16000);
- payloads << payload;
-
- payload.setId(97);
- payload.setChannels(1);
- payload.setName("SPEEX");
- payload.setClockrate(8000);
- payloads << payload;
-#endif
-
- payload.setId(G711u);
- payload.setChannels(1);
- payload.setName("PCMU");
- payload.setClockrate(8000);
- payloads << payload;
-
- payload.setId(G711a);
- payload.setChannels(1);
- payload.setName("PCMA");
- payload.setClockrate(8000);
- payloads << payload;
-
- return payloads;
-}
-
/// Handles acknowledgements
///
@@ -666,11 +422,11 @@ void QXmppCallManager::iqReceived(const QXmppIq &ack)
QXmppJingleIq request;
foreach (call, m_calls)
{
- for (int i = 0; i < call->m_requests.size(); i++)
+ for (int i = 0; i < call->d->requests.size(); i++)
{
- if (ack.id() == call->m_requests[i].id())
+ if (ack.id() == call->d->requests[i].id())
{
- request = call->m_requests.takeAt(i);
+ request = call->d->requests.takeAt(i);
found = true;
break;
}
@@ -682,7 +438,7 @@ void QXmppCallManager::iqReceived(const QXmppIq &ack)
return;
// process acknowledgement
- emit logMessage(QXmppLogger::DebugMessage, QString("Received ACK for packet %1").arg(ack.id()));
+ debug(QString("Received ACK for packet %1").arg(ack.id()));
if (request.action() == QXmppJingleIq::SessionTerminate)
{
// terminate
@@ -702,11 +458,11 @@ void QXmppCallManager::jingleIqReceived(const QXmppJingleIq &iq)
{
// build call
QXmppCall *call = new QXmppCall(iq.from(), QXmppCall::IncomingDirection, this);
- call->m_sid = iq.sid();
- call->m_contentCreator = iq.content().creator();
- call->m_contentName = iq.content().name();
- call->m_connection->setRemoteUser(iq.content().transportUser());
- call->m_connection->setRemotePassword(iq.content().transportPassword());
+ call->d->sid = iq.sid();
+ call->d->contentCreator = iq.content().creator();
+ call->d->contentName = iq.content().name();
+ call->d->connection->setRemoteUser(iq.content().transportUser());
+ call->d->connection->setRemotePassword(iq.content().transportPassword());
call->addRemoteCandidates(iq.content().transportCandidates());
// send ack
@@ -727,8 +483,6 @@ void QXmppCallManager::jingleIqReceived(const QXmppJingleIq &iq)
this, SLOT(callStateChanged(QXmppCall::State)));
connect(call, SIGNAL(localCandidatesChanged()),
this, SLOT(localCandidatesChanged()));
- connect(call, SIGNAL(logMessage(QXmppLogger::MessageType, QString)),
- this, SIGNAL(logMessage(QXmppLogger::MessageType, QString)));
// send ringing indication
QXmppJingleIq ringing;
@@ -746,8 +500,7 @@ void QXmppCallManager::jingleIqReceived(const QXmppJingleIq &iq)
QXmppCall *call = findCall(iq.sid(), QXmppCall::OutgoingDirection);
if (!call)
{
- emit logMessage(QXmppLogger::WarningMessage,
- QString("Remote party %1 accepted unknown call %2").arg(iq.from(), iq.sid()));
+ warning(QString("Remote party %1 accepted unknown call %2").arg(iq.from(), iq.sid()));
return;
}
@@ -764,11 +517,11 @@ void QXmppCallManager::jingleIqReceived(const QXmppJingleIq &iq)
// perform ICE negotiation
if (!iq.content().transportCandidates().isEmpty())
{
- call->m_connection->setRemoteUser(iq.content().transportUser());
- call->m_connection->setRemotePassword(iq.content().transportPassword());
+ call->d->connection->setRemoteUser(iq.content().transportUser());
+ call->d->connection->setRemotePassword(iq.content().transportPassword());
call->addRemoteCandidates(iq.content().transportCandidates());
}
- call->m_connection->connectToHost();
+ call->d->connection->connectToHost();
} else if (iq.action() == QXmppJingleIq::SessionInfo) {
@@ -784,13 +537,11 @@ void QXmppCallManager::jingleIqReceived(const QXmppJingleIq &iq)
QXmppCall *call = findCall(iq.sid());
if (!call)
{
- emit logMessage(QXmppLogger::WarningMessage,
- QString("Remote party %1 terminated unknown call %2").arg(iq.from(), iq.sid()));
+ warning(QString("Remote party %1 terminated unknown call %2").arg(iq.from(), iq.sid()));
return;
}
- emit logMessage(QXmppLogger::InformationMessage,
- QString("Remote party %1 terminated call %2").arg(iq.from(), iq.sid()));
+ info(QString("Remote party %1 terminated call %2").arg(iq.from(), iq.sid()));
// send ack
sendAck(iq);
@@ -802,8 +553,7 @@ void QXmppCallManager::jingleIqReceived(const QXmppJingleIq &iq)
QXmppCall *call = findCall(iq.sid());
if (!call)
{
- emit logMessage(QXmppLogger::WarningMessage,
- QString("Remote party %1 sent transports for unknown call %2").arg(iq.from(), iq.sid()));
+ warning(QString("Remote party %1 sent transports for unknown call %2").arg(iq.from(), iq.sid()));
return;
}
@@ -811,10 +561,10 @@ void QXmppCallManager::jingleIqReceived(const QXmppJingleIq &iq)
sendAck(iq);
// perform ICE negotiation
- call->m_connection->setRemoteUser(iq.content().transportUser());
- call->m_connection->setRemotePassword(iq.content().transportPassword());
+ call->d->connection->setRemoteUser(iq.content().transportUser());
+ call->d->connection->setRemotePassword(iq.content().transportPassword());
call->addRemoteCandidates(iq.content().transportCandidates());
- call->m_connection->connectToHost();
+ call->d->connection->connectToHost();
}
}
@@ -834,9 +584,9 @@ void QXmppCallManager::localCandidatesChanged()
iq.setInitiator(client()->configuration().jid());
iq.setSid(call->sid());
- iq.content().setCreator(call->m_contentCreator);
- iq.content().setName(call->m_contentName);
- foreach (const QXmppJingleCandidate &candidate, call->m_connection->localCandidates())
+ iq.content().setCreator(call->d->contentCreator);
+ iq.content().setName(call->d->contentName);
+ foreach (const QXmppJingleCandidate &candidate, call->d->connection->localCandidates())
iq.content().addTransportCandidate(candidate);
sendRequest(call, iq);
@@ -859,7 +609,7 @@ bool QXmppCallManager::sendAck(const QXmppJingleIq &iq)
bool QXmppCallManager::sendRequest(QXmppCall *call, const QXmppJingleIq &iq)
{
- call->m_requests << iq;
+ call->d->requests << iq;
return client()->sendPacket(iq);
}