get downloading newsgroups for offline use working better, r=naving, sr=mscott 84061

This commit is contained in:
bienvenu%netscape.com 2002-01-30 22:58:30 +00:00
Родитель 18c55e9e85
Коммит 97edea9175
6 изменённых файлов: 133 добавлений и 109 удалений

Просмотреть файл

@ -818,11 +818,7 @@ nsresult nsMsgSearchOfflineNews::OpenSummaryFile ()
nsCOMPtr <nsIDBFolderInfo> folderInfo;
nsCOMPtr <nsIMsgFolder> scopeFolder;
err = m_scope->GetFolder(getter_AddRefs(scopeFolder));
nsCOMPtr <nsIFileSpec> pathSpec;
err= scopeFolder->GetPath(getter_AddRefs(pathSpec));
PRBool exists=PR_FALSE;
err = pathSpec->Exists(&exists);
if (!exists) return NS_ERROR_FILE_NOT_FOUND;
// code here used to check if offline store existed, which breaks offline news.
if (NS_SUCCEEDED(err) && scopeFolder)
err = scopeFolder->GetMsgDatabase(nsnull, &m_db);
return err;

Просмотреть файл

@ -671,23 +671,25 @@ nsresult nsMsgSearchSession::TimeSliceSerial (PRBool *aDone)
// disk, this is the fastest way to do it.
NS_ENSURE_ARG(aDone);
nsMsgSearchScopeTerm *scope = GetRunningScope();
nsresult rv = NS_OK;
nsMsgSearchScopeTerm *scope = GetRunningScope();
if (scope)
{
scope->TimeSlice (aDone);
if (*aDone)
rv = scope->TimeSlice (aDone);
if (NS_FAILED(rv))
*aDone = PR_TRUE;
if (*aDone || NS_FAILED(rv))
{
ReleaseFolderDBRef();
m_idxRunningScope++;
// if (m_idxRunningScope < m_scopeList.Count())
// UpdateStatusBar (MK_MSG_SEARCH_STATUS);
}
}
*aDone = PR_FALSE;
return NS_OK;
return rv;
}
else
{
{
*aDone = PR_TRUE;
return NS_OK;
}

Просмотреть файл

@ -95,13 +95,13 @@ nsNewsDownloader::nsNewsDownloader(nsIMsgWindow *window, nsIMsgDatabase *msgDB,
nsNewsDownloader::~nsNewsDownloader()
{
if (m_listener)
m_listener->OnStopRunningUrl(/* don't have a url */nsnull, m_status);
if (m_newsDB)
{
m_newsDB->Commit(nsMsgDBCommitType::kLargeCommit);
m_newsDB = nsnull;
}
if (m_listener)
m_listener->OnStopRunningUrl(/* don't have a url */nsnull, m_status);
if (m_newsDB)
{
m_newsDB->Commit(nsMsgDBCommitType::kLargeCommit);
m_newsDB = nsnull;
}
}
NS_IMETHODIMP nsNewsDownloader::OnStartRunningUrl(nsIURI* url)
@ -246,52 +246,52 @@ NS_IMETHODIMP DownloadNewsArticlesToOfflineStore::OnStartRunningUrl(nsIURI* url)
NS_IMETHODIMP DownloadNewsArticlesToOfflineStore::OnStopRunningUrl(nsIURI* url, nsresult exitCode)
{
m_status = exitCode;
if (m_newsHeader != nsnull)
{
m_status = exitCode;
if (m_newsHeader != nsnull)
{
#ifdef DEBUG_bienvenu
// XP_Trace("finished retrieving %ld\n", m_newsHeader->GetMessageKey());
// XP_Trace("finished retrieving %ld\n", m_newsHeader->GetMessageKey());
#endif
if (m_newsDB)
{
if (m_newsDB)
{
nsMsgKey msgKey;
m_newsHeader->GetMessageKey(&msgKey);
m_newsDB->MarkMarked(msgKey, PR_FALSE, nsnull);
}
}
m_newsHeader = nsnull;
return nsNewsDownloader::OnStopRunningUrl(url, exitCode);
m_newsDB->MarkMarked(msgKey, PR_FALSE, nsnull);
}
}
m_newsHeader = nsnull;
return nsNewsDownloader::OnStopRunningUrl(url, exitCode);
}
int DownloadNewsArticlesToOfflineStore::FinishDownload()
{
return 0;
return 0;
}
NS_IMETHODIMP nsNewsDownloader::OnSearchHit(nsIMsgDBHdr *header, nsIMsgFolder *folder)
{
NS_ENSURE_ARG(header);
PRUint32 msgFlags;
header->GetFlags(&msgFlags);
// only need to download articles we don't already have...
if (! (msgFlags & MSG_FLAG_OFFLINE))
{
// only need to download articles we don't already have...
if (! (msgFlags & MSG_FLAG_OFFLINE))
{
nsMsgKey key;
header->GetMessageKey(&key);
m_keysToDownload.Add(key);
m_keysToDownload.Add(key);
#ifdef HAVE_PORT
char *statusTemplate = XP_GetString (MK_MSG_ARTICLES_TO_RETRIEVE);
char *statusString = PR_smprintf (statusTemplate, (long) newsArticleState->m_keysToDownload.GetSize());
if (statusString)
{
FE_Progress (newsArticleState->m_context, statusString);
XP_FREE(statusString);
}
char *statusTemplate = XP_GetString (MK_MSG_ARTICLES_TO_RETRIEVE);
char *statusString = PR_smprintf (statusTemplate, (long) newsArticleState->m_keysToDownload.GetSize());
if (statusString)
{
FE_Progress (newsArticleState->m_context, statusString);
XP_FREE(statusString);
}
#endif
}
}
return NS_OK;
}
@ -316,14 +316,14 @@ NS_IMETHODIMP nsNewsDownloader::OnNewSearch()
int DownloadNewsArticlesToOfflineStore::StartDownload()
{
m_newsDB->GetMsgHdrForKey(m_keyToDownload, getter_AddRefs(m_newsHeader));
return 0;
m_newsDB->GetMsgHdrForKey(m_keyToDownload, getter_AddRefs(m_newsHeader));
return 0;
}
DownloadNewsArticlesToOfflineStore::DownloadNewsArticlesToOfflineStore(nsIMsgWindow *window, nsIMsgDatabase *db, nsIUrlListener *listener)
: nsNewsDownloader(window, db, listener)
{
m_newsDB = db;
m_newsDB = db;
}
DownloadNewsArticlesToOfflineStore::~DownloadNewsArticlesToOfflineStore()
@ -335,10 +335,10 @@ DownloadMatchingNewsArticlesToNewsDB::DownloadMatchingNewsArticlesToNewsDB
nsIUrlListener *listener) :
DownloadNewsArticlesToOfflineStore(window, newsDB, listener)
{
m_window = window;
m_folder = folder;
m_newsDB = newsDB;
m_downloadFromKeys = PR_TRUE; // search term matching means downloadFromKeys.
m_window = window;
m_folder = folder;
m_newsDB = newsDB;
m_downloadFromKeys = PR_TRUE; // search term matching means downloadFromKeys.
}
DownloadMatchingNewsArticlesToNewsDB::~DownloadMatchingNewsArticlesToNewsDB()
@ -357,10 +357,13 @@ nsMsgDownloadAllNewsgroups::nsMsgDownloadAllNewsgroups(nsIMsgWindow *window, nsI
m_window = window;
m_listener = listener;
m_downloaderForGroup = new DownloadMatchingNewsArticlesToNewsDB(window, nsnull, nsnull, this);
NS_IF_ADDREF(m_downloaderForGroup);
m_downloadedHdrsForCurGroup = PR_FALSE;
}
nsMsgDownloadAllNewsgroups::~nsMsgDownloadAllNewsgroups()
{
NS_IF_RELEASE(m_downloaderForGroup);
}
NS_IMETHODIMP nsMsgDownloadAllNewsgroups::OnStartRunningUrl(nsIURI* url)
@ -373,7 +376,17 @@ nsMsgDownloadAllNewsgroups::OnStopRunningUrl(nsIURI* url, nsresult exitCode)
{
nsresult rv = exitCode;
if (NS_SUCCEEDED(exitCode) || exitCode == NS_MSG_NEWS_ARTICLE_NOT_FOUND)
rv = ProcessNextGroup();
{
if (m_downloadedHdrsForCurGroup)
{
rv = DownloadMsgsForCurrentGroup();
m_downloadedHdrsForCurGroup = PR_FALSE;
}
else
{
rv = ProcessNextGroup();
}
}
else if (m_listener) // notify main observer.
m_listener->OnStopRunningUrl(url, exitCode);
@ -489,7 +502,7 @@ nsresult DownloadMatchingNewsArticlesToNewsDB::RunSearch(nsIMsgFolder *folder, n
searchSession->RegisterListener(this);
rv = searchSession->AddScopeTerm(nsMsgSearchScope::localNews, folder);
return searchSession->Search(m_window);
return searchSession->Search(m_window);
}
nsresult nsMsgDownloadAllNewsgroups::ProcessNextGroup()
@ -513,12 +526,17 @@ nsresult nsMsgDownloadAllNewsgroups::ProcessNextGroup()
if (m_listener)
return m_listener->OnStopRunningUrl(nsnull, NS_OK);
}
m_downloadedHdrsForCurGroup = PR_TRUE;
return m_currentFolder->GetNewMessages(m_window, this);
}
nsresult nsMsgDownloadAllNewsgroups::DownloadMsgsForCurrentGroup()
{
nsCOMPtr <nsIMsgDatabase> db;
nsCOMPtr <nsISupportsArray> termList;
nsCOMPtr <nsIMsgDownloadSettings> downloadSettings;
m_currentFolder->GetMsgDatabase(m_window, getter_AddRefs(db));
rv = m_currentFolder->GetDownloadSettings(getter_AddRefs(downloadSettings));
nsresult rv = m_currentFolder->GetDownloadSettings(getter_AddRefs(downloadSettings));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr <nsIMsgNewsFolder> newsFolder = do_QueryInterface(m_currentFolder);

Просмотреть файл

@ -52,42 +52,42 @@
class nsNewsDownloader : public nsIUrlListener, public nsIMsgSearchNotify
{
public:
nsNewsDownloader(nsIMsgWindow *window, nsIMsgDatabase *db, nsIUrlListener *listener);
virtual ~nsNewsDownloader();
nsNewsDownloader(nsIMsgWindow *window, nsIMsgDatabase *db, nsIUrlListener *listener);
virtual ~nsNewsDownloader();
NS_DECL_ISUPPORTS
NS_DECL_NSIURLLISTENER
NS_DECL_NSIMSGSEARCHNOTIFY
virtual nsresult DownloadArticles(nsIMsgWindow *window, nsIMsgFolder *folder, nsMsgKeyArray *pKeyArray);
PRBool ShouldAbort() const { return m_abort; }
virtual nsresult DownloadArticles(nsIMsgWindow *window, nsIMsgFolder *folder, nsMsgKeyArray *pKeyArray);
PRBool ShouldAbort() const { return m_abort; }
protected:
virtual PRInt32 Write(const char * /*block*/, PRInt32 length) {return length;}
virtual void Abort();
virtual void Complete();
virtual PRBool GetNextHdrToRetrieve();
virtual nsresult DownloadNext(PRBool firstTimeP);
virtual PRInt32 FinishDownload() {return 0;}
virtual PRInt32 StartDownload() {return 0;}
virtual PRInt32 Write(const char * /*block*/, PRInt32 length) {return length;}
virtual void Abort();
virtual void Complete();
virtual PRBool GetNextHdrToRetrieve();
virtual nsresult DownloadNext(PRBool firstTimeP);
virtual PRInt32 FinishDownload() {return 0;}
virtual PRInt32 StartDownload() {return 0;}
virtual nsresult ShowProgress(const PRUnichar *progressString, PRInt32 percent);
nsMsgKeyArray m_keysToDownload;
PRBool m_downloadFromKeys;
nsCOMPtr <nsIMsgFolder> m_folder;
nsCOMPtr <nsIMsgDatabase> m_newsDB;
nsMsgKeyArray m_keysToDownload;
nsCOMPtr <nsIMsgFolder> m_folder;
nsCOMPtr <nsIMsgDatabase> m_newsDB;
nsCOMPtr <nsIUrlListener> m_listener;
PRBool m_existedP;
PRBool m_wroteAnyP;
PRBool m_summaryValidP;
PRInt32 m_numwrote;
nsMsgKey m_keyToDownload;
nsCOMPtr <nsIMsgWindow> m_window;
PRPackedBool m_downloadFromKeys;
PRPackedBool m_existedP;
PRPackedBool m_wroteAnyP;
PRPackedBool m_summaryValidP;
PRPackedBool m_abort;
PRInt32 m_numwrote;
nsMsgKey m_keyToDownload;
nsCOMPtr <nsIMsgWindow> m_window;
nsCOMPtr <nsIMsgStatusFeedback> m_statusFeedback;
nsCOMPtr <nsIMsgSearchSession> m_searchSession;
nsresult m_status;
PRBool m_abort;
nsresult m_status;
};
@ -95,19 +95,18 @@ protected:
class DownloadNewsArticlesToOfflineStore : public nsNewsDownloader
{
public:
DownloadNewsArticlesToOfflineStore(nsIMsgWindow *window, nsIMsgDatabase *db, nsIUrlListener *listener);
virtual ~DownloadNewsArticlesToOfflineStore();
DownloadNewsArticlesToOfflineStore(nsIMsgWindow *window, nsIMsgDatabase *db, nsIUrlListener *listener);
virtual ~DownloadNewsArticlesToOfflineStore();
NS_IMETHOD OnStartRunningUrl(nsIURI* url);
NS_IMETHOD OnStopRunningUrl(nsIURI* url, nsresult exitCode);
protected:
virtual PRInt32 StartDownload();
virtual PRInt32 FinishDownload();
virtual PRBool GetNextHdrToRetrieve();
virtual PRInt32 StartDownload();
virtual PRInt32 FinishDownload();
virtual PRBool GetNextHdrToRetrieve();
nsCOMPtr <nsISimpleEnumerator> m_headerEnumerator;
nsCOMPtr <nsIMsgDBHdr> m_newsHeader;
// MsgDocument *m_dbWriteDocument;
nsCOMPtr <nsISimpleEnumerator> m_headerEnumerator;
nsCOMPtr <nsIMsgDBHdr> m_newsHeader;
};
// class for downloading all the articles that match the passed in search criteria
@ -115,8 +114,8 @@ protected:
class DownloadMatchingNewsArticlesToNewsDB : public DownloadNewsArticlesToOfflineStore
{
public:
DownloadMatchingNewsArticlesToNewsDB(nsIMsgWindow *window, nsIMsgFolder *folder, nsIMsgDatabase *newsDB, nsIUrlListener *listener);
virtual ~DownloadMatchingNewsArticlesToNewsDB();
DownloadMatchingNewsArticlesToNewsDB(nsIMsgWindow *window, nsIMsgFolder *folder, nsIMsgDatabase *newsDB, nsIUrlListener *listener);
virtual ~DownloadMatchingNewsArticlesToNewsDB();
nsresult RunSearch(nsIMsgFolder *folder, nsIMsgDatabase *newsDB, nsIMsgSearchSession *searchSession);
protected:
};
@ -137,10 +136,11 @@ public:
protected:
nsresult AdvanceToNextServer(PRBool *done);
nsresult AdvanceToNextGroup(PRBool *done);
nsresult DownloadMsgsForCurrentGroup();
DownloadMatchingNewsArticlesToNewsDB *m_downloaderForGroup;
nsCOMPtr <nsIMsgFolder> m_currentFolder;
nsCOMPtr <nsIMsgFolder> m_currentFolder;
nsCOMPtr <nsIMsgWindow> m_window;
nsCOMPtr <nsISupportsArray> m_allServers;
nsCOMPtr <nsISupportsArray> m_allFolders;
@ -148,6 +148,8 @@ protected:
nsCOMPtr <nsIEnumerator> m_serverEnumerator;
nsCOMPtr <nsIUrlListener> m_listener;
nsCOMPtr <nsISupportsArray> m_termList;
PRBool m_downloadedHdrsForCurGroup;
};
#endif

