/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ #include "msg.h" #include "msgbgcln.h" #include "msgcmfld.h" #include "msgpane.h" #include "msgfinfo.h" #include "msgpurge.h" #include "msgimap.h" MSG_BackgroundCleanup::MSG_BackgroundCleanup(XPPtrArray &foldersToCleanup) { m_foldersToCleanup.InsertAt(0, &foldersToCleanup); m_currentFolderCompressor = 0; m_currentNewsgroupPurger = 0; } MSG_BackgroundCleanup::~MSG_BackgroundCleanup() { delete m_currentFolderCompressor; delete m_currentNewsgroupPurger; } int MSG_BackgroundCleanup::DoSomeWork() { int status; switch (m_state) { case BGCleanupStart: m_state = BGCleanupNextGroup; break; case BGCleanupNextGroup: if (m_folderIndex >= m_foldersToCleanup.GetSize()) return MK_CONNECTED; else m_folder = m_foldersToCleanup.GetAt(m_folderIndex++); m_bytesTotal = m_bytesCompressed = 0; if (m_folder->IsMail()) { MSG_IMAPFolderInfoMail *imapFolder = m_folder->GetIMAPFolderInfoMail(); // only try to cleanup this folder if the user is authenticated if (imapFolder && m_pane->GetMaster()->IsUserAuthenticated()) { // this will add the compress url to the url queue we are running in. imapFolder->ClearRequiresCleanup(); // pretend it's going to work. if (imapFolder->GetFlags() & MSG_FOLDER_FLAG_TRASH) imapFolder->DeleteAllMessages(m_pane, FALSE); else if (m_pane->GetMaster()->HasCachedConnection(imapFolder)) m_pane->CompressOneMailFolder(imapFolder); } else { m_currentFolderCompressor = new MSG_CompressFolderState(m_pane->GetMaster(), m_pane->GetContext(), NULL, (MSG_FolderInfoMail *)m_folder, m_bytesCompressed, m_bytesTotal); status = m_currentFolderCompressor->BeginCompression(); } } else if (m_folder->IsNews()) { // ### dmb check errors m_currentNewsgroupPurger = new MSG_PurgeNewsgroupState(m_pane, m_folder); m_currentNewsgroupPurger->Init(); } m_state = BGCleanupMoreHeaders; break; case BGCleanupMoreHeaders: { if (m_folder->IsMail()) { MSG_IMAPFolderInfoMail *imapFolder = m_folder->GetIMAPFolderInfoMail(); if (imapFolder) { m_state = BGCleanupNextGroup; status = 0; } else { status = m_currentFolderCompressor->CompressSomeMore(); if (status != MK_WAITING_FOR_CONNECTION) { if (status < 0) { char* pString = XP_GetString(status); if (pString && strlen(pString)) FE_Alert(m_pane->GetContext(), pString); } m_state = BGCleanupNextGroup; status = StopCompression(); } } } else if (m_folder->IsNews()) { status = m_currentNewsgroupPurger->PurgeSomeMore(); if (status != MK_WAITING_FOR_CONNECTION) { m_state = BGCleanupNextGroup; status = StopPurging(); } } } break; default: break; } return MK_WAITING_FOR_CONNECTION; } int MSG_BackgroundCleanup::StopCompression() { int status = m_currentFolderCompressor->FinishCompression(); delete m_currentFolderCompressor; m_currentFolderCompressor = NULL; return status; } int MSG_BackgroundCleanup::StopPurging() { int status = m_currentNewsgroupPurger->FinishPurging(); delete m_currentNewsgroupPurger; m_currentNewsgroupPurger = NULL; return status; } XP_Bool MSG_BackgroundCleanup::AllDone(int /*status*/) { if (m_folder) { if (m_folder->IsMail() && m_currentFolderCompressor) StopCompression(); else if (m_folder->IsNews() && m_currentNewsgroupPurger) StopPurging(); } return TRUE; } int MSG_BackgroundCleanup::DoNextFolder() { return 0; } int MSG_BackgroundCleanup::DoProcess() { return 0; }