Prevent quasselclient from crashing when using the 'cancel' button of the 'Authorisat...
[quassel.git] / src / client / messagemodel.cpp
index ca77bfd..d10a9bc 100644 (file)
@@ -112,34 +112,25 @@ void MessageModel::insertMessageGroup(const QList<Message> &msglist) {
   int start = indexForId(msglist.first().msgId());
   int end = start + msglist.count() - 1;
   Message dayChangeMsg;
-//   MessageModelItem *dayChangeItem = 0;
-  bool relocatedMsg = false;
+
   if(start > 0) {
     // check if the preceeding msg is a daychange message and if so if
     // we have to drop or relocate it at the end of this chunk
     int prevIdx = start - 1;
     if(messageItemAt(prevIdx)->msgType() == Message::DayChange
        && messageItemAt(prevIdx)->timestamp() > msglist.at(0).timestamp()) {
+
       beginRemoveRows(QModelIndex(), prevIdx, prevIdx);
-//       MessageModelItem *oldItem = _messageList.takeAt(prevIdx);
-//       if(msglist.last().timestamp() < oldItem->timestamp()) {
-//     // we have to reinsert it (with changed msgId -> thus we need to recreate it)
-//     Message dayChangeMsg = Message::ChangeOfDay(oldItem->timestamp());
-//     dayChangeMsg.setMsgId(msglist.last().msgId());
-//     dayChangeItem = createMessageModelItem(dayChangeMsg);
-//       }
-//       delete oldItem;
-
-
-      dayChangeMsg = takeMessageAt(prevIdx);
-      if(msglist.last().timestamp() < dayChangeMsg.timestamp()) {
+      Message oldDayChangeMsg = takeMessageAt(prevIdx);
+      if(msglist.last().timestamp() < oldDayChangeMsg.timestamp()) {
        // we have to reinsert it with a changed msgId
+       dayChangeMsg = oldDayChangeMsg;
        dayChangeMsg.setMsgId(msglist.last().msgId());
       }
       endRemoveRows();
+
       start--;
       end--;
-      relocatedMsg = true;
     }
   }
 
@@ -170,24 +161,14 @@ void MessageModel::insertMessageGroup(const QList<Message> &msglist) {
   Q_ASSERT(start == 0 || messageItemAt(start - 1)->msgId() < msglist.first().msgId());
   Q_ASSERT(start == messageCount() || messageItemAt(start)->msgId() > msglist.last().msgId());
   beginInsertRows(QModelIndex(), start, end);
-//   int pos = start;
-//   foreach(Message msg, msglist) {
-//     _messageList.insert(pos, createMessageModelItem(msg));
-//     pos++;
-//   }
-//   if(dayChangeItem) {
-//     _messageList.insert(pos, dayChangeItem);
-//     pos++; // needed for the following assert
-//   }
   insertMessages__(start, msglist);
   if(dayChangeMsg.isValid())
     insertMessage__(start + msglist.count(), dayChangeMsg);
   endInsertRows();
 
-//   Q_ASSERT(start == end || _messageList.at(start)->msgId() != _messageList.at(end)->msgId() || _messageList.at(end)->msgType() == Message::DayChange);
+  Q_ASSERT(start == end || messageItemAt(start)->msgId() != messageItemAt(end)->msgId() || messageItemAt(end)->msgType() == Message::DayChange);
   Q_ASSERT(start == 0 || messageItemAt(start - 1)->msgId() < messageItemAt(start)->msgId());
   Q_ASSERT(end + 1 == messageCount() || messageItemAt(end)->msgId() < messageItemAt(end + 1)->msgId());
-//   Q_ASSERT(pos - 1 == end);
 }
 
 int MessageModel::insertMessagesGracefully(const QList<Message> &msglist) {
@@ -238,7 +219,7 @@ int MessageModel::insertMessagesGracefully(const QList<Message> &msglist) {
     while(iter != msglist.constBegin()) {
       iter--;
 
-      if(!fastForward && (*iter).msgId() < minId)
+      if(!fastForward && (*iter).msgId() <= minId)
        break;
       processedMsgs++;
 
@@ -269,7 +250,7 @@ int MessageModel::insertMessagesGracefully(const QList<Message> &msglist) {
     }
   } else {
     while(iter != msglist.constEnd()) {
-      if(!fastForward && (*iter).msgId() < minId)
+      if(!fastForward && (*iter).msgId() <= minId)
        break;
       processedMsgs++;
 
@@ -326,10 +307,12 @@ void MessageModel::customEvent(QEvent *event) {
 }
 
 void MessageModel::clear() {
-  beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
-  removeAllMessages();
-  endRemoveRows();
   _messagesWaiting.clear();
+  if (rowCount() > 0) {
+    beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
+    removeAllMessages();
+    endRemoveRows();
+  }
 }
 
 // returns index of msg with given Id or of the next message after that (i.e., the index where we'd insert this msg)
@@ -367,6 +350,18 @@ void MessageModel::changeOfDay() {
   _nextDayChange = _nextDayChange.addSecs(86400);
 }
 
+void MessageModel::insertErrorMessage(BufferInfo bufferInfo, const QString &errorString) {
+  int idx = messageCount();
+  beginInsertRows(QModelIndex(), idx, idx);
+  Message msg(bufferInfo, Message::Error, errorString);
+  if(!messagesIsEmpty())
+    msg.setMsgId(messageItemAt(idx-1)->msgId());
+  else
+    msg.setMsgId(0);
+  insertMessage__(idx, msg);
+  endInsertRows();
+}
+
 void MessageModel::requestBacklog(BufferId bufferId) {
   if(_messagesWaiting.contains(bufferId))
     return;
@@ -414,13 +409,14 @@ QVariant MessageModelItem::data(int column, int role) const {
     return QVariant();
 
   switch(role) {
-  case MessageModel::MsgIdRole: return QVariant::fromValue<MsgId>(msgId());
-  case MessageModel::BufferIdRole: return QVariant::fromValue<BufferId>(bufferId());
-  case MessageModel::TypeRole: return msgType();
-  case MessageModel::FlagsRole: return (int)msgFlags();
-  case MessageModel::TimestampRole: return timestamp();
-  case MessageModel::RedirectedToRole: return qVariantFromValue<BufferId>(_redirectedTo);
-  default: return QVariant();
+    case MessageModel::MessageRole: return QVariant::fromValue<Message>(message());
+    case MessageModel::MsgIdRole: return QVariant::fromValue<MsgId>(msgId());
+    case MessageModel::BufferIdRole: return QVariant::fromValue<BufferId>(bufferId());
+    case MessageModel::TypeRole: return msgType();
+    case MessageModel::FlagsRole: return (int)msgFlags();
+    case MessageModel::TimestampRole: return timestamp();
+    case MessageModel::RedirectedToRole: return qVariantFromValue<BufferId>(_redirectedTo);
+    default: return QVariant();
   }
 }