[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