[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