Comment 2 for bug 90824

Revision history for this message
In , Jeongkyu Kim (jeongkyu-kim) wrote :

I also could reproduce the same behavior only for IMAP folder. When a new
message is moved to the specified folder by filter, it is not recognized until
the folder is clicked and refreshed.

The function nsMsgDatabase::MarkAllRead() seems related to this behavior. When
message is just moved and the folder is not refreshed, enumerator (hdrs) skips
new messages.

(in nsImapMailFolder.cpp)
NS_IMETHODIMP nsImapMailFolder::MarkAllMessagesRead(void)
{
...
    rv = mDatabase->MarkAllRead(&thoseMarked);
...
}

(in nsmsgdatabase.cpp)
NS_IMETHODIMP nsMsgDatabase::MarkAllRead(nsMsgKeyArray *thoseMarked)
{
  nsresult rv;
  nsMsgHdr *pHeader;

  nsCOMPtr <nsISimpleEnumerator> hdrs;
  rv = EnumerateMessages(getter_AddRefs(hdrs));
  if (NS_FAILED(rv))
    return rv;
  PRBool hasMore = PR_FALSE;

  while (NS_SUCCEEDED(rv = hdrs->HasMoreElements(&hasMore)) && (hasMore ==
PR_TRUE))
  {
    rv = hdrs->GetNext((nsISupports**)&pHeader);
    NS_ASSERTION(NS_SUCCEEDED(rv), "nsMsgDBEnumerator broken");
    if (NS_FAILED(rv))
      break;

    PRBool isRead;
    IsHeaderRead(pHeader, &isRead);

    if (!isRead)
    {
      if (thoseMarked)
      {
        nsMsgKey key;
        (void)pHeader->GetMessageKey(&key);
        thoseMarked->Add(key);
      }
      rv = MarkHdrRead(pHeader, PR_TRUE, nsnull); // ### dmb - blow off error?
    }
    NS_RELEASE(pHeader);
  }
...
}