aboutsummaryrefslogtreecommitdiff
path: root/src/client/QXmppCallManager.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2015-08-31 14:33:25 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2015-08-31 14:33:25 +0200
commit596e81b331da8d24ca3d9f2604752f692e1ad3fe (patch)
tree251067c067a3e9c2995b2a7b15c3ed42e6315268 /src/client/QXmppCallManager.cpp
parentaa131bd436b528a68bdcea4fab180b551f2a0d81 (diff)
downloadqxmpp-596e81b331da8d24ca3d9f2604752f692e1ad3fe.tar.gz
allow QXmppJingleIq to have multiple contents
Diffstat (limited to 'src/client/QXmppCallManager.cpp')
-rw-r--r--src/client/QXmppCallManager.cpp136
1 files changed, 72 insertions, 64 deletions
diff --git a/src/client/QXmppCallManager.cpp b/src/client/QXmppCallManager.cpp
index a278eef6..7792dad8 100644
--- a/src/client/QXmppCallManager.cpp
+++ b/src/client/QXmppCallManager.cpp
@@ -171,6 +171,8 @@ bool QXmppCallPrivate::handleTransport(QXmppCallPrivate::Stream *stream, const Q
void QXmppCallPrivate::handleRequest(const QXmppJingleIq &iq)
{
+ const QXmppJingleIq::Content content = iq.contents().isEmpty() ? QXmppJingleIq::Content() : iq.contents().first();
+
if (iq.action() == QXmppJingleIq::SessionAccept) {
if (direction == QXmppCall::IncomingDirection) {
@@ -182,10 +184,10 @@ void QXmppCallPrivate::handleRequest(const QXmppJingleIq &iq)
sendAck(iq);
// check content description and transport
- QXmppCallPrivate::Stream *stream = findStreamByName(iq.content().name());
+ QXmppCallPrivate::Stream *stream = findStreamByName(content.name());
if (!stream ||
- !handleDescription(stream, iq.content()) ||
- !handleTransport(stream, iq.content())) {
+ !handleDescription(stream, content) ||
+ !handleTransport(stream, content)) {
// terminate call
terminate(QXmppJingleIq::Reason::FailedApplication);
@@ -215,10 +217,10 @@ void QXmppCallPrivate::handleRequest(const QXmppJingleIq &iq)
sendAck(iq);
// check content description and transport
- QXmppCallPrivate::Stream *stream = findStreamByName(iq.content().name());
+ QXmppCallPrivate::Stream *stream = findStreamByName(content.name());
if (!stream ||
- !handleDescription(stream, iq.content()) ||
- !handleTransport(stream, iq.content())) {
+ !handleDescription(stream, content) ||
+ !handleTransport(stream, content)) {
// FIXME: what action?
return;
@@ -230,20 +232,20 @@ void QXmppCallPrivate::handleRequest(const QXmppJingleIq &iq)
sendAck(iq);
// check media stream does not exist yet
- QXmppCallPrivate::Stream *stream = findStreamByName(iq.content().name());
+ QXmppCallPrivate::Stream *stream = findStreamByName(content.name());
if (stream)
return;
// create media stream
- stream = createStream(iq.content().descriptionMedia());
+ stream = createStream(content.descriptionMedia());
if (!stream)
return;
- stream->creator = iq.content().creator();
- stream->name = iq.content().name();
+ stream->creator = content.creator();
+ stream->name = content.name();
// check content description
- if (!handleDescription(stream, iq.content()) ||
- !handleTransport(stream, iq.content())) {
+ if (!handleDescription(stream, content) ||
+ !handleTransport(stream, content)) {
QXmppJingleIq iq;
iq.setTo(q->jid());
@@ -263,21 +265,22 @@ void QXmppCallPrivate::handleRequest(const QXmppJingleIq &iq)
iq.setType(QXmppIq::Set);
iq.setAction(QXmppJingleIq::ContentAccept);
iq.setSid(q->sid());
- iq.content().setCreator(stream->creator);
- iq.content().setName(stream->name);
+
+ QXmppJingleIq::Content responseContent;
+ responseContent.setCreator(stream->creator);
+ responseContent.setName(stream->name);
// description
- iq.content().setDescriptionMedia(stream->media);
- iq.content().setDescriptionSsrc(stream->channel->localSsrc());
- foreach (const QXmppJinglePayloadType &payload, stream->channel->localPayloadTypes())
- iq.content().addPayloadType(payload);
+ responseContent.setDescriptionMedia(stream->media);
+ responseContent.setDescriptionSsrc(stream->channel->localSsrc());
+ responseContent.setPayloadTypes(stream->channel->localPayloadTypes());
// transport
- iq.content().setTransportUser(stream->connection->localUser());
- iq.content().setTransportPassword(stream->connection->localPassword());
- foreach (const QXmppJingleCandidate &candidate, stream->connection->localCandidates())
- iq.content().addTransportCandidate(candidate);
+ responseContent.setTransportUser(stream->connection->localUser());
+ responseContent.setTransportPassword(stream->connection->localPassword());
+ responseContent.setTransportCandidates(stream->connection->localCandidates());
+ iq.addContent(responseContent);
sendRequest(iq);
} else if (iq.action() == QXmppJingleIq::TransportInfo) {
@@ -286,9 +289,9 @@ void QXmppCallPrivate::handleRequest(const QXmppJingleIq &iq)
sendAck(iq);
// check content transport
- QXmppCallPrivate::Stream *stream = findStreamByName(iq.content().name());
+ QXmppCallPrivate::Stream *stream = findStreamByName(content.name());
if (!stream ||
- !handleTransport(stream, iq.content())) {
+ !handleTransport(stream, content)) {
// FIXME: what action?
return;
}
@@ -387,21 +390,22 @@ bool QXmppCallPrivate::sendInvite()
// create audio stream
QXmppCallPrivate::Stream *stream = findStreamByMedia(AUDIO_MEDIA);
Q_ASSERT(stream);
- iq.content().setCreator(stream->creator);
- iq.content().setName(stream->name);
- iq.content().setSenders("both");
+
+ QXmppJingleIq::Content content;
+ content.setCreator(stream->creator);
+ content.setName(stream->name);
+ content.setSenders("both");
// description
- iq.content().setDescriptionMedia(stream->media);
- foreach (const QXmppJinglePayloadType &payload, stream->channel->localPayloadTypes())
- iq.content().addPayloadType(payload);
+ content.setDescriptionMedia(stream->media);
+ content.setPayloadTypes(stream->channel->localPayloadTypes());
// transport
- iq.content().setTransportUser(stream->connection->localUser());
- iq.content().setTransportPassword(stream->connection->localPassword());
- foreach (const QXmppJingleCandidate &candidate, stream->connection->localCandidates())
- iq.content().addTransportCandidate(candidate);
+ content.setTransportUser(stream->connection->localUser());
+ content.setTransportPassword(stream->connection->localPassword());
+ content.setTransportCandidates(stream->connection->localCandidates());
+ iq.addContent(content);
return sendRequest(iq);
}
@@ -490,20 +494,21 @@ void QXmppCall::accept()
iq.setAction(QXmppJingleIq::SessionAccept);
iq.setResponder(d->ownJid);
iq.setSid(d->sid);
- iq.content().setCreator(stream->creator);
- iq.content().setName(stream->name);
+
+ QXmppJingleIq::Content content;
+ content.setCreator(stream->creator);
+ content.setName(stream->name);
// description
- iq.content().setDescriptionMedia(stream->media);
- foreach (const QXmppJinglePayloadType &payload, stream->channel->localPayloadTypes())
- iq.content().addPayloadType(payload);
+ content.setDescriptionMedia(stream->media);
+ content.setPayloadTypes(stream->channel->localPayloadTypes());
// transport
- iq.content().setTransportUser(stream->connection->localUser());
- iq.content().setTransportPassword(stream->connection->localPassword());
- foreach (const QXmppJingleCandidate &candidate, stream->connection->localCandidates())
- iq.content().addTransportCandidate(candidate);
+ content.setTransportUser(stream->connection->localUser());
+ content.setTransportPassword(stream->connection->localPassword());
+ content.setTransportCandidates(stream->connection->localCandidates());
+ iq.addContent(content);
d->sendRequest(iq);
// notify user
@@ -606,15 +611,16 @@ void QXmppCall::localCandidatesChanged()
iq.setAction(QXmppJingleIq::TransportInfo);
iq.setSid(d->sid);
- iq.content().setCreator(stream->creator);
- iq.content().setName(stream->name);
+ QXmppJingleIq::Content content;
+ content.setCreator(stream->creator);
+ content.setName(stream->name);
// transport
- iq.content().setTransportUser(stream->connection->localUser());
- iq.content().setTransportPassword(stream->connection->localPassword());
- foreach (const QXmppJingleCandidate &candidate, stream->connection->localCandidates())
- iq.content().addTransportCandidate(candidate);
+ content.setTransportUser(stream->connection->localUser());
+ content.setTransportPassword(stream->connection->localPassword());
+ content.setTransportCandidates(stream->connection->localCandidates());
+ iq.addContent(content);
d->sendRequest(iq);
}
@@ -700,21 +706,22 @@ void QXmppCall::startVideo()
iq.setType(QXmppIq::Set);
iq.setAction(QXmppJingleIq::ContentAdd);
iq.setSid(d->sid);
- iq.content().setCreator(stream->creator);
- iq.content().setName(stream->name);
- iq.content().setSenders("both");
+
+ QXmppJingleIq::Content content;
+ content.setCreator(stream->creator);
+ content.setName(stream->name);
+ content.setSenders("both");
// description
- iq.content().setDescriptionMedia(stream->media);
- foreach (const QXmppJinglePayloadType &payload, stream->channel->localPayloadTypes())
- iq.content().addPayloadType(payload);
+ content.setDescriptionMedia(stream->media);
+ content.setPayloadTypes(stream->channel->localPayloadTypes());
// transport
- iq.content().setTransportUser(stream->connection->localUser());
- iq.content().setTransportPassword(stream->connection->localPassword());
- foreach (const QXmppJingleCandidate &candidate, stream->connection->localCandidates())
- iq.content().addTransportCandidate(candidate);
+ content.setTransportUser(stream->connection->localUser());
+ content.setTransportPassword(stream->connection->localPassword());
+ content.setTransportCandidates(stream->connection->localCandidates());
+ iq.addContent(content);
d->sendRequest(iq);
}
@@ -939,18 +946,19 @@ void QXmppCallManager::_q_jingleIqReceived(const QXmppJingleIq &iq)
QXmppCall *call = new QXmppCall(iq.from(), QXmppCall::IncomingDirection, this);
call->d->sid = iq.sid();
- QXmppCallPrivate::Stream *stream = call->d->findStreamByMedia(iq.content().descriptionMedia());
+ const QXmppJingleIq::Content content = iq.contents().isEmpty() ? QXmppJingleIq::Content() : iq.contents().first();
+ QXmppCallPrivate::Stream *stream = call->d->findStreamByMedia(content.descriptionMedia());
if (!stream)
return;
- stream->creator = iq.content().creator();
- stream->name = iq.content().name();
+ stream->creator = content.creator();
+ stream->name = content.name();
// send ack
call->d->sendAck(iq);
// check content description and transport
- if (!call->d->handleDescription(stream, iq.content()) ||
- !call->d->handleTransport(stream, iq.content())) {
+ if (!call->d->handleDescription(stream, content) ||
+ !call->d->handleTransport(stream, content)) {
// terminate call
call->d->terminate(QXmppJingleIq::Reason::FailedApplication);