1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/downloads/nsDownloadProxy.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,170 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifndef downloadproxy___h___ 1.10 +#define downloadproxy___h___ 1.11 + 1.12 +#include "nsIDownloadManager.h" 1.13 +#include "nsIPrefBranch.h" 1.14 +#include "nsIPrefService.h" 1.15 +#include "nsIMIMEInfo.h" 1.16 +#include "nsIFileURL.h" 1.17 +#include "nsIDownloadManagerUI.h" 1.18 + 1.19 +#define PREF_BDM_SHOWWHENSTARTING "browser.download.manager.showWhenStarting" 1.20 +#define PREF_BDM_FOCUSWHENSTARTING "browser.download.manager.focusWhenStarting" 1.21 + 1.22 +// This class only exists because nsDownload cannot inherit from nsITransfer 1.23 +// directly. The reason for this is that nsDownloadManager (incorrectly) keeps 1.24 +// an nsCOMArray of nsDownloads, and nsCOMArray is only intended for use with 1.25 +// abstract classes. Using a concrete class that multiply inherits from classes 1.26 +// deriving from nsISupports will throw ambiguous base class errors. 1.27 +class nsDownloadProxy : public nsITransfer 1.28 +{ 1.29 +public: 1.30 + 1.31 + nsDownloadProxy() { } 1.32 + virtual ~nsDownloadProxy() { } 1.33 + 1.34 + NS_DECL_ISUPPORTS 1.35 + 1.36 + NS_IMETHODIMP Init(nsIURI* aSource, 1.37 + nsIURI* aTarget, 1.38 + const nsAString& aDisplayName, 1.39 + nsIMIMEInfo *aMIMEInfo, 1.40 + PRTime aStartTime, 1.41 + nsIFile* aTempFile, 1.42 + nsICancelable* aCancelable, 1.43 + bool aIsPrivate) { 1.44 + nsresult rv; 1.45 + nsCOMPtr<nsIDownloadManager> dm = do_GetService("@mozilla.org/download-manager;1", &rv); 1.46 + NS_ENSURE_SUCCESS(rv, rv); 1.47 + 1.48 + rv = dm->AddDownload(nsIDownloadManager::DOWNLOAD_TYPE_DOWNLOAD, aSource, 1.49 + aTarget, aDisplayName, aMIMEInfo, aStartTime, 1.50 + aTempFile, aCancelable, aIsPrivate, 1.51 + getter_AddRefs(mInner)); 1.52 + NS_ENSURE_SUCCESS(rv, rv); 1.53 + 1.54 + nsCOMPtr<nsIPrefService> prefs = do_GetService("@mozilla.org/preferences-service;1", &rv); 1.55 + NS_ENSURE_SUCCESS(rv, rv); 1.56 + nsCOMPtr<nsIPrefBranch> branch = do_QueryInterface(prefs); 1.57 + 1.58 + bool showDM = true; 1.59 + if (branch) 1.60 + branch->GetBoolPref(PREF_BDM_SHOWWHENSTARTING, &showDM); 1.61 + 1.62 + if (showDM) { 1.63 + nsCOMPtr<nsIDownloadManagerUI> dmui = 1.64 + do_GetService("@mozilla.org/download-manager-ui;1", &rv); 1.65 + NS_ENSURE_SUCCESS(rv, rv); 1.66 + 1.67 + bool visible; 1.68 + rv = dmui->GetVisible(&visible); 1.69 + NS_ENSURE_SUCCESS(rv, rv); 1.70 + 1.71 + bool focusWhenStarting = true; 1.72 + if (branch) 1.73 + (void)branch->GetBoolPref(PREF_BDM_FOCUSWHENSTARTING, &focusWhenStarting); 1.74 + 1.75 + if (visible && !focusWhenStarting) 1.76 + return NS_OK; 1.77 + 1.78 + return dmui->Show(nullptr, mInner, nsIDownloadManagerUI::REASON_NEW_DOWNLOAD, aIsPrivate); 1.79 + } 1.80 + return rv; 1.81 + } 1.82 + 1.83 + NS_IMETHODIMP OnStateChange(nsIWebProgress* aWebProgress, 1.84 + nsIRequest* aRequest, uint32_t aStateFlags, 1.85 + nsresult aStatus) 1.86 + { 1.87 + NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED); 1.88 + return mInner->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus); 1.89 + } 1.90 + 1.91 + NS_IMETHODIMP OnStatusChange(nsIWebProgress *aWebProgress, 1.92 + nsIRequest *aRequest, nsresult aStatus, 1.93 + const char16_t *aMessage) 1.94 + { 1.95 + NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED); 1.96 + return mInner->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage); 1.97 + } 1.98 + 1.99 + NS_IMETHODIMP OnLocationChange(nsIWebProgress *aWebProgress, 1.100 + nsIRequest *aRequest, nsIURI *aLocation, 1.101 + uint32_t aFlags) 1.102 + { 1.103 + NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED); 1.104 + return mInner->OnLocationChange(aWebProgress, aRequest, aLocation, aFlags); 1.105 + } 1.106 + 1.107 + NS_IMETHODIMP OnProgressChange(nsIWebProgress *aWebProgress, 1.108 + nsIRequest *aRequest, 1.109 + int32_t aCurSelfProgress, 1.110 + int32_t aMaxSelfProgress, 1.111 + int32_t aCurTotalProgress, 1.112 + int32_t aMaxTotalProgress) 1.113 + { 1.114 + NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED); 1.115 + return mInner->OnProgressChange(aWebProgress, aRequest, 1.116 + aCurSelfProgress, 1.117 + aMaxSelfProgress, 1.118 + aCurTotalProgress, 1.119 + aMaxTotalProgress); 1.120 + } 1.121 + 1.122 + NS_IMETHODIMP OnProgressChange64(nsIWebProgress *aWebProgress, 1.123 + nsIRequest *aRequest, 1.124 + int64_t aCurSelfProgress, 1.125 + int64_t aMaxSelfProgress, 1.126 + int64_t aCurTotalProgress, 1.127 + int64_t aMaxTotalProgress) 1.128 + { 1.129 + NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED); 1.130 + return mInner->OnProgressChange64(aWebProgress, aRequest, 1.131 + aCurSelfProgress, 1.132 + aMaxSelfProgress, 1.133 + aCurTotalProgress, 1.134 + aMaxTotalProgress); 1.135 + } 1.136 + 1.137 + NS_IMETHODIMP OnRefreshAttempted(nsIWebProgress *aWebProgress, 1.138 + nsIURI *aUri, 1.139 + int32_t aDelay, 1.140 + bool aSameUri, 1.141 + bool *allowRefresh) 1.142 + { 1.143 + *allowRefresh = true; 1.144 + return NS_OK; 1.145 + } 1.146 + 1.147 + NS_IMETHODIMP OnSecurityChange(nsIWebProgress *aWebProgress, 1.148 + nsIRequest *aRequest, uint32_t aState) 1.149 + { 1.150 + NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED); 1.151 + return mInner->OnSecurityChange(aWebProgress, aRequest, aState); 1.152 + } 1.153 + 1.154 + NS_IMETHODIMP SetSha256Hash(const nsACString& aHash) 1.155 + { 1.156 + NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED); 1.157 + return mInner->SetSha256Hash(aHash); 1.158 + } 1.159 + 1.160 + NS_IMETHODIMP SetSignatureInfo(nsIArray* aSignatureInfo) 1.161 + { 1.162 + NS_ENSURE_TRUE(mInner, NS_ERROR_NOT_INITIALIZED); 1.163 + return mInner->SetSignatureInfo(aSignatureInfo); 1.164 + } 1.165 + 1.166 +private: 1.167 + nsCOMPtr<nsIDownload> mInner; 1.168 +}; 1.169 + 1.170 +NS_IMPL_ISUPPORTS(nsDownloadProxy, nsITransfer, 1.171 + nsIWebProgressListener, nsIWebProgressListener2) 1.172 + 1.173 +#endif