Просмотреть файл

@ -971,16 +971,15 @@ nsMsgNewsFolder::DeleteMessages(nsISupportsArray *messages, nsIMsgWindow *aMsgWi
NS_IMETHODIMP nsMsgNewsFolder::GetNewMessages(nsIMsgWindow *aMsgWindow, nsIUrlListener *aListener)
{
NS_ASSERTION(aListener == nsnull, "news can't currently listen for this finishing");
return GetNewsMessages(aMsgWindow, PR_FALSE);
return GetNewsMessages(aMsgWindow, PR_FALSE, aListener);
}
NS_IMETHODIMP nsMsgNewsFolder::GetNextNMessages(nsIMsgWindow *aMsgWindow)
{
return GetNewsMessages(aMsgWindow, PR_TRUE);
return GetNewsMessages(aMsgWindow, PR_TRUE, nsnull);
}
nsresult nsMsgNewsFolder::GetNewsMessages(nsIMsgWindow *aMsgWindow, PRBool aGetOld)
nsresult nsMsgNewsFolder::GetNewsMessages(nsIMsgWindow *aMsgWindow, PRBool aGetOld, nsIUrlListener *aUrlListener)
{
nsresult rv = NS_OK;
@ -990,7 +989,7 @@ nsresult nsMsgNewsFolder::GetNewsMessages(nsIMsgWindow *aMsgWindow, PRBool aGetO
if (isNewsServer) {
// get new messages only works on a newsgroup, not a news server
return NS_OK;
return NS_OK;
}
nsCOMPtr <nsINntpService> nntpService = do_GetService(NS_NNTPSERVICE_CONTRACTID, &rv);
@ -1000,7 +999,14 @@ nsresult nsMsgNewsFolder::GetNewsMessages(nsIMsgWindow *aMsgWindow, PRBool aGetO
rv = GetNntpServer(getter_AddRefs(nntpServer));
if (NS_FAILED(rv)) return rv;
rv = nntpService->GetNewNews(nntpServer, mURI, aGetOld, this, aMsgWindow, nsnull);
nsCOMPtr <nsIURI> resultUri;
rv = nntpService->GetNewNews(nntpServer, mURI, aGetOld, this, aMsgWindow, getter_AddRefs(resultUri));
if (aUrlListener && NS_SUCCEEDED(rv) && resultUri)
{
nsCOMPtr<nsIMsgMailNewsUrl> msgUrl (do_QueryInterface(resultUri));
if (msgUrl)
msgUrl->RegisterListener(aUrlListener);
}
return rv;
}

Просмотреть файл

@ -131,29 +131,29 @@ protected:
PRInt32 RememberLine(const char *line);
nsresult RememberUnsubscribedGroup(const char *newsgroup, const char *setStr);
nsresult ForgetLine(void);
nsresult GetNewsMessages(nsIMsgWindow *aMsgWindow, PRBool getOld);
nsresult GetNewsMessages(nsIMsgWindow *aMsgWindow, PRBool getOld, nsIUrlListener *aListener);
PRInt32 HandleNewsrcLine(char *line, PRUint32 line_size);
virtual const char *GetIncomingServerType() {return "nntp";}
virtual nsresult CreateBaseMessageURI(const char *aURI);
nsByteArray m_newsrcInputStream;
nsByteArray m_newsrcInputStream;
protected:
PRUint32 mExpungedBytes;
PRBool mGettingNews;
PRBool mInitialized;
nsISupportsArray *mMessages;
nsCString mOptionLines;
nsCString mUnsubscribedNewsgroupLines;
PRBool m_downloadMessageForOfflineUse;
nsMsgKeySet *mReadSet;
PRUint32 mExpungedBytes;
PRBool mGettingNews;
PRBool mInitialized;
nsISupportsArray *mMessages;
nsCString mOptionLines;
nsCString mUnsubscribedNewsgroupLines;
PRBool m_downloadMessageForOfflineUse;
nsMsgKeySet *mReadSet;
nsCOMPtr<nsIFileSpec> mNewsrcFilePath;
nsCOMPtr<nsIFileSpec> mNewsrcFilePath;
// used for auth news
char *mGroupUsername;
char *mGroupPassword;
// used for auth news
char *mGroupUsername;
char *mGroupPassword;
// the name of the newsgroup.
char *mAsciiName;