From 584b0d5a41fe8aab67eb4efdb5ba52f9204d99b7 Mon Sep 17 00:00:00 2001 From: "tonyr%fbdesigns.com" Date: Fri, 14 Apr 2000 03:04:08 +0000 Subject: [PATCH] First Checked In. git-svn-id: svn://10.0.0.236/trunk@65937 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/uriloader/extprotocol/Makefile.in | 32 +++++ .../uriloader/extprotocol/base/Makefile.in | 52 +++++++ .../uriloader/extprotocol/base/Makefile.win | 48 +++++++ .../extprotocol/base/nsExternalFactory.cpp | 68 +++++++++ .../extprotocol/base/nsExternalProtocol.cpp | 135 ++++++++++++++++++ .../extprotocol/base/nsExternalProtocol.h | 60 ++++++++ mozilla/uriloader/extprotocol/mac/MANIFEST | 0 .../uriloader/extprotocol/mac/extProtocol.mcp | Bin 0 -> 157453 bytes .../extprotocol/mac/extProtocolIDL.mcp | Bin 0 -> 90044 bytes .../extprotocol/mac/extProtocolPrefix.h | 25 ++++ .../extprotocol/mac/extProtocolPrefixDebug.h | 25 ++++ .../extprotocol/mac/nsExternalProtocolMac.cpp | 75 ++++++++++ mozilla/uriloader/extprotocol/makefile.win | 26 ++++ .../uriloader/extprotocol/public/Makefile.in | 37 +++++ .../uriloader/extprotocol/public/makefile.win | 32 +++++ .../public/nsIExternalProtocol.idl | 62 ++++++++ .../public/nsIExternalURIHandler.idl | 53 +++++++ .../uriloader/extprotocol/unix/Makefile.in | 41 ++++++ .../unix/nsExternalProtocolUnix.cpp | 49 +++++++ .../uriloader/extprotocol/win/Makefile.win | 45 ++++++ .../extprotocol/win/nsExternalProtocolWin.cpp | 123 ++++++++++++++++ 21 files changed, 988 insertions(+) create mode 100644 mozilla/uriloader/extprotocol/Makefile.in create mode 100644 mozilla/uriloader/extprotocol/base/Makefile.in create mode 100644 mozilla/uriloader/extprotocol/base/Makefile.win create mode 100644 mozilla/uriloader/extprotocol/base/nsExternalFactory.cpp create mode 100644 mozilla/uriloader/extprotocol/base/nsExternalProtocol.cpp create mode 100644 mozilla/uriloader/extprotocol/base/nsExternalProtocol.h create mode 100644 mozilla/uriloader/extprotocol/mac/MANIFEST create mode 100644 mozilla/uriloader/extprotocol/mac/extProtocol.mcp create mode 100644 mozilla/uriloader/extprotocol/mac/extProtocolIDL.mcp create mode 100644 mozilla/uriloader/extprotocol/mac/extProtocolPrefix.h create mode 100644 mozilla/uriloader/extprotocol/mac/extProtocolPrefixDebug.h create mode 100644 mozilla/uriloader/extprotocol/mac/nsExternalProtocolMac.cpp create mode 100644 mozilla/uriloader/extprotocol/makefile.win create mode 100644 mozilla/uriloader/extprotocol/public/Makefile.in create mode 100644 mozilla/uriloader/extprotocol/public/makefile.win create mode 100644 mozilla/uriloader/extprotocol/public/nsIExternalProtocol.idl create mode 100644 mozilla/uriloader/extprotocol/public/nsIExternalURIHandler.idl create mode 100644 mozilla/uriloader/extprotocol/unix/Makefile.in create mode 100644 mozilla/uriloader/extprotocol/unix/nsExternalProtocolUnix.cpp create mode 100644 mozilla/uriloader/extprotocol/win/Makefile.win create mode 100644 mozilla/uriloader/extprotocol/win/nsExternalProtocolWin.cpp diff --git a/mozilla/uriloader/extprotocol/Makefile.in b/mozilla/uriloader/extprotocol/Makefile.in new file mode 100644 index 00000000000..c5482543108 --- /dev/null +++ b/mozilla/uriloader/extprotocol/Makefile.in @@ -0,0 +1,32 @@ +# +# The contents of this file are subject to the Netscape 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/NPL/ +# +# 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. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# + +DEPTH = .. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +DIRS = public + +include $(topsrcdir)/config/rules.mk + diff --git a/mozilla/uriloader/extprotocol/base/Makefile.in b/mozilla/uriloader/extprotocol/base/Makefile.in new file mode 100644 index 00000000000..87b53c734ad --- /dev/null +++ b/mozilla/uriloader/extprotocol/base/Makefile.in @@ -0,0 +1,52 @@ +# +# The contents of this file are subject to the Netscape 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/NPL/ +# +# 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. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# + +DEPTH = ../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +MODULE = extprotocol +LIBRARY_NAME = extprotocol +IS_COMPONENT = 1 + + +CPPSRCS = nsExternalFactory.cpp \ + nsExternalProtocol.cpp \ + $(NULL) + +SHARED_LIBRARY_LIBS = \ + $(DIST)/lib/extprotocolunix_s.$(LIB_SUFFIX) \ + $(NULL) + +EXTRA_DSO_LDOPTS = \ + -L$(DIST)/bin \ + $(SHARED_LIBRARY_LIBS) \ + $(NSPR_LIBS) \ + $(XPCOM_LIBS) \ + $(NULL) + +include $(topsrcdir)/config/rules.mk + +$(LIBRARY) $(SHARED_LIBRARY): $(SHARED_LIBRARY_LIBS) Makefile + diff --git a/mozilla/uriloader/extprotocol/base/Makefile.win b/mozilla/uriloader/extprotocol/base/Makefile.win new file mode 100644 index 00000000000..f5d3ccd3bbf --- /dev/null +++ b/mozilla/uriloader/extprotocol/base/Makefile.win @@ -0,0 +1,48 @@ +#!gmake +# +# The contents of this file are subject to the Netscape 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/NPL/ +# +# 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. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): + +DEPTH=..\..\.. +MODULE=extprotocol + +MAKE_OBJ_TYPE=DLL +DLLNAME=$(MODULE) +DLL=.\$(OBJDIR)\$(DLLNAME).dll + + +CPP_OBJS=\ + .\$(OBJDIR)\nsExternalFactory.obj \ + .\$(OBJDIR)\nsExternalProtocol.obj \ + $(NULL) + +LLIBS=\ + $(DIST)\lib\extprotocolwin_s.lib \ + $(DIST)\lib\xpcom.lib \ + $(LIBNSPR) \ + $(NULL) + +WIN_LIBS= shell32.lib + +include <$(DEPTH)\config\rules.mak> + +install:: $(DLL) + $(MAKE_INSTALL) $(DLL) $(DIST)\bin\components + + diff --git a/mozilla/uriloader/extprotocol/base/nsExternalFactory.cpp b/mozilla/uriloader/extprotocol/base/nsExternalFactory.cpp new file mode 100644 index 00000000000..eb6a2a84cef --- /dev/null +++ b/mozilla/uriloader/extprotocol/base/nsExternalFactory.cpp @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +/* + Text import module +*/ + +#include "nsCOMPtr.h" +#include "nsCRT.h" +#include "nsIModule.h" +#include "nsIGenericFactory.h" +#include "nsIServiceManager.h" +#include "nsICategoryManager.h" +#include "nsXPIDLString.h" +#include "nsExternalProtocol.h" + + +static NS_DEFINE_CID(kExternalProtocolCID, NS_EXTERNALPROTOCOL_CID); + + +NS_GENERIC_FACTORY_CONSTRUCTOR( nsExternalProtocol) + +static NS_IMETHODIMP nsExternalMailtoConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult) +{ + nsresult rv = nsExternalProtocolConstructor( aOuter, aIID, aResult); + if (NS_SUCCEEDED( rv)) { + nsIExternalProtocol *pProto = (nsIExternalProtocol *) (*aResult); + pProto->SetScheme( "mailto"); + } + return( rv); +} + +static nsModuleComponentInfo components[] = { + { "External protocol handler", + NS_EXTERNALPROTOCOL_CID, + "component://mozilla/externalprotocol/default", + nsExternalProtocolConstructor, + nsnull, + nsnull + }, + { "External mailto protocol handler", + NS_EXTERNALMAILTO_CID, + NS_EXTERNALMAILTO_PROGID, + nsExternalMailtoConstructor, + nsnull, + nsnull + } +}; + + +NS_IMPL_NSGETMODULE("nsExternalProtocolModule", components) + + diff --git a/mozilla/uriloader/extprotocol/base/nsExternalProtocol.cpp b/mozilla/uriloader/extprotocol/base/nsExternalProtocol.cpp new file mode 100644 index 00000000000..8cedcf1e19b --- /dev/null +++ b/mozilla/uriloader/extprotocol/base/nsExternalProtocol.cpp @@ -0,0 +1,135 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + * + * Contributor(s): + * + */ + + +#include "nscore.h" +#include "nsCRT.h" +#include "nsString.h" +#include "nsIURI.h" +#include "nsIURL.h" +#include "nsIComponentManager.h" +#include "nsExternalProtocol.h" +#include "nsXPIDLString.h" + + + +#ifdef NS_DEBUG +#define DEBUG_LOG0( x) printf( x) +#define DEBUG_LOG1( x, y) printf( x, y) +#else +#define DEBUG_LOG0( x) +#define DEBUG_LOG1( x, y) +#endif + +static NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID); + + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + + +nsExternalProtocol::nsExternalProtocol() +{ + NS_INIT_REFCNT(); + m_pData = nsnull; + m_schemeName = "default"; +} + + +nsExternalProtocol::~nsExternalProtocol() +{ + if (m_pData) + delete [] m_pData; +} + + + +NS_IMPL_ISUPPORTS(nsExternalProtocol, NS_GET_IID(nsIExternalProtocol)); + + + +NS_IMETHODIMP nsExternalProtocol::SetScheme(const char *scheme) +{ + m_schemeName = scheme; + return( NS_OK); +} + +/* readonly attribute string scheme; */ +NS_IMETHODIMP nsExternalProtocol::GetScheme(char * *aScheme) +{ + *aScheme = m_schemeName.ToNewCString(); + + return( NS_OK); +} + +/* readonly attribute long defaultPort; */ +NS_IMETHODIMP nsExternalProtocol::GetDefaultPort(PRInt32 *aDefaultPort) +{ + *aDefaultPort = 0; + return( NS_OK); +} + +/* nsIURI newURI (in string aSpec, in nsIURI aBaseURI); */ +NS_IMETHODIMP nsExternalProtocol::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval) +{ + nsresult rv; + + nsIURI* url; + if (aBaseURI) { + rv = aBaseURI->Clone(&url); + } else { + rv = nsComponentManager::CreateInstance(kStandardURLCID, nsnull, + NS_GET_IID(nsIURI), + (void**)&url); + } + if (NS_FAILED(rv)) + return rv; + + rv = url->SetSpec((char*)aSpec); + if (NS_FAILED(rv)) { + NS_RELEASE(url); + return rv; + } + + *_retval = url; + return rv; +} + +/* nsIChannel newChannel (in nsIURI aURI); */ +NS_IMETHODIMP nsExternalProtocol::NewChannel(nsIURI *aURI, nsIChannel **_retval) +{ + if (NS_SUCCEEDED( LaunchViaHelper( aURI))) + return( NS_ERROR_EXTERNAL_LAUNCH); + + return( DefaultLaunch( aURI)); +} + + +nsresult nsExternalProtocol::LaunchViaHelper( nsIURI *pUri) +{ + // check the category manager for an installed external + // handler for this protocol. If one exists, get it + // and try and launch the URI. If it succeeds return NS_OK, + // any other return value will cause the default to be called. + + return( NS_ERROR_FAILURE); +} + diff --git a/mozilla/uriloader/extprotocol/base/nsExternalProtocol.h b/mozilla/uriloader/extprotocol/base/nsExternalProtocol.h new file mode 100644 index 00000000000..851746e2a5f --- /dev/null +++ b/mozilla/uriloader/extprotocol/base/nsExternalProtocol.h @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsExternalProtocol_h___ +#define nsExternalProtocol_h___ + +#include "nsIProtocolHandler.h" +#include "nsIExternalProtocol.h" +#include "nsCOMPtr.h" +#include "nsString.h" + +#define NS_EXTERNALPROTOCOL_CID \ +{ /* 99BD73D1-F835-11d3-AA27-00A0CC26DA63 */ \ + 0x99bd73d1, 0xf835, 0x11d3, \ + {0xaa, 0x27, 0x0, 0xa0, 0xcc, 0x26, 0xda, 0x63 }} + + + +class nsExternalProtocol : public nsIExternalProtocol +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIPROTOCOLHANDLER + NS_DECL_NSIEXTERNALPROTOCOL + + nsExternalProtocol(); + virtual ~nsExternalProtocol(); + /* additional members */ + +protected: + // Launch via an installed helper, if the helper fails + // then we will try and launch using our the default + // external app mechanism. (If that fails too, then + // we fall through to the default handler.) + nsresult LaunchViaHelper( nsIURI *pUri); + + nsresult DefaultLaunch( nsIURI *pUri); + + nsCString m_schemeName; + char * m_pData; // some data to use if you need it +}; + + +#endif // nsExternalProtocol_h__ + diff --git a/mozilla/uriloader/extprotocol/mac/MANIFEST b/mozilla/uriloader/extprotocol/mac/MANIFEST new file mode 100644 index 00000000000..e69de29bb2d diff --git a/mozilla/uriloader/extprotocol/mac/extProtocol.mcp b/mozilla/uriloader/extprotocol/mac/extProtocol.mcp new file mode 100644 index 0000000000000000000000000000000000000000..62a262680861a738628eeaa386bcc68408e3e96b GIT binary patch literal 157453 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 ryqNeG#+MWS(pWz7u<>_^A2C+lj~f4)_%Y*W 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 literal 0 HcmV?d00001 diff --git a/mozilla/uriloader/extprotocol/mac/extProtocolIDL.mcp b/mozilla/uriloader/extprotocol/mac/extProtocolIDL.mcp new file mode 100644 index 0000000000000000000000000000000000000000..2efc713a8fdb761122cd6cc8667f4b512aab345c GIT binary patch literal 90044 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 + +#ifdef NS_DEBUG +#define DEBUG_LOG0( x) printf( x) +#define DEBUG_LOG1( x, y) printf( x, y) +#else +#define DEBUG_LOG0( x) +#define DEBUG_LOG1( x, y) +#endif + + + +nsresult nsExternalProtocol::DefaultLaunch( nsIURI *pUri) +{ + nsresult rv = NS_ERROR_FAILURE; + + // use internet config to launch the uri + nsXPIDLCString uriStr; + if (pUri) { + pUri->GetSpec( getter_Copies( uriStr)); + } + else { + uriStr = m_schemeName; + } + + + OSStatus err; + ICInstance inst; + long startSel; + long endSel = nsCRT::strlen( (const char *)uriStr); + + err = ICStart(&inst, 'MOSS'); + if (err == noErr) { + err = ICFindConfigFile( inst, 0, nil); + if (err == noErr) { + startSel = 0; + err = ICLaunchURL(inst, "\p", (char *)((const char *) uriStr), endSel, &startSel, &endSel); + if (err == noErr) + rv = NS_ERROR_EXTERNAL_LAUNCH; + } + (void) ICStop(inst); + } + + return( rv); +} + diff --git a/mozilla/uriloader/extprotocol/makefile.win b/mozilla/uriloader/extprotocol/makefile.win new file mode 100644 index 00000000000..9138c1ff07d --- /dev/null +++ b/mozilla/uriloader/extprotocol/makefile.win @@ -0,0 +1,26 @@ +#!nmake +# +# The contents of this file are subject to the Netscape 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/NPL/ +# +# 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. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): + +DEPTH=..\.. + +DIRS=public win base + +include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/uriloader/extprotocol/public/Makefile.in b/mozilla/uriloader/extprotocol/public/Makefile.in new file mode 100644 index 00000000000..a3b88124995 --- /dev/null +++ b/mozilla/uriloader/extprotocol/public/Makefile.in @@ -0,0 +1,37 @@ +# +# The contents of this file are subject to the Netscape 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/NPL/ +# +# 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. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# + +DEPTH = ../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +MODULE = extprotocol + +XPIDLSRCS = \ + nsIExternalURIHandler.idl \ + nsIExternalProtocol.idl \ + $(NULL) + +include $(topsrcdir)/config/rules.mk + diff --git a/mozilla/uriloader/extprotocol/public/makefile.win b/mozilla/uriloader/extprotocol/public/makefile.win new file mode 100644 index 00000000000..8e662119977 --- /dev/null +++ b/mozilla/uriloader/extprotocol/public/makefile.win @@ -0,0 +1,32 @@ +#!nmake +# +# The contents of this file are subject to the Netscape 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/NPL/ +# +# 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. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): + +DEPTH=..\..\.. +IGNORE_MANIFEST=1 + +XPIDLSRCS= .\nsIExternalURIHandler.idl \ + .\nsIExternalProtocol.idl \ + $(NULL) + +MODULE= extprotocol + +include <$(DEPTH)\config\rules.mak> + diff --git a/mozilla/uriloader/extprotocol/public/nsIExternalProtocol.idl b/mozilla/uriloader/extprotocol/public/nsIExternalProtocol.idl new file mode 100644 index 00000000000..766047f36a7 --- /dev/null +++ b/mozilla/uriloader/extprotocol/public/nsIExternalProtocol.idl @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape 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/NPL/ + * + * 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. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +/* + + The import service. + + */ + +#include "nsISupports.idl" +#include "nsIProtocolHandler.idl" +interface nsIURI; + +/* + Unlike most protocol handlers, an external protocol + handler is capable of handling ANY scheme. Of course, it may + not always successfully launch every URI but it has the ability + to try. Consequently, we can either have a single handler that + is "special" or just create a bunch of them and install them + as appropriate. The current implementation provides a bunch + of CLSID's for common protocol handlers that may want to use + an external handler. +*/ + +[scriptable, uuid(4ed3a580-0dfc-11d4-9ad2-00601df05068)] +interface nsIExternalProtocol : nsIProtocolHandler +{ + void setScheme( in string scheme); +}; + +%{C++ +#define NS_EXTERNALMAILTO_CID \ +{ /* 364d6c20-0e16-11d4-9ad2-00601df05068 */ \ + 0x364d6c20, 0x0e16, 0x11d4, \ + { 0x9a, 0xd2, 0x0, 0x60, 0x1d, 0xf0, 0x50, 0x68 } \ +} +#define NS_EXTERNALMAILTO_PROGID \ + "component://mozilla/externalprotocol/mailto" + + +#define NS_ERROR_EXTERNAL_LAUNCH NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_NETWORK, 100) + +%} diff --git a/mozilla/uriloader/extprotocol/public/nsIExternalURIHandler.idl b/mozilla/uriloader/extprotocol/public/nsIExternalURIHandler.idl new file mode 100644 index 00000000000..94a24a21335 --- /dev/null +++ b/mozilla/uriloader/extprotocol/public/nsIExternalURIHandler.idl @@ -0,0 +1,53 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape 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/NPL/ + * + * 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. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +/* + + The import service. + + */ + +#include "nsISupports.idl" + +interface nsIURI; + +/* + Pretty simple. Just register your class with the category manager under + the proper protocol and someday we'll figure out how to tie that in + to the rest of the mozilla! The idea is that some one will specify in a preference + or some other way that the particular protocol be handled via external app. + When that happens, the external app protocol handler will check the category manager + to see what external handler is available and use it to launch URI's with that protocol. + + Seems almost too simple, there must be more to this?! +*/ + +[scriptable, uuid(578cd5d1-f82b-11d3-aa27-00a0cc26da63)] +interface nsIExternalURILauncher : nsISupports +{ + // mailto, http, nntp, etc. + readonly attribute string protocol; + + // send this URI to an external entity. + nsresult LaunchURI( in nsIURI uri); +}; + diff --git a/mozilla/uriloader/extprotocol/unix/Makefile.in b/mozilla/uriloader/extprotocol/unix/Makefile.in new file mode 100644 index 00000000000..b116b69d1ab --- /dev/null +++ b/mozilla/uriloader/extprotocol/unix/Makefile.in @@ -0,0 +1,41 @@ +# +# The contents of this file are subject to the Netscape 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/NPL/ +# +# 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. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1999 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# + +DEPTH = ../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +MODULE = extprotocol +LIBRARY_NAME = extprotocolunix_s + +CPPSRCS = \ + nsExternalProcotolUnix.cpp \ + $(NULL) + +# we don't want the shared lib, but we want to force the creation of a static lib. +override NO_SHARED_LIB=1 +override NO_STATIC_LIB= + +include $(topsrcdir)/config/rules.mk + diff --git a/mozilla/uriloader/extprotocol/unix/nsExternalProtocolUnix.cpp b/mozilla/uriloader/extprotocol/unix/nsExternalProtocolUnix.cpp new file mode 100644 index 00000000000..19ecd778af8 --- /dev/null +++ b/mozilla/uriloader/extprotocol/unix/nsExternalProtocolUnix.cpp @@ -0,0 +1,49 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + * + * Contributor(s): + * + */ + + +#include "nscore.h" +#include "nsCRT.h" +#include "nsString.h" +#include "nsIURI.h" +#include "nsExternalProtocol.h" +#include "nsXPIDLString.h" + + +#ifdef NS_DEBUG +#define DEBUG_LOG0( x) printf( x) +#define DEBUG_LOG1( x, y) printf( x, y) +#else +#define DEBUG_LOG0( x) +#define DEBUG_LOG1( x, y) +#endif + + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +nsresult nsExternalProtocol::DefaultLaunch( nsIURI *pUri) +{ + nsresult rv = NS_ERROR_FAILURE; + + return( rv); +} + diff --git a/mozilla/uriloader/extprotocol/win/Makefile.win b/mozilla/uriloader/extprotocol/win/Makefile.win new file mode 100644 index 00000000000..6da920940bb --- /dev/null +++ b/mozilla/uriloader/extprotocol/win/Makefile.win @@ -0,0 +1,45 @@ +#!gmake +# +# The contents of this file are subject to the Netscape 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/NPL/ +# +# 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. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): + +DEPTH=..\..\.. +MODULE=extprotocol + +LIBRARY_NAME=extprotocolwin_s + +CPP_OBJS=\ + .\$(OBJDIR)\nsExternalProtocolWin.obj \ + $(NULL) + +INCS = $(INCS) \ + -I$(DEPTH)\dist\include \ + -I..\base \ + $(NULL) + + +include <$(DEPTH)\config\rules.mak> + +install:: $(LIBRARY) + $(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib + + +clobber:: + rm -f $(DIST)\lib\$(LIBRARY_NAME).lib + diff --git a/mozilla/uriloader/extprotocol/win/nsExternalProtocolWin.cpp b/mozilla/uriloader/extprotocol/win/nsExternalProtocolWin.cpp new file mode 100644 index 00000000000..d4f3b5fe73e --- /dev/null +++ b/mozilla/uriloader/extprotocol/win/nsExternalProtocolWin.cpp @@ -0,0 +1,123 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + * + * Contributor(s): + * + */ + + +#include "nscore.h" +#include "nsCRT.h" +#include "nsString.h" +#include "nsIURI.h" +#include "nsExternalProtocol.h" +#include "nsXPIDLString.h" + +#include + +#ifdef NS_DEBUG +#define DEBUG_LOG0( x) printf( x) +#define DEBUG_LOG1( x, y) printf( x, y) +#else +#define DEBUG_LOG0( x) +#define DEBUG_LOG1( x, y) +#endif + + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +// ::RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\Accounts", 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &sKey) == ERROR_SUCCESS) + +BYTE * GetValueBytes( HKEY hKey, const char *pValueName) +{ + LONG err; + DWORD bufSz; + LPBYTE pBytes = NULL; + + err = ::RegQueryValueEx( hKey, pValueName, NULL, NULL, NULL, &bufSz); + if (err == ERROR_SUCCESS) { + pBytes = new BYTE[bufSz]; + err = ::RegQueryValueEx( hKey, pValueName, NULL, NULL, pBytes, &bufSz); + if (err != ERROR_SUCCESS) { + delete [] pBytes; + pBytes = NULL; + } + } + + return( pBytes); +} + + +PRBool GetCommandString( const char *pProtocol, nsCString& command) +{ + // HKEY_CLASSES_ROOT + // /shell/open/command + + PRBool result = PR_FALSE; + nsCString reg = pProtocol; + reg.Append( "\\shell\\open\\command"); + HKEY hKey; + LONG err = ::RegOpenKeyEx( HKEY_CLASSES_ROOT, reg, 0, KEY_QUERY_VALUE, &hKey); + if (err == ERROR_SUCCESS) { + LPBYTE pBytes = GetValueBytes( hKey, NULL); + if (pBytes) { + command = (char *)pBytes; + delete [] pBytes; + result = PR_TRUE; + } + } + + return( result); +} + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +nsresult nsExternalProtocol::DefaultLaunch( nsIURI *pUri) +{ + nsresult rv = NS_OK; + + // 1. Find the default app for this protocol + // 2. Set up the command line + // 3. Launch the app. + + // For now, we'll just cheat essentially, check for the command line + // then just call ShellExecute()! + nsCString cmd; + if (GetCommandString( m_schemeName, cmd)) { + nsXPIDLCString uriStr; + if (pUri) { + pUri->GetSpec( getter_Copies( uriStr)); + } + else { + uriStr = m_schemeName; + } + LONG r = (LONG) ::ShellExecute( NULL, "open", uriStr, NULL, NULL, SW_SHOWNORMAL); + if (r < 32) { + DEBUG_LOG1( "ShellExecute failed: %d\n", (int)r); + rv = NS_ERROR_FAILURE; + } + else + rv = NS_ERROR_EXTERNAL_LAUNCH; + + } + else + rv = NS_ERROR_FAILURE; + + return( rv); +} +