diff options
Diffstat (limited to 'embed/mozilla/EphyHeaderSniffer.cpp')
-rw-r--r-- | embed/mozilla/EphyHeaderSniffer.cpp | 261 |
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) |