Commit ffba6a5a authored by Marco Pesenti Gritti's avatar Marco Pesenti Gritti Committed by Marco Pesenti Gritti

Update remaning time every two seconds

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
parent 80f66913
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):
......
......@@ -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
......@@ -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 *
......
......@@ -46,6 +46,7 @@ typedef enum
struct EphyDownload
{
GObject parent;
EphyDownloadPrivate *priv;
};
struct EphyDownloadClass
......
......@@ -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,
......
......@@ -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;
};
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment