diff options
Diffstat (limited to 'embed/mozilla/StartHereProtocolHandler.cpp')
-rw-r--r-- | embed/mozilla/StartHereProtocolHandler.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/embed/mozilla/StartHereProtocolHandler.cpp b/embed/mozilla/StartHereProtocolHandler.cpp new file mode 100644 index 000000000..47a1af310 --- /dev/null +++ b/embed/mozilla/StartHereProtocolHandler.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2001 Matt Aubury, Philip Langdale + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "ephy-file-helpers.h" + +#include "nsCOMPtr.h" +#include "nsIFactory.h" +#include "nsIIOService.h" +#include "nsIServiceManager.h" +#include "nsIURI.h" +#include "nsNetCID.h" +#include "nsNetUtil.h" +#include "nsXPComFactory.h" + +static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID); + +class GStartHereProtocolHandler : public nsIProtocolHandler +{ + public: + NS_DECL_ISUPPORTS + NS_DECL_NSIPROTOCOLHANDLER + + GStartHereProtocolHandler (void); + virtual ~GStartHereProtocolHandler(); + + nsCOMPtr<nsIChannel> mChannel; + nsCOMPtr<nsIURI> mURI; +}; + +/* Implementation file */ +NS_IMPL_ISUPPORTS1 (GStartHereProtocolHandler, nsIProtocolHandler) + +GStartHereProtocolHandler::GStartHereProtocolHandler (void) +{ + NS_INIT_ISUPPORTS(); + +} + +GStartHereProtocolHandler::~GStartHereProtocolHandler() +{ + /* destructor code */ +} + +/* readonly attribute string scheme; */ +NS_IMETHODIMP GStartHereProtocolHandler::GetScheme(nsACString &aScheme) +{ + aScheme = NS_LITERAL_CSTRING("start-here"); + return NS_OK; +} + +/* readonly attribute long defaultPort; */ +NS_IMETHODIMP GStartHereProtocolHandler::GetDefaultPort(PRInt32 *aDefaultPort) +{ + nsresult rv = NS_OK; + if (aDefaultPort) + *aDefaultPort = -1; + else + rv = NS_ERROR_NULL_POINTER; + return rv; +} + +/* readonly attribute short protocolFlags; */ +NS_IMETHODIMP GStartHereProtocolHandler::GetProtocolFlags(PRUint32 *aProtocolFlags) +{ + if (aProtocolFlags) + *aProtocolFlags = nsIProtocolHandler::URI_STD; + else + return NS_ERROR_NULL_POINTER; + return NS_OK; +} + +/* nsIURI newURI (in string aSpec, in nsIURI aBaseURI); */ +NS_IMETHODIMP GStartHereProtocolHandler::NewURI(const nsACString &aSpec, + const char *aOriginCharset, + nsIURI *aBaseURI, + nsIURI **_retval) +{ + nsresult rv = NS_OK; + nsCOMPtr <nsIURI> newUri; + + rv = nsComponentManager::CreateInstance(kSimpleURICID, NULL, + NS_GET_IID(nsIURI), + getter_AddRefs(newUri)); + + if (NS_SUCCEEDED(rv)) + { + newUri->SetSpec(aSpec); + rv = newUri->QueryInterface(NS_GET_IID(nsIURI), + (void **) _retval); + } + return rv; +} + +/* nsIChannel newChannel (in nsIURI aURI); */ +NS_IMETHODIMP GStartHereProtocolHandler::NewChannel(nsIURI *aURI, + nsIChannel **_retval) +{ + nsresult rv; + + nsCAutoString path; + rv = aURI->GetPath(path); + if (NS_FAILED(rv)) return rv; + + char *httpSpec = g_strconcat ("file:///", + ephy_file ("start_here.html"), + NULL); + + if (!httpSpec) return NS_ERROR_OUT_OF_MEMORY; + + nsCOMPtr<nsIIOService> serv(do_GetIOService(&rv)); + if (NS_FAILED(rv)) return rv; + + // now we have an HTTP url, give the user an HTTP channel + rv = serv->NewChannel(nsDependentCString(httpSpec), nsnull, nsnull, _retval); + + return rv; +} + +/* boolean allowPort (in long port, in string scheme); */ +NS_IMETHODIMP GStartHereProtocolHandler::AllowPort(PRInt32 port, const char *scheme, + PRBool *_retval) +{ + *_retval = PR_FALSE; + return NS_OK; +} + +NS_DEF_FACTORY (GStartHereProtocolHandler, GStartHereProtocolHandler); + +/** + * NS_NewStartHereProtocolHandlerFactory: + */ +nsresult NS_NewStartHereHandlerFactory(nsIFactory** aFactory) +{ + NS_ENSURE_ARG_POINTER(aFactory); + *aFactory = nsnull; + + nsGStartHereProtocolHandlerFactory *result = new nsGStartHereProtocolHandlerFactory; + if (result == NULL) + { + return NS_ERROR_OUT_OF_MEMORY; + } + + NS_ADDREF(result); + *aFactory = result; + + return NS_OK; +} |