From 0b4e062a59613b2597b712c0106c3ed08b747637 Mon Sep 17 00:00:00 2001
From: Edwin Mons <edwin.mons@isode.com>
Date: Thu, 8 Nov 2018 15:12:36 +0100
Subject: Change unread counters to size_t

Since the counters cannot be negative, changing the type used for unread
counters to size_t seems a better fit, and it avoids the need for
numeric_casts.

Test-Information:

Unit tests pass on macOS 10.13

Change-Id: I61badcfc410f0cce7f922da90b50ef5a809c6521

diff --git a/Swift/Controllers/Chat/ChatControllerBase.cpp b/Swift/Controllers/Chat/ChatControllerBase.cpp
index 8a26a56..3805084 100644
--- a/Swift/Controllers/Chat/ChatControllerBase.cpp
+++ b/Swift/Controllers/Chat/ChatControllerBase.cpp
@@ -118,8 +118,8 @@ void ChatControllerBase::handleAllMessagesRead() {
     }
 }
 
-int ChatControllerBase::getUnreadCount() {
-    return boost::numeric_cast<int>(targetedUnreadMessages_.size());
+size_t ChatControllerBase::getUnreadCount() {
+    return targetedUnreadMessages_.size();
 }
 
 void ChatControllerBase::handleSendMessageRequest(const std::string &body, bool isCorrectionMessage) {
@@ -193,11 +193,10 @@ ChatWindow::ChatMessage ChatControllerBase::buildChatWindowChatMessage(const std
 }
 
 void ChatControllerBase::updateMessageCount() {
-    int intCount = boost::numeric_cast<int>(unreadMessages_.size());
-    chatWindow_->setUnreadMessageCount(intCount);
     auto baseJID = getBaseJID();
     auto state = chattables_.getState(baseJID);
-    state.unreadCount = intCount;
+    state.unreadCount = unreadMessages_.size();
+    chatWindow_->setUnreadMessageCount(state.unreadCount);
     chattables_.setState(baseJID, state);
 #ifndef NOT_YET
     onUnreadCountChanged();
diff --git a/Swift/Controllers/Chat/ChatControllerBase.h b/Swift/Controllers/Chat/ChatControllerBase.h
index 527196c..92c6175 100644
--- a/Swift/Controllers/Chat/ChatControllerBase.h
+++ b/Swift/Controllers/Chat/ChatControllerBase.h
@@ -73,7 +73,7 @@ namespace Swift {
             boost::signals2::signal<void (const std::string& /*activity*/)> onActivity;
             boost::signals2::signal<void ()> onUnreadCountChanged;
             boost::signals2::signal<void ()> onWindowClosed;
-            int getUnreadCount();
+            size_t getUnreadCount();
             const JID& getToJID() {return toJID_;}
             void handleCapsChanged(const JID& jid);
             void setCanStartImpromptuChats(bool supportsImpromptu);
diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp
index 532b925..6530a7e 100644
--- a/Swift/Controllers/Chat/ChatsManager.cpp
+++ b/Swift/Controllers/Chat/ChatsManager.cpp
@@ -372,7 +372,7 @@ void ChatsManager::handleMUCBookmarkRemoved(const MUCBookmark& bookmark) {
 
 #ifndef NOT_YET
 ChatListWindow::Chat ChatsManager::createChatListChatItem(const JID& jid, const std::string& activity, bool privateMessage) {
-    int unreadCount = 0;
+    size_t unreadCount = 0;
     if (mucRegistry_->isMUC(jid)) {
         MUCController* controller = mucControllers_[jid.toBare()];
         StatusShow::Type type = StatusShow::None;
@@ -447,7 +447,7 @@ void ChatsManager::handleChatClosed(const JID& /*jid*/) {
 #ifndef NOT_YET
 
 void ChatsManager::handleUnreadCountChanged(ChatControllerBase* controller) {
-    int unreadTotal = 0;
+    size_t unreadTotal = 0;
     bool controllerIsMUC = dynamic_cast<MUCController*>(controller);
     bool isPM = controller && !controllerIsMUC && mucRegistry_->isMUC(controller->getToJID().toBare());
     for (ChatListWindow::Chat& chatItem : recentChats_) {
diff --git a/Swift/Controllers/Chat/Chattables.h b/Swift/Controllers/Chat/Chattables.h
index c115fb3..3b5817a 100644
--- a/Swift/Controllers/Chat/Chattables.h
+++ b/Swift/Controllers/Chat/Chattables.h
@@ -22,7 +22,7 @@ class Chattables {
             JID jid;
             /// Empty for no name
             std::string name;
-            int unreadCount = 0;
+            size_t unreadCount = 0;
             Type type;
             StatusShow::Type status = StatusShow::None;
             //avatar
diff --git a/Swift/Controllers/Chat/UnitTest/ChattablesTest.cpp b/Swift/Controllers/Chat/UnitTest/ChattablesTest.cpp
index e052aff..f30e3fd 100644
--- a/Swift/Controllers/Chat/UnitTest/ChattablesTest.cpp
+++ b/Swift/Controllers/Chat/UnitTest/ChattablesTest.cpp
@@ -9,6 +9,9 @@
 
 #include <Swift/Controllers/Chat/Chattables.h>
 
+// Clang wrongly things that tests for 0 are using 0 as null.
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+
 using namespace Swift;
 
 class ChattablesTest : public ::testing::Test {
diff --git a/Swift/Controllers/Chat/UnitTest/MockChatListWindow.h b/Swift/Controllers/Chat/UnitTest/MockChatListWindow.h
index 395b050..1d980d3 100644
--- a/Swift/Controllers/Chat/UnitTest/MockChatListWindow.h
+++ b/Swift/Controllers/Chat/UnitTest/MockChatListWindow.h
@@ -20,7 +20,7 @@ namespace Swift {
             void removeWhiteboardSession(const JID& /*jid*/) {}
             void setBookmarksEnabled(bool /*enabled*/) {}
             void setRecents(const std::list<ChatListWindow::Chat>& /*recents*/) {}
-            void setUnreadCount(int /*unread*/) {}
+            void setUnreadCount(size_t /*unread*/) {}
             void clearBookmarks() {}
             void setOnline(bool /*isOnline*/) {}
     };
diff --git a/Swift/Controllers/Storages/CertificateFileStorage.cpp b/Swift/Controllers/Storages/CertificateFileStorage.cpp
index 3fe6d54..8ba7d12 100644
--- a/Swift/Controllers/Storages/CertificateFileStorage.cpp
+++ b/Swift/Controllers/Storages/CertificateFileStorage.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
diff --git a/Swift/Controllers/UIInterfaces/ChatListWindow.h b/Swift/Controllers/UIInterfaces/ChatListWindow.h
index 29097e9..6aa729b 100644
--- a/Swift/Controllers/UIInterfaces/ChatListWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatListWindow.h
@@ -26,7 +26,7 @@ namespace Swift {
             class Chat {
                 public:
                     Chat() : statusType(StatusShow::None), isMUC(false), unreadCount(0), isPrivateMessage(false) {}
-                    Chat(const JID& jid, const std::string& chatName, const std::string& activity, int unreadCount, StatusShow::Type statusType, const boost::filesystem::path& avatarPath, bool isMUC, bool isPrivateMessage = false, const std::string& nick = "", const boost::optional<std::string> password = boost::optional<std::string>())
+                    Chat(const JID& jid, const std::string& chatName, const std::string& activity, size_t unreadCount, StatusShow::Type statusType, const boost::filesystem::path& avatarPath, bool isMUC, bool isPrivateMessage = false, const std::string& nick = "", const boost::optional<std::string> password = boost::optional<std::string>())
                     : jid(jid), chatName(chatName), activity(activity), statusType(statusType), isMUC(isMUC), nick(nick), password(password), unreadCount(unreadCount), avatarPath(avatarPath), isPrivateMessage(isPrivateMessage) {}
                     /** Assume that nicks and other transient features aren't important for equality */
                     bool operator==(const Chat& other) const {
@@ -53,7 +53,7 @@ namespace Swift {
                             return key_compare(inviteesNames, other.inviteesNames);
                         }
                     }
-                    void setUnreadCount(int unread) {
+                    void setUnreadCount(size_t unread) {
                         unreadCount = unread;
                     }
                     void setStatusType(StatusShow::Type type) {
@@ -93,7 +93,7 @@ namespace Swift {
                     bool isMUC;
                     std::string nick;
                     boost::optional<std::string> password;
-                    int unreadCount;
+                    size_t unreadCount;
                     boost::filesystem::path avatarPath;
                     std::map<std::string, JID> impromptuJIDs;
                     std::map<JID, std::string> inviteesNames;
@@ -107,7 +107,7 @@ namespace Swift {
             virtual void removeWhiteboardSession(const JID& jid) = 0;
             virtual void removeMUCBookmark(const MUCBookmark& bookmark) = 0;
             virtual void setRecents(const std::list<Chat>& recents) = 0;
-            virtual void setUnreadCount(int unread) = 0;
+            virtual void setUnreadCount(size_t unread) = 0;
             virtual void clearBookmarks() = 0;
             virtual void setOnline(bool isOnline) = 0;
 
diff --git a/Swift/Controllers/UIInterfaces/ChatWindow.h b/Swift/Controllers/UIInterfaces/ChatWindow.h
index daece0e..1c36ffc 100644
--- a/Swift/Controllers/UIInterfaces/ChatWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatWindow.h
@@ -202,7 +202,7 @@ namespace Swift {
             virtual void setSecurityLabelsEnabled(bool enabled) = 0;
             virtual void setCorrectionEnabled(Tristate enabled) = 0;
             virtual void setFileTransferEnabled(Tristate enabled) = 0;
-            virtual void setUnreadMessageCount(int count) = 0;
+            virtual void setUnreadMessageCount(size_t count) = 0;
             virtual void convertToMUC(MUCType mucType) = 0;
 //            virtual TreeWidget *getTreeWidget() = 0;
             virtual void setSecurityLabelsError() = 0;
diff --git a/Swift/Controllers/UnitTest/MockChatWindow.h b/Swift/Controllers/UnitTest/MockChatWindow.h
index 389d787..38b3b1f 100644
--- a/Swift/Controllers/UnitTest/MockChatWindow.h
+++ b/Swift/Controllers/UnitTest/MockChatWindow.h
@@ -73,7 +73,7 @@ namespace Swift {
             virtual void activate() {}
             virtual void setAvailableSecurityLabels(const std::vector<SecurityLabelsCatalog::Item>& labels) {labels_ = labels;}
             virtual void setSecurityLabelsEnabled(bool enabled) {labelsEnabled_ = enabled;}
-            virtual void setUnreadMessageCount(int /*count*/) {}
+            virtual void setUnreadMessageCount(size_t /*count*/) {}
 
             virtual void convertToMUC(MUCType mucType) {
                 mucType_ = mucType;
diff --git a/Swift/QtUI/ChatList/QtChatListWindow.cpp b/Swift/QtUI/ChatList/QtChatListWindow.cpp
index e92ba0d..2fd05c4 100644
--- a/Swift/QtUI/ChatList/QtChatListWindow.cpp
+++ b/Swift/QtUI/ChatList/QtChatListWindow.cpp
@@ -130,7 +130,7 @@ void QtChatListWindow::setRecents(const std::list<ChatListWindow::Chat>& recents
     model_->setRecents(recents);
 }
 
-void QtChatListWindow::setUnreadCount(int unread) {
+void QtChatListWindow::setUnreadCount(size_t unread) {
     emit onCountUpdated(unread);
 }
 
diff --git a/Swift/QtUI/ChatList/QtChatListWindow.h b/Swift/QtUI/ChatList/QtChatListWindow.h
index 001650c..3322001 100644
--- a/Swift/QtUI/ChatList/QtChatListWindow.h
+++ b/Swift/QtUI/ChatList/QtChatListWindow.h
@@ -27,12 +27,12 @@ namespace Swift {
             void removeWhiteboardSession(const JID& jid);
             void setBookmarksEnabled(bool enabled);
             void setRecents(const std::list<ChatListWindow::Chat>& recents);
-            void setUnreadCount(int unread);
+            void setUnreadCount(size_t unread);
             void clearBookmarks();
             virtual void setOnline(bool isOnline);
 
         signals:
-            void onCountUpdated(int count);
+            void onCountUpdated(size_t count);
         private slots:
             void handleItemActivated(const QModelIndex&);
             void handleEditBookmark();
diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp
index a413b4d..82c65ce 100644
--- a/Swift/QtUI/QtChatWindow.cpp
+++ b/Swift/QtUI/QtChatWindow.cpp
@@ -505,7 +505,7 @@ void QtChatWindow::showEvent(QShowEvent* event) {
     QWidget::showEvent(event);
 }
 
-void QtChatWindow::setUnreadMessageCount(int count) {
+void QtChatWindow::setUnreadMessageCount(size_t count) {
     if (unreadCount_ != count) {
         unreadCount_ = count;
         updateTitleWithUnreadCount();
@@ -547,7 +547,7 @@ void QtChatWindow::flash() {
     emit requestFlash();
 }
 
-int QtChatWindow::getCount() {
+size_t QtChatWindow::getCount() {
     return unreadCount_;
 }
 
diff --git a/Swift/QtUI/QtChatWindow.h b/Swift/QtUI/QtChatWindow.h
index 8cc3283..b876d1e 100644
--- a/Swift/QtUI/QtChatWindow.h
+++ b/Swift/QtUI/QtChatWindow.h
@@ -106,7 +106,7 @@ namespace Swift {
             void show();
             bool isVisible() const;
             void activate();
-            void setUnreadMessageCount(int count);
+            void setUnreadMessageCount(size_t count);
             void convertToMUC(MUCType mucType);
 //            TreeWidget *getTreeWidget();
             void setAvailableSecurityLabels(const std::vector<SecurityLabelsCatalog::Item>& labels);
@@ -119,7 +119,7 @@ namespace Swift {
             void setContactChatState(ChatState::ChatStateType state);
             void setRosterModel(Roster* roster);
             void setTabComplete(TabComplete* completer);
-            int getCount();
+            size_t getCount();
             virtual void replaceSystemMessage(const ChatMessage& message, const std::string& id, const TimestampBehaviour timestampBehaviour);
             void replaceLastMessage(const ChatMessage& message, const TimestampBehaviour timestampBehaviour);
             void setAckState(const std::string& id, AckState state);
@@ -201,7 +201,7 @@ namespace Swift {
             void handleFocusTimerTick();
 
         private:
-            int unreadCount_;
+            size_t unreadCount_;
             bool contactIsTyping_;
             LastLineTracker lastLineTracker_;
             std::string id_;
diff --git a/Swift/QtUI/QtTabbable.h b/Swift/QtUI/QtTabbable.h
index 5837702..63c60f4 100644
--- a/Swift/QtUI/QtTabbable.h
+++ b/Swift/QtUI/QtTabbable.h
@@ -19,7 +19,7 @@ namespace Swift {
 
             bool isWidgetSelected();
             virtual AlertType getWidgetAlertState() {return NoActivity;}
-            virtual int getCount() {return 0;}
+            virtual size_t getCount() {return 0;}
             virtual std::string getID() const = 0;
             virtual void setEmphasiseFocus(bool /*emphasise*/) {}
 
-- 
cgit v0.10.2-6-g49f6