gecko-dev/lib/libmsg/thrlstst.cpp

111 строки
3.2 KiB
C++

/* -*- 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 "thrlstst.h"
#include "msgdbvw.h"
#include "msgpane.h"
#include "msgfinfo.h"
extern "C"
{
extern int MK_MSG_LOADING_MESSAGES;
}
MSG_ListThreadState::MSG_ListThreadState(MessageDBView *view, MSG_Pane *pane, XP_Bool getNewsMsgsAfterLoad, int32 totalHeaders)
{
m_view = view;
m_pane = pane;
m_startKey = 0;
m_totalHeaders = totalHeaders;
m_headersListed = 0;
m_getNewsMsgsAfterLoad = getNewsMsgsAfterLoad;
XP_ASSERT(pane && view);
}
MSG_ListThreadState::~MSG_ListThreadState()
{
}
int MSG_ListThreadState::DoSomeWork()
{
const int kIdChunkSize = 200;
int numListed = 0;
MessageKey idArray[kIdChunkSize];
int32 flagArray[kIdChunkSize];
char levelArray[kIdChunkSize];
SortType sortType;
SortOrder sortOrder;
m_view->GetDB()->GetSortInfo(&sortType, &sortOrder);
MsgERR err;
err = m_view->GetDB()->ListThreadIds(&m_startKey, m_view->GetViewType() == ViewOnlyNewHeaders, idArray,
flagArray, levelArray, kIdChunkSize, &numListed, m_view, &m_headersListed);
if (err == eCorruptDB)
{
m_view->GetDB()->SetSummaryValid(FALSE);
err = eEXCEPTION;
}
#ifndef XP_OS2_HACK
int32 percent = (int32) (100 * (double)m_headersListed /
(double) m_totalHeaders);
#else
int32 percent = 0; /*protect against m_totalHeaders == 0*/
if (m_totalHeaders != 0)
{
percent = (int32) (100 * (double)m_headersListed /
(double) m_totalHeaders);
} /* endif */
#endif
FE_SetProgressBarPercent (m_pane->GetContext(), percent);
FE_Progress(m_pane->GetContext(), XP_GetString(MK_MSG_LOADING_MESSAGES));
if (err == eSUCCESS)
{
int32 numAdded = m_view->AddKeys(idArray, flagArray, levelArray, sortType, numListed);
// if (pCount)
// *pCount += numAdded;
}
if (err != eSUCCESS || m_startKey == kIdNone)
{
m_view->InitSort(sortType, sortOrder);
return MK_CONNECTED;
}
else
return MK_WAITING_FOR_CONNECTION;
}
XP_Bool MSG_ListThreadState::AllDone(int /* status */)
{
// time to list the new news headers...perhaps should be a subclass
if (m_getNewsMsgsAfterLoad && m_pane && m_pane->GetFolder() && m_pane->GetFolder()->IsNews())
m_pane->GetNewNewsMessages(m_pane, m_pane->GetFolder(), FALSE);
else if (m_pane->GetFolder() && m_pane->GetFolder()->IsMail())
FE_PaneChanged(m_pane, TRUE, MSG_PaneNotifyFolderLoaded, (uint32) m_pane->GetFolder());
// Tell front end we're done.
m_pane->StartingUpdate(MSG_NotifyNone, 0, 0);
m_pane->EndingUpdate(MSG_NotifyNone, 0, 0);
return TRUE;
}