From 596e81b331da8d24ca3d9f2604752f692e1ad3fe Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Mon, 31 Aug 2015 14:33:25 +0200 Subject: allow QXmppJingleIq to have multiple contents --- src/client/QXmppCallManager.cpp | 136 +++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 64 deletions(-) (limited to 'src/client/QXmppCallManager.cpp') 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); -- cgit v1.2.3 From a5b0a728b25688ee8b3aaac0208aff1d1d521983 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Mon, 31 Aug 2015 14:42:00 +0200 Subject: refactor --- src/client/QXmppCallManager.cpp | 100 +++++++++++----------------------------- 1 file changed, 27 insertions(+), 73 deletions(-) (limited to 'src/client/QXmppCallManager.cpp') diff --git a/src/client/QXmppCallManager.cpp b/src/client/QXmppCallManager.cpp index 7792dad8..a71fbe34 100644 --- a/src/client/QXmppCallManager.cpp +++ b/src/client/QXmppCallManager.cpp @@ -54,6 +54,8 @@ public: Stream *createStream(const QString &media); Stream *findStreamByMedia(const QString &media); Stream *findStreamByName(const QString &name); + QXmppJingleIq::Content localContent(QXmppCallPrivate::Stream *stream) const; + void handleAck(const QXmppIq &iq); bool handleDescription(QXmppCallPrivate::Stream *stream, const QXmppJingleIq::Content &content); void handleRequest(const QXmppJingleIq &iq); @@ -265,22 +267,7 @@ void QXmppCallPrivate::handleRequest(const QXmppJingleIq &iq) iq.setType(QXmppIq::Set); iq.setAction(QXmppJingleIq::ContentAccept); iq.setSid(q->sid()); - - QXmppJingleIq::Content responseContent; - responseContent.setCreator(stream->creator); - responseContent.setName(stream->name); - - // description - responseContent.setDescriptionMedia(stream->media); - responseContent.setDescriptionSsrc(stream->channel->localSsrc()); - responseContent.setPayloadTypes(stream->channel->localPayloadTypes()); - - // transport - responseContent.setTransportUser(stream->connection->localUser()); - responseContent.setTransportPassword(stream->connection->localPassword()); - responseContent.setTransportCandidates(stream->connection->localCandidates()); - - iq.addContent(responseContent); + iq.addContent(localContent(stream)); sendRequest(iq); } else if (iq.action() == QXmppJingleIq::TransportInfo) { @@ -366,6 +353,26 @@ QXmppCallPrivate::Stream *QXmppCallPrivate::createStream(const QString &media) return stream; } +QXmppJingleIq::Content QXmppCallPrivate::localContent(QXmppCallPrivate::Stream *stream) const +{ + QXmppJingleIq::Content content; + content.setCreator(stream->creator); + content.setName(stream->name); + content.setSenders("both"); + + // description + content.setDescriptionMedia(stream->media); + content.setDescriptionSsrc(stream->channel->localSsrc()); + content.setPayloadTypes(stream->channel->localPayloadTypes()); + + // transport + content.setTransportUser(stream->connection->localUser()); + content.setTransportPassword(stream->connection->localPassword()); + content.setTransportCandidates(stream->connection->localCandidates()); + + return content; +} + /// Sends an acknowledgement for a Jingle IQ. /// @@ -391,21 +398,7 @@ bool QXmppCallPrivate::sendInvite() QXmppCallPrivate::Stream *stream = findStreamByMedia(AUDIO_MEDIA); Q_ASSERT(stream); - QXmppJingleIq::Content content; - content.setCreator(stream->creator); - content.setName(stream->name); - content.setSenders("both"); - - // description - content.setDescriptionMedia(stream->media); - content.setPayloadTypes(stream->channel->localPayloadTypes()); - - // transport - content.setTransportUser(stream->connection->localUser()); - content.setTransportPassword(stream->connection->localPassword()); - content.setTransportCandidates(stream->connection->localCandidates()); - - iq.addContent(content); + iq.addContent(localContent(stream)); return sendRequest(iq); } @@ -494,21 +487,7 @@ void QXmppCall::accept() iq.setAction(QXmppJingleIq::SessionAccept); iq.setResponder(d->ownJid); iq.setSid(d->sid); - - QXmppJingleIq::Content content; - content.setCreator(stream->creator); - content.setName(stream->name); - - // description - content.setDescriptionMedia(stream->media); - content.setPayloadTypes(stream->channel->localPayloadTypes()); - - // transport - content.setTransportUser(stream->connection->localUser()); - content.setTransportPassword(stream->connection->localPassword()); - content.setTransportCandidates(stream->connection->localCandidates()); - - iq.addContent(content); + iq.addContent(localContent(stream)); d->sendRequest(iq); // notify user @@ -610,17 +589,7 @@ void QXmppCall::localCandidatesChanged() iq.setType(QXmppIq::Set); iq.setAction(QXmppJingleIq::TransportInfo); iq.setSid(d->sid); - - QXmppJingleIq::Content content; - content.setCreator(stream->creator); - content.setName(stream->name); - - // transport - content.setTransportUser(stream->connection->localUser()); - content.setTransportPassword(stream->connection->localPassword()); - content.setTransportCandidates(stream->connection->localCandidates()); - - iq.addContent(content); + iq.addContent(d->localContent(stream)); d->sendRequest(iq); } @@ -706,22 +675,7 @@ void QXmppCall::startVideo() iq.setType(QXmppIq::Set); iq.setAction(QXmppJingleIq::ContentAdd); iq.setSid(d->sid); - - QXmppJingleIq::Content content; - content.setCreator(stream->creator); - content.setName(stream->name); - content.setSenders("both"); - - // description - content.setDescriptionMedia(stream->media); - content.setPayloadTypes(stream->channel->localPayloadTypes()); - - // transport - content.setTransportUser(stream->connection->localUser()); - content.setTransportPassword(stream->connection->localPassword()); - content.setTransportCandidates(stream->connection->localCandidates()); - - iq.addContent(content); + iq.addContent(d->localContent(stream)); d->sendRequest(iq); } -- cgit v1.2.3 From 5e56d1caa5b3cdc8299b03cd21f6724bf45ad4d7 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Mon, 31 Aug 2015 14:44:53 +0200 Subject: cosmetic tweak --- src/client/QXmppCallManager.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src/client/QXmppCallManager.cpp') diff --git a/src/client/QXmppCallManager.cpp b/src/client/QXmppCallManager.cpp index a71fbe34..b72af31b 100644 --- a/src/client/QXmppCallManager.cpp +++ b/src/client/QXmppCallManager.cpp @@ -387,17 +387,16 @@ bool QXmppCallPrivate::sendAck(const QXmppJingleIq &iq) bool QXmppCallPrivate::sendInvite() { + // create audio stream + QXmppCallPrivate::Stream *stream = findStreamByMedia(AUDIO_MEDIA); + Q_ASSERT(stream); + QXmppJingleIq iq; iq.setTo(jid); iq.setType(QXmppIq::Set); iq.setAction(QXmppJingleIq::SessionInitiate); iq.setInitiator(ownJid); iq.setSid(sid); - - // create audio stream - QXmppCallPrivate::Stream *stream = findStreamByMedia(AUDIO_MEDIA); - Q_ASSERT(stream); - iq.addContent(localContent(stream)); return sendRequest(iq); } -- cgit v1.2.3 From 575193d32f31b5c9acae2e4ffa4d2781b445942a Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Mon, 31 Aug 2015 15:02:55 +0200 Subject: fix typo --- src/client/QXmppCallManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/client/QXmppCallManager.cpp') diff --git a/src/client/QXmppCallManager.cpp b/src/client/QXmppCallManager.cpp index b72af31b..8f5ddbb2 100644 --- a/src/client/QXmppCallManager.cpp +++ b/src/client/QXmppCallManager.cpp @@ -486,7 +486,7 @@ void QXmppCall::accept() iq.setAction(QXmppJingleIq::SessionAccept); iq.setResponder(d->ownJid); iq.setSid(d->sid); - iq.addContent(localContent(stream)); + iq.addContent(d->localContent(stream)); d->sendRequest(iq); // notify user -- cgit v1.2.3