author aceman <>
Sat, 05 May 2018 09:49:00 +0200
changeset 31026 02e4c2f6655fd398a52d76e2a9445d2bd373ddf3
parent 30703 cc67b8f8435c6a3f93762e5fd6f28e390711afa9
child 34354 9e527e651e5c6044973c705e74a7cd017bcb224f
permissions -rw-r--r--
Bug 1459184 - Port bug 1456611: Replace use of insertItemAt and removeItemAt methods (mail part). r=jorgk, ui-r=Paenglab

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at */

#ifndef _nsNewsDownloader_H_
#define _nsNewsDownloader_H_

#include "nsIMsgDatabase.h"
#include "nsIUrlListener.h"
#include "nsIMsgFolder.h"
#include "nsIMsgHdr.h"
#include "nsIMsgWindow.h"
#include "nsIMsgSearchNotify.h"
#include "nsIMsgSearchSession.h"
#include "nsIMsgStatusFeedback.h"
#include "nsTArray.h"

// base class for downloading articles in a single newsgroup. Keys to download are passed in
// to DownloadArticles method.
class nsNewsDownloader : public nsIUrlListener, public nsIMsgSearchNotify
  nsNewsDownloader(nsIMsgWindow *window, nsIMsgDatabase *db, nsIUrlListener *listener);


  virtual nsresult DownloadArticles(nsIMsgWindow *window, nsIMsgFolder *folder, nsTArray<nsMsgKey> *pKeyArray);

  bool ShouldAbort() const { return m_abort; }

  virtual ~nsNewsDownloader();

  virtual int32_t Write(const char * /*block*/, int32_t length) {return length;}
  virtual void Abort();
  virtual void Complete();
  virtual bool GetNextHdrToRetrieve();
  virtual nsresult DownloadNext(bool firstTimeP);
  virtual int32_t FinishDownload() {return 0;}
  virtual int32_t  StartDownload() {return 0;}
  virtual nsresult ShowProgress(const char16_t *progressString, int32_t percent);

  nsTArray<nsMsgKey>      m_keysToDownload;
  nsCOMPtr <nsIMsgFolder>  m_folder;
  nsCOMPtr <nsIMsgDatabase> m_newsDB;
  nsCOMPtr <nsIUrlListener> m_listener;
  bool m_downloadFromKeys;
  bool m_existedP;
  bool m_wroteAnyP;
  bool m_summaryValidP;
  bool m_abort;
  int32_t     m_numwrote;
  nsMsgKey    m_keyToDownload;
  nsCOMPtr <nsIMsgWindow> m_window;
  nsCOMPtr <nsIMsgStatusFeedback> m_statusFeedback;
  nsCOMPtr <nsIMsgSearchSession> m_searchSession;
  int32_t m_lastPercent;
  int64_t m_lastProgressTime;
  nsresult  m_status;

// class for downloading articles in a single newsgroup to the offline store.
class DownloadNewsArticlesToOfflineStore : public nsNewsDownloader
  DownloadNewsArticlesToOfflineStore(nsIMsgWindow *window, nsIMsgDatabase *db, nsIUrlListener *listener);
  virtual ~DownloadNewsArticlesToOfflineStore();

  NS_IMETHOD OnStartRunningUrl(nsIURI* url);
  NS_IMETHOD OnStopRunningUrl(nsIURI* url, nsresult exitCode);
  virtual int32_t  StartDownload();
  virtual int32_t FinishDownload();
  virtual bool GetNextHdrToRetrieve();

  nsCOMPtr <nsISimpleEnumerator>  m_headerEnumerator;
  nsCOMPtr <nsIMsgDBHdr>  m_newsHeader;

// class for downloading all the articles that match the passed in search criteria
// for a single newsgroup.
class DownloadMatchingNewsArticlesToNewsDB : public DownloadNewsArticlesToOfflineStore
  DownloadMatchingNewsArticlesToNewsDB(nsIMsgWindow *window, nsIMsgFolder *folder, nsIMsgDatabase *newsDB,  nsIUrlListener *listener);
  virtual ~DownloadMatchingNewsArticlesToNewsDB();
  nsresult RunSearch(nsIMsgFolder *folder, nsIMsgDatabase *newsDB, nsIMsgSearchSession *searchSession);

// this class iterates all the news servers for each group on the server that's configured for
// offline use, downloads the messages that meet the download criteria for that newsgroup/server
class nsMsgDownloadAllNewsgroups : public nsIUrlListener
  nsMsgDownloadAllNewsgroups(nsIMsgWindow *window, nsIUrlListener *listener);


  nsresult ProcessNextGroup();

  virtual ~nsMsgDownloadAllNewsgroups();

  bool     AdvanceToNextServer();
  bool     AdvanceToNextGroup();
  nsresult DownloadMsgsForCurrentGroup();

  RefPtr<DownloadMatchingNewsArticlesToNewsDB> m_downloaderForGroup;

  nsCOMPtr <nsIMsgFolder> m_currentFolder;
  nsCOMPtr <nsIMsgWindow> m_window;
  nsCOMPtr <nsIArray> m_allServers;
  nsCOMPtr <nsIArray> m_allFolders;
  nsCOMPtr <nsIMsgIncomingServer> m_currentServer;
  nsCOMPtr <nsISimpleEnumerator> m_serverEnumerator;
  nsCOMPtr <nsIUrlListener> m_listener;

  bool m_downloadedHdrsForCurGroup;