summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/news/src/nsNewsDownloader.h
blob: c1e68eb77d57eeedef7c35196076ca9dfdb1a27b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* -*- 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 http://mozilla.org/MPL/2.0/. */

#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 {
 public:
  nsNewsDownloader(nsIMsgWindow* window, nsIMsgDatabase* db,
                   nsIUrlListener* listener);

  NS_DECL_ISUPPORTS
  NS_DECL_NSIURLLISTENER
  NS_DECL_NSIMSGSEARCHNOTIFY

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

  bool ShouldAbort() const { return m_abort; }

 protected:
  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 {
 public:
  DownloadNewsArticlesToOfflineStore(nsIMsgWindow* window, nsIMsgDatabase* db,
                                     nsIUrlListener* listener);
  virtual ~DownloadNewsArticlesToOfflineStore();

  NS_IMETHOD OnStartRunningUrl(nsIURI* url);
  NS_IMETHOD OnStopRunningUrl(nsIURI* url, nsresult exitCode);

 protected:
  virtual int32_t StartDownload();
  virtual int32_t FinishDownload();
  virtual bool GetNextHdrToRetrieve();

  nsCOMPtr<nsIMsgEnumerator> 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 {
 public:
  DownloadMatchingNewsArticlesToNewsDB(nsIMsgWindow* window,
                                       nsIMsgFolder* folder,
                                       nsIMsgDatabase* newsDB,
                                       nsIUrlListener* listener);
  virtual ~DownloadMatchingNewsArticlesToNewsDB();
  nsresult RunSearch(nsIMsgFolder* folder, nsIMsgDatabase* newsDB,
                     nsIMsgSearchSession* searchSession);

 protected:
};

// 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 {
 public:
  nsMsgDownloadAllNewsgroups(nsIMsgWindow* window, nsIUrlListener* listener);

  NS_DECL_ISUPPORTS
  NS_DECL_NSIURLLISTENER

  nsresult ProcessNextGroup();

 protected:
  virtual ~nsMsgDownloadAllNewsgroups();

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

  RefPtr<DownloadMatchingNewsArticlesToNewsDB> m_downloaderForGroup;

  nsCOMPtr<nsIMsgFolder> m_currentFolder;
  nsCOMPtr<nsIMsgWindow> m_window;
  nsTArray<RefPtr<nsIMsgIncomingServer>> m_allServers;
  nsCOMPtr<nsIMsgIncomingServer> m_currentServer;
  // Folders still to process for the current server.
  nsTArray<RefPtr<nsIMsgFolder>> m_folderQueue;
  nsCOMPtr<nsIUrlListener> m_listener;

  bool m_downloadedHdrsForCurGroup;
};

#endif