[telepathy-qt4/master] Use a private implementation for Channel::GroupMemberChangeDetails

Olli Salli "XXX CHANGETHISINVALIDADDRESSTOSOMETHINGSENSIBLEWHENWORKINGONANEWREPOXXX" at dhansak.collabora.co.uk
Tue Jun 30 11:51:41 PDT 2009


---
 TelepathyQt4/channel.cpp |   51 ++++++++++++++++++++++++++++++++++++++++++++++
 TelepathyQt4/channel.h   |   41 +++++++++++++++++++-----------------
 2 files changed, 73 insertions(+), 19 deletions(-)

diff --git a/TelepathyQt4/channel.cpp b/TelepathyQt4/channel.cpp
index a85ab70..7c83e57 100644
--- a/TelepathyQt4/channel.cpp
+++ b/TelepathyQt4/channel.cpp
@@ -38,6 +38,7 @@
 
 #include <QHash>
 #include <QQueue>
+#include <QSharedData>
 #include <QTimer>
 
 /**
@@ -1541,6 +1542,56 @@ Contacts Channel::groupRemotePendingContacts() const
     return mPriv->groupRemotePendingContacts.values().toSet();
 }
 
+struct Channel::GroupMemberChangeDetails::Private : public QSharedData
+{
+    ContactPtr actor;
+    QVariantMap details;
+
+    Private(const ContactPtr &actor, const QVariantMap &details)
+        : actor(actor), details(details) {}
+};
+
+Channel::GroupMemberChangeDetails::GroupMemberChangeDetails()
+{
+}
+
+Channel::GroupMemberChangeDetails::GroupMemberChangeDetails(const GroupMemberChangeDetails &other)
+    : mPriv(other.mPriv)
+{
+}
+
+Channel::GroupMemberChangeDetails::~GroupMemberChangeDetails()
+{
+}
+
+Channel::GroupMemberChangeDetails &Channel::GroupMemberChangeDetails::operator=(
+        const GroupMemberChangeDetails &other)
+{
+    this->mPriv = other.mPriv;
+    return *this;
+}
+
+bool Channel::GroupMemberChangeDetails::hasActor() const
+{
+    return isValid() && !mPriv->actor.isNull();
+}
+
+ContactPtr Channel::GroupMemberChangeDetails::actor() const
+{
+    return isValid() ? mPriv->actor : ContactPtr();
+}
+
+QVariantMap Channel::GroupMemberChangeDetails::allDetails() const
+{
+    return isValid() ? mPriv->details : QVariantMap();
+}
+
+Channel::GroupMemberChangeDetails::GroupMemberChangeDetails(const ContactPtr &actor,
+        const QVariantMap &details)
+    : mPriv(new Private(actor, details))
+{
+}
+
 /**
  * Return information of a local pending contact change. If
  * no information is available, an object for which
diff --git a/TelepathyQt4/channel.h b/TelepathyQt4/channel.h
index 4dd7d4f..7eca198 100644
--- a/TelepathyQt4/channel.h
+++ b/TelepathyQt4/channel.h
@@ -39,6 +39,7 @@
 #include <TelepathyQt4/SharedPtr>
 
 #include <QSet>
+#include <QSharedDataPointer>
 #include <QVariantMap>
 
 namespace Tp
@@ -102,37 +103,39 @@ public:
     class GroupMemberChangeDetails
     {
     public:
-        GroupMemberChangeDetails()
-            : mIsValid(false) {}
+        GroupMemberChangeDetails();
+        GroupMemberChangeDetails(const GroupMemberChangeDetails &other);
+        ~GroupMemberChangeDetails();
 
-        bool isValid() const { return mIsValid; }
+        GroupMemberChangeDetails &operator=(const GroupMemberChangeDetails &other);
 
-        bool hasActor() const { return !mActor.isNull(); }
-        ContactPtr actor() const { return mActor; }
+        bool isValid() const { return mPriv.constData() != 0; }
 
-        bool hasReason() const { return mDetails.contains("change-reason"); }
-        uint reason() const { return qdbus_cast<uint>(mDetails.value("change-reason")); }
+        bool hasActor() const;
+        ContactPtr actor() const;
 
-        bool hasMessage() const { return mDetails.contains("message"); }
-        QString message () const { return qdbus_cast<QString>(mDetails.value("message")); }
+        bool hasReason() const { return allDetails().contains("change-reason"); }
+        uint reason() const { return qdbus_cast<uint>(allDetails().value("change-reason")); }
 
-        bool hasError() const { return mDetails.contains("error"); }
-        QString error() const { return qdbus_cast<QString>(mDetails.value("error")); }
+        bool hasMessage() const { return allDetails().contains("message"); }
+        QString message () const { return qdbus_cast<QString>(allDetails().value("message")); }
 
-        bool hasDebugMessage() const { return mDetails.contains("debug-message"); }
-        QString debugMessage() const { return qdbus_cast<QString>(mDetails.value("debug-message")); }
+        bool hasError() const { return allDetails().contains("error"); }
+        QString error() const { return qdbus_cast<QString>(allDetails().value("error")); }
 
-        QVariantMap allDetails() const { return mDetails; }
+        bool hasDebugMessage() const { return allDetails().contains("debug-message"); }
+        QString debugMessage() const { return qdbus_cast<QString>(allDetails().value("debug-message")); }
+
+        QVariantMap allDetails() const;
 
     private:
         friend class Channel;
 
-        GroupMemberChangeDetails(const ContactPtr &actor, const QVariantMap &details)
-            : mActor(actor), mDetails(details), mIsValid(true) {}
+        GroupMemberChangeDetails(const ContactPtr &actor, const QVariantMap &details);
 
-        ContactPtr mActor;
-        QVariantMap mDetails;
-        bool mIsValid;
+        struct Private;
+        friend struct Private;
+        QSharedDataPointer<Private> mPriv;
     };
 
     GroupMemberChangeDetails groupLocalPendingContactChangeInfo(const ContactPtr &contact) const;
-- 
1.5.6.5




More information about the telepathy-commits mailing list