summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Smith <git@kismith.co.uk>2010-09-18 20:58:48 (GMT)
committerKevin Smith <git@kismith.co.uk>2010-10-01 11:38:56 (GMT)
commit5a91a3ef54c00a6d4d960725f2ff84b5e0c43cab (patch)
treede73910e121edc91f6eec2a9af863b7be8d352e3 /Swiften
parent5166d2def025a4fb1e3c4a723d90dc82669b36ee (diff)
downloadswift-5a91a3ef54c00a6d4d960725f2ff84b5e0c43cab.zip
swift-5a91a3ef54c00a6d4d960725f2ff84b5e0c43cab.tar.bz2
Use caps for enabling chat state notifications.
Resolves: #93
Diffstat (limited to 'Swiften')
-rw-r--r--Swiften/Chat/ChatStateNotifier.cpp21
-rw-r--r--Swiften/Chat/ChatStateNotifier.h2
-rw-r--r--Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp6
-rw-r--r--Swiften/Elements/ChatState.h2
4 files changed, 20 insertions, 11 deletions
diff --git a/Swiften/Chat/ChatStateNotifier.cpp b/Swiften/Chat/ChatStateNotifier.cpp
index 5024958..667c244 100644
--- a/Swiften/Chat/ChatStateNotifier.cpp
+++ b/Swiften/Chat/ChatStateNotifier.cpp
@@ -9,18 +9,22 @@
namespace Swift {
ChatStateNotifier::ChatStateNotifier() {
- contactHas85Caps_ = false;
- isInConversation_ = false;
- contactHasSentActive_ = false;
- userIsTyping_ = false;
+ contactJIDHasChanged();
}
void ChatStateNotifier::setContactHas85Caps(bool hasCaps) {
contactHas85Caps_ = hasCaps;
}
+void ChatStateNotifier::contactJIDHasChanged() {
+ contactHasSentActive_ = false;
+ contactHas85Caps_ = false;
+ userIsTyping_ = false;
+}
+
void ChatStateNotifier::setUserIsTyping() {
- if (contactShouldReceiveStates() && !userIsTyping_) {
+ bool should = contactShouldReceiveStates();
+ if (should && !userIsTyping_) {
userIsTyping_ = true;
onChatStateChanged(ChatState::Composing);
}
@@ -38,14 +42,15 @@ void ChatStateNotifier::userCancelledNewMessage() {
}
void ChatStateNotifier::receivedMessageFromContact(bool hasActiveElement) {
- isInConversation_ = true;
contactHasSentActive_ = hasActiveElement;
}
bool ChatStateNotifier::contactShouldReceiveStates() {
/* So, yes, the XEP says to look at caps, but it also says that once you've
- heard from the contact, the active state overrides this.*/
- return contactHasSentActive_ || (contactHas85Caps_ && !isInConversation_);;
+ heard from the contact, the active state overrides this.
+ *HOWEVER* it says that the MUST NOT send csn if you haven't received
+ active is OPTIONAL behaviour for if you haven't got caps.*/
+ return contactHasSentActive_ || contactHas85Caps_ ;
}
}
diff --git a/Swiften/Chat/ChatStateNotifier.h b/Swiften/Chat/ChatStateNotifier.h
index 71febfa..8dcd5cd 100644
--- a/Swiften/Chat/ChatStateNotifier.h
+++ b/Swiften/Chat/ChatStateNotifier.h
@@ -21,11 +21,11 @@ namespace Swift {
void userCancelledNewMessage();
void receivedMessageFromContact(bool hasActiveElement);
bool contactShouldReceiveStates();
+ void contactJIDHasChanged();
boost::signal<void (ChatState::ChatStateType)> onChatStateChanged;
private:
bool contactHas85Caps_;
- bool isInConversation_;
bool contactHasSentActive_;
bool userIsTyping_;
};
diff --git a/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp b/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
index 712ba10..2fa4c26 100644
--- a/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
+++ b/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
@@ -114,7 +114,11 @@ public:
void testContactShouldReceiveStates_ActiveOverrideOff() {
notifier_->setContactHas85Caps(true);
notifier_->receivedMessageFromContact(false);
- CPPUNIT_ASSERT_EQUAL(false, notifier_->contactShouldReceiveStates());
+ /* I originally read the MUST NOT send after receiving without Active and
+ * thought this should check for false, but I later found it was OPTIONAL
+ * (MAY) behaviour only for if you didn't receive caps.
+ */
+ CPPUNIT_ASSERT_EQUAL(true, notifier_->contactShouldReceiveStates());
}
diff --git a/Swiften/Elements/ChatState.h b/Swiften/Elements/ChatState.h
index 8dcf77c..8a96bf1 100644
--- a/Swiften/Elements/ChatState.h
+++ b/Swiften/Elements/ChatState.h
@@ -19,7 +19,7 @@ namespace Swift {
ChatStateType getChatState() { return state_; }
void setChatState(ChatStateType state) {state_ = state;}
-
+ static String getFeatureNamespace() {return "http://jabber.org/protocol/chatstates";}
private:
ChatStateType state_;
};