summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swift/Controllers/MainController.cpp11
-rw-r--r--Swiften/Elements/Presence.h4
2 files changed, 12 insertions, 3 deletions
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
index 29d67b5..946b7d0 100644
--- a/Swift/Controllers/MainController.cpp
+++ b/Swift/Controllers/MainController.cpp
@@ -202,17 +202,21 @@ void MainController::handleChangeStatusRequest(StatusShow::Type show, const Stri
if (presence->getType() != Presence::Unavailable && !client_->isAvailable()) {
performLoginFromCachedCredentials();
queuedPresence_ = presence;
- } else {
+ }
+ else {
sendPresence(presence);
}
}
void MainController::sendPresence(boost::shared_ptr<Presence> presence) {
+ // Copy presence before adding extra information
+ lastSentPresence_ = presence->clone();
+
+ // Add information and send
if (!vCardPhotoHash_.isEmpty()) {
presence->addPayload(boost::shared_ptr<VCardUpdate>(new VCardUpdate(vCardPhotoHash_)));
}
presence->addPayload(capsInfo_);
- lastSentPresence_ = presence;
presenceSender_->sendPresence(presence);
if (presence->getType() == Presence::Unavailable) {
logout();
@@ -233,7 +237,8 @@ void MainController::handleInputIdleChanged(bool idle) {
else {
if (client_) {
sendPresence(preIdlePresence_);
- } else {
+ }
+ else {
queuedPresence_ = preIdlePresence_;
}
}
diff --git a/Swiften/Elements/Presence.h b/Swiften/Elements/Presence.h
index a1f15fa..f748e44 100644
--- a/Swiften/Elements/Presence.h
+++ b/Swiften/Elements/Presence.h
@@ -52,6 +52,10 @@ namespace Swift {
updatePayload(boost::shared_ptr<Priority>(new Priority(priority)));
}
+ boost::shared_ptr<Presence> clone() const {
+ return boost::shared_ptr<Presence>(new Presence(*this));
+ }
+
private:
Presence::Type type_;
};