nsDownloadProxy.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #ifndef downloadproxy___h___
  6. #define downloadproxy___h___
  7. #include "nsIDownloadManager.h"
  8. #include "nsIPrefBranch.h"
  9. #include "nsIPrefService.h"
  10. #include "nsIMIMEInfo.h"
  11. #include "nsIFileURL.h"
  12. #include "nsIDownloadManagerUI.h"
  13. #define PREF_BDM_SHOWWHENSTARTING "browser.download.manager.showWhenStarting"
  14. #define PREF_BDM_FOCUSWHENSTARTING "browser.download.manager.focusWhenStarting"
  15. // This class only exists because nsDownload cannot inherit from nsITransfer
  16. // directly. The reason for this is that nsDownloadManager (incorrectly) keeps
  17. // an nsCOMArray of nsDownloads, and nsCOMArray is only intended for use with
  18. // abstract classes. Using a concrete class that multiply inherits from classes
  19. // deriving from nsISupports will throw ambiguous base class errors.
  20. class nsDownloadProxy : public nsITransfer
  21. {
  22. protected:
  23. virtual ~nsDownloadProxy() { }
  24. public:
  25. nsDownloadProxy() { }
  26. NS_DECL_ISUPPORTS
  27. NS_IMETHOD Init(nsIURI* aSource,
  28. nsIURI* aTarget,
  29. const nsAString& aDisplayName,
  30. nsIMIMEInfo *aMIMEInfo,
  31. PRTime aStartTime,
  32. nsIFile* aTempFile,
  33. nsICancelable* aCancelable,
  34. bool aIsPrivate) override {
  35. nsresult rv;
  36. nsCOMPtr<nsIDownloadManager> dm = do_GetService("@mozilla.org/download-manager;1", &rv);
  37. NS_ENSURE_SUCCESS(rv, rv);
  38. rv = dm->AddDownload(nsIDownloadManager::DOWNLOAD_TYPE_DOWNLOAD, aSource,
  39. aTarget, aDisplayName, aMIMEInfo, aStartTime,
  40. aTempFile, aCancelable, aIsPrivate,
  41. getter_AddRefs(mInner));
  42. NS_ENSURE_SUCCESS(rv, rv);
  43. nsCOMPtr<nsIPrefService> prefs = do_GetService("@mozilla.org/preferences-service;1", &rv);
  44. NS_ENSURE_SUCCESS(rv, rv);
  45. nsCOMPtr<nsIPrefBranch> branch = do_QueryInterface(prefs);
  46. bool showDM = true;
  47. if (branch)
  48. branch->GetBoolPref(PREF_BDM_SHOWWHENSTARTING, &showDM);
  49. if (showDM) {
  50. nsCOMPtr<nsIDownloadManagerUI> dmui =
  51. do_GetService("@mozilla.org/download-manager-ui;1", &rv);
  52. NS_ENSURE_SUCCESS(rv, rv);
  53. bool visible;
  54. rv = dmui->GetVisible(&visible);
  55. NS_ENSURE_SUCCESS(rv, rv);
  56. bool focusWhenStarting = true;
  57. if (branch)
  58. (void)branch->GetBoolPref(PREF_BDM_FOCUSWHENSTARTING, &focusWhenStarting);
  59. if (visible && !focusWhenStarting)
  60. return NS_OK;
  61. return dmui->Show(nullptr, mInner, nsIDownloadManagerUI::REASON_NEW_DOWNLOAD, aIsPrivate);
  62. }
  63. return rv;
  64. }
  65. NS_IMETHOD OnStateChange(nsIWebProgress* aWebProgress,
  66. nsIRequest* aRequest, uint32_t aStateFlags,
  67. nsresult aStatus) override
  68. {
  69. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  70. return mInner->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
  71. }
  72. NS_IMETHOD OnStatusChange(nsIWebProgress *aWebProgress,
  73. nsIRequest *aRequest, nsresult aStatus,
  74. const char16_t *aMessage) override
  75. {
  76. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  77. return mInner->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage);
  78. }
  79. NS_IMETHOD OnLocationChange(nsIWebProgress *aWebProgress,
  80. nsIRequest *aRequest, nsIURI *aLocation,
  81. uint32_t aFlags) override
  82. {
  83. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  84. return mInner->OnLocationChange(aWebProgress, aRequest, aLocation, aFlags);
  85. }
  86. NS_IMETHOD OnProgressChange(nsIWebProgress *aWebProgress,
  87. nsIRequest *aRequest,
  88. int32_t aCurSelfProgress,
  89. int32_t aMaxSelfProgress,
  90. int32_t aCurTotalProgress,
  91. int32_t aMaxTotalProgress) override
  92. {
  93. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  94. return mInner->OnProgressChange(aWebProgress, aRequest,
  95. aCurSelfProgress,
  96. aMaxSelfProgress,
  97. aCurTotalProgress,
  98. aMaxTotalProgress);
  99. }
  100. NS_IMETHOD OnProgressChange64(nsIWebProgress *aWebProgress,
  101. nsIRequest *aRequest,
  102. int64_t aCurSelfProgress,
  103. int64_t aMaxSelfProgress,
  104. int64_t aCurTotalProgress,
  105. int64_t aMaxTotalProgress) override
  106. {
  107. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  108. return mInner->OnProgressChange64(aWebProgress, aRequest,
  109. aCurSelfProgress,
  110. aMaxSelfProgress,
  111. aCurTotalProgress,
  112. aMaxTotalProgress);
  113. }
  114. NS_IMETHOD OnRefreshAttempted(nsIWebProgress *aWebProgress,
  115. nsIURI *aUri,
  116. int32_t aDelay,
  117. bool aSameUri,
  118. bool *allowRefresh) override
  119. {
  120. *allowRefresh = true;
  121. return NS_OK;
  122. }
  123. NS_IMETHOD OnSecurityChange(nsIWebProgress *aWebProgress,
  124. nsIRequest *aRequest, uint32_t aState) override
  125. {
  126. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  127. return mInner->OnSecurityChange(aWebProgress, aRequest, aState);
  128. }
  129. NS_IMETHOD SetSha256Hash(const nsACString& aHash) override
  130. {
  131. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  132. return mInner->SetSha256Hash(aHash);
  133. }
  134. NS_IMETHOD SetSignatureInfo(nsIArray* aSignatureInfo) override
  135. {
  136. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  137. return mInner->SetSignatureInfo(aSignatureInfo);
  138. }
  139. NS_IMETHOD SetRedirects(nsIArray* aRedirects) override
  140. {
  141. NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED);
  142. return mInner->SetRedirects(aRedirects);
  143. }
  144. private:
  145. nsCOMPtr<nsIDownload> mInner;
  146. };
  147. NS_IMPL_ISUPPORTS(nsDownloadProxy, nsITransfer,
  148. nsIWebProgressListener, nsIWebProgressListener2)
  149. #endif