[Telepathy-commits] [telepathy-qt4/master] StreamedMediaChannel: Fixed requestStreams to return a PendingMediaStreams object.
Andre Moreira Magalhaes (andrunko)
andre.magalhaes at collabora.co.uk
Wed Mar 11 07:09:44 PDT 2009
---
TelepathyQt4/Client/streamed-media-channel.cpp | 105 ++++++++++++++++++++++--
TelepathyQt4/Client/streamed-media-channel.h | 39 ++++++++-
2 files changed, 132 insertions(+), 12 deletions(-)
diff --git a/TelepathyQt4/Client/streamed-media-channel.cpp b/TelepathyQt4/Client/streamed-media-channel.cpp
index 2490daa..b1a0896 100644
--- a/TelepathyQt4/Client/streamed-media-channel.cpp
+++ b/TelepathyQt4/Client/streamed-media-channel.cpp
@@ -35,6 +35,88 @@ namespace Telepathy
namespace Client
{
+struct PendingMediaStreams::Private
+{
+ Private(StreamedMediaChannel *channel)
+ : channel(channel)
+ {
+ }
+
+ StreamedMediaChannel *channel;
+ MediaStreams streams;
+};
+
+PendingMediaStreams::PendingMediaStreams(StreamedMediaChannel *channel,
+ QSharedPointer<Telepathy::Client::Contact> contact,
+ QList<Telepathy::MediaStreamType> types,
+ QObject *parent)
+ : PendingOperation(parent),
+ mPriv(new Private(channel))
+{
+ Telepathy::UIntList l;
+ foreach (Telepathy::MediaStreamType type, types) {
+ l << type;
+ }
+ QDBusPendingCallWatcher *watcher =
+ new QDBusPendingCallWatcher(
+ channel->streamedMediaInterface()->RequestStreams(
+ contact->handle()[0], l), this);
+ connect(watcher,
+ SIGNAL(finished(QDBusPendingCallWatcher*)),
+ SLOT(gotStreams(QDBusPendingCallWatcher*)));
+}
+
+PendingMediaStreams::~PendingMediaStreams()
+{
+ delete mPriv;
+}
+
+MediaStreams PendingMediaStreams::streams() const
+{
+ if (!isFinished()) {
+ warning() << "PendingMediaStreams::streams called before finished";
+ } else if (!isValid()) {
+ warning() << "PendingMediaStreams::streams called when not valid";
+ }
+
+ return mPriv->streams;
+}
+
+void PendingMediaStreams::gotStreams(QDBusPendingCallWatcher *watcher)
+{
+ QDBusPendingReply<QVariantMap> reply = *watcher;
+ if (reply.isError()) {
+ warning().nospace() << "StreamedMedia::RequestStreams()"
+ " failed with " << reply.error().name() << ": " <<
+ reply.error().message();
+ setFinishedWithError(reply.error());
+ return;
+ }
+
+ debug() << "Got reply to StreamedMedia::RequestStreams()";
+
+ Telepathy::MediaStreamInfoList list =
+ qdbus_cast<Telepathy::MediaStreamInfoList>(reply.value());
+ QSharedPointer<MediaStream> stream;
+ foreach (const MediaStreamInfo &streamInfo, list) {
+ // TODO retrieve the contact object
+ stream = QSharedPointer<MediaStream>(
+ new MediaStream(mPriv->channel,
+ streamInfo.identifier,
+ streamInfo.contact,
+ (Telepathy::MediaStreamType) streamInfo.type,
+ (Telepathy::MediaStreamState) streamInfo.state,
+ (Telepathy::MediaStreamDirection) streamInfo.direction,
+ (Telepathy::MediaStreamPendingSend) streamInfo.pendingSendFlags));
+ mPriv->streams.append(stream);
+ mPriv->channel->addStream(stream);
+ }
+
+ setFinished();
+
+ watcher->deleteLater();
+}
+
struct MediaStream::Private
{
Private(StreamedMediaChannel *channel, uint id,
@@ -392,17 +474,11 @@ PendingOperation *StreamedMediaChannel::removeStreams(const Telepathy::UIntList
streamedMediaInterface()->RemoveStreams(ids));
}
-PendingOperation *StreamedMediaChannel::requestStreams(
+PendingMediaStreams *StreamedMediaChannel::requestStreams(
QSharedPointer<Telepathy::Client::Contact> contact,
QList<Telepathy::MediaStreamType> types)
{
- Telepathy::UIntList l;
- foreach (Telepathy::MediaStreamType type, types) {
- l << type;
- }
- return new PendingVoidMethodCall(this,
- streamedMediaInterface()->RequestStreams(
- contact->handle()[0], l));
+ return new PendingMediaStreams(this, contact, types, this);
}
void StreamedMediaChannel::gotStreams(QDBusPendingCallWatcher *watcher)
@@ -421,8 +497,10 @@ void StreamedMediaChannel::gotStreams(QDBusPendingCallWatcher *watcher)
debug() << "Got reply to StreamedMedia::ListStreams()";
mPriv->initialStreamsReceived = true;
- MediaStreamInfoList list = qdbus_cast<MediaStreamInfoList>(reply.value());
+ Telepathy::MediaStreamInfoList list =
+ qdbus_cast<Telepathy::MediaStreamInfoList>(reply.value());
foreach (const MediaStreamInfo &streamInfo, list) {
+ // TODO retrieve the contact object
mPriv->streams.insert(streamInfo.identifier,
QSharedPointer<MediaStream>(
new MediaStream(this,
@@ -517,5 +595,14 @@ void StreamedMediaChannel::onStreamError(uint streamId,
}
}
+void StreamedMediaChannel::addStream(const QSharedPointer<MediaStream> &stream)
+{
+ mPriv->streams.insert(stream->id(), stream);
+
+ if (mPriv->initialStreamsReceived) {
+ emit streamAdded(stream);
+ }
+}
+
} // Telepathy::Client
} // Telepathy
diff --git a/TelepathyQt4/Client/streamed-media-channel.h b/TelepathyQt4/Client/streamed-media-channel.h
index 34af55e..8f6077b 100644
--- a/TelepathyQt4/Client/streamed-media-channel.h
+++ b/TelepathyQt4/Client/streamed-media-channel.h
@@ -26,6 +26,7 @@
#endif
#include <TelepathyQt4/Client/Channel>
+#include <TelepathyQt4/Client/PendingOperation>
namespace Telepathy
{
@@ -33,6 +34,35 @@ namespace Client
{
class StreamedMediaChannel;
+class MediaStream;
+
+typedef QList<QSharedPointer<MediaStream> > MediaStreams;
+
+class PendingMediaStreams : public PendingOperation
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(PendingMediaStreams)
+
+public:
+ ~PendingMediaStreams();
+
+ MediaStreams streams() const;
+
+private Q_SLOTS:
+ void gotStreams(QDBusPendingCallWatcher *);
+
+private:
+ friend class StreamedMediaChannel;
+
+ PendingMediaStreams(StreamedMediaChannel *channel,
+ QSharedPointer<Telepathy::Client::Contact> contact,
+ QList<Telepathy::MediaStreamType> types,
+ QObject *parent = 0);
+
+ struct Private;
+ friend struct Private;
+ Private *mPriv;
+};
class MediaStream : public QObject
{
@@ -73,6 +103,7 @@ Q_SIGNALS:
const QString &errorMessage);
private:
+ friend class PendingMediaStreams;
friend class StreamedMediaChannel;
MediaStream(StreamedMediaChannel *channel, uint id,
@@ -89,8 +120,6 @@ private:
Private *mPriv;
};
-typedef QList<QSharedPointer<MediaStream> > MediaStreams;
-
class StreamedMediaChannel : public Channel
{
Q_OBJECT
@@ -113,7 +142,7 @@ public:
PendingOperation *removeStreams(MediaStreams streams);
PendingOperation *removeStreams(const Telepathy::UIntList &ids);
- PendingOperation *requestStreams(
+ PendingMediaStreams *requestStreams(
QSharedPointer<Telepathy::Client::Contact> contact,
QList<Telepathy::MediaStreamType> types);
@@ -129,6 +158,10 @@ private Q_SLOTS:
void onStreamError(uint, uint, const QString &);
private:
+ friend class PendingMediaStreams;
+
+ void addStream(const QSharedPointer<MediaStream> &stream);
+
struct Private;
friend struct Private;
Private *mPriv;
--
1.5.6.5
More information about the telepathy-commits
mailing list