aboutsummaryrefslogtreecommitdiffstats
path: root/embed/mozilla
diff options
context:
space:
mode:
Diffstat (limited to 'embed/mozilla')
-rw-r--r--embed/mozilla/ContentHandler.cpp225
-rw-r--r--embed/mozilla/ContentHandler.h11
-rw-r--r--embed/mozilla/MozDownload.cpp40
-rw-r--r--embed/mozilla/MozDownload.h2
4 files changed, 104 insertions, 174 deletions
diff --git a/embed/mozilla/ContentHandler.cpp b/embed/mozilla/ContentHandler.cpp
index 02f346bd2..d4c1dc4f9 100644
--- a/embed/mozilla/ContentHandler.cpp
+++ b/embed/mozilla/ContentHandler.cpp
@@ -35,7 +35,6 @@
#include "nsILocalFile.h"
#include "nsIMIMEInfo.h"
-#include "nsIDocShell.h"
#include "nsIWebNavigation.h" // Needed to create the LoadType flag
#include "ephy-prefs.h"
@@ -59,8 +58,7 @@ class GContentHandler;
NS_IMPL_ISUPPORTS1(GContentHandler, nsIHelperAppLauncherDialog)
-GContentHandler::GContentHandler() : mMimeType(nsnull),
- mUrlHelper(PR_FALSE)
+GContentHandler::GContentHandler() : mMimeType(nsnull)
{
LOG ("GContentHandler ctor")
}
@@ -98,10 +96,6 @@ NS_IMETHODIMP GContentHandler::Show(nsIHelperAppLauncher *aLauncher,
single = EPHY_EMBED_SINGLE (ephy_embed_shell_get_embed_single (embed_shell));
g_signal_emit_by_name (single, "handle_content", mMimeType,
mUrl.get(), &handled);
-
- nsCOMPtr<nsIDocShell> eDocShell = do_QueryInterface(aContext);
- PRUint32 eLoadType;
- eDocShell->GetLoadType (&eLoadType);
if (!handled)
{
@@ -165,136 +159,51 @@ NS_METHOD GContentHandler::ShowProgressDialog(nsIHelperAppLauncher *aLauncher,
}
#endif
-NS_METHOD GContentHandler::FindHelperApp (void)
-{
- if (mUrlHelper)
- {
- return LaunchHelperApp ();
- }
-
- nsresult rv;
- rv = SynchroniseMIMEInfo();
- if (NS_FAILED (rv)) return NS_ERROR_FAILURE;
-
- return mLauncher->LaunchWithApplication (nsnull, PR_FALSE);
-}
-
NS_METHOD GContentHandler::LaunchHelperApp (void)
{
- if (mMimeType)
- {
- nsresult rv;
- nsCOMPtr<nsIExternalHelperAppService> helperService =
- do_GetService (NS_EXTERNALHELPERAPPSERVICE_CONTRACTID);
- NS_ENSURE_TRUE (helperService, NS_ERROR_FAILURE);
-
- nsCOMPtr<nsPIExternalAppLauncher> appLauncher =
- do_QueryInterface (helperService);
- if (appLauncher)
- {
- appLauncher->DeleteTemporaryFileOnExit(mTempFile);
- }
+ nsresult rv;
+ nsCOMPtr<nsIExternalHelperAppService> helperService;
- nsString uFileName;
- mTempFile->GetPath(uFileName);
- const nsCString &aFileName = NS_ConvertUCS2toUTF8(uFileName);
+ helperService = do_GetService (NS_EXTERNALHELPERAPPSERVICE_CONTRACTID);
+ NS_ENSURE_TRUE (helperService, NS_ERROR_FAILURE);
- const nsCString &document = (mUrlHelper) ? mUrl : aFileName;
+ nsCOMPtr<nsPIExternalAppLauncher> appLauncher = do_QueryInterface (helperService);
+ NS_ENSURE_TRUE (appLauncher, NS_ERROR_FAILURE);
+ appLauncher->DeleteTemporaryFileOnExit(mTempFile);
- char *param = g_strdup (document.get());
- GList *params = NULL;
- params = g_list_append (params, param);
- gnome_vfs_mime_application_launch (mHelperApp, params);
- g_free (param);
- g_list_free (params);
+ char *param = g_strdup (mUrl.get());
+ GList *params = NULL;
+ params = g_list_append (params, param);
+ gnome_vfs_mime_application_launch (mHelperApp, params);
+ g_free (param);
+ g_list_free (params);
- if (mUrlHelper)
- {
- mLauncher->Cancel();
- }
- }
- else
- {
- mLauncher->Cancel ();
- }
+ mLauncher->Cancel();
return NS_OK;
}
-NS_METHOD GContentHandler::GetLauncher (nsIHelperAppLauncher * *_retval)
-{
- NS_IF_ADDREF (*_retval = mLauncher);
- return NS_OK;
-}
-
-static gboolean
-application_support_scheme (GnomeVFSMimeApplication *app, const nsCString &aScheme)
+NS_METHOD GContentHandler::CheckAppSupportScheme (void)
{
GList *l;
- g_return_val_if_fail (app != NULL, FALSE);
- g_return_val_if_fail (!aScheme.IsEmpty(), FALSE);
-
- if (app->expects_uris != GNOME_VFS_MIME_APPLICATION_ARGUMENT_TYPE_URIS)
- return FALSE;
+ mAppSupportScheme = PR_FALSE;
+
+ if (!mHelperApp) return NS_OK;
+
+ if (mHelperApp->expects_uris != GNOME_VFS_MIME_APPLICATION_ARGUMENT_TYPE_URIS)
+ return NS_OK;
- for (l = app->supported_uri_schemes; l != NULL; l = l->next)
+ for (l = mHelperApp->supported_uri_schemes; l != NULL; l = l->next)
{
char *uri_scheme = (char *)l->data;
- g_return_val_if_fail (uri_scheme != NULL, FALSE);
- if (aScheme.Equals (uri_scheme)) return TRUE;
- }
-
- return FALSE;
-}
-
-NS_METHOD GContentHandler::SetHelperApp(GnomeVFSMimeApplication *aHelperApp,
- PRBool alwaysUse)
-{
- mHelperApp = aHelperApp;
- mUrlHelper = application_support_scheme (aHelperApp, mScheme);
-
- return NS_OK;
-}
-
-NS_METHOD GContentHandler::SynchroniseMIMEInfo (void)
-{
- nsresult rv;
- char *command_with_path;
-
- NS_ENSURE_TRUE (mLauncher, NS_ERROR_FAILURE);
- nsCOMPtr<nsIMIMEInfo> mimeInfo;
- mLauncher->GetMIMEInfo(getter_AddRefs(mimeInfo));
- NS_ENSURE_TRUE (mimeInfo, NS_ERROR_FAILURE);
-
- command_with_path = g_find_program_in_path (mHelperApp->command);
- if (command_with_path == NULL) return NS_ERROR_FAILURE;
-
- nsCOMPtr<nsILocalFile> helperFile;
- NS_NewNativeLocalFile (nsDependentCString(command_with_path),
- PR_TRUE,
- getter_AddRefs(helperFile));
- NS_ENSURE_TRUE (helperFile, NS_ERROR_FAILURE);
-
- g_free (command_with_path);
-
- rv = mimeInfo->SetPreferredApplicationHandler(helperFile);
- NS_ENSURE_SUCCESS (rv, NS_ERROR_FAILURE);
-
- nsMIMEInfoHandleAction mimeInfoAction;
- mimeInfoAction = nsIMIMEInfo::useHelperApp;
-
- if(mHelperApp->requires_terminal) //Information passing kludge!
- {
- rv = mimeInfo->SetApplicationDescription
- (NS_LITERAL_STRING("runInTerminal").get());
- NS_ENSURE_SUCCESS (rv, NS_ERROR_FAILURE);
+ if (mScheme.Equals (uri_scheme))
+ {
+ mAppSupportScheme = PR_TRUE;
+ }
}
- rv = mimeInfo->SetPreferredAction(mimeInfoAction);
- NS_ENSURE_SUCCESS (rv, NS_ERROR_FAILURE);
-
return NS_OK;
}
@@ -325,34 +234,6 @@ NS_METHOD GContentHandler::Init (void)
rv = mUri->GetSpec (mUrl);
rv = mUri->GetScheme (mScheme);
- ProcessMimeInfo ();
-
- return NS_OK;
-}
-
-NS_METHOD GContentHandler::ProcessMimeInfo (void)
-{
- if (mMimeType == NULL ||
- !nsCRT::strcmp(mMimeType, "application/octet-stream"))
- {
- /* FIXME: we leak the old value of mMimeType */
-
- nsresult rv;
- nsCOMPtr<nsIURL> url = do_QueryInterface(mUri, &rv);
- if (NS_SUCCEEDED(rv) && url)
- {
- nsCAutoString uriFileName;
- url->GetFileName(uriFileName);
- mMimeType = g_strdup
- (gnome_vfs_mime_type_from_name
- (uriFileName.get()));
- }
- else
- {
- mMimeType = g_strdup ("application/octet-stream");
- }
- }
-
return NS_OK;
}
@@ -367,7 +248,8 @@ NS_METHOD GContentHandler::MIMEConfirmAction ()
("", NULL, GTK_DIALOG_NO_SEPARATOR,
_("Save As..."), CONTENT_ACTION_SAVEAS,
GTK_STOCK_CANCEL, CONTENT_ACTION_NONE,
- _("Open"), CONTENT_ACTION_OPEN,
+ mAction == CONTENT_ACTION_OPEN ?
+ _("Open") : _("Download"), mAction,
NULL);
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
@@ -382,13 +264,13 @@ NS_METHOD GContentHandler::MIMEConfirmAction ()
if (mPermission != EPHY_MIME_PERMISSION_SAFE)
{
text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s",
- _("Do you really want to download the file?"),
- _("This type of file could potentially damage your documents"
- "or invade your privacy."
- "It's not safe to open it directly. You"
+ _("Download the unsafe file?"),
+ _("This type of file could potentially damage your documents "
+ "or invade your privacy. "
+ "It's not safe to open it directly. You "
"can save it instead."));
}
- if (mAction == CONTENT_ACTION_OPEN)
+ else if (mAction == CONTENT_ACTION_OPEN)
{
text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s",
_("Open the file in another application?"),
@@ -400,7 +282,7 @@ NS_METHOD GContentHandler::MIMEConfirmAction ()
{
text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s",
_("Download the file?"),
- _("It's not possible to view this file because there is no"
+ _("It's not possible to view this file because there is no "
"application installed that can open it."
"You can save it instead."));
}
@@ -439,8 +321,9 @@ NS_METHOD GContentHandler::MIMEDoAction (void)
if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_SAVE_TO_DISK)) return NS_OK;
auto_downloads = eel_gconf_get_boolean (CONF_AUTO_DOWNLOADS);
- GnomeVFSMimeApplication *DefaultApp = gnome_vfs_mime_get_default_application(mMimeType);
+ mHelperApp = gnome_vfs_mime_get_default_application (mMimeType);
+ CheckAppSupportScheme ();
mPermission = ephy_embed_shell_check_mime (embed_shell, mMimeType);
mAction = CONTENT_ACTION_OPEN;
@@ -454,21 +337,31 @@ NS_METHOD GContentHandler::MIMEDoAction (void)
{
MIMEConfirmAction ();
}
-
- if (mAction == CONTENT_ACTION_DOWNLOAD ||
- mAction == CONTENT_ACTION_SAVEAS)
+
+ nsCOMPtr<nsIMIMEInfo> mimeInfo;
+ mLauncher->GetMIMEInfo(getter_AddRefs(mimeInfo));
+ NS_ENSURE_TRUE (mimeInfo, NS_ERROR_FAILURE);
+
+ if (mAction == CONTENT_ACTION_OPEN)
{
- nsCOMPtr<nsIHelperAppLauncher> launcher;
- GetLauncher (getter_AddRefs(launcher));
- NS_ENSURE_TRUE (launcher, NS_ERROR_FAILURE);
- launcher->SaveToDisk (nsnull,PR_FALSE);
+ /* HACK we use the application description to ask
+ MozDownload to open the file when download
+ is finished */
+ mimeInfo->SetApplicationDescription
+ (NS_LITERAL_STRING ("gnome-default").get());
}
- else if (mAction == CONTENT_ACTION_OPEN)
+ else
+ {
+ mimeInfo->SetApplicationDescription (nsnull);
+ }
+
+ if (mAction == CONTENT_ACTION_OPEN && mAppSupportScheme)
+ {
+ LaunchHelperApp ();
+ }
+ else if (mAction != CONTENT_ACTION_NONE)
{
- rv = SetHelperApp (DefaultApp, FALSE);
- NS_ENSURE_SUCCESS (rv, NS_ERROR_FAILURE);
- rv = FindHelperApp ();
- NS_ENSURE_SUCCESS (rv, NS_ERROR_FAILURE);
+ mLauncher->SaveToDisk (nsnull,PR_FALSE);
}
return NS_OK;
diff --git a/embed/mozilla/ContentHandler.h b/embed/mozilla/ContentHandler.h
index d07bea0f7..b692675f5 100644
--- a/embed/mozilla/ContentHandler.h
+++ b/embed/mozilla/ContentHandler.h
@@ -70,24 +70,19 @@ class GContentHandler : public nsIHelperAppLauncherDialog
private:
NS_METHOD Init ();
- NS_METHOD ProcessMimeInfo ();
- NS_METHOD FindHelperApp ();
NS_METHOD LaunchHelperApp ();
- NS_METHOD GetLauncher (nsIHelperAppLauncher * *_retval);
- NS_METHOD SetHelperApp(GnomeVFSMimeApplication *mHelperApp,
- PRBool alwaysUse);
- NS_METHOD SynchroniseMIMEInfo ();
NS_METHOD MIMEConfirmAction ();
NS_METHOD MIMEDoAction ();
-
+ NS_METHOD CheckAppSupportScheme ();
+
nsCOMPtr<nsIHelperAppLauncher> mLauncher;
nsCOMPtr<nsIURI> mUri;
nsCOMPtr<nsIFile> mTempFile;
char *mMimeType;
- PRBool mUrlHelper;
+ PRBool mAppSupportScheme;
GnomeVFSMimeApplication *mHelperApp;
ContentAction mAction;
EphyMimePermission mPermission;
diff --git a/embed/mozilla/MozDownload.cpp b/embed/mozilla/MozDownload.cpp
index 53205702a..003573402 100644
--- a/embed/mozilla/MozDownload.cpp
+++ b/embed/mozilla/MozDownload.cpp
@@ -55,6 +55,7 @@
#include "nsDirectoryServiceDefs.h"
#include "nsDirectoryServiceUtils.h"
#include "nsIRequest.h"
+#include "nsIMIMEInfo.h"
#include "netCore.h"
const char* const persistContractID = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1";
@@ -88,6 +89,7 @@ MozDownload::Init(nsIURI *aSource, nsILocalFile *aTarget, const PRUnichar *aDisp
nsIMIMEInfo *aMIMEInfo, PRInt64 startTime, nsIWebBrowserPersist *aPersist)
{
PRBool addToView = PR_TRUE;
+ nsresult rv;
if (mEmbedPersist)
{
@@ -106,6 +108,7 @@ MozDownload::Init(nsIURI *aSource, nsILocalFile *aTarget, const PRUnichar *aDisp
mPercentComplete = 0;
mInterval = 4000; /* in ms */
mLastUpdate = mStartTime;
+ mMIMEInfo = aMIMEInfo;
if (aPersist)
{
@@ -262,6 +265,8 @@ NS_IMETHODIMP
MozDownload::OnStateChange (nsIWebProgress *aWebProgress, nsIRequest *aRequest,
PRUint32 aStateFlags, nsresult aStatus)
{
+ nsresult rv;
+
/* For a file download via the external helper app service, we will never get a start
notification. The helper app service has gotten that notification before it created us. */
if (!mGotFirstStateChange)
@@ -302,6 +307,41 @@ MozDownload::OnStateChange (nsIWebProgress *aWebProgress, nsIRequest *aRequest,
mozilla_embed_persist_cancelled (mEmbedPersist);
}
}
+ else if (NS_SUCCEEDED (aStatus))
+ {
+ GnomeVFSMimeApplication *helperApp;
+ char *mimeType;
+
+ rv = mMIMEInfo->GetMIMEType (&mimeType);
+ NS_ENSURE_SUCCESS (rv, NS_ERROR_FAILURE);
+
+ helperApp = gnome_vfs_mime_get_default_application (mimeType);
+
+ PRUnichar *description;
+ mMIMEInfo->GetApplicationDescription (&description);
+
+ /* HACK we use the application description to decide
+ if we have to open the saved file */
+ if ((strcmp (NS_ConvertUCS2toUTF8 (description).get(), "gnome-default") == 0) &&
+ helperApp)
+ {
+ GList *params = NULL;
+ char *param;
+ nsCAutoString aDest;
+
+ mDestination->GetNativePath (aDest);
+
+ param = g_strdup (aDest.get ());
+ params = g_list_append (params, param);
+ gnome_vfs_mime_application_launch (helperApp, params);
+ g_free (param);
+
+ g_list_free (params);
+ }
+
+ nsMemory::Free (mimeType);
+ gnome_vfs_mime_application_free (helperApp);
+ }
}
return NS_OK;
diff --git a/embed/mozilla/MozDownload.h b/embed/mozilla/MozDownload.h
index 9a2a94d53..084a90f8b 100644
--- a/embed/mozilla/MozDownload.h
+++ b/embed/mozilla/MozDownload.h
@@ -56,6 +56,7 @@
#include "downloader-view.h"
#include "ephy-download.h"
#include "ephy-embed-shell.h"
+#include <libgnomevfs/gnome-vfs-mime-handlers.h>
/* MozDownload
Holds information used to display a single download in the UI. This object is
@@ -111,6 +112,7 @@ public:
protected:
nsCOMPtr<nsIURI> mSource;
nsCOMPtr<nsILocalFile> mDestination;
+ nsCOMPtr<nsIMIMEInfo> mMIMEInfo;
PRInt64 mLastUpdate;
PRInt64 mStartTime;
PRInt64 mElapsed;