2003-01-22 09:57:15 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
2004-04-17 20:52:41 +04:00
|
|
|
* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
|
|
|
*
|
2000-06-17 01:35:13 +04:00
|
|
|
* The Original Code is the Mozilla browser.
|
2004-04-17 20:52:41 +04:00
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Netscape Communications, Inc.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1999
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
2000-06-17 01:35:13 +04:00
|
|
|
* Contributor(s):
|
|
|
|
* Scott MacGregor <mscott@netscape.com>
|
2004-06-11 19:47:57 +04:00
|
|
|
* Christian Biesinger <cbiesinger@web.de>
|
2007-05-25 19:17:44 +04:00
|
|
|
* Dan Mosedale <dmose@mozilla.org>
|
2004-04-17 20:52:41 +04:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
|
|
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
2000-06-17 01:35:13 +04:00
|
|
|
|
|
|
|
#ifndef nsExternalHelperAppService_h__
|
|
|
|
#define nsExternalHelperAppService_h__
|
|
|
|
|
2003-07-25 20:48:00 +04:00
|
|
|
#ifdef MOZ_LOGGING
|
|
|
|
#define FORCE_PR_LOG
|
|
|
|
#endif
|
|
|
|
#include "prlog.h"
|
2003-09-25 17:07:24 +04:00
|
|
|
#include "prtime.h"
|
2003-07-25 20:48:00 +04:00
|
|
|
|
2005-04-06 03:24:23 +04:00
|
|
|
#include "nsInt64.h"
|
|
|
|
|
2000-06-17 01:35:13 +04:00
|
|
|
#include "nsIExternalHelperAppService.h"
|
2000-06-19 02:07:54 +04:00
|
|
|
#include "nsIExternalProtocolService.h"
|
2005-04-06 03:24:23 +04:00
|
|
|
#include "nsIWebProgressListener2.h"
|
2001-05-04 01:24:36 +04:00
|
|
|
#include "nsIHelperAppLauncherDialog.h"
|
2000-06-19 02:07:54 +04:00
|
|
|
|
2000-07-07 05:48:05 +04:00
|
|
|
#include "nsIMIMEInfo.h"
|
2004-01-28 17:48:22 +03:00
|
|
|
#include "nsMIMEInfoImpl.h"
|
2000-09-08 04:12:51 +04:00
|
|
|
#include "nsIMIMEService.h"
|
2000-06-17 01:35:13 +04:00
|
|
|
#include "nsIStreamListener.h"
|
|
|
|
#include "nsIFile.h"
|
2000-06-17 23:53:44 +04:00
|
|
|
#include "nsIFileStreams.h"
|
|
|
|
#include "nsIOutputStream.h"
|
2000-06-18 05:13:04 +04:00
|
|
|
#include "nsString.h"
|
2001-07-16 06:40:48 +04:00
|
|
|
#include "nsIInterfaceRequestor.h"
|
2001-09-06 01:28:38 +04:00
|
|
|
#include "nsIInterfaceRequestorUtils.h"
|
2001-07-16 06:40:48 +04:00
|
|
|
#include "nsILocalFile.h"
|
2003-01-18 05:15:14 +03:00
|
|
|
#include "nsIChannel.h"
|
2006-08-08 22:02:46 +04:00
|
|
|
#include "nsITimer.h"
|
2000-06-21 12:29:13 +04:00
|
|
|
|
2006-08-15 02:36:15 +04:00
|
|
|
#ifdef MOZ_RDF
|
2000-06-21 12:29:13 +04:00
|
|
|
#include "nsIRDFDataSource.h"
|
|
|
|
#include "nsIRDFResource.h"
|
2006-08-15 02:36:15 +04:00
|
|
|
#endif
|
2000-06-17 01:35:13 +04:00
|
|
|
#include "nsCOMPtr.h"
|
2001-07-11 07:23:24 +04:00
|
|
|
#include "nsIObserver.h"
|
2003-07-02 04:29:26 +04:00
|
|
|
#include "nsCOMArray.h"
|
2003-01-22 09:57:15 +03:00
|
|
|
#include "nsWeakReference.h"
|
2004-10-25 11:46:01 +04:00
|
|
|
#include "nsIPrompt.h"
|
2000-06-17 01:35:13 +04:00
|
|
|
|
2000-06-17 04:06:26 +04:00
|
|
|
class nsExternalAppHandler;
|
2000-06-21 12:29:13 +04:00
|
|
|
class nsIMIMEInfo;
|
|
|
|
class nsIRDFService;
|
2005-01-04 16:40:51 +03:00
|
|
|
class nsITransfer;
|
2006-08-08 22:02:46 +04:00
|
|
|
class nsIDOMWindowInternal;
|
2000-06-17 04:06:26 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* The helper app service. Responsible for handling content that Mozilla
|
|
|
|
* itself can not handle
|
|
|
|
*/
|
2003-01-22 09:57:15 +03:00
|
|
|
class nsExternalHelperAppService
|
|
|
|
: public nsIExternalHelperAppService,
|
|
|
|
public nsPIExternalAppLauncher,
|
|
|
|
public nsIExternalProtocolService,
|
|
|
|
public nsIMIMEService,
|
|
|
|
public nsIObserver,
|
|
|
|
public nsSupportsWeakReference
|
2000-06-17 01:35:13 +04:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_DECL_NSIEXTERNALHELPERAPPSERVICE
|
2000-06-18 03:04:53 +04:00
|
|
|
NS_DECL_NSPIEXTERNALAPPLAUNCHER
|
2000-06-19 02:07:54 +04:00
|
|
|
NS_DECL_NSIEXTERNALPROTOCOLSERVICE
|
2000-09-08 04:12:51 +04:00
|
|
|
NS_DECL_NSIMIMESERVICE
|
2001-07-11 07:23:24 +04:00
|
|
|
NS_DECL_NSIOBSERVER
|
2000-06-17 01:35:13 +04:00
|
|
|
|
|
|
|
nsExternalHelperAppService();
|
|
|
|
virtual ~nsExternalHelperAppService();
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Initializes the RDF datasource from the profile.
|
|
|
|
* @retval NS_OK Loading was successful
|
|
|
|
* @retval errorcode Loading failed
|
|
|
|
* @see mOverRideDataSource
|
|
|
|
*/
|
2004-06-11 19:47:57 +04:00
|
|
|
NS_HIDDEN_(nsresult) InitDataSource();
|
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Initializes internal state. Will be called automatically when
|
|
|
|
* this service is first instantiated.
|
|
|
|
*/
|
2004-06-11 19:47:57 +04:00
|
|
|
NS_HIDDEN_(nsresult) Init();
|
2000-06-21 12:29:13 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
2007-07-05 23:31:44 +04:00
|
|
|
* Given an existing MIME info object and a MIME type, fill in any user
|
|
|
|
* override info from the in-memory data source.
|
|
|
|
*
|
|
|
|
* @param aContentType The MIME content-type
|
|
|
|
* @param aMIMEInfo The mime info to fill with the information
|
|
|
|
*/
|
|
|
|
NS_HIDDEN_(nsresult) FillMIMEInfoForMimeTypeFromDS(
|
|
|
|
const nsACString& aContentType, nsIMIMEInfo * aMIMEInfo);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Given an existing protocol info object and a protocol scheme, fill in
|
|
|
|
* any user override info from the in-memory data source.
|
|
|
|
*
|
|
|
|
* @param aScheme The protocol scheme
|
2003-11-15 18:01:39 +03:00
|
|
|
* @param aMIMEInfo The mime info to fill with the information
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2007-07-05 23:31:44 +04:00
|
|
|
NS_HIDDEN_(nsresult) FillProtoInfoForSchemeFromDS(
|
|
|
|
const nsACString& aScheme, nsIHandlerInfo * aMIMEInfo);
|
|
|
|
|
2007-07-24 03:36:16 +04:00
|
|
|
#ifdef MOZ_RDF
|
2007-07-05 23:31:44 +04:00
|
|
|
/**
|
|
|
|
* Fill in the generic handler info stuff; called by Fill*InfoFor*FromDS.
|
|
|
|
*
|
|
|
|
* @param aTypeNodeResource RDF resource representing the top level scheme
|
|
|
|
* or MIME-type node in the graph
|
|
|
|
* @param aType content-type or scheme name
|
|
|
|
* @param aRDFService the RDF service
|
|
|
|
* @param aTypeNodePrefix One of NC_{CONTENT,SCHEME}_NODE_PREFIX
|
|
|
|
* @param aHandlerInfo object to be filled in
|
|
|
|
*/
|
|
|
|
NS_HIDDEN_(nsresult) FillHandlerInfoForTypeFromDS(
|
|
|
|
nsIRDFResource *aTypeNodeResource, const nsCAutoString& aType,
|
|
|
|
nsIRDFService *aRDFService, const char *aTypeNodePrefix,
|
|
|
|
nsIHandlerInfo * aHandlerInfo);
|
2007-07-24 03:36:16 +04:00
|
|
|
#endif
|
2007-07-05 23:31:44 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Given an extension, look up the user override information to see if we
|
|
|
|
* have a mime info object representing this extension. The user over ride
|
2004-06-11 19:47:57 +04:00
|
|
|
* information is contained in an in-memory data source.
|
|
|
|
*
|
|
|
|
* Does not change the MIME Type of the MIME Info.
|
|
|
|
*
|
2003-11-15 18:01:39 +03:00
|
|
|
* @param aMIMEInfo The mime info to fill with the information
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2007-07-05 23:31:44 +04:00
|
|
|
NS_HIDDEN_(nsresult) FillMIMEInfoForExtensionFromDS(
|
|
|
|
const nsACString& aFileExtension, nsIMIMEInfo * aMIMEInfo);
|
2004-06-11 19:47:57 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Looks up the MIME Type for a given extension in the RDF Datasource.
|
|
|
|
* @param aExtension The extension to look for
|
|
|
|
* @param aType [out] The type, if found
|
|
|
|
* @return PR_TRUE if found, PR_FALSE otherwise
|
|
|
|
*/
|
|
|
|
NS_HIDDEN_(PRBool) GetTypeFromDS(const nsACString& aFileExtension,
|
|
|
|
nsACString& aType);
|
2003-01-12 04:14:35 +03:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Given a mimetype and an extension, looks up a mime info from the OS.
|
|
|
|
* The mime type is given preference. This function follows the same rules
|
|
|
|
* as nsIMIMEService::GetFromTypeAndExtension.
|
|
|
|
* This is supposed to be overridden by the platform-specific
|
|
|
|
* nsOSHelperAppService!
|
2004-08-10 01:27:24 +04:00
|
|
|
* @param aFileExt The file extension; may be empty. UTF-8 encoded.
|
2003-11-15 18:01:39 +03:00
|
|
|
* @param [out] aFound
|
|
|
|
* Should be set to PR_TRUE if the os has a mapping, to
|
|
|
|
* PR_FALSE otherwise. Must not be null.
|
|
|
|
* @return A MIMEInfo. This function must return a MIMEInfo object if it
|
|
|
|
* can allocate one. The only justifiable reason for not
|
|
|
|
* returning one is an out-of-memory error.
|
|
|
|
* If null, the value of aFound is unspecified.
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2004-04-16 00:56:37 +04:00
|
|
|
virtual already_AddRefed<nsIMIMEInfo> GetMIMEInfoFromOS(const nsACString& aMIMEType,
|
|
|
|
const nsACString& aFileExt,
|
2004-03-08 23:15:09 +03:00
|
|
|
PRBool * aFound) = 0;
|
2003-01-12 04:14:35 +03:00
|
|
|
|
2007-07-22 22:40:24 +04:00
|
|
|
/**
|
|
|
|
* Given a scheme, looks up the protocol info from the OS. This should be
|
|
|
|
* overridden by each OS's implementation.
|
|
|
|
*
|
|
|
|
* @param aScheme The protocol scheme we are looking for.
|
|
|
|
* @return An nsIHanderInfo for the protocol.
|
|
|
|
*/
|
2007-07-31 03:33:16 +04:00
|
|
|
virtual already_AddRefed<nsIHandlerInfo> GetProtocolInfoFromOS(const nsACString &aScheme,
|
|
|
|
PRBool *found) = 0;
|
2007-07-22 22:40:24 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Given a string identifying an application, create an nsIFile representing
|
|
|
|
* it. This function should look in $PATH for the application.
|
2004-03-08 23:15:09 +03:00
|
|
|
* The base class implementation will first try to interpret platformAppPath
|
|
|
|
* as an absolute path, and if that fails it will look for a file next to the
|
|
|
|
* mozilla executable. Subclasses can override this method if they want a
|
|
|
|
* different behaviour.
|
2003-09-26 23:49:23 +04:00
|
|
|
* @param platformAppPath A platform specific path to an application that we
|
|
|
|
* got out of the rdf data source. This can be a mac
|
|
|
|
* file spec, a unix path or a windows path depending
|
|
|
|
* on the platform
|
|
|
|
* @param aFile [out] An nsIFile representation of that platform
|
|
|
|
* application path.
|
|
|
|
*/
|
2003-07-25 20:48:00 +04:00
|
|
|
virtual nsresult GetFileTokenForPath(const PRUnichar * platformAppPath,
|
2004-03-08 23:15:09 +03:00
|
|
|
nsIFile ** aFile);
|
2003-01-12 04:14:35 +03:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Helper routine used to test whether a given mime type is in our
|
|
|
|
* mimeTypes.rdf data source
|
|
|
|
*/
|
2004-06-11 19:47:57 +04:00
|
|
|
NS_HIDDEN_(PRBool) MIMETypeIsInDataSource(const char * aContentType);
|
2003-01-12 04:14:35 +03:00
|
|
|
|
2007-05-25 19:17:44 +04:00
|
|
|
/**
|
|
|
|
* Return the URI template for any configured web handler. This will
|
|
|
|
* probably be replaced by something on nsIWebContentConverterService soon.
|
|
|
|
*/
|
2007-07-05 23:31:44 +04:00
|
|
|
NS_HIDDEN_(nsresult) GetProtocolHandlerInfo(const nsACString &aScheme,
|
|
|
|
nsIHandlerInfo **aHandlerInfo);
|
2007-05-25 19:17:44 +04:00
|
|
|
|
|
|
|
virtual NS_HIDDEN_(nsresult) OSProtocolHandlerExists(const char *aScheme,
|
|
|
|
PRBool *aExists) = 0;
|
|
|
|
|
2000-06-17 01:35:13 +04:00
|
|
|
protected:
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Pointer to the datasource that contains the user override information.
|
|
|
|
* @see InitDataSource
|
|
|
|
*/
|
2006-08-15 02:36:15 +04:00
|
|
|
#ifdef MOZ_RDF
|
2000-06-21 12:29:13 +04:00
|
|
|
nsCOMPtr<nsIRDFDataSource> mOverRideDataSource;
|
|
|
|
|
2004-04-16 00:56:37 +04:00
|
|
|
nsCOMPtr<nsIRDFResource> kNC_Description;
|
|
|
|
nsCOMPtr<nsIRDFResource> kNC_Value;
|
|
|
|
nsCOMPtr<nsIRDFResource> kNC_FileExtensions;
|
2000-06-21 12:29:13 +04:00
|
|
|
nsCOMPtr<nsIRDFResource> kNC_Path;
|
2003-01-12 04:14:35 +03:00
|
|
|
nsCOMPtr<nsIRDFResource> kNC_UseSystemDefault;
|
2000-06-21 12:29:13 +04:00
|
|
|
nsCOMPtr<nsIRDFResource> kNC_SaveToDisk;
|
|
|
|
nsCOMPtr<nsIRDFResource> kNC_AlwaysAsk;
|
|
|
|
nsCOMPtr<nsIRDFResource> kNC_HandleInternal;
|
|
|
|
nsCOMPtr<nsIRDFResource> kNC_PrettyName;
|
2007-07-05 23:31:44 +04:00
|
|
|
nsCOMPtr<nsIRDFResource> kNC_UriTemplate;
|
2006-08-15 02:36:15 +04:00
|
|
|
#endif
|
2000-06-21 12:29:13 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Whether mOverRideDataSource is initialized
|
|
|
|
*/
|
2000-09-08 04:12:51 +04:00
|
|
|
PRBool mDataSourceInitialized;
|
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Helper routines for digesting the data source and filling in a mime info
|
|
|
|
* object for a given content type inside that data source.
|
2004-06-11 19:47:57 +04:00
|
|
|
* The content type of the MIME Info will not be changed.
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2006-08-15 02:36:15 +04:00
|
|
|
#ifdef MOZ_RDF
|
2007-07-05 23:31:44 +04:00
|
|
|
NS_HIDDEN_(nsresult) FillMIMEExtensionProperties(
|
|
|
|
nsIRDFResource * aContentTypeNodeResource, nsIRDFService * aRDFService,
|
|
|
|
nsIMIMEInfo * aMIMEInfo);
|
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
2007-07-05 23:31:44 +04:00
|
|
|
* @see FillMIMEExtensionProperties
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2004-06-11 19:47:57 +04:00
|
|
|
NS_HIDDEN_(nsresult) FillContentHandlerProperties(const char * aContentType,
|
2007-07-05 23:31:44 +04:00
|
|
|
const char * aNodePrefix,
|
2004-06-11 19:47:57 +04:00
|
|
|
nsIRDFService * aRDFService,
|
2007-07-05 23:31:44 +04:00
|
|
|
nsIHandlerInfo * aHandler);
|
2000-06-21 12:29:13 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* A small helper function which gets the target for a given source and
|
|
|
|
* property. QIs to a literal and returns a CONST ptr to the string value
|
|
|
|
* of that target
|
|
|
|
*/
|
2004-06-11 19:47:57 +04:00
|
|
|
NS_HIDDEN_(nsresult) FillLiteralValueFromTarget(nsIRDFResource * aSource,
|
|
|
|
nsIRDFResource * aProperty,
|
|
|
|
const PRUnichar ** aLiteralValue);
|
2006-08-15 02:36:15 +04:00
|
|
|
#endif
|
2000-06-17 01:35:13 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Searches the "extra" array of MIMEInfo objects for an object
|
2003-11-15 18:01:39 +03:00
|
|
|
* with a specific type. If found, it will modify the passed-in
|
|
|
|
* MIMEInfo. Otherwise, it will return an error and the MIMEInfo
|
|
|
|
* will be untouched.
|
2003-09-26 23:49:23 +04:00
|
|
|
* @param aContentType The type to search for.
|
2003-11-15 18:01:39 +03:00
|
|
|
* @param aMIMEInfo [inout] The mime info, if found
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2007-07-05 23:31:44 +04:00
|
|
|
NS_HIDDEN_(nsresult) FillMIMEInfoForMimeTypeFromExtras(
|
|
|
|
const nsACString& aContentType, nsIMIMEInfo * aMIMEInfo);
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Searches the "extra" array of MIMEInfo objects for an object
|
|
|
|
* with a specific extension.
|
2004-06-11 19:47:57 +04:00
|
|
|
*
|
|
|
|
* Does not change the MIME Type of the MIME Info.
|
|
|
|
*
|
2007-07-05 23:31:44 +04:00
|
|
|
* @see FillMIMEInfoForMimeTypeFromExtras
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2007-07-05 23:31:44 +04:00
|
|
|
NS_HIDDEN_(nsresult) FillMIMEInfoForExtensionFromExtras(
|
|
|
|
const nsACString& aExtension, nsIMIMEInfo * aMIMEInfo);
|
2004-06-11 19:47:57 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Searches the "extra" array for a MIME type, and gets its extension.
|
|
|
|
* @param aExtension The extension to search for
|
|
|
|
* @param aMIMEType [out] The found MIME type.
|
|
|
|
* @return PR_TRUE if the extension was found, PR_FALSE otherwise.
|
|
|
|
*/
|
|
|
|
NS_HIDDEN_(PRBool) GetTypeFromExtras(const nsACString& aExtension,
|
|
|
|
nsACString& aMIMEType);
|
2000-09-15 10:07:58 +04:00
|
|
|
|
2004-03-06 22:37:22 +03:00
|
|
|
/**
|
|
|
|
* Fixes the file permissions to be correct. Base class has a no-op
|
|
|
|
* implementation, subclasses can use this to correctly inherit ACLs from the
|
|
|
|
* parent directory, to make the permissions obey the umask, etc.
|
|
|
|
*/
|
|
|
|
virtual void FixFilePermissions(nsILocalFile* aFile);
|
|
|
|
|
2003-07-25 20:48:00 +04:00
|
|
|
#ifdef PR_LOGGING
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* NSPR Logging Module. Usage: set NSPR_LOG_MODULES=HelperAppService:level,
|
|
|
|
* where level should be 2 for errors, 3 for debug messages from the cross-
|
|
|
|
* platform nsExternalHelperAppService, and 4 for os-specific debug messages.
|
|
|
|
*/
|
2003-07-25 20:48:00 +04:00
|
|
|
static PRLogModuleInfo* mLog;
|
2003-09-23 23:27:07 +04:00
|
|
|
|
2003-07-25 20:48:00 +04:00
|
|
|
#endif
|
2004-03-06 22:37:22 +03:00
|
|
|
// friend, so that it can access the nspr log module and FixFilePermissions
|
|
|
|
friend class nsExternalAppHandler;
|
2006-05-10 21:30:15 +04:00
|
|
|
friend class nsExternalLoadRequest;
|
2004-02-24 01:49:28 +03:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Functions related to the tempory file cleanup service provided by
|
|
|
|
* nsExternalHelperAppService
|
|
|
|
*/
|
2004-06-11 19:47:57 +04:00
|
|
|
NS_HIDDEN_(nsresult) ExpungeTemporaryFiles();
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Array for the files that should be deleted
|
|
|
|
*/
|
2003-07-02 04:29:26 +04:00
|
|
|
nsCOMArray<nsILocalFile> mTemporaryFilesList;
|
2000-09-15 10:07:58 +04:00
|
|
|
};
|
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* We need to read the data out of the incoming stream into a buffer which we
|
|
|
|
* can then use to write the data into the output stream representing the
|
|
|
|
* temp file.
|
|
|
|
*/
|
2000-06-17 23:53:44 +04:00
|
|
|
#define DATA_BUFFER_SIZE (4096*2)
|
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* An external app handler is just a small little class that presents itself as
|
|
|
|
* a nsIStreamListener. It saves the incoming data into a temp file. The handler
|
|
|
|
* is bound to an application when it is created. When it receives an
|
|
|
|
* OnStopRequest it launches the application using the temp file it has
|
|
|
|
* stored the data into. We create a handler every time we have to process
|
|
|
|
* data using a helper app.
|
|
|
|
*/
|
2003-07-25 20:48:00 +04:00
|
|
|
class nsExternalAppHandler : public nsIStreamListener,
|
2006-08-08 22:02:46 +04:00
|
|
|
public nsIHelperAppLauncher,
|
|
|
|
public nsITimerCallback
|
2000-06-17 01:35:13 +04:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_DECL_NSISTREAMLISTENER
|
2001-04-10 10:01:08 +04:00
|
|
|
NS_DECL_NSIREQUESTOBSERVER
|
2000-07-07 05:48:05 +04:00
|
|
|
NS_DECL_NSIHELPERAPPLAUNCHER
|
2005-04-15 23:41:07 +04:00
|
|
|
NS_DECL_NSICANCELABLE
|
2006-08-08 22:02:46 +04:00
|
|
|
NS_DECL_NSITIMERCALLBACK
|
2000-06-17 01:35:13 +04:00
|
|
|
|
2005-03-13 20:03:44 +03:00
|
|
|
/**
|
|
|
|
* @param aMIMEInfo MIMEInfo object, representing the type of the
|
|
|
|
* content that should be handled
|
|
|
|
* @param aFileExtension The extension we need to append to our temp file,
|
|
|
|
* INCLUDING the ".". e.g. .mp3
|
|
|
|
* @param aWindowContext Window context, as passed to DoContent
|
|
|
|
* @param aFileName The filename to use
|
|
|
|
* @param aReason A constant from nsIHelperAppLauncherDialog indicating
|
|
|
|
* why the request is handled by a helper app.
|
|
|
|
*/
|
|
|
|
nsExternalAppHandler(nsIMIMEInfo * aMIMEInfo, const nsCSubstring& aFileExtension,
|
|
|
|
nsIInterfaceRequestor * aWindowContext,
|
|
|
|
const nsAString& aFilename,
|
|
|
|
PRUint32 aReason);
|
2000-06-17 01:35:13 +04:00
|
|
|
|
2005-03-13 20:03:44 +03:00
|
|
|
~nsExternalAppHandler();
|
2000-06-17 06:34:44 +04:00
|
|
|
|
2000-06-17 01:35:13 +04:00
|
|
|
protected:
|
|
|
|
nsCOMPtr<nsIFile> mTempFile;
|
2003-07-01 02:33:36 +04:00
|
|
|
nsCOMPtr<nsIURI> mSourceUrl;
|
2002-05-08 03:07:19 +04:00
|
|
|
nsString mTempFileExtension;
|
2005-03-02 00:34:57 +03:00
|
|
|
/**
|
|
|
|
* The MIME Info for this load. Will never be null.
|
|
|
|
*/
|
2000-07-07 05:48:05 +04:00
|
|
|
nsCOMPtr<nsIMIMEInfo> mMimeInfo;
|
2003-09-26 23:49:23 +04:00
|
|
|
nsCOMPtr<nsIOutputStream> mOutStream; /**< output stream to the temp file */
|
2006-08-08 22:02:46 +04:00
|
|
|
nsCOMPtr<nsIInterfaceRequestor> mWindowContext;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Used to close the window on a timer, to avoid any exceptions that are
|
|
|
|
* thrown if we try to close the window before it's fully loaded.
|
|
|
|
*/
|
|
|
|
nsCOMPtr<nsIDOMWindowInternal> mWindowToClose;
|
|
|
|
nsCOMPtr<nsITimer> mTimer;
|
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* The following field is set if we were processing an http channel that had
|
|
|
|
* a content disposition header which specified the SUGGESTED file name we
|
|
|
|
* should present to the user in the save to disk dialog.
|
|
|
|
*/
|
2002-05-08 03:07:19 +04:00
|
|
|
nsString mSuggestedFileName;
|
2000-06-17 01:35:13 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* The canceled flag is set if the user canceled the launching of this
|
|
|
|
* application before we finished saving the data to a temp file.
|
|
|
|
*/
|
2002-06-04 00:52:27 +04:00
|
|
|
PRPackedBool mCanceled;
|
2000-07-07 05:48:05 +04:00
|
|
|
|
2006-07-05 00:48:33 +04:00
|
|
|
/**
|
|
|
|
* This is set based on whether the channel indicates that a new window
|
|
|
|
* was opened specifically for this download. If so, then we
|
|
|
|
* close it.
|
|
|
|
*/
|
2006-07-06 22:41:16 +04:00
|
|
|
PRPackedBool mShouldCloseWindow;
|
2006-07-05 00:48:33 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* have we received information from the user about how they want to
|
|
|
|
* dispose of this content
|
|
|
|
*/
|
2002-06-07 02:12:18 +04:00
|
|
|
PRPackedBool mReceivedDispositionInfo;
|
2002-06-04 00:52:27 +04:00
|
|
|
PRPackedBool mStopRequestIssued;
|
|
|
|
PRPackedBool mProgressListenerInitialized;
|
2005-03-13 20:03:44 +03:00
|
|
|
|
2005-09-26 07:14:50 +04:00
|
|
|
PRPackedBool mIsFileChannel;
|
|
|
|
|
2005-03-13 20:03:44 +03:00
|
|
|
/**
|
|
|
|
* One of the REASON_ constants from nsIHelperAppLauncherDialog. Indicates the
|
|
|
|
* reason the dialog was shown (unknown content type, server requested it,
|
|
|
|
* etc).
|
|
|
|
*/
|
|
|
|
PRUint32 mReason;
|
|
|
|
|
2003-09-25 17:07:24 +04:00
|
|
|
PRTime mTimeDownloadStarted;
|
2005-04-06 03:24:23 +04:00
|
|
|
nsInt64 mContentLength;
|
|
|
|
nsInt64 mProgress; /**< Number of bytes received (for sending progress notifications). */
|
2000-07-07 05:48:05 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* When we are told to save the temp file to disk (in a more permament
|
|
|
|
* location) before we are done writing the content to a temp file, then
|
|
|
|
* we need to remember the final destination until we are ready to use it.
|
|
|
|
*/
|
2000-07-07 05:48:05 +04:00
|
|
|
nsCOMPtr<nsIFile> mFinalFileDestination;
|
|
|
|
|
2003-12-19 18:18:59 +03:00
|
|
|
char mDataBuffer[DATA_BUFFER_SIZE];
|
2000-07-07 05:48:05 +04:00
|
|
|
|
2005-03-02 00:34:57 +03:00
|
|
|
/**
|
|
|
|
* Creates the temporary file for the download and an output stream for it.
|
|
|
|
* Upon successful return, both mTempFile and mOutStream will be valid.
|
|
|
|
*/
|
2000-07-07 05:48:05 +04:00
|
|
|
nsresult SetUpTempFile(nsIChannel * aChannel);
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* When we download a helper app, we are going to retarget all load
|
|
|
|
* notifications into our own docloader and load group instead of
|
|
|
|
* using the window which initiated the load....RetargetLoadNotifications
|
|
|
|
* contains that information...
|
|
|
|
*/
|
2004-02-07 22:52:16 +03:00
|
|
|
void RetargetLoadNotifications(nsIRequest *request);
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* If the user tells us how they want to dispose of the content and
|
|
|
|
* we still haven't finished downloading while they were deciding,
|
|
|
|
* then create a progress listener of some kind so they know
|
|
|
|
* what's going on...
|
|
|
|
*/
|
2002-06-04 00:52:27 +04:00
|
|
|
nsresult CreateProgressListener();
|
2003-07-25 20:48:00 +04:00
|
|
|
nsresult PromptForSaveToFile(nsILocalFile ** aNewFile,
|
|
|
|
const nsAFlatString &aDefaultFile,
|
|
|
|
const nsAFlatString &aDefaultFileExt);
|
2003-10-22 10:46:52 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* After we're done prompting the user for any information, if the original
|
|
|
|
* channel had a refresh url associated with it (which might point to a
|
|
|
|
* "thank you for downloading" kind of page, then process that....It is safe
|
|
|
|
* to invoke this method multiple times. We'll clear mOriginalChannel after
|
|
|
|
* it's called and this ensures we won't call it again....
|
|
|
|
*/
|
2000-11-01 11:06:19 +03:00
|
|
|
void ProcessAnyRefreshTags();
|
2001-01-25 09:48:16 +03:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* An internal method used to actually move the temp file to the final
|
|
|
|
* destination once we done receiving data AND have showed the progress dialog
|
|
|
|
*/
|
2001-01-25 09:48:16 +03:00
|
|
|
nsresult MoveFile(nsIFile * aNewFileLocation);
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* An internal method used to actually launch a helper app given the temp file
|
|
|
|
* once we are done receiving data AND have showed the progress dialog.
|
2004-02-24 01:49:28 +03:00
|
|
|
* Uses the application specified in the mime info.
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2004-02-24 01:49:28 +03:00
|
|
|
nsresult OpenWithApplication();
|
2002-06-04 00:52:27 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Helper routine which peaks at the mime action specified by mMimeInfo
|
|
|
|
* and calls either MoveFile or OpenWithApplication
|
|
|
|
*/
|
2001-01-25 09:48:16 +03:00
|
|
|
nsresult ExecuteDesiredAction();
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Helper routine that searches a pref string for a given mime type
|
|
|
|
*/
|
2003-01-12 04:14:35 +03:00
|
|
|
PRBool GetNeverAskFlagFromPref(const char * prefName, const char * aContentType);
|
2002-06-04 00:52:27 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
2005-01-04 16:40:51 +03:00
|
|
|
* Initialize an nsITransfer object for use as a progress object
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2005-01-04 16:40:51 +03:00
|
|
|
nsresult InitializeDownload(nsITransfer*);
|
2002-06-04 00:52:27 +04:00
|
|
|
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Helper routine to ensure mSuggestedFileName is "correct";
|
2004-01-16 21:22:55 +03:00
|
|
|
* this ensures that mTempFileExtension only contains an extension when it
|
|
|
|
* is different from mSuggestedFileName's extension.
|
2003-09-26 23:49:23 +04:00
|
|
|
*/
|
2004-01-16 21:22:55 +03:00
|
|
|
void EnsureSuggestedFileName();
|
2003-09-26 23:49:23 +04:00
|
|
|
|
2002-05-17 04:31:53 +04:00
|
|
|
typedef enum { kReadError, kWriteError, kLaunchError } ErrorType;
|
2003-09-26 23:49:23 +04:00
|
|
|
/**
|
|
|
|
* Utility function to send proper error notification to web progress listener
|
|
|
|
*/
|
2002-05-17 04:31:53 +04:00
|
|
|
void SendStatusChange(ErrorType type, nsresult aStatus, nsIRequest *aRequest, const nsAFlatString &path);
|
2006-07-05 00:48:33 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Closes the window context if it does not have a refresh header
|
|
|
|
* and it never displayed content before the external helper app
|
|
|
|
* service was invoked.
|
|
|
|
*/
|
|
|
|
nsresult MaybeCloseWindow();
|
|
|
|
|
2005-04-06 03:24:23 +04:00
|
|
|
nsCOMPtr<nsIWebProgressListener2> mWebProgressListener;
|
2003-09-26 23:49:23 +04:00
|
|
|
nsCOMPtr<nsIChannel> mOriginalChannel; /**< in the case of a redirect, this will be the pre-redirect channel. */
|
2001-05-04 01:24:36 +04:00
|
|
|
nsCOMPtr<nsIHelperAppLauncherDialog> mDialog;
|
2004-01-29 01:05:25 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The request that's being loaded. Not used after OnStopRequest, so a weak
|
|
|
|
* reference suffices. Initialized in OnStartRequest.
|
|
|
|
*/
|
|
|
|
nsIRequest* mRequest;
|
2000-06-17 01:35:13 +04:00
|
|
|
};
|
|
|
|
|
2007-05-25 19:17:44 +04:00
|
|
|
extern NS_HIDDEN_(nsExternalHelperAppService*) gExtProtSvc;
|
|
|
|
|
2000-06-17 01:35:13 +04:00
|
|
|
#endif // nsExternalHelperAppService_h__
|