[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/network/kcall
From:       George Kiagiadakis <gkiagiad () csd ! uoc ! gr>
Date:       2009-06-08 10:49:42
Message-ID: 1244458182.497479.25456.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 978838 by gkiagia:

Add initial implementation of the call window, using a kpart-based design.


 M  +3 -1      CMakeLists.txt  
 M  +72 -47    callwindow.cpp  
 M  +10 -5     callwindow.h  
 A             callwindowpart (directory)  
 A             callwindowpart/CMakeLists.txt  
 A             callwindowpart/callwindowpart.cpp   [License: LGPL (v2.1+)]
 A             callwindowpart/callwindowpart.h   [License: LGPL (v2.1+)]
 A             callwindowpart/callwindowpart_p.cpp   [License: LGPL (v2.1+)]
 A             callwindowpart/callwindowpart_p.h   [License: LGPL (v2.1+)]
 A             callwindowpart/kcall_callwindowpart.desktop  
 A             callwindowpart/pendingoutgoingcall.cpp   [License: LGPL (v2.1+)]
 A             callwindowpart/pendingoutgoingcall.h   [License: LGPL (v2.1+)]
 M  +1 -2      contactlistcontroller.cpp  


--- trunk/playground/network/kcall/CMakeLists.txt #978837:978838
@@ -8,6 +8,8 @@
 include_directories(${KDE4_INCLUDES} ${TELEPATHY_QT4_INCLUDE_DIR} \
${CMAKE_CURRENT_BINARY_DIR})  add_definitions(${KDE4_DEFINITIONS})
 
+add_subdirectory(callwindowpart)
+
 set(kcall_SRCS
     main.cpp
     kcallapplication.cpp
@@ -23,7 +25,7 @@
 
 kde4_add_ui_files(kcall_SRCS mainwindow.ui)
 kde4_add_executable(kcall ${kcall_SRCS})
-target_link_libraries(kcall ${KDE4_KDEUI_LIBS} ${TELEPATHY_QT4_LIBRARIES})
+target_link_libraries(kcall ${KDE4_KPARTS_LIBS} ${TELEPATHY_QT4_LIBRARIES})
 
 install(TARGETS kcall ${INSTALL_TARGETS_DEFAULT_ARGS})
 #install(FILES kcallui.rc DESTINATION ${DATA_INSTALL_DIR}/kcall)
--- trunk/playground/network/kcall/callwindow.cpp #978837:978838
@@ -15,77 +15,102 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "callwindow.h"
-#include <QtGui/QStackedWidget>
+#include <QtCore/QMetaObject>
+#include <QtGui/QCloseEvent>
 #include <QtGui/QLabel>
 #include <KDebug>
-#include <TelepathyQt4/Connection>
-#include <TelepathyQt4/ContactManager>
-#include <TelepathyQt4/PendingChannel>
-#include <TelepathyQt4/StreamedMediaChannel>
+#include <KLocalizedString>
+#include <KPluginLoader>
+#include <KPluginFactory>
+#include <KParts/Part>
 
 struct CallWindow::Private
 {
-    QStackedWidget *videoStackedWidget;
-    QLabel *videoPlaceHolder;
-    Tp::StreamedMediaChannelPtr channel;
+    KPluginLoader *loader;
+    KParts::Part *part;
 };
 
-CallWindow::CallWindow()
-    : KXmlGuiWindow(), d(new Private)
+/*! This constructor is used to make an outgoing call to the specified \a contact */
+CallWindow::CallWindow(Tp::ContactPtr contact)
+    : KParts::MainWindow(), d(new Private)
 {
-    d->videoStackedWidget = new QStackedWidget(this);
-    d->videoPlaceHolder = new QLabel;
-    d->videoStackedWidget->addWidget(d->videoPlaceHolder);
+    init();
+    if ( d->part ) {
+        QMetaObject::invokeMethod(d->part, "callContact", Q_ARG(Tp::ContactPtr, \
contact)); +    }
+}
 
-    setCentralWidget(d->videoStackedWidget);
-
-    setAutoSaveSettings(QLatin1String("CallWindow"));
-    setupGUI(QSize(320, 260), KXmlGuiWindow::Default, \
QLatin1String("callwindowui.rc")); +/*! This constructor is used to handle an \
incoming call, in which case + * the specified \a channel must be ready and the call \
must have been accepted. + */
+CallWindow::CallWindow(Tp::StreamedMediaChannelPtr channel)
+    : KParts::MainWindow(), d(new Private)
+{
+    init();
+    if ( d->part ) {
+        QMetaObject::invokeMethod(d->part, "handleStreamedMediaChannel",
+                                  Q_ARG(Tp::StreamedMediaChannelPtr, channel));
+    }
 }
 
 CallWindow::~CallWindow()
 {
+    kDebug() << "Deleting CallWindow";
     delete d;
 }
 
-void CallWindow::callContact(Tp::ContactPtr contact)
+void CallWindow::init()
 {
-    setWindowTitle(contact->alias());
+    d->part = NULL;
+    d->loader = new KPluginLoader("kcall_callwindowpart", KGlobal::mainComponent(), \
this); +    KPluginFactory *factory = d->loader->factory();
+    if ( factory ) {
+        d->part = factory->create<KParts::Part>(this, this);
+        //version check
+        int index = d->part->metaObject()->indexOfClassInfo("Interface version");
+        const char *version = d->part->metaObject()->classInfo(index).value();
+        if ( !version || version[0] != '0' ) {
+            kWarning() << "Incompatible plugin version loaded";
+            d->part->deleteLater();
+            d->part = NULL;
+        }
+    }
 
-    Tp::ConnectionPtr connection = contact->manager()->connection();
-    kDebug() << "Connection is ready" << connection->isReady();
+    if ( d->part ) {
+        setCentralWidget(d->part->widget());
+    } else {
+        QLabel *label = new QLabel(i18nc("@info:status", "Could not load call window \
part. " +                                                         "Please check your \
installation."), this); +        label->setWordWrap(true);
+        setCentralWidget(label);
+    }
 
-    QVariantMap request;
-    request.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".ChannelType"), \
                QString("StreamedMedia"));
-    request.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandleType"), \
                Tp::HandleTypeContact);
-    request.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandle"), \
contact->handle()[0]); +    setAutoSaveSettings(QLatin1String("CallWindow"));
+    setupGUI(QSize(320, 260), ToolBar | Keys | StatusBar | Save, \
QLatin1String("callwindowui.rc")); +    if ( d->part ) {
+        createGUI(d->part);
+    } else {
+        KXmlGuiWindow::createGUI(QLatin1String("callwindowui.rc"));
+    }
+}
 
