From ffba6a5ae788b7c8ad83809a944907caa7a8fe84 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Sun, 19 Oct 2003 09:53:50 +0000 Subject: Update remaning time every two seconds 2003-10-19 Marco Pesenti Gritti * TODO: * embed/ephy-download.c: (ephy_download_class_init), (ephy_download_init), (update_remaining_time), (ephy_download_get_remaining_time): * embed/ephy-download.h: Update remaning time every two seconds * embed/mozilla/mozilla-download.cpp: Source/target was swapped * embed/mozilla/EphyHeaderSniffer.cpp: * embed/mozilla/EphyHeaderSniffer.h: Fix style --- ChangeLog | 19 +++ TODO | 5 +- embed/ephy-download.c | 45 ++++++- embed/ephy-download.h | 1 + embed/mozilla/EphyHeaderSniffer.cpp | 260 +++++++++++++++++++----------------- embed/mozilla/EphyHeaderSniffer.h | 45 +++---- embed/mozilla/mozilla-download.cpp | 4 +- 7 files changed, 221 insertions(+), 158 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4b5c9573a..08d6defae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2003-10-19 Marco Pesenti Gritti + + * TODO: + * embed/ephy-download.c: (ephy_download_class_init), + (ephy_download_init), (update_remaining_time), + (ephy_download_get_remaining_time): + * embed/ephy-download.h: + + Update remaning time every two seconds + + * embed/mozilla/mozilla-download.cpp: + + Source/target was swapped + + * embed/mozilla/EphyHeaderSniffer.cpp: + * embed/mozilla/EphyHeaderSniffer.h: + + Fix style + 2003-10-19 Marco Pesenti Gritti * embed/ephy-history.c: (update_hosts): diff --git a/TODO b/TODO index 65beb3bfd..09b5d770c 100644 --- a/TODO +++ b/TODO @@ -3,8 +3,6 @@ Downloader: -- Update rate (used for estimated time) only after some time, otherwise estimated -keep to chang in an annoying way - Fixup column sizing. Ideally filename should get all available space, the others column can get the minimum (for progress we can just fixup requisition in the renderer to something sane) @@ -13,4 +11,5 @@ in the renderer to something sane) constructor/destructor. Verify that references are correct == objects are destroyed at right time. - Probably use cur from total instead of just total in the size field -- fix EphyHeaderSniffer style +- when porting to the new file picker get rid of FilePicker.cpp and +show the dialog in Sniffer, so we can have proper filename diff --git a/embed/ephy-download.c b/embed/ephy-download.c index 0e72f9d90..f7e09d94f 100644 --- a/embed/ephy-download.c +++ b/embed/ephy-download.c @@ -26,6 +26,10 @@ #include +#define EPHY_DOWNLOAD_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_DOWNLOAD, EphyDownloadPrivate)) + +#define REMAINING_TIME_UPDATE_SECS 2 + static void ephy_download_class_init (EphyDownloadClass *klass); static void @@ -37,6 +41,12 @@ enum LAST_SIGNAL }; +struct EphyDownloadPrivate +{ + long remaining_time_last_update; + long remaining_time; +}; + static GObjectClass *parent_class = NULL; static guint ephy_download_signals[LAST_SIGNAL] = { 0 }; @@ -72,6 +82,8 @@ ephy_download_get_type (void) static void ephy_download_class_init (EphyDownloadClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + parent_class = g_type_class_peek_parent (klass); ephy_download_signals[CHANGED] = @@ -83,11 +95,17 @@ ephy_download_class_init (EphyDownloadClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + g_type_class_add_private (object_class, sizeof(EphyDownloadPrivate)); } static void -ephy_download_init (EphyDownload *dv) +ephy_download_init (EphyDownload *download) { + download->priv = EPHY_DOWNLOAD_GET_PRIVATE (download); + + download->priv->remaining_time = 0; + download->priv->remaining_time_last_update = 0; } EphyDownload * @@ -119,11 +137,10 @@ ephy_download_get_name (EphyDownload *download) return result; } -long -ephy_download_get_remaining_time (EphyDownload *download) +static void +update_remaining_time (EphyDownload *download) { - long elapsed_time, remaining_time = 0; - long total, cur; + long elapsed_time, total, cur; total = ephy_download_get_total_progress (download); cur = ephy_download_get_current_progress (download); @@ -131,10 +148,24 @@ ephy_download_get_remaining_time (EphyDownload *download) if (cur > 0) { - remaining_time = elapsed_time * (total - cur) / cur; + download->priv->remaining_time = elapsed_time * (total - cur) / cur; + } +} + +long +ephy_download_get_remaining_time (EphyDownload *download) +{ + long elapsed_time; + + elapsed_time = ephy_download_get_elapsed_time (download); + if (elapsed_time - download->priv->remaining_time_last_update >= + REMAINING_TIME_UPDATE_SECS) + { + update_remaining_time (download); + download->priv->remaining_time_last_update = elapsed_time; } - return remaining_time; + return download->priv->remaining_time; } char * diff --git a/embed/ephy-download.h b/embed/ephy-download.h index adb82adaf..c36c0de5c 100644 --- a/embed/ephy-download.h +++ b/embed/ephy-download.h @@ -46,6 +46,7 @@ typedef enum struct EphyDownload { GObject parent; + EphyDownloadPrivate *priv; }; struct EphyDownloadClass diff --git a/embed/mozilla/EphyHeaderSniffer.cpp b/embed/mozilla/EphyHeaderSniffer.cpp index 407967b87..efeb90e4a 100644 --- a/embed/mozilla/EphyHeaderSniffer.cpp +++ b/embed/mozilla/EphyHeaderSniffer.cpp @@ -53,7 +53,7 @@ const char* const persistContractID = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1"; -EphyHeaderSniffer::EphyHeaderSniffer(nsIWebBrowserPersist* aPersist, MozillaEmbedPersist *aEmbedPersist, +EphyHeaderSniffer::EphyHeaderSniffer (nsIWebBrowserPersist* aPersist, MozillaEmbedPersist *aEmbedPersist, nsIFile* aFile, nsIURI* aURL, nsIDOMDocument* aDocument, nsIInputStream* aPostData, const nsAString& aSuggestedFilename, PRBool aBypassCache) : mPersist(aPersist) @@ -74,86 +74,87 @@ EphyHeaderSniffer::~EphyHeaderSniffer() NS_IMPL_ISUPPORTS2(EphyHeaderSniffer, nsIWebProgressListener, nsIAuthPrompt) -// Implementation of nsIWebProgressListener -/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aStateFlags, in unsigned long aStatus); */ NS_IMETHODIMP -EphyHeaderSniffer::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, - PRUint32 aStatus) +EphyHeaderSniffer::OnStateChange (nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, + PRUint32 aStatus) { - if (aStateFlags & nsIWebProgressListener::STATE_START) - { - nsCOMPtr kungFuDeathGrip(mPersist); // be sure to keep it alive while we save - // since it owns us as a listener - nsCOMPtr kungFuSuicideGrip(this); // and keep ourselves alive + if (aStateFlags & nsIWebProgressListener::STATE_START) + { + /* be sure to keep it alive while we save since it owns + us as a listener and keep ourselves alive */ + nsCOMPtr kungFuDeathGrip(mPersist); + nsCOMPtr kungFuSuicideGrip(this); - nsresult rv; - nsCOMPtr channel = do_QueryInterface(aRequest, &rv); - if (!channel) return rv; - channel->GetContentType(mContentType); + nsresult rv; + nsCOMPtr channel = do_QueryInterface(aRequest, &rv); + if (!channel) return rv; + channel->GetContentType(mContentType); - nsCOMPtr origURI; - channel->GetOriginalURI(getter_AddRefs(origURI)); + nsCOMPtr origURI; + channel->GetOriginalURI(getter_AddRefs(origURI)); - // Get the content-disposition if we're an HTTP channel. - nsCOMPtr httpChannel(do_QueryInterface(channel)); - if (httpChannel) - httpChannel->GetResponseHeader(nsCAutoString("content-disposition"), mContentDisposition); + nsCOMPtr httpChannel(do_QueryInterface(channel)); + if (httpChannel) + { + httpChannel->GetResponseHeader(nsCAutoString("content-disposition"), + mContentDisposition); + } - mPersist->CancelSave(); - PRBool exists; - mTmpFile->Exists(&exists); - if (exists) - mTmpFile->Remove(PR_FALSE); - - rv = PerformSave(origURI); - if (NS_FAILED(rv)) - { - // put up some UI + mPersist->CancelSave(); + + PRBool exists; + mTmpFile->Exists(&exists); + if (exists) + { + mTmpFile->Remove(PR_FALSE); + } + + rv = PerformSave(origURI); + if (NS_FAILED(rv)) + { + /* FIXME put up some UI */ - } - } - return NS_OK; + } + } + + return NS_OK; } -/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */ NS_IMETHODIMP -EphyHeaderSniffer::OnProgressChange(nsIWebProgress *aWebProgress, - nsIRequest *aRequest, - PRInt32 aCurSelfProgress, - PRInt32 aMaxSelfProgress, - PRInt32 aCurTotalProgress, - PRInt32 aMaxTotalProgress) +EphyHeaderSniffer::OnProgressChange (nsIWebProgress *aWebProgress, + nsIRequest *aRequest, + PRInt32 aCurSelfProgress, + PRInt32 aMaxSelfProgress, + PRInt32 aCurTotalProgress, + PRInt32 aMaxTotalProgress) { - return NS_OK; + return NS_OK; } -/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */ NS_IMETHODIMP -EphyHeaderSniffer::OnLocationChange(nsIWebProgress *aWebProgress, - nsIRequest *aRequest, - nsIURI *location) +EphyHeaderSniffer::OnLocationChange (nsIWebProgress *aWebProgress, + nsIRequest *aRequest, + nsIURI *location) { - return NS_OK; + return NS_OK; } -/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */ NS_IMETHODIMP -EphyHeaderSniffer::OnStatusChange(nsIWebProgress *aWebProgress, - nsIRequest *aRequest, - nsresult aStatus, - const PRUnichar *aMessage) +EphyHeaderSniffer::OnStatusChange (nsIWebProgress *aWebProgress, + nsIRequest *aRequest, + nsresult aStatus, + const PRUnichar *aMessage) { return NS_OK; } -/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */ NS_IMETHODIMP -EphyHeaderSniffer::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 state) +EphyHeaderSniffer::OnSecurityChange (nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 state) { - return NS_OK; + return NS_OK; } -nsresult EphyHeaderSniffer::PerformSave(nsIURI* inOriginalURI) +nsresult EphyHeaderSniffer::PerformSave (nsIURI* inOriginalURI) { nsresult rv; @@ -167,90 +168,105 @@ nsresult EphyHeaderSniffer::PerformSave(nsIURI* inOriginalURI) nsCOMPtr sourceData; if (isHTML) + { sourceData = do_QueryInterface(mDocument); + } else + { sourceData = do_QueryInterface(mURL); + } return InitiateDownload(sourceData, file, inOriginalURI); } -// inOriginalURI is always a URI. inSourceData can be an nsIURI or an nsIDOMDocument, depending -// on what we're saving. It's that way for nsIWebBrowserPersist. -nsresult EphyHeaderSniffer::InitiateDownload(nsISupports* inSourceData, nsILocalFile* inDestFile, nsIURI* inOriginalURI) +nsresult EphyHeaderSniffer::InitiateDownload (nsISupports* inSourceData, nsILocalFile* inDestFile, + nsIURI* inOriginalURI) { - nsresult rv = NS_OK; + nsresult rv = NS_OK; - nsCOMPtr webPersist = do_CreateInstance(persistContractID, &rv); - if (NS_FAILED(rv)) return rv; + nsCOMPtr webPersist = do_CreateInstance(persistContractID, &rv); + if (NS_FAILED(rv)) return rv; - nsCOMPtr sourceURI = do_QueryInterface(inSourceData); + nsCOMPtr sourceURI = do_QueryInterface(inSourceData); - PRInt64 timeNow = PR_Now(); - - nsAutoString fileDisplayName; - inDestFile->GetLeafName(fileDisplayName); + PRInt64 timeNow = PR_Now(); - MozDownload *downloader = new MozDownload (); - // dlListener attaches to its progress dialog here, which gains ownership - rv = downloader->InitForEmbed (inOriginalURI, inDestFile, fileDisplayName.get(), - nsnull, timeNow, webPersist, mEmbedPersist); - if (NS_FAILED(rv)) return rv; - - PRInt32 flags = nsIWebBrowserPersist::PERSIST_FLAGS_NO_CONVERSION | - nsIWebBrowserPersist::PERSIST_FLAGS_REPLACE_EXISTING_FILES; - if (mBypassCache) - flags |= nsIWebBrowserPersist::PERSIST_FLAGS_BYPASS_CACHE; - else - flags |= nsIWebBrowserPersist::PERSIST_FLAGS_FROM_CACHE; - - webPersist->SetPersistFlags(flags); + nsAutoString fileDisplayName; + inDestFile->GetLeafName(fileDisplayName); + + MozDownload *downloader = new MozDownload (); + /* dlListener attaches to its progress dialog here, which gains ownership */ + rv = downloader->InitForEmbed (inOriginalURI, inDestFile, fileDisplayName.get(), + nsnull, timeNow, webPersist, mEmbedPersist); + if (NS_FAILED(rv)) return rv; + + PRInt32 flags = nsIWebBrowserPersist::PERSIST_FLAGS_NO_CONVERSION | + nsIWebBrowserPersist::PERSIST_FLAGS_REPLACE_EXISTING_FILES; + if (mBypassCache) + { + flags |= nsIWebBrowserPersist::PERSIST_FLAGS_BYPASS_CACHE; + } + else + { + flags |= nsIWebBrowserPersist::PERSIST_FLAGS_FROM_CACHE; + } + + webPersist->SetPersistFlags(flags); - if (sourceURI) - { - rv = webPersist->SaveURI(sourceURI, nsnull, nsnull, mPostData, nsnull, inDestFile); - } - else - { - nsCOMPtr domDoc = do_QueryInterface(inSourceData, &rv); - if (!domDoc) return rv; // should never happen + if (sourceURI) + { + rv = webPersist->SaveURI (sourceURI, nsnull, nsnull, + mPostData, nsnull, inDestFile); + } + else + { + nsCOMPtr domDoc = do_QueryInterface(inSourceData, &rv); + if (!domDoc) return rv; /* should never happen */ - PRInt32 encodingFlags = 0; - nsCOMPtr filesFolder; + PRInt32 encodingFlags = 0; + nsCOMPtr filesFolder; - if (!mContentType.Equals("text/plain")) { - // Create a local directory in the same dir as our file. It - // will hold our associated files. - filesFolder = do_CreateInstance("@mozilla.org/file/local;1"); - nsAutoString unicodePath; - inDestFile->GetPath(unicodePath); - filesFolder->InitWithPath(unicodePath); + if (!mContentType.Equals("text/plain")) + { + /* Create a local directory in the same dir as our file. It + will hold our associated files. */ + + filesFolder = do_CreateInstance("@mozilla.org/file/local;1"); + nsAutoString unicodePath; + inDestFile->GetPath(unicodePath); + filesFolder->InitWithPath(unicodePath); - nsAutoString leafName; - filesFolder->GetLeafName(leafName); - nsAutoString nameMinusExt(leafName); - PRInt32 index = nameMinusExt.RFind("."); - if (index >= 0) - nameMinusExt.Left(nameMinusExt, index); - nameMinusExt += NS_LITERAL_STRING(" Files"); // XXXdwh needs to be localizable! - filesFolder->SetLeafName(nameMinusExt); - PRBool exists = PR_FALSE; - filesFolder->Exists(&exists); - if (!exists) { - rv = filesFolder->Create(nsILocalFile::DIRECTORY_TYPE, 0755); - if (NS_FAILED(rv)) - return rv; - } - } - else - { - encodingFlags |= nsIWebBrowserPersist::ENCODE_FLAGS_FORMATTED | - nsIWebBrowserPersist::ENCODE_FLAGS_ABSOLUTE_LINKS | - nsIWebBrowserPersist::ENCODE_FLAGS_NOFRAMES_CONTENT; - } - rv = webPersist->SaveDocument(domDoc, inDestFile, filesFolder, mContentType.get(), encodingFlags, 80); - } + nsAutoString leafName; + filesFolder->GetLeafName(leafName); + nsAutoString nameMinusExt(leafName); + PRInt32 index = nameMinusExt.RFind("."); + if (index >= 0) + { + nameMinusExt.Left(nameMinusExt, index); + } + + nameMinusExt += NS_LITERAL_STRING(" Files"); + filesFolder->SetLeafName(nameMinusExt); + PRBool exists = PR_FALSE; + filesFolder->Exists(&exists); + if (!exists) + { + rv = filesFolder->Create(nsILocalFile::DIRECTORY_TYPE, 0755); + if (NS_FAILED(rv)) return rv; + } + } + else + { + encodingFlags |= nsIWebBrowserPersist::ENCODE_FLAGS_FORMATTED | + nsIWebBrowserPersist::ENCODE_FLAGS_ABSOLUTE_LINKS | + nsIWebBrowserPersist::ENCODE_FLAGS_NOFRAMES_CONTENT; + } + + rv = webPersist->SaveDocument (domDoc, inDestFile, filesFolder, + mContentType.get(), encodingFlags, 80); + } - return rv; + return rv; } NS_IMETHODIMP EphyHeaderSniffer::Prompt (const PRUnichar *dialogTitle, const PRUnichar *text, diff --git a/embed/mozilla/EphyHeaderSniffer.h b/embed/mozilla/EphyHeaderSniffer.h index 01f5b7bd8..b8d56281d 100644 --- a/embed/mozilla/EphyHeaderSniffer.h +++ b/embed/mozilla/EphyHeaderSniffer.h @@ -48,38 +48,35 @@ #include "nsIAuthPrompt.h" #include "nsIPromptService.h" -// Implementation of a header sniffer class that is used when saving Web pages and images. class EphyHeaderSniffer : public nsIWebProgressListener, public nsIAuthPrompt { public: - EphyHeaderSniffer(nsIWebBrowserPersist* aPersist, MozillaEmbedPersist *aEmbedPersist, - nsIFile* aFile, nsIURI* aURL, - nsIDOMDocument* aDocument, nsIInputStream* aPostData, - const nsAString& aSuggestedFilename, PRBool aBypassCache); - virtual ~EphyHeaderSniffer(); + EphyHeaderSniffer (nsIWebBrowserPersist* aPersist, MozillaEmbedPersist *aEmbedPersist, + nsIFile* aFile, nsIURI* aURL, + nsIDOMDocument* aDocument, nsIInputStream* aPostData, + const nsAString& aSuggestedFilename, PRBool aBypassCache); + virtual ~EphyHeaderSniffer (); - NS_DECL_ISUPPORTS - NS_DECL_NSIWEBPROGRESSLISTENER - NS_DECL_NSIAUTHPROMPT + NS_DECL_ISUPPORTS + NS_DECL_NSIWEBPROGRESSLISTENER + NS_DECL_NSIAUTHPROMPT protected: - - nsresult PerformSave(nsIURI* inOriginalURI); - nsresult InitiateDownload(nsISupports* inSourceData, nsILocalFile* inDestFile, nsIURI* inOriginalURI); + nsresult PerformSave (nsIURI* inOriginalURI); + nsresult InitiateDownload (nsISupports* inSourceData, nsILocalFile* inDestFile, nsIURI* inOriginalURI); private: - - nsIWebBrowserPersist* mPersist; // Weak. It owns us as a listener. - MozillaEmbedPersist *mEmbedPersist; - nsCOMPtr mTmpFile; - nsCOMPtr mURL; - nsCOMPtr mDocument; - nsCOMPtr mPostData; - nsString mDefaultFilename; - PRBool mBypassCache; - nsCString mContentType; - nsCString mContentDisposition; - nsCOMPtr mPrompt; + nsIWebBrowserPersist* mPersist; /* Weak. It owns us as a listener. */ + MozillaEmbedPersist *mEmbedPersist; + nsCOMPtr mTmpFile; + nsCOMPtr mURL; + nsCOMPtr mDocument; + nsCOMPtr mPostData; + nsString mDefaultFilename; + PRBool mBypassCache; + nsCString mContentType; + nsCString mContentDisposition; + nsCOMPtr mPrompt; }; diff --git a/embed/mozilla/mozilla-download.cpp b/embed/mozilla/mozilla-download.cpp index bb60cd0e6..d970264fe 100644 --- a/embed/mozilla/mozilla-download.cpp +++ b/embed/mozilla/mozilla-download.cpp @@ -61,7 +61,7 @@ mozilla_download_get_type (void) } static char * -impl_get_source (EphyDownload *download) +impl_get_target (EphyDownload *download) { nsCOMPtr targetFile; MozDownload *mozDownload; @@ -77,7 +77,7 @@ impl_get_source (EphyDownload *download) } static char * -impl_get_target (EphyDownload *download) +impl_get_source (EphyDownload *download) { nsCOMPtr uri; MozDownload *mozDownload; -- cgit v1.2.3