Split PendingCall into PendingCall and PendingCallWatcher.

svn path=/branches/work/~ervin/qtjolie/; revision=976816
This commit is contained in:
Kevin Ottens 2009-06-02 18:02:06 +00:00
parent 2d2aef5930
commit c106afee83
9 changed files with 136 additions and 27 deletions

View File

@ -4,5 +4,6 @@ install( FILES
QtJolie/Message QtJolie/Message
QtJolie/MetaService QtJolie/MetaService
QtJolie/PendingCall QtJolie/PendingCall
QtJolie/PendingCallWatcher
QtJolie/Value QtJolie/Value
DESTINATION ${INCLUDE_INSTALL_DIR}/QtJolie COMPONENT Devel) DESTINATION ${INCLUDE_INSTALL_DIR}/QtJolie COMPONENT Devel)

View File

@ -0,0 +1,2 @@
#include "../qtjolie/pendingcallwatcher.h"

View File

@ -5,7 +5,16 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
${QT_INCLUDE_DIR}) ${QT_INCLUDE_DIR})
set(qtjolie_LIB_SRCS client.cpp clientthread.cpp value.cpp fault.cpp message.cpp metaservice.cpp pendingcall.cpp) set(qtjolie_LIB_SRCS
client.cpp
clientthread.cpp
value.cpp
fault.cpp
message.cpp
metaservice.cpp
pendingcall.cpp
pendingcallwatcher.cpp
)
kde4_add_library(QtJolie SHARED ${qtjolie_LIB_SRCS}) kde4_add_library(QtJolie SHARED ${qtjolie_LIB_SRCS})
@ -23,4 +32,5 @@ install(FILES
message.h message.h
metaservice.h metaservice.h
pendingcall.h pendingcall.h
pendingcallwatcher.h
DESTINATION ${INCLUDE_INSTALL_DIR}/qtjolie) DESTINATION ${INCLUDE_INSTALL_DIR}/qtjolie)

View File

@ -24,6 +24,7 @@
#include "clientthread_p.h" #include "clientthread_p.h"
#include "message.h" #include "message.h"
#include "pendingcall.h" #include "pendingcall.h"
#include "pendingcallwatcher.h"
using namespace Jolie; using namespace Jolie;
@ -60,7 +61,7 @@ PendingCall Client::asyncCall(const Message &message)
Message Client::call(const Message &message) Message Client::call(const Message &message)
{ {
PendingCall pending = asyncCall(message); PendingCallWatcher pending(asyncCall(message));
pending.waitForFinished(); pending.waitForFinished();
return pending.reply(); return pending.reply();
} }

View File

