[Telepathy-commits] [telepathy-qt4/master] Channel: Removed readiness completelly.
Andre Moreira Magalhaes (andrunko)
andre.magalhaes at collabora.co.uk
Tue Feb 3 11:58:32 PST 2009
---
TelepathyQt4/Client/channel.cpp | 295 +++++++++++++++-----------------------
1 files changed, 117 insertions(+), 178 deletions(-)
diff --git a/TelepathyQt4/Client/channel.cpp b/TelepathyQt4/Client/channel.cpp
index f0d2827..d251114 100644
--- a/TelepathyQt4/Client/channel.cpp
+++ b/TelepathyQt4/Client/channel.cpp
@@ -60,14 +60,6 @@ namespace Client
struct Channel::Private
{
- enum Readiness {
- ReadinessJustCreated = 0,
- ReadinessFull = 5,
- ReadinessDead = 10,
- ReadinessClosed = 15,
- _ReadinessInvalid = 0xffff
- };
-
Private(Channel *parent, Connection *connection);
void introspectMain();
@@ -85,7 +77,7 @@ struct Channel::Private
void nowHaveInterfaces();
- void changeReadiness(Readiness newReadiness);
+ void setClosed();
class PendingReady;
@@ -103,9 +95,10 @@ struct Channel::Private
DBus::PropertiesInterface *properties;
PendingReady *pendingReady;
+ bool ready;
+ bool closed;
// Introspection
- Readiness readiness;
QStringList interfaces;
QQueue<void (Private::*)()> introspectQueue;
@@ -160,7 +153,8 @@ Channel::Private::Private(Channel *parent, Connection *connection)
group(0),
properties(0),
pendingReady(0),
- readiness(ReadinessJustCreated),
+ ready(false),
+ closed(false),
features(0),
targetHandleType(0),
targetHandle(0),
@@ -172,25 +166,26 @@ Channel::Private::Private(Channel *parent, Connection *connection)
{
debug() << "Creating new Channel";
- debug() << " Connecting to Channel::Closed()";
- parent->connect(baseInterface,
- SIGNAL(Closed()),
- SLOT(onClosed()));
-
- debug() << " Connection to owning connection's lifetime signals";
- parent->connect(connection,
- SIGNAL(invalidated(Telepathy::Client::DBusProxy *,
- const QString &, const QString &)),
- SLOT(onConnectionInvalidated()));
+ if (connection->isValid()) {
+ debug() << " Connecting to Channel::Closed() signal";
+ parent->connect(baseInterface,
+ SIGNAL(Closed()),
+ SLOT(onClosed()));
- parent->connect(connection,
- SIGNAL(destroyed()),
- SLOT(onConnectionDestroyed()));
+ debug() << " Connection to owning connection's lifetime signals";
+ parent->connect(connection,
+ SIGNAL(invalidated(Telepathy::Client::DBusProxy *,
+ const QString &, const QString &)),
+ SLOT(onConnectionInvalidated()));
- if (!connection->isValid()) {
+ parent->connect(connection,
+ SIGNAL(destroyed()),
+ SLOT(onConnectionDestroyed()));
+ }
+ else {
warning() << "Connection given as the owner for a Channel was "
"invalid! Channel will be stillborn.";
- readiness = ReadinessDead;
+ closed = true;
}
}
@@ -420,73 +415,24 @@ void Channel::Private::nowHaveInterfaces()
}
}
-void Channel::Private::changeReadiness(Readiness newReadiness)
+void Channel::Private::setClosed()
{
- Q_ASSERT(newReadiness != readiness);
- switch (readiness) {
- case ReadinessJustCreated:
- // We don't allow ReadinessClosed to be reached without ReadinessFull
- // being reached at some point first.
- Q_ASSERT((newReadiness == ReadinessFull) ||
- (newReadiness == ReadinessDead));
- break;
- case ReadinessFull:
- Q_ASSERT((newReadiness == ReadinessDead) ||
- (newReadiness == ReadinessClosed));
- break;
- case ReadinessDead:
- case ReadinessClosed:
- default:
- introspectQueue.clear();
- break;
- }
-
- debug() << "Channel readiness changed from" <<
- readiness << "to" << newReadiness;
-
- if (newReadiness == ReadinessFull) {
- debug() << "Channel fully ready";
- debug() << " Channel type" << channelType;
- debug() << " Target handle" << targetHandle;
- debug() << " Target handle type" << targetHandleType;
-
- if (interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
- debug() << " Group: flags" << groupFlags;
- if (groupAreHandleOwnersAvailable) {
- debug() << " Group: Number of handle owner mappings" <<
- groupHandleOwners.size();
- }
- else {
- debug() << " Group: No handle owners property present";
- }
- debug() << " Group: Number of current members" <<
- groupMembers.size();
- debug() << " Group: Number of local pending members" <<
- groupLocalPending.size();
- debug() << " Group: Number of remote pending members" <<
- groupRemotePending.size();
- debug() << " Group: Self handle" << groupSelfHandle <<
- "tracked:" << (groupIsSelfHandleTracked ? "yes" : "no");
- }
+ if (closed) {
+ warning() << "Channel::Private::setClosed called with channel already closed";
+ return;
}
- else {
- Q_ASSERT((newReadiness == ReadinessDead) ||
- (newReadiness == ReadinessClosed));
- debug() << "R.I.P. Channel.";
+ closed = true;
- if (groupSelfRemoveInfo.isValid()) {
- debug() << " Group: removed by " << groupSelfRemoveInfo.actor();
- debug() << " because of " << groupSelfRemoveInfo.reason();
- debug() << " with message" << groupSelfRemoveInfo.message();
- }
- }
-
- readiness = newReadiness;
+ debug() << "R.I.P. Channel.";
- if (readiness == ReadinessDead || readiness == ReadinessClosed) {
- emit parent->closed();
+ if (groupSelfRemoveInfo.isValid()) {
+ debug() << " Group: removed by " << groupSelfRemoveInfo.actor();
+ debug() << " because of " << groupSelfRemoveInfo.reason();
+ debug() << " with message" << groupSelfRemoveInfo.message();
}
+
+ emit parent->closed();
}
/**
@@ -562,8 +508,11 @@ Channel::Channel(Connection *connection,
OptionalInterfaceFactory<Channel>(this),
mPriv(new Private(this, connection))
{
- mPriv->introspectQueue.enqueue(&Private::introspectMain);
- QTimer::singleShot(0, this, SLOT(continueIntrospection()));
+ // no need to start introspection if channel is already closed
+ if (!mPriv->closed) {
+ mPriv->introspectQueue.enqueue(&Private::introspectMain);
+ QTimer::singleShot(0, this, SLOT(continueIntrospection()));
+ }
}
/**
@@ -594,15 +543,12 @@ QStringList Channel::interfaces() const
// Different check than the others, because the optional interface getters
// may be used internally with the knowledge about getting the interfaces
// list, so we don't want this to cause warnings.
- if (mPriv->readiness < Private::ReadinessFull && mPriv->interfaces.empty()) {
+ if (!isReady() && mPriv->interfaces.empty()) {
warning() << "Channel::interfaces() used possibly before the list of "
"interfaces has been received";
}
- else if (mPriv->readiness == Private::ReadinessDead) {
- warning() << "Channel::interfaces() used with readiness ReadinessDead";
- }
- else if (mPriv->readiness == Private::ReadinessClosed) {
- warning() << "Channel::interfaces() used with readiness ReadinessClosed";
+ else if (mPriv->closed) {
+ warning() << "Channel::interfaces() used with channel closed";
}
return mPriv->interfaces;
@@ -617,18 +563,13 @@ QString Channel::channelType() const
{
// Similarly, we don't want warnings triggered when using the type interface
// proxies internally.
- if (mPriv->readiness < Private::ReadinessFull && mPriv->channelType.isEmpty()) {
+ if (!isReady() && mPriv->channelType.isEmpty()) {
warning() << "Channel::channelType() before the channel type has "
"been received";
}
- else if (mPriv->readiness == Private::ReadinessDead) {
- warning() << "Channel::channelType() used with readiness ReadinessDead";
+ else if (mPriv->closed) {
+ warning() << "Channel::channelType() used with channel closed";
}
- // Channel type will still be valid if the channel has been closed after
- // introspection completed successfully.
- // else if (mPriv->readiness == Private::ReadinessClosed) {
- // warning() << "Channel::channelType() used with readiness ReadinessClosed";
- // }
return mPriv->channelType;
}
@@ -640,9 +581,8 @@ QString Channel::channelType() const
*/
uint Channel::targetHandleType() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::targetHandleType() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::targetHandleType() used channel not ready";
}
return mPriv->targetHandleType;
@@ -656,9 +596,8 @@ uint Channel::targetHandleType() const
*/
uint Channel::targetHandle() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::targetHandle() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::targetHandle() used channel not ready";
}
return mPriv->targetHandle;
@@ -676,7 +615,7 @@ uint Channel::targetHandle() const
*/
bool Channel::isReady(Features features) const
{
- return (mPriv->readiness == Private::ReadinessFull)
+ return mPriv->ready
&& ((mPriv->features & features) == features);
}
@@ -691,6 +630,11 @@ bool Channel::isReady(Features features) const
*/
PendingOperation *Channel::becomeReady(Features features)
{
+ if (mPriv->closed) {
+ return new PendingFailure(this, TELEPATHY_ERROR_NOT_AVAILABLE,
+ "Channel is already closed");
+ }
+
if (isReady(features)) {
return new PendingSuccess(this);
}
@@ -713,8 +657,7 @@ PendingOperation *Channel::becomeReady(Features features)
*/
bool Channel::isClosed() const
{
- return (mPriv->readiness == Private::ReadinessClosed ||
- mPriv->readiness == Private::ReadinessDead);
+ return mPriv->closed;
}
/**
@@ -728,9 +671,9 @@ bool Channel::isClosed() const
*/
PendingOperation *Channel::requestClose()
{
- // Closing a channel does not make sense if it is already dead or closed.
- if ((mPriv->readiness == Private::ReadinessDead) ||
- (mPriv->readiness == Private::ReadinessClosed)) {
+ // Closing a channel does not make sense if it is already closed,
+ // just silently returns.
+ if (mPriv->closed) {
return new PendingSuccess(this);
}
@@ -784,9 +727,8 @@ PendingOperation *Channel::requestClose()
*/
uint Channel::groupFlags() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::groupFlags() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::groupFlags() used channel not ready";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupFlags() used with no group interface";
@@ -802,9 +744,8 @@ uint Channel::groupFlags() const
*/
QSet<uint> Channel::groupMembers() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::groupMembers() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::groupMembers() used channel not ready";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupMembers() used with no group interface";
@@ -834,9 +775,8 @@ QSet<uint> Channel::groupMembers() const
*/
Channel::GroupMemberChangeInfoMap Channel::groupLocalPending() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::groupLocalPending() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::groupLocalPending() used channel not ready";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupLocalPending() used with no group interface";
@@ -853,9 +793,8 @@ Channel::GroupMemberChangeInfoMap Channel::groupLocalPending() const
*/
QSet<uint> Channel::groupRemotePending() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::groupRemotePending() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::groupRemotePending() used channel not ready";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupRemotePending() used with no "
@@ -890,9 +829,8 @@ QSet<uint> Channel::groupRemotePending() const
*/
bool Channel::groupAreHandleOwnersAvailable() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::groupAreHandleOwnersAvailable() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::groupAreHandleOwnersAvailable() used channel not ready";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupAreHandleOwnersAvailable() used with "
@@ -916,16 +854,15 @@ bool Channel::groupAreHandleOwnersAvailable() const
*/
HandleOwnerMap Channel::groupHandleOwners() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::groupHandleOwners() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::groupHandleOwners() used channel not ready";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupAreHandleOwnersAvailable() used with no "
"group interface";
}
else if (!groupAreHandleOwnersAvailable()) {
- warning() << "Channel::areHandleOwnersAvailable() used, but handle "
+ warning() << "Channel::groupAreHandleOwnersAvailable() used, but handle "
"owners not available";
}
@@ -943,9 +880,8 @@ HandleOwnerMap Channel::groupHandleOwners() const
*/
bool Channel::groupIsSelfHandleTracked() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::isSelfHandleTracked() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::groupIsSelfHandleTracked() used channel not ready";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupIsSelfHandleTracked() used with "
@@ -964,9 +900,8 @@ bool Channel::groupIsSelfHandleTracked() const
*/
uint Channel::groupSelfHandle() const
{
- if (mPriv->readiness != Private::ReadinessFull) {
- warning() << "Channel::groupSelfHandle() used with readiness" <<
- mPriv->readiness << "!= ReadinessFull";
+ if (!isReady()) {
+ warning() << "Channel::groupSelfHandle() used channel not ready";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupSelfHandle() used with "
@@ -997,9 +932,8 @@ uint Channel::groupSelfHandle() const
*/
Channel::GroupMemberChangeInfo Channel::groupSelfRemoveInfo() const
{
- if (mPriv->readiness != Private::ReadinessClosed) {
- warning() << "Channel::groupSelfRemoveInfo() used with readiness" <<
- mPriv->readiness << "!= ReadinessClosed";
+ if (!mPriv->closed) {
+ warning() << "Channel::groupSelfRemoveInfo() used channel not closed";
}
else if (!mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
warning() << "Channel::groupSelfRemoveInfo() used with "
@@ -1311,10 +1245,7 @@ void Channel::gotChannelType(QDBusPendingCallWatcher *watcher)
warning().nospace() << "Channel::GetChannelType() failed with " <<
reply.error().name() << ": " << reply.error().message() <<
", Channel officially dead";
- if ((mPriv->readiness != Private::ReadinessDead) &&
- (mPriv->readiness != Private::ReadinessClosed)) {
- mPriv->changeReadiness(Private::ReadinessDead);
- }
+ mPriv->setClosed();
return;
}
@@ -1331,10 +1262,7 @@ void Channel::gotHandle(QDBusPendingCallWatcher *watcher)
warning().nospace() << "Channel::GetHandle() failed with " <<
reply.error().name() << ": " << reply.error().message() <<
", Channel officially dead";
- if ((mPriv->readiness != Private::ReadinessDead) &&
- (mPriv->readiness != Private::ReadinessClosed)) {
- mPriv->changeReadiness(Private::ReadinessDead);
- }
+ mPriv->setClosed();
return;
}
@@ -1352,10 +1280,7 @@ void Channel::gotInterfaces(QDBusPendingCallWatcher *watcher)
warning().nospace() << "Channel::GetInterfaces() failed with " <<
reply.error().name() << ": " << reply.error().message() <<
", Channel officially dead";
- if ((mPriv->readiness != Private::ReadinessDead) &&
- (mPriv->readiness != Private::ReadinessClosed)) {
- mPriv->changeReadiness(Private::ReadinessDead);
- }
+ mPriv->setClosed();
return;
}
@@ -1369,13 +1294,7 @@ void Channel::onClosed()
{
debug() << "Got Channel::Closed";
- if (mPriv->readiness == Private::ReadinessFull) {
- mPriv->changeReadiness(Private::ReadinessClosed);
- }
- else if ((mPriv->readiness != Private::ReadinessDead) &&
- (mPriv->readiness != Private::ReadinessClosed)) {
- mPriv->changeReadiness(Private::ReadinessDead);
- }
+ mPriv->setClosed();
// I think this is the nearest error code we can get at the moment
invalidate(TELEPATHY_ERROR_CANCELLED, "Closed");
@@ -1383,11 +1302,9 @@ void Channel::onClosed()
void Channel::onConnectionInvalidated()
{
- if (mPriv->readiness != Private::ReadinessDead) {
- debug() << "Owning connection died leaving an orphan Channel, "
- "changing to ReadinessDead";
- mPriv->changeReadiness(Private::ReadinessDead);
- }
+ debug() << "Owning connection died leaving an orphan Channel, "
+ "changing to closed";
+ mPriv->setClosed();
}
void Channel::onConnectionDestroyed()
@@ -1687,20 +1604,42 @@ void Channel::onSelfHandleChanged(uint newSelfHandle)
void Channel::continueIntrospection()
{
- if (mPriv->readiness < Private::ReadinessFull) {
- if (mPriv->introspectQueue.isEmpty()) {
- mPriv->changeReadiness(Private::ReadinessFull);
-
- if (mPriv->pendingReady) {
- mPriv->pendingReady->setFinished();
- // it will delete itself later
- mPriv->pendingReady = 0;
- }
+ if (mPriv->introspectQueue.isEmpty()) {
+ mPriv->ready = true;
+
+ if (mPriv->pendingReady) {
+ mPriv->pendingReady->setFinished();
+ // it will delete itself later
+ mPriv->pendingReady = 0;
}
- else {
- (mPriv->*(mPriv->introspectQueue.dequeue()))();
+
+ debug() << "Channel fully ready";
+ debug() << " Channel type" << mPriv->channelType;
+ debug() << " Target handle" << mPriv->targetHandle;
+ debug() << " Target handle type" << mPriv->targetHandleType;
+
+ if (mPriv->interfaces.contains(TELEPATHY_INTERFACE_CHANNEL_INTERFACE_GROUP)) {
+ debug() << " Group: flags" << mPriv->groupFlags;
+ if (mPriv->groupAreHandleOwnersAvailable) {
+ debug() << " Group: Number of handle owner mappings" <<
+ mPriv->groupHandleOwners.size();
+ }
+ else {
+ debug() << " Group: No handle owners property present";
+ }
+ debug() << " Group: Number of current members" <<
+ mPriv->groupMembers.size();
+ debug() << " Group: Number of local pending members" <<
+ mPriv->groupLocalPending.size();
+ debug() << " Group: Number of remote pending members" <<
+ mPriv->groupRemotePending.size();
+ debug() << " Group: Self handle" << mPriv->groupSelfHandle <<
+ "tracked:" << (mPriv->groupIsSelfHandleTracked ? "yes" : "no");
}
}
+ else {
+ (mPriv->*(mPriv->introspectQueue.dequeue()))();
+ }
}
/**
--
1.5.6.5
More information about the telepathy-commits
mailing list