[Telepathy-commits] [telepathy-qt4/master] Account: Make sure change signals are emitted only if the property changed.
Andre Moreira Magalhaes (andrunko)
andre.magalhaes at collabora.co.uk
Wed Feb 4 12:26:51 PST 2009
Make sure change signals are emitted only if the property changed, protect
against buggy AM impls.
---
TelepathyQt4/Client/account.cpp | 65 ++++++++++++++++++++++++++++-----------
1 files changed, 47 insertions(+), 18 deletions(-)
diff --git a/TelepathyQt4/Client/account.cpp b/TelepathyQt4/Client/account.cpp
index 30c6cf6..f702df4 100644
--- a/TelepathyQt4/Client/account.cpp
+++ b/TelepathyQt4/Client/account.cpp
@@ -808,60 +808,75 @@ void Account::updateProperties(const QVariantMap &props)
checkForAvatarInterface();
}
- if (props.contains("DisplayName")) {
+ if (props.contains("DisplayName") &&
+ mPriv->displayName != qdbus_cast<QString>(props["DisplayName"])) {
mPriv->displayName = qdbus_cast<QString>(props["DisplayName"]);
Q_EMIT displayNameChanged(mPriv->displayName);
}
- if (props.contains("Icon")) {
+ if (props.contains("Icon") &&
+ mPriv->icon != qdbus_cast<QString>(props["Icon"])) {
mPriv->icon = qdbus_cast<QString>(props["Icon"]);
Q_EMIT iconChanged(mPriv->icon);
}
- if (props.contains("Nickname")) {
+ if (props.contains("Nickname") &&
+ mPriv->nickname != qdbus_cast<QString>(props["Nickname"])) {
mPriv->nickname = qdbus_cast<QString>(props["Nickname"]);
Q_EMIT nicknameChanged(mPriv->icon);
}
- if (props.contains("NormalizedName")) {
+ if (props.contains("NormalizedName") &&
+ mPriv->normalizedName != qdbus_cast<QString>(props["NormalizedName"])) {
mPriv->normalizedName = qdbus_cast<QString>(props["NormalizedName"]);
Q_EMIT normalizedNameChanged(mPriv->normalizedName);
}
- if (props.contains("Valid")) {
+ if (props.contains("Valid") &&
+ mPriv->valid != qdbus_cast<bool>(props["Valid"])) {
mPriv->valid = qdbus_cast<bool>(props["Valid"]);
Q_EMIT validityChanged(mPriv->valid);
}
- if (props.contains("Enabled")) {
+ if (props.contains("Enabled") &&
+ mPriv->enabled != qdbus_cast<bool>(props["Enabled"])) {
mPriv->enabled = qdbus_cast<bool>(props["Enabled"]);
Q_EMIT stateChanged(mPriv->enabled);
}
- if (props.contains("ConnectAutomatically")) {
+ if (props.contains("ConnectAutomatically") &&
+ mPriv->connectsAutomatically !=
+ qdbus_cast<bool>(props["ConnectAutomatically"])) {
mPriv->connectsAutomatically =
qdbus_cast<bool>(props["ConnectAutomatically"]);
Q_EMIT connectsAutomaticallyPropertyChanged(mPriv->connectsAutomatically);
}
- if (props.contains("Parameters")) {
+ if (props.contains("Parameters") &&
+ mPriv->parameters != qdbus_cast<QVariantMap>(props["Parameters"])) {
mPriv->parameters = qdbus_cast<QVariantMap>(props["Parameters"]);
Q_EMIT parametersChanged(mPriv->parameters);
}
- if (props.contains("AutomaticPresence")) {
+ if (props.contains("AutomaticPresence") &&
+ mPriv->automaticPresence != qdbus_cast<Telepathy::SimplePresence>(
+ props["AutomaticPresence"])) {
mPriv->automaticPresence = qdbus_cast<Telepathy::SimplePresence>(
props["AutomaticPresence"]);
Q_EMIT automaticPresenceChanged(mPriv->automaticPresence);
}
- if (props.contains("CurrentPresence")) {
+ if (props.contains("CurrentPresence") &&
+ mPriv->currentPresence != qdbus_cast<Telepathy::SimplePresence>(
+ props["CurrentPresence"])) {
mPriv->currentPresence = qdbus_cast<Telepathy::SimplePresence>(
props["CurrentPresence"]);
Q_EMIT presenceChanged(mPriv->currentPresence);
}
- if (props.contains("RequestedPresence")) {
+ if (props.contains("RequestedPresence") &&
+ mPriv->requestedPresence != qdbus_cast<Telepathy::SimplePresence>(
+ props["RequestedPresence"])) {
mPriv->requestedPresence = qdbus_cast<Telepathy::SimplePresence>(
props["RequestedPresence"]);
Q_EMIT requestedPresenceChanged(mPriv->requestedPresence);
@@ -872,23 +887,37 @@ void Account::updateProperties(const QVariantMap &props)
if (path == QLatin1String("/")) {
path = QString();
}
- mPriv->connection.clear();
- mPriv->connectionObjectPath = path;
- emit haveConnectionChanged(!path.isEmpty());
+
+ if (mPriv->connectionObjectPath != path) {
+ mPriv->connection.clear();
+ mPriv->connectionObjectPath = path;
+ emit haveConnectionChanged(!path.isEmpty());
+ }
}
if (props.contains("ConnectionStatus") || props.contains("ConnectionStatusReason")) {
- if (props.contains("ConnectionStatus")) {
+ bool changed = false;
+
+ if (props.contains("ConnectionStatus") &&
+ mPriv->connectionStatus != Telepathy::ConnectionStatus(
+ qdbus_cast<uint>(props["ConnectionStatus"]))) {
mPriv->connectionStatus = Telepathy::ConnectionStatus(
qdbus_cast<uint>(props["ConnectionStatus"]));
+ changed = true;
}
- if (props.contains("ConnectionStatusReason")) {
+ if (props.contains("ConnectionStatusReason") &&
+ mPriv->connectionStatusReason != Telepathy::ConnectionStatusReason(
+ qdbus_cast<uint>(props["ConnectionStatusReason"]))) {
mPriv->connectionStatusReason = Telepathy::ConnectionStatusReason(
qdbus_cast<uint>(props["ConnectionStatusReason"]));
+ changed = true;
+ }
+
+ if (changed) {
+ Q_EMIT connectionStatusChanged(
+ mPriv->connectionStatus, mPriv->connectionStatusReason);
}
- Q_EMIT connectionStatusChanged(
- mPriv->connectionStatus, mPriv->connectionStatusReason);
}
}
--
1.5.6.5
More information about the telepathy-commits
mailing list