-    Tp::PendingChannel *pendChan = connection->ensureChannel(request);
-    connect(pendChan, SIGNAL(finished(Tp::PendingOperation*)),
-            SLOT(callRequestFinished(Tp::PendingOperation*)));
+void CallWindow::onCallEnded(bool hasError)
+{
 }
 
-void CallWindow::callRequestFinished(Tp::PendingOperation *op)
+void CallWindow::closeEvent(QCloseEvent *event)
 {
-    if ( op->isError() ) {
-        kDebug() << "Failed to call contact" << op->errorName() << \
                op->errorMessage();
-        return;
+    if ( d->part ) {
+        bool canClose;
+        if ( QMetaObject::invokeMethod(d->part, "requestClose", Q_RETURN_ARG(bool, \
canClose)) ) { +            if ( !canClose ) {
+                kDebug() << "Ignoring close event";
+                connect(d->part, SIGNAL(callEnded(bool)), SLOT(close()));
+                event->ignore();
+            }
+        }
     }
-
-    Tp::PendingChannel *pendChan = qobject_cast<Tp::PendingChannel*>(op);
-    Q_ASSERT(pendChan);
-
-    if ( pendChan->yours() ) {
-        Tp::StreamedMediaChannelPtr \
                channel(qobject_cast<Tp::StreamedMediaChannel*>(pendChan->channel().data()));
                
-        Q_ASSERT(!channel.isNull());
-        d->channel = channel;
-
-        kDebug() << "Channel is ready" << channel->isReady();
-        kDebug() << "Awaiting answer" << channel->awaitingRemoteAnswer();
-        kDebug() << "Handler required" << channel->handlerStreamingRequired();
-    } else {
-        kDebug() << "Channel is not ours";
-    }
+    KParts::MainWindow::closeEvent(event);
 }
 
 #include "callwindow.moc"
--- trunk/playground/network/kcall/callwindow.h #978837:978838
@@ -17,21 +17,26 @@
 #ifndef CALLWINDOW_H
 #define CALLWINDOW_H
 
-#include <KXmlGuiWindow>
+#include <KParts/MainWindow>
 #include <TelepathyQt4/Contact>
 
-class CallWindow : public KXmlGuiWindow
+class CallWindow : public KParts::MainWindow
 {
     Q_OBJECT
 public:
-    CallWindow();
+    CallWindow(Tp::ContactPtr contact);
+    CallWindow(Tp::StreamedMediaChannelPtr channel);
     virtual ~CallWindow();
 
-    void callContact(Tp::ContactPtr contact);
+private:
+    void init();
 
 private slots:
-    void callRequestFinished(Tp::PendingOperation *op);
+    void onCallEnded(bool hasError);
 
+protected:
+    virtual void closeEvent(QCloseEvent *event);
+
 private:
     struct Private;
     Private *const d;
--- trunk/playground/network/kcall/contactlistcontroller.cpp #978837:978838
@@ -92,9 +92,8 @@
     Tp::ContactPtr contact = \
d->currentIndex.data(ContactsModel::ObjectPtrRole).value<Tp::ContactPtr>();  \
Q_ASSERT( !contact.isNull() );  
-    CallWindow *cw = new CallWindow();
+    CallWindow *cw = new CallWindow(contact);
     cw->show();
-    cw->callContact(contact);
 }
 
 void ContactListController::setStatus(int statusIndex)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic