diff options
author | Kevin Smith <git@kismith.co.uk> | 2010-09-18 20:58:48 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2010-10-01 11:38:56 (GMT) |
commit | 5a91a3ef54c00a6d4d960725f2ff84b5e0c43cab (patch) | |
tree | de73910e121edc91f6eec2a9af863b7be8d352e3 /Swiften | |
parent | 5166d2def025a4fb1e3c4a723d90dc82669b36ee (diff) | |
download | swift-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.cpp | 21 | ||||
-rw-r--r-- | Swiften/Chat/ChatStateNotifier.h | 2 | ||||
-rw-r--r-- | Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp | 6 | ||||
-rw-r--r-- | Swiften/Elements/ChatState.h | 2 |
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_; }; |