// Helper routine - lowest level of flag setting PRBool nsMailDatabase::SetHdrFlag(nsIMsgDBHdr *msgHdr, PRBool bSet, MsgFlags flag) { nsIOutputStream *fileStream = nsnull; PRBool ret = PR_FALSE; if (!m_folderStream && m_folder) //we are going to create a stream, bail out if someone else has lock { PRBool isLocked; m_folder->GetLocked(&isLocked); if (isLocked) { NS_ASSERTION(PR_FALSE, "Some other operation is in progress"); return PR_FALSE; } } if (nsMsgDatabase::SetHdrFlag(msgHdr, bSet, flag)) { UpdateFolderFlag(msgHdr, bSet, flag, &fileStream); if (fileStream) { fileStream->Flush(); fileStream->Close(); NS_RELEASE(fileStream); SetFolderInfoValid(m_folderFile, 0, 0); } ret = PR_TRUE; } return ret; }
NS_IMETHODIMP nsMsgBrkMBoxStore::ChangeFlags(nsIArray *aHdrArray, uint32_t aFlags, bool aSet) { NS_ENSURE_ARG_POINTER(aHdrArray); nsCOMPtr<nsIOutputStream> outputStream; nsCOMPtr<nsISeekableStream> seekableStream; int64_t restoreStreamPos; uint32_t messageCount; nsresult rv = aHdrArray->GetLength(&messageCount); NS_ENSURE_SUCCESS(rv, rv); if (!messageCount) return NS_ERROR_INVALID_ARG; rv = GetOutputStream(aHdrArray, outputStream, seekableStream, restoreStreamPos); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIMsgDBHdr> msgHdr; for (uint32_t i = 0; i < messageCount; i++) { msgHdr = do_QueryElementAt(aHdrArray, i, &rv); // Seek to x-mozilla-status offset and rewrite value. rv = UpdateFolderFlag(msgHdr, aSet, aFlags, outputStream); if (NS_FAILED(rv)) { NS_WARNING("updateFolderFlag failed"); break; } } if (restoreStreamPos != -1) seekableStream->Seek(nsISeekableStream::NS_SEEK_SET, restoreStreamPos); else if (outputStream) outputStream->Close(); if (messageCount > 0) { msgHdr = do_QueryElementAt(aHdrArray, 0); SetDBValid(msgHdr); } return NS_OK; }
NS_IMETHODIMP nsMsgMaildirStore::ChangeFlags(nsIArray *aHdrArray, uint32_t aFlags, bool aSet) { NS_ENSURE_ARG_POINTER(aHdrArray); uint32_t messageCount; nsresult rv = aHdrArray->GetLength(&messageCount); NS_ENSURE_SUCCESS(rv, rv); for (uint32_t i = 0; i < messageCount; i++) { nsCOMPtr<nsIMsgDBHdr> msgHdr = do_QueryElementAt(aHdrArray, i, &rv); // get output stream for header nsCOMPtr<nsIOutputStream> outputStream; rv = GetOutputStream(msgHdr, outputStream); NS_ENSURE_SUCCESS(rv, rv); // Seek to x-mozilla-status offset and rewrite value. rv = UpdateFolderFlag(msgHdr, aSet, aFlags, outputStream); if (NS_FAILED(rv)) NS_WARNING("updateFolderFlag failed"); } return NS_OK; }