aboutsummaryrefslogtreecommitdiffstats
path: root/embed/mozilla/EphyHeaderSniffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'embed/mozilla/EphyHeaderSniffer.cpp')
-rw-r--r--embed/mozilla/EphyHeaderSniffer.cpp261
1 files changed, 28 insertions, 233 deletions
diff --git a/embed/mozilla/EphyHeaderSniffer.cpp b/embed/mozilla/EphyHeaderSniffer.cpp
index ea5df90a0..fe0e6ac4a 100644
--- a/embed/mozilla/EphyHeaderSniffer.cpp
+++ b/embed/mozilla/EphyHeaderSniffer.cpp
@@ -36,11 +36,8 @@
*
* ***** END LICENSE BLOCK ***** */
+#include "MozDownload.h"
#include "EphyHeaderSniffer.h"
-//#include "UMacUnicode.h"
-
-//#include "UCustomNavServicesDialogs.h"
-
#include "netCore.h"
#include "nsIChannel.h"
@@ -52,21 +49,20 @@
#include "nsIMIMEInfo.h"
#include "nsIDOMHTMLDocument.h"
#include "nsIDownload.h"
-//#include "nsILocalFileMac.h"
const char* const persistContractID = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1";
-EphyHeaderSniffer::EphyHeaderSniffer(nsIWebBrowserPersist* aPersist, nsIFile* aFile, nsIURI* aURL,
- nsIDOMDocument* aDocument, nsIInputStream* aPostData,
- const nsAString& aSuggestedFilename, PRBool aBypassCache, ESaveFormat aSaveFormat)
+EphyHeaderSniffer::EphyHeaderSniffer(nsIWebBrowserPersist* aPersist, MozillaEmbedPersist *aEmbedPersist,
+ nsIFile* aFile, nsIURI* aURL, nsIDOMDocument* aDocument, nsIInputStream* aPostData,
+ const nsAString& aSuggestedFilename, PRBool aBypassCache)
: mPersist(aPersist)
+, mEmbedPersist(aEmbedPersist)
, mTmpFile(aFile)
, mURL(aURL)
, mDocument(aDocument)
, mPostData(aPostData)
, mDefaultFilename(aSuggestedFilename)
, mBypassCache(aBypassCache)
-, mSaveFormat(aSaveFormat)
{
}
@@ -76,8 +72,6 @@ EphyHeaderSniffer::~EphyHeaderSniffer()
NS_IMPL_ISUPPORTS1(EphyHeaderSniffer, nsIWebProgressListener)
-#pragma mark -
-
// Implementation of nsIWebProgressListener
/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aStateFlags, in unsigned long aStatus); */
NS_IMETHODIMP
@@ -109,7 +103,7 @@ EphyHeaderSniffer::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequ
if (exists)
mTmpFile->Remove(PR_FALSE);
- rv = PerformSave(origURI, mSaveFormat);
+ rv = PerformSave(origURI);
if (NS_FAILED(rv))
{
// put up some UI
@@ -147,7 +141,7 @@ EphyHeaderSniffer::OnStatusChange(nsIWebProgress *aWebProgress,
nsresult aStatus,
const PRUnichar *aMessage)
{
- return NS_OK;
+ return NS_OK;
}
/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
@@ -157,225 +151,25 @@ EphyHeaderSniffer::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aR
return NS_OK;
}
-#pragma mark -
-
-static ESaveFormat SaveFormatFromPrefValue(PRInt32 inPrefValue)
-{
- switch (inPrefValue)
- {
- case 0: return eSaveFormatHTMLComplete;
- default: // fall through
- case 1: return eSaveFormatHTML;
- case 2: return eSaveFormatPlainText;
- }
-}
-
-static PRInt32 PrefValueFromSaveFormat(ESaveFormat inSaveFormat)
-{
- switch (inSaveFormat)
- {
- case eSaveFormatPlainText: return 2;
- default: // fall through
- case eSaveFormatHTML: return 1;
- case eSaveFormatHTMLComplete: return 0;
- }
-}
-
-nsresult EphyHeaderSniffer::PerformSave(nsIURI* inOriginalURI, const ESaveFormat inSaveFormat)
+nsresult EphyHeaderSniffer::PerformSave(nsIURI* inOriginalURI)
{
- nsresult rv;
- // Are we an HTML document? If so, we will want to append an accessory view to
- // the save dialog to provide the user with the option of doing a complete
- // save vs. a single file save.
- PRBool isHTML = (mDocument && mContentType.Equals("text/html") ||
- mContentType.Equals("text/xml") ||
- mContentType.Equals("application/xhtml+xml"));
-
- // Next find out the directory that we should start in.
- nsCOMPtr<nsIPrefService> prefs(do_GetService("@mozilla.org/preferences-service;1", &rv));
- if (!prefs)
- return rv;
- nsCOMPtr<nsIPrefBranch> dirBranch;
- prefs->GetBranch("browser.download.", getter_AddRefs(dirBranch));
- PRInt32 filterIndex = 0;
- if (inSaveFormat != eSaveFormatUnspecified) {
- filterIndex = PrefValueFromSaveFormat(inSaveFormat);
- }
- else if (dirBranch) {
- nsresult rv = dirBranch->GetIntPref("save_converter_index", &filterIndex);
- if (NS_FAILED(rv))
- filterIndex = 0;
- }
-
- // We need to figure out what file name to use.
-/* nsAutoString defaultFileName;
- if (!mContentDisposition.IsEmpty()) {
- // (1) Use the HTTP header suggestion.
- PRInt32 index = mContentDisposition.Find("filename=");
- if (index >= 0) {
- // Take the substring following the prefix.
- index += 9;
- nsCAutoString filename;
- mContentDisposition.Right(filename, mContentDisposition.Length() - index);
- defaultFileName = NS_ConvertUTF8toUCS2(filename);
- }
- }
-
- if (defaultFileName.IsEmpty()) {
- nsCOMPtr<nsIURL> url(do_QueryInterface(mURL));
- if (url) {
- nsCAutoString fileNameCString;
- url->GetFileName(fileNameCString); // (2) For file URLs, use the file name.
- defaultFileName = NS_ConvertUTF8toUCS2(fileNameCString);
- }
- }
-
- if (defaultFileName.IsEmpty() && mDocument && isHTML) {
- nsCOMPtr<nsIDOMHTMLDocument> htmlDoc(do_QueryInterface(mDocument));
- if (htmlDoc)
- htmlDoc->GetTitle(defaultFileName); // (3) Use the title of the document.
- }
-
- if (defaultFileName.IsEmpty()) {
- // (4) Use the caller provided name.
- defaultFileName = mDefaultFilename;
- }
-
- if (defaultFileName.IsEmpty() && mURL) {
- // (5) Use the host.
- nsCAutoString hostName;
- mURL->GetHost(hostName);
- defaultFileName = NS_ConvertUTF8toUCS2(hostName);
- }
-
- // One last case to handle about:blank and other fruity untitled pages.
- if (defaultFileName.IsEmpty())
- defaultFileName.AssignWithConversion("untitled");
-
- // Validate the file name to ensure legality.
- for (PRUint32 i = 0; i < defaultFileName.Length(); i++)
- if (defaultFileName[i] == ':' || defaultFileName[i] == '/')
- defaultFileName.SetCharAt(i, PRUnichar(' '));
-
- // Make sure the appropriate extension is appended to the suggested file name.
- nsCOMPtr<nsIURI> fileURI(do_CreateInstance("@mozilla.org/network/standard-url;1"));
- nsCOMPtr<nsIURL> fileURL(do_QueryInterface(fileURI, &rv));
- if (!fileURL)
- return rv;
-
- fileURL->SetFilePath(NS_ConvertUCS2toUTF8(defaultFileName));
-
- nsCAutoString fileExtension;
- fileURL->GetFileExtension(fileExtension);
-
- PRBool setExtension = PR_FALSE;
- if (mContentType.Equals("text/html")) {
- if (fileExtension.IsEmpty() || (!fileExtension.Equals("htm") && !fileExtension.Equals("html"))) {
- defaultFileName.AppendWithConversion(".html");
- setExtension = PR_TRUE;
- }
- }
-
- if (!setExtension && fileExtension.IsEmpty()) {
- nsCOMPtr<nsIMIMEService> mimeService(do_GetService("@mozilla.org/mime;1", &rv));
- if (!mimeService)
- return rv;
- nsCOMPtr<nsIMIMEInfo> mimeInfo;
- rv = mimeService->GetFromTypeAndExtension(mContentType.get(), nsnull, getter_AddRefs(mimeInfo));
- if (!mimeInfo)
- return rv;
-
- nsCOMPtr<nsIUTF8StringEnumerator> extensions;
- mimeInfo->GetFileExtensions(getter_AddRefs(extensions));
-
- PRBool hasMore;
- extensions->HasMore(&hasMore);
- if (hasMore) {
- nsCAutoString ext;
- extensions->GetNext(ext);
- defaultFileName.Append(PRUnichar('.'));
- defaultFileName.Append(NS_ConvertUTF8toUCS2(ext));
- }
- }
-
- // Now it's time to pose the save dialog.
- FSSpec destFileSpec;
- bool isReplacing = false;
-
- {
- Str255 defaultName;
- bool result;
-
- CPlatformUCSConversion::GetInstance()->UCSToPlatform(defaultFileName, defaultName);
-#ifndef XP_MACOSX
- char tempBuf1[256], tempBuf2[64];
- ::CopyPascalStringToC(defaultName, tempBuf1);
- ::CopyCStringToPascal(NS_TruncNodeName(tempBuf1, tempBuf2), defaultName);
-#endif
- if (isHTML) {
- ESaveFormat saveFormat = SaveFormatFromPrefValue(filterIndex);
- UNavServicesDialogs::LCustomFileDesignator customDesignator;
- result = customDesignator.AskDesignateFile(defaultName, saveFormat);
- if (!result)
- return NS_OK; // user canceled
- filterIndex = PrefValueFromSaveFormat(saveFormat);
- customDesignator.GetFileSpec(destFileSpec);
- isReplacing = customDesignator.IsReplacing();
- }
- else {
- UNavServicesDialogs::LFileDesignator stdDesignator;
- result = stdDesignator.AskDesignateFile(defaultName);
- if (!result)
- return NS_OK; // user canceled
- stdDesignator.GetFileSpec(destFileSpec);
- isReplacing = stdDesignator.IsReplacing();
- }
-
- // After the dialog is dismissed, process all activation an update events right away.
- // The save dialog code calls UDesktop::Activate after dismissing the dialog. All that
- // does is activate the now frontmost LWindow which was behind the dialog. It does not
- // remove the activate event from the queue. If that event is not processed and removed
- // before we show the progress window, bad things happen. Specifically, the progress
- // dialog will show in front and then, shortly thereafter, the window which was behind this save
- // dialog will be moved to the front.
-
- if (LEventDispatcher::GetCurrentEventDispatcher()) { // Can this ever be NULL?
- EventRecord theEvent;
- while (::WaitNextEvent(updateMask | activMask, &theEvent, 0, nil))
- LEventDispatcher::GetCurrentEventDispatcher()->DispatchEvent(theEvent);
- }
- }
-
- // only save the pref if the frontend didn't specify a format
- if (inSaveFormat == eSaveFormatUnspecified && isHTML)
- dirBranch->SetIntPref("save_converter_index", filterIndex);
-
- nsCOMPtr<nsILocalFile> destFile;
-
- rv = NS_NewLocalFileWithFSSpec(&destFileSpec, PR_TRUE, getter_AddRefs(destFile));
- if (NS_FAILED(rv))
- return rv;
-
- if (isReplacing) {
- PRBool exists;
- rv = destFile->Exists(&exists);
- if (NS_SUCCEEDED(rv) && exists)
- rv = destFile->Remove(PR_TRUE);
- if (NS_FAILED(rv))
- return rv;
- }
-
- // if the user chose plain text, set the content type
- if (isHTML && filterIndex == 2)
- mContentType = "text/plain";
-
- nsCOMPtr<nsISupports> sourceData;
- if (isHTML && filterIndex != 1)
- sourceData = do_QueryInterface(mDocument); // HTML complete
- else
- sourceData = do_QueryInterface(mURL); // HTML or text only
+ nsresult rv;
+
+ PRBool isHTML = (mDocument && mContentType.Equals("text/html") ||
+ mContentType.Equals("text/xml") ||
+ mContentType.Equals("application/xhtml+xml"));
+
+ nsCOMPtr<nsILocalFile> file;
+ rv = NS_NewLocalFile(mDefaultFilename, PR_TRUE, getter_AddRefs(file));
+ if (NS_FAILED(rv) || !file) return G_FAILED;
+
+ nsCOMPtr<nsISupports> sourceData;
+ if (isHTML)
+ sourceData = do_QueryInterface(mDocument);
+ else
+ sourceData = do_QueryInterface(mURL);
- return InitiateDownload(sourceData, destFile, inOriginalURI);*/
+ return InitiateDownload(sourceData, file, inOriginalURI);
}
// inOriginalURI is always a URI. inSourceData can be an nsIURI or an nsIDOMDocument, depending
@@ -394,11 +188,12 @@ nsresult EphyHeaderSniffer::InitiateDownload(nsISupports* inSourceData, nsILocal
nsAutoString fileDisplayName;
inDestFile->GetLeafName(fileDisplayName);
- nsCOMPtr<nsIDownload> downloader = do_CreateInstance(NS_DOWNLOAD_CONTRACTID);
+ MozDownload *downloader = new MozDownload ();
// dlListener attaches to its progress dialog here, which gains ownership
- rv = downloader->Init(inOriginalURI, inDestFile, fileDisplayName.get(), nsnull, timeNow, webPersist);
+ 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)