@ -1,6 +1,6 @@
/** /**
* This file is part of the KDE project * This file is part of the KDE project
* Copyright (C) 2008 Kevin Ottens <ervin@kde.org> * Copyright (C) 2009 Kevin Ottens <ervin@kde.org>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -20,6 +20,7 @@
#include "pendingcall.h" #include "pendingcall.h"
#include "pendingcall_p.h" #include "pendingcall_p.h"
#include "pendingcallwatcher.h"
using namespace Jolie; using namespace Jolie;
@ -44,22 +45,6 @@ PendingCall &PendingCall::operator=(const PendingCall &other)
return *this; return *this;
} }
bool PendingCall::isFinished() const
{
return d->isFinished;
}
Message PendingCall::reply() const
{
return d->reply;
}
void PendingCall::waitForFinished()
{
PendingCallWaiter waiter;
waiter.waitForFinished(d.data());
}
void PendingCallPrivate::setReply(const Message &message) void PendingCallPrivate::setReply(const Message &message)
{ {
Q_ASSERT(message.id()==id); Q_ASSERT(message.id()==id);
@ -69,8 +54,12 @@ void PendingCallPrivate::setReply(const Message &message)
foreach (PendingCallWaiter *waiter, waiters) { foreach (PendingCallWaiter *waiter, waiters) {
waiter->eventLoop.quit(); waiter->eventLoop.quit();
} }
waiters.clear(); waiters.clear();
foreach (PendingCallWatcher *watcher, watchers) {
emit watcher->finished(watcher);
}
watchers.clear();
} }
void PendingCallWaiter::waitForFinished(PendingCallPrivate *pendingCall) void PendingCallWaiter::waitForFinished(PendingCallPrivate *pendingCall)

View File

@ -1,6 +1,6 @@
/** /**
* This file is part of the KDE project * This file is part of the KDE project
* Copyright (C) 2008 Kevin Ottens <ervin@kde.org> * Copyright (C) 2009 Kevin Ottens <ervin@kde.org>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -37,13 +37,9 @@ public:
PendingCall &operator=(const PendingCall &other); PendingCall &operator=(const PendingCall &other);
bool isFinished() const;
Message reply() const;
void waitForFinished();
private: private:
friend class Client; friend class Client;
friend class PendingCallWatcher;
PendingCall(); // Not defined PendingCall(); // Not defined
PendingCall(QExplicitlySharedDataPointer<PendingCallPrivate> dd); PendingCall(QExplicitlySharedDataPointer<PendingCallPrivate> dd);

View File

@ -1,6 +1,6 @@
/** /**
* This file is part of the KDE project * This file is part of the KDE project
* Copyright (C) 2008 Kevin Ottens <ervin@kde.org> * Copyright (C) 2009 Kevin Ottens <ervin@kde.org>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -31,6 +31,7 @@ namespace Jolie
{ {
class PendingCallPrivate; class PendingCallPrivate;
class PendingCallWatcher;
class PendingCallWaiter class PendingCallWaiter
{ {
@ -52,12 +53,14 @@ public:
private: private:
friend class PendingCall; friend class PendingCall;
friend class PendingCallWatcher;
friend class PendingCallWaiter; friend class PendingCallWaiter;
qint64 id; qint64 id;
bool isFinished; bool isFinished;
Message reply; Message reply;
QList<PendingCallWaiter*> waiters; QList<PendingCallWaiter*> waiters;
QList<PendingCallWatcher*> watchers;
}; };
} // namespace Jolie } // namespace Jolie

View File

@ -0,0 +1,53 @@
/**
* This file is part of the KDE project
* Copyright (C) 2008 Kevin Ottens <ervin@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "pendingcallwatcher.h"
#include "pendingcall_p.h"
using namespace Jolie;
PendingCallWatcher::PendingCallWatcher(const PendingCall &other, QObject *parent)
: QObject(parent), PendingCall(other.d)
{
d->watchers << this;
}
PendingCallWatcher::~PendingCallWatcher()
{
d->watchers.removeAll(this);
}
bool PendingCallWatcher::isFinished() const
{
return d->isFinished;
}
Message PendingCallWatcher::reply() const
{
return d->reply;
}
void PendingCallWatcher::waitForFinished()
{
PendingCallWaiter waiter;
waiter.waitForFinished(d.data());
}

View File

@ -0,0 +1,54 @@
/**
* This file is part of the KDE project
* Copyright (C) 2008 Kevin Ottens <ervin@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef QTJOLIE_PENDINGCALLWATCHER_H
#define QTJOLIE_PENDINGCALLWATCHER_H
#include <QtCore/QObject>
#include <qtjolie/pendingcall.h>
namespace Jolie
{
class Q_DECL_EXPORT PendingCallWatcher : public QObject, public PendingCall
{
Q_OBJECT
public:
PendingCallWatcher(const PendingCall &call, QObject *parent=0);
~PendingCallWatcher();
bool isFinished() const;
Message reply() const;
void waitForFinished();
Q_SIGNALS:
void finished(Jolie::PendingCallWatcher *self);
private:
friend class PendingCallPrivate;
PendingCallWatcher(); // Not defined
};
} // namespace Jolie
#endif