summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog19
-rw-r--r--TODO5
-rw-r--r--embed/ephy-download.c45
-rw-r--r--embed/ephy-download.h1
-rw-r--r--embed/mozilla/EphyHeaderSniffer.cpp260
-rw-r--r--embed/mozilla/EphyHeaderSniffer.h45
-rw-r--r--embed/mozilla/mozilla-download.cpp4
7 files changed, 221 insertions, 158 deletions
diff --git a/ChangeLog b/ChangeLog
index 4b5c9573a..08d6defae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,24 @@
2003-10-19 Marco Pesenti Gritti <marco@gnome.org>
+ * 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 <marco@gnome.org>
+
* embed/ephy-history.c: (update_hosts):
do not try to remove All node
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 <libgnomevfs/gnome-vfs-uri.h>
+#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<nsIWebBrowserPersist> kungFuDeathGrip(mPersist); // be sure to keep it alive while we save
- // since it owns us as a listener
- nsCOMPtr<nsIWebProgressListener> 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<nsIWebBrowserPersist> kungFuDeathGrip(mPersist);
+ nsCOMPtr<nsIWebProgressListener> kungFuSuicideGrip(this);
- nsresult rv;
- nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest, &rv);
- if (!channel) return rv;
- channel->GetContentType(mContentType);
+ nsresult rv;
+ nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest, &rv);
+ if (!channel) return rv;
+ channel->GetContentType(mContentType);
- nsCOMPtr<nsIURI> origURI;
- channel->GetOriginalURI(getter_AddRefs(origURI));
+ nsCOMPtr<nsIURI> origURI;
+ channel->GetOriginalURI(getter_AddRefs(origURI));
- // Get the content-disposition if we're an HTTP channel.
- nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(channel));
- if (httpChannel)
- httpChannel->GetResponseHeader(nsCAutoString("content-disposition"), mContentDisposition);
+ nsCOMPtr<nsIHttpChannel> 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<nsISupports> 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<nsIWebBrowserPersist> webPersist = do_CreateInstance(persistContractID, &rv);
- if (NS_FAILED(rv)) return rv;
+ nsCOMPtr<nsIWebBrowserPersist> webPersist = do_CreateInstance(persistContractID, &rv);
+ if (NS_FAILED(rv)) return rv;
- nsCOMPtr<nsIURI> sourceURI = do_QueryInterface(inSourceData);
+ nsCOMPtr<nsIURI> 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<nsIDOMDocument> 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<nsIDOMDocument> domDoc = do_QueryInterface(inSourceData, &rv);
+ if (!domDoc) return rv; /* should never happen */
- PRInt32 encodingFlags = 0;
- nsCOMPtr<nsILocalFile> filesFolder;
+ PRInt32 encodingFlags = 0;
+ nsCOMPtr<nsILocalFile> 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<nsIFile> mTmpFile;
- nsCOMPtr<nsIURI> mURL;
- nsCOMPtr<nsIDOMDocument> mDocument;
- nsCOMPtr<nsIInputStream> mPostData;
- nsString mDefaultFilename;
- PRBool mBypassCache;
- nsCString mContentType;
- nsCString mContentDisposition;
- nsCOMPtr<nsIPromptService> mPrompt;
+ nsIWebBrowserPersist* mPersist; /* Weak. It owns us as a listener. */
+ MozillaEmbedPersist *mEmbedPersist;
+ nsCOMPtr<nsIFile> mTmpFile;
+ nsCOMPtr<nsIURI> mURL;
+ nsCOMPtr<nsIDOMDocument> mDocument;
+ nsCOMPtr<nsIInputStream> mPostData;
+ nsString mDefaultFilename;
+ PRBool mBypassCache;
+ nsCString mContentType;
+ nsCString mContentDisposition;
+ nsCOMPtr<nsIPromptService> 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<nsILocalFile> 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<nsIURI> uri;
MozDownload *mozDownload;