From d3b9c9c3ccbe2a19d5941268a8cae09af01ecd89 Mon Sep 17 00:00:00 2001 From: "warren%netscape.com" Date: Wed, 3 Nov 1999 05:13:44 +0000 Subject: [PATCH] Structural changes for MakeAbsolute performance. bug#10736 r=valeski --- chrome/src/nsChromeProtocolHandler.cpp | 17 ----- dom/src/jsurl/nsJSProtocolHandler.cpp | 14 ---- mailnews/base/util/nsMsgMailNewsUrl.cpp | 5 ++ mailnews/compose/src/nsSmtpService.cpp | 6 -- mailnews/imap/src/nsImapService.cpp | 6 -- mailnews/local/src/nsMailboxService.cpp | 6 -- mailnews/local/src/nsPop3Service.cpp | 6 -- mailnews/news/src/nsNntpService.cpp | 6 -- modules/libjar/nsJARProtocolHandler.cpp | 8 --- modules/libjar/nsJARProtocolHandler.h | 13 +--- netwerk/base/public/nsIIOService.idl | 18 +---- netwerk/base/public/nsIProtocolHandler.idl | 4 +- netwerk/base/public/nsIURI.idl | 26 ++++--- netwerk/base/src/nsIOService.cpp | 52 -------------- netwerk/base/src/nsSimpleURI.cpp | 7 ++ netwerk/base/src/nsStdURL.cpp | 16 +++++ .../about/src/nsAboutProtocolHandler.cpp | 14 ---- netwerk/protocol/data/src/nsDataHandler.cpp | 10 --- .../file/src/nsFileProtocolHandler.cpp | 17 ----- .../protocol/ftp/src/nsFtpProtocolHandler.cpp | 17 ----- netwerk/protocol/http/src/nsHTTPHandler.cpp | 16 ----- netwerk/protocol/http/src/nsHTTPHandler.h | 4 -- .../protocol/jar/src/nsJARProtocolHandler.cpp | 8 --- .../protocol/jar/src/nsJARProtocolHandler.h | 13 +--- .../keyword/src/nsKeywordProtocolHandler.cpp | 12 ---- .../src/nsResourceProtocolHandler.cpp | 17 ----- netwerk/util/src/nsNeckoUtil.cpp | 70 ++++++++++++++++--- rdf/base/src/rdfutil.cpp | 35 ++-------- rdf/chrome/src/nsChromeProtocolHandler.cpp | 17 ----- 29 files changed, 116 insertions(+), 344 deletions(-) diff --git a/chrome/src/nsChromeProtocolHandler.cpp b/chrome/src/nsChromeProtocolHandler.cpp index 0e9477adee9b..9de674ea5b86 100644 --- a/chrome/src/nsChromeProtocolHandler.cpp +++ b/chrome/src/nsChromeProtocolHandler.cpp @@ -87,23 +87,6 @@ nsChromeProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsChromeProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - // XXX optimize this to not needlessly construct the URL - - nsresult rv; - nsIURI* url; - rv = NewURI(aSpec, aBaseURI, &url); - if (NS_FAILED(rv)) return rv; - - rv = url->GetSpec(result); - NS_RELEASE(url); - return rv; -} - NS_IMETHODIMP nsChromeProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result) diff --git a/dom/src/jsurl/nsJSProtocolHandler.cpp b/dom/src/jsurl/nsJSProtocolHandler.cpp index 9cad05e50f4c..384979490189 100644 --- a/dom/src/jsurl/nsJSProtocolHandler.cpp +++ b/dom/src/jsurl/nsJSProtocolHandler.cpp @@ -154,20 +154,6 @@ nsJSProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsJSProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - // presumably, there's no such thing as a relative javascript: URI, - // so just copy the input spec - char* dup = nsCRT::strdup(aSpec); - if (!dup) - return NS_ERROR_OUT_OF_MEMORY; - *result = dup; - return NS_OK; -} - NS_IMETHODIMP nsJSProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result) diff --git a/mailnews/base/util/nsMsgMailNewsUrl.cpp b/mailnews/base/util/nsMsgMailNewsUrl.cpp index 735778335d06..79719cda7922 100644 --- a/mailnews/base/util/nsMsgMailNewsUrl.cpp +++ b/mailnews/base/util/nsMsgMailNewsUrl.cpp @@ -385,6 +385,11 @@ NS_IMETHODIMP nsMsgMailNewsUrl::SetRelativePath(const char *i_RelativePath) return m_baseURL->SetRelativePath(i_RelativePath); } +NS_IMETHODIMP nsMsgMailNewsUrl::Resolve(const char *relativePath, char **result) +{ + return m_baseURL->Resolve(relativePath, result); +} + NS_IMETHODIMP nsMsgMailNewsUrl::GetDirectory(char * *aDirectory) { return m_baseURL->GetDirectory(aDirectory); diff --git a/mailnews/compose/src/nsSmtpService.cpp b/mailnews/compose/src/nsSmtpService.cpp index d238cce771aa..4d6ef192b68a 100644 --- a/mailnews/compose/src/nsSmtpService.cpp +++ b/mailnews/compose/src/nsSmtpService.cpp @@ -214,12 +214,6 @@ NS_IMETHODIMP nsSmtpService::GetDefaultPort(PRInt32 *aDefaultPort) return rv; } -NS_IMETHODIMP nsSmtpService::MakeAbsolute(const char *aRelativeSpec, nsIURI *aBaseURI, char **_retval) -{ - // no such thing as relative urls for smtp..... - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP nsSmtpService::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval) { // i just haven't implemented this yet...I will be though.... diff --git a/mailnews/imap/src/nsImapService.cpp b/mailnews/imap/src/nsImapService.cpp index 7e9131c2fed9..b9cf5d9b1054 100644 --- a/mailnews/imap/src/nsImapService.cpp +++ b/mailnews/imap/src/nsImapService.cpp @@ -2122,12 +2122,6 @@ NS_IMETHODIMP nsImapService::GetDefaultPort(PRInt32 *aDefaultPort) return rv; } -NS_IMETHODIMP nsImapService::MakeAbsolute(const char *aRelativeSpec, nsIURI *aBaseURI, char **_retval) -{ - // no such thing as relative urls for smtp..... - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP nsImapService::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval) { nsCOMPtr aImapUrl; diff --git a/mailnews/local/src/nsMailboxService.cpp b/mailnews/local/src/nsMailboxService.cpp index 6f8f66448289..26063fb13d77 100644 --- a/mailnews/local/src/nsMailboxService.cpp +++ b/mailnews/local/src/nsMailboxService.cpp @@ -272,12 +272,6 @@ NS_IMETHODIMP nsMailboxService::GetDefaultPort(PRInt32 *aDefaultPort) return rv; } -NS_IMETHODIMP nsMailboxService::MakeAbsolute(const char *aRelativeSpec, nsIURI *aBaseURI, char **_retval) -{ - // no such thing as relative urls for smtp..... - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP nsMailboxService::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval) { nsCOMPtr aMsgUrl; diff --git a/mailnews/local/src/nsPop3Service.cpp b/mailnews/local/src/nsPop3Service.cpp index ed8b180ffa4c..61c0073e8851 100644 --- a/mailnews/local/src/nsPop3Service.cpp +++ b/mailnews/local/src/nsPop3Service.cpp @@ -249,12 +249,6 @@ NS_IMETHODIMP nsPop3Service::GetDefaultPort(PRInt32 *aDefaultPort) return rv; } -NS_IMETHODIMP nsPop3Service::MakeAbsolute(const char *aRelativeSpec, nsIURI *aBaseURI, char **_retval) -{ - // no such thing as relative urls for smtp..... - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP nsPop3Service::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval) { // i just haven't implemented this yet...I will be though.... diff --git a/mailnews/news/src/nsNntpService.cpp b/mailnews/news/src/nsNntpService.cpp index ac4da518a836..d1e9e2c31de2 100644 --- a/mailnews/news/src/nsNntpService.cpp +++ b/mailnews/news/src/nsNntpService.cpp @@ -917,12 +917,6 @@ NS_IMETHODIMP nsNntpService::GetDefaultPort(PRInt32 *aDefaultPort) return rv; } -NS_IMETHODIMP nsNntpService::MakeAbsolute(const char *aRelativeSpec, nsIURI *aBaseURI, char **_retval) -{ - // no such thing as relative urls for smtp..... - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP nsNntpService::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval) { nsresult rv = NS_OK; diff --git a/modules/libjar/nsJARProtocolHandler.cpp b/modules/libjar/nsJARProtocolHandler.cpp index 9019cbb3de54..fe8269285497 100644 --- a/modules/libjar/nsJARProtocolHandler.cpp +++ b/modules/libjar/nsJARProtocolHandler.cpp @@ -81,14 +81,6 @@ nsJARProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsJARProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - // JAR urls have the following syntax // // jar:!/(entry) diff --git a/modules/libjar/nsJARProtocolHandler.h b/modules/libjar/nsJARProtocolHandler.h index fe7469d88c3e..8407954dd4f0 100644 --- a/modules/libjar/nsJARProtocolHandler.h +++ b/modules/libjar/nsJARProtocolHandler.h @@ -33,18 +33,7 @@ class nsJARProtocolHandler : public nsIProtocolHandler { public: NS_DECL_ISUPPORTS - - // nsIProtocolHandler methods: - NS_IMETHOD GetScheme(char * *aScheme); - NS_IMETHOD GetDefaultPort(PRInt32 *aDefaultPort); - NS_IMETHOD MakeAbsolute(const char *aRelativeSpec, nsIURI *aBaseURI, - char **_retval); - NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, - nsIURI **_retval); - NS_IMETHOD NewChannel(const char* verb, nsIURI* url, - nsILoadGroup *loadGroup, - nsIEventSinkGetter *eventSinkGetter, - nsIChannel **_retval); + ns_DECL_NSIPROTOCOLHANDLER // nsJARProtocolHandler methods: nsJARProtocolHandler(); diff --git a/netwerk/base/public/nsIIOService.idl b/netwerk/base/public/nsIIOService.idl index 12269f4c762b..49f02dc8d33d 100644 --- a/netwerk/base/public/nsIIOService.idl +++ b/netwerk/base/public/nsIIOService.idl @@ -32,7 +32,7 @@ interface nsIFileChannel; interface nsILoadGroup; interface nsILoadGroupObserver; -[scriptable, uuid(01f0a170-1881-11d3-9337-00104ba0fd40)] +[scriptable, uuid(1daf19f0-8ea7-11d3-93ad-00104ba0fd40)] interface nsIIOService : nsISupports { /** @@ -40,12 +40,6 @@ interface nsIIOService : nsISupports */ nsIProtocolHandler getProtocolHandler(in string scheme); - /** - * Returns an absolute URI string from a relative specification and - * a base URI. - */ - string makeAbsolute(in string aRelativeSpec, in nsIURI aBaseURI); - /** * This method constructs a new URI by first determining the scheme * of the URI spec, and then delegating the construction of the URI @@ -147,16 +141,6 @@ interface nsIIOService : nsISupports */ nsIFileChannel newChannelFromNativePath(in string nativePath); - /** - * Returns a new load group. Load groups can be used to manage collections - * of channels so that they can be reloaded or canceled en mass. Note that - * their use is not required by other parts of the system, they are primarily - * a convenience for the caller. The outer parameter can be used for aggregation. - */ - nsILoadGroup newLoadGroup(in nsISupports outer, - in nsIStreamObserver observer, - in nsILoadGroup parent); - /** * Returns a simple channel implementation that uses the given input * stream and content type. A URI may also be supplied which will be returned diff --git a/netwerk/base/public/nsIProtocolHandler.idl b/netwerk/base/public/nsIProtocolHandler.idl index f164a4f95ffe..1677754e7578 100644 --- a/netwerk/base/public/nsIProtocolHandler.idl +++ b/netwerk/base/public/nsIProtocolHandler.idl @@ -23,15 +23,13 @@ interface nsIEventSinkGetter; interface nsIChannel; interface nsILoadGroup; -[scriptable, uuid(8984a6f0-1893-11d3-9337-00104ba0fd40)] +[scriptable, uuid(15fd6940-8ea7-11d3-93ad-00104ba0fd40)] interface nsIProtocolHandler : nsISupports { readonly attribute string scheme; readonly attribute long defaultPort; - string makeAbsolute(in string aRelativeSpec, in nsIURI aBaseURI); - /** * Makes a URI object that is suitable for loading by this protocol. * In the usual case (when only the accessors provided by nsIURI are diff --git a/netwerk/base/public/nsIURI.idl b/netwerk/base/public/nsIURI.idl index 614ee19f8b79..87e36f010631 100644 --- a/netwerk/base/public/nsIURI.idl +++ b/netwerk/base/public/nsIURI.idl @@ -117,18 +117,26 @@ interface nsIURI : nsISupports */ nsIURI clone(); - /** - * Sets the given string to be a relative path for this URL, and - * changes this to read relative. Thus for example- if this = - * http://foo.com/bar/index.html, then calling SetRelativePath("/baz") will - * change this to http://foo.com/baz and calling it with "baz" will - * change this to http://foo.com/bar/baz. - */ - void setRelativePath(in string i_RelativePath); + /** + * Sets the given string to be a relative path for this URI, and + * changes this to read relative. Thus for example- if this = + * http://foo.com/bar/index.html, then calling SetRelativePath("/baz") will + * change this to http://foo.com/baz and calling it with "baz" will + * change this to http://foo.com/bar/baz. + */ + void setRelativePath(in string relativePath); + + /** + * This method resolves a relative string into an absolute URI string, + * using the URI as the base. + * + * This method subsumes the deprecated method nsIIOService::MakeAbsolute. + */ + string resolve(in string relativePath); }; %{C++ -// Malformed URL Error +// Malformed URI Error #define NS_ERROR_MALFORMED_URI NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_NETWORK, 10) /** diff --git a/netwerk/base/src/nsIOService.cpp b/netwerk/base/src/nsIOService.cpp index 5464241366b1..fcf65a0d63a7 100644 --- a/netwerk/base/src/nsIOService.cpp +++ b/netwerk/base/src/nsIOService.cpp @@ -251,38 +251,6 @@ nsIOService::NewChannel(const char* verb, const char *aSpec, return rv; } -NS_IMETHODIMP -nsIOService::MakeAbsolute(const char *aSpec, - nsIURI *aBaseURI, - char **result) -{ - nsresult rv; - NS_ASSERTION(aBaseURI, "It doesn't make sense to not supply a base URI"); - - if (aSpec == nsnull) - return aBaseURI->GetSpec(result); - - char* scheme; - rv = GetScheme(aSpec, &scheme); - if (NS_SUCCEEDED(rv)) { - nsAllocator::Free(scheme); - // if aSpec has a scheme, then it's already absolute - *result = nsCRT::strdup(aSpec); - return (*result == nsnull) ? NS_ERROR_OUT_OF_MEMORY : NS_OK; - } - - // else ask the protocol handler for the base URI to deal with it - rv = aBaseURI->GetScheme(&scheme); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr handler; - rv = GetProtocolHandler(scheme, getter_AddRefs(handler)); - nsCRT::free(scheme); - if (NS_FAILED(rv)) return rv; - - return handler->MakeAbsolute(aSpec, aBaseURI, result); -} - NS_IMETHODIMP nsIOService::GetAppCodeName(PRUnichar* *aAppCodeName) { @@ -395,26 +363,6 @@ nsIOService::NewChannelFromNativePath(const char *nativePath, nsIFileChannel **r return NS_OK; } -NS_IMETHODIMP -nsIOService::NewLoadGroup(nsISupports* outer, nsIStreamObserver* observer, - nsILoadGroup* parent, nsILoadGroup **result) -{ - nsresult rv; - nsILoadGroup* group; - rv = nsLoadGroup::Create(outer, NS_GET_IID(nsILoadGroup), - (void**)&group); - if (NS_FAILED(rv)) return rv; - - rv = group->Init(observer, parent); - if (NS_FAILED(rv)) { - NS_RELEASE(group); - return rv; - } - - *result = group; - return NS_OK; -} - NS_IMETHODIMP nsIOService::NewInputStreamChannel(nsIURI* uri, const char *contentType, PRInt32 contentLength, diff --git a/netwerk/base/src/nsSimpleURI.cpp b/netwerk/base/src/nsSimpleURI.cpp index 25753f18158e..712b9c4cf5a6 100644 --- a/netwerk/base/src/nsSimpleURI.cpp +++ b/netwerk/base/src/nsSimpleURI.cpp @@ -221,6 +221,13 @@ nsSimpleURI::SetRelativePath(const char *i_RelativePath) return NS_ERROR_FAILURE; } +NS_IMETHODIMP +nsSimpleURI::Resolve(const char *relativePath, char **result) +{ + NS_ASSERTION(PR_FALSE, "This is meaningless in hack context!"); + return NS_ERROR_NOT_IMPLEMENTED; +} + //////////////////////////////////////////////////////////////////////////////// NS_METHOD diff --git a/netwerk/base/src/nsStdURL.cpp b/netwerk/base/src/nsStdURL.cpp index 12c366e0d5a3..3cd9f46dc876 100644 --- a/netwerk/base/src/nsStdURL.cpp +++ b/netwerk/base/src/nsStdURL.cpp @@ -23,6 +23,7 @@ #include "prmem.h" #include "prprf.h" #include "nsXPIDLString.h" +#include "nsCOMPtr.h" static NS_DEFINE_CID(kStdURLCID, NS_STANDARDURL_CID); static NS_DEFINE_CID(kThisStdURLImplementationCID, @@ -879,6 +880,21 @@ nsStdURL::SetRelativePath(const char* i_Relative) } } +NS_IMETHODIMP +nsStdURL::Resolve(const char *relativePath, char **result) +{ + // XXX Judson: optimize this + nsresult rv; + nsCOMPtr uri; + rv = Clone(getter_AddRefs(uri)); + if (NS_FAILED(rv)) return rv; + + rv = uri->SetRelativePath(relativePath); + if (NS_FAILED(rv)) return rv; + + return uri->GetSpec(result); +} + nsresult nsStdURL::ReconstructPath(void) { diff --git a/netwerk/protocol/about/src/nsAboutProtocolHandler.cpp b/netwerk/protocol/about/src/nsAboutProtocolHandler.cpp index ab71dceb4245..33cb77279364 100644 --- a/netwerk/protocol/about/src/nsAboutProtocolHandler.cpp +++ b/netwerk/protocol/about/src/nsAboutProtocolHandler.cpp @@ -83,20 +83,6 @@ nsAboutProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsAboutProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - // presumably, there's no such thing as a relative about: URI, - // so just copy the input spec - char* dup = nsCRT::strdup(aSpec); - if (dup == nsnull) - return NS_ERROR_OUT_OF_MEMORY; - *result = dup; - return NS_OK; -} - NS_IMETHODIMP nsAboutProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result) diff --git a/netwerk/protocol/data/src/nsDataHandler.cpp b/netwerk/protocol/data/src/nsDataHandler.cpp index c14eca332b2a..d8f1d4abc50e 100644 --- a/netwerk/protocol/data/src/nsDataHandler.cpp +++ b/netwerk/protocol/data/src/nsDataHandler.cpp @@ -68,16 +68,6 @@ nsDataHandler::GetDefaultPort(PRInt32 *result) { return NS_OK; } -NS_IMETHODIMP -nsDataHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) { - // no concept of a relative data url - *result = nsCRT::strdup(aSpec); - if (!*result) return NS_ERROR_OUT_OF_MEMORY; - return NS_OK; -} - NS_IMETHODIMP nsDataHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result) { diff --git a/netwerk/protocol/file/src/nsFileProtocolHandler.cpp b/netwerk/protocol/file/src/nsFileProtocolHandler.cpp index e2b460b667ce..01b7b63ff425 100644 --- a/netwerk/protocol/file/src/nsFileProtocolHandler.cpp +++ b/netwerk/protocol/file/src/nsFileProtocolHandler.cpp @@ -90,23 +90,6 @@ nsFileProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsFileProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - // XXX optimize this to not needlessly construct the URL - - nsresult rv; - nsIURI* url; - rv = NewURI(aSpec, aBaseURI, &url); - if (NS_FAILED(rv)) return rv; - - rv = url->GetSpec(result); - NS_RELEASE(url); - return rv; -} - NS_IMETHODIMP nsFileProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result) diff --git a/netwerk/protocol/ftp/src/nsFtpProtocolHandler.cpp b/netwerk/protocol/ftp/src/nsFtpProtocolHandler.cpp index f11d544c533c..56b940f4d231 100644 --- a/netwerk/protocol/ftp/src/nsFtpProtocolHandler.cpp +++ b/netwerk/protocol/ftp/src/nsFtpProtocolHandler.cpp @@ -134,23 +134,6 @@ nsFtpProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsFtpProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - // XXX optimize this to not needlessly construct the URL - - nsresult rv; - nsIURI* url; - rv = NewURI(aSpec, aBaseURI, &url); - if (NS_FAILED(rv)) return rv; - - rv = url->GetSpec(result); - NS_RELEASE(url); - return rv; -} - NS_IMETHODIMP nsFtpProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result) diff --git a/netwerk/protocol/http/src/nsHTTPHandler.cpp b/netwerk/protocol/http/src/nsHTTPHandler.cpp index bbfb2597f35e..e9a067847638 100644 --- a/netwerk/protocol/http/src/nsHTTPHandler.cpp +++ b/netwerk/protocol/http/src/nsHTTPHandler.cpp @@ -268,22 +268,6 @@ nsHTTPHandler::QueryInterface(REFNSIID aIID, void** aInstancePtr) NS_IMPL_RELEASE(nsHTTPHandler); -NS_METHOD -nsHTTPHandler::MakeAbsolute(const char *aRelativeSpec, nsIURI *aBaseURI, - char **_retval) -{ - // XXX optimize this to not needlessly construct the URL - - nsresult rv; - nsIURI* url; - rv = NewURI(aRelativeSpec, aBaseURI, &url); - if (NS_FAILED(rv)) return rv; - - rv = url->GetSpec(_retval); - NS_RELEASE(url); - return rv; -} - NS_METHOD nsHTTPHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result) diff --git a/netwerk/protocol/http/src/nsHTTPHandler.h b/netwerk/protocol/http/src/nsHTTPHandler.h index 05f0b92eade0..003a9e8f5b71 100644 --- a/netwerk/protocol/http/src/nsHTTPHandler.h +++ b/netwerk/protocol/http/src/nsHTTPHandler.h @@ -77,10 +77,6 @@ public: return NS_OK; }; - NS_IMETHOD MakeAbsolute(const char *aRelativeSpec, - nsIURI *aBaseURI, - char **_retval); - NS_IMETHOD NewChannel(const char* verb, nsIURI* url, nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, diff --git a/netwerk/protocol/jar/src/nsJARProtocolHandler.cpp b/netwerk/protocol/jar/src/nsJARProtocolHandler.cpp index 9019cbb3de54..fe8269285497 100644 --- a/netwerk/protocol/jar/src/nsJARProtocolHandler.cpp +++ b/netwerk/protocol/jar/src/nsJARProtocolHandler.cpp @@ -81,14 +81,6 @@ nsJARProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsJARProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - // JAR urls have the following syntax // // jar:!/(entry) diff --git a/netwerk/protocol/jar/src/nsJARProtocolHandler.h b/netwerk/protocol/jar/src/nsJARProtocolHandler.h index fe7469d88c3e..8407954dd4f0 100644 --- a/netwerk/protocol/jar/src/nsJARProtocolHandler.h +++ b/netwerk/protocol/jar/src/nsJARProtocolHandler.h @@ -33,18 +33,7 @@ class nsJARProtocolHandler : public nsIProtocolHandler { public: NS_DECL_ISUPPORTS - - // nsIProtocolHandler methods: - NS_IMETHOD GetScheme(char * *aScheme); - NS_IMETHOD GetDefaultPort(PRInt32 *aDefaultPort); - NS_IMETHOD MakeAbsolute(const char *aRelativeSpec, nsIURI *aBaseURI, - char **_retval); - NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, - nsIURI **_retval); - NS_IMETHOD NewChannel(const char* verb, nsIURI* url, - nsILoadGroup *loadGroup, - nsIEventSinkGetter *eventSinkGetter, - nsIChannel **_retval); + ns_DECL_NSIPROTOCOLHANDLER // nsJARProtocolHandler methods: nsJARProtocolHandler(); diff --git a/netwerk/protocol/keyword/src/nsKeywordProtocolHandler.cpp b/netwerk/protocol/keyword/src/nsKeywordProtocolHandler.cpp index 8736f4a32093..b5f3c2e20b69 100644 --- a/netwerk/protocol/keyword/src/nsKeywordProtocolHandler.cpp +++ b/netwerk/protocol/keyword/src/nsKeywordProtocolHandler.cpp @@ -76,18 +76,6 @@ nsKeywordProtocolHandler::GetDefaultPort(PRInt32 *result) { return NS_OK; } -NS_IMETHODIMP -nsKeywordProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) { - // presumably, there's no such thing as a relative Keyword: URI, - // so just copy the input spec - char* dup = nsCRT::strdup(aSpec); - if (!dup) return NS_ERROR_OUT_OF_MEMORY; - *result = dup; - return NS_OK; -} - // digests a spec _without_ the preceeding "keyword:" scheme. static char * MangleKeywordIntoHTTPURL(const char *aSpec) { diff --git a/netwerk/protocol/resource/src/nsResourceProtocolHandler.cpp b/netwerk/protocol/resource/src/nsResourceProtocolHandler.cpp index a09b2f5c8727..8273471c7778 100644 --- a/netwerk/protocol/resource/src/nsResourceProtocolHandler.cpp +++ b/netwerk/protocol/resource/src/nsResourceProtocolHandler.cpp @@ -97,23 +97,6 @@ nsResourceProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsResourceProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - // XXX optimize this to not needlessly construct the URL - - nsresult rv; - nsIURI* url; - rv = NewURI(aSpec, aBaseURI, &url); - if (NS_FAILED(rv)) return rv; - - rv = url->GetSpec(result); - NS_RELEASE(url); - return rv; -} - NS_IMETHODIMP nsResourceProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result) diff --git a/netwerk/util/src/nsNeckoUtil.cpp b/netwerk/util/src/nsNeckoUtil.cpp index a958ad0053c5..b3b93f35e14d 100644 --- a/netwerk/util/src/nsNeckoUtil.cpp +++ b/netwerk/util/src/nsNeckoUtil.cpp @@ -25,6 +25,7 @@ #include "nsIHTTPProtocolHandler.h" static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); +static NS_DEFINE_CID(kLoadGroupCID, NS_LOADGROUP_CID); NECKO_EXPORT(nsresult) NS_NewURI(nsIURI* *result, const char* spec, nsIURI* baseURI) @@ -101,14 +102,58 @@ NS_OpenURI(nsIStreamListener* aConsumer, nsISupports* context, nsIURI* uri, return rv; } +// XXX copied from nsIOService.cpp (for now): +static nsresult +GetScheme(const char* inURI, char* *scheme) +{ + // search for something up to a colon, and call it the scheme + NS_ASSERTION(inURI, "null pointer"); + if (!inURI) return NS_ERROR_NULL_POINTER; + char c; + const char* URI = inURI; + PRUint8 length = 0; + // skip leading white space + while (nsString::IsSpace(*URI)) + URI++; + while ((c = *URI++) != '\0') { + if (c == ':') { + char* newScheme = (char *)nsAllocator::Alloc(length+1); + if (newScheme == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + + nsCRT::memcpy(newScheme, inURI, length); + newScheme[length] = '\0'; + *scheme = newScheme; + return NS_OK; + } + else if (nsString::IsAlpha(c)) { + length++; + } + else + break; + } + return NS_ERROR_MALFORMED_URI; +} + NECKO_EXPORT(nsresult) -NS_MakeAbsoluteURI(const char* spec, nsIURI* baseURI, char* *result) +NS_MakeAbsoluteURI(const char* aSpec, nsIURI* aBaseURI, char* *result) { nsresult rv; - NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv); - if (NS_FAILED(rv)) return rv; - - return serv->MakeAbsolute(spec, baseURI, result); + NS_ASSERTION(aBaseURI, "It doesn't make sense to not supply a base URI"); + + if (aSpec == nsnull) + return aBaseURI->GetSpec(result); + + char* scheme; + rv = GetScheme(aSpec, &scheme); + if (NS_SUCCEEDED(rv)) { + nsAllocator::Free(scheme); + // if aSpec has a scheme, then it's already absolute + *result = nsCRT::strdup(aSpec); + return (*result == nsnull) ? NS_ERROR_OUT_OF_MEMORY : NS_OK; + } + + return aBaseURI->Resolve(aSpec, result); } NECKO_EXPORT(nsresult) @@ -133,10 +178,19 @@ NS_NewLoadGroup(nsISupports* outer, nsIStreamObserver* observer, nsILoadGroup* parent, nsILoadGroup* *result) { nsresult rv; - NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv); + nsILoadGroup* group; + rv = nsComponentManager::CreateInstance(kLoadGroupCID, outer, + NS_GET_IID(nsILoadGroup), + (void**)&group); if (NS_FAILED(rv)) return rv; - - return serv->NewLoadGroup(outer, observer, parent, result); + + rv = group->Init(observer, parent); + if (NS_FAILED(rv)) { + NS_RELEASE(group); + return rv; + } + *result = group; + return rv; } NECKO_EXPORT(nsresult) diff --git a/rdf/base/src/rdfutil.cpp b/rdf/base/src/rdfutil.cpp index b6c57df0182c..dff58d6c8e85 100644 --- a/rdf/base/src/rdfutil.cpp +++ b/rdf/base/src/rdfutil.cpp @@ -47,6 +47,7 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); #include "nsXPIDLString.h" #include "prtime.h" #include "rdfutil.h" +#include "nsNeckoUtil.h" //////////////////////////////////////////////////////////////////////// @@ -90,29 +91,13 @@ rdf_MakeAbsoluteURI(const nsString& aBaseURI, nsString& aURI) nsresult rv; nsAutoString result; - NS_WITH_SERVICE(nsIIOService, service, kIOServiceCID, &rv); + nsCOMPtr base; + rv = NS_NewURI(getter_AddRefs(base), aBaseURI); if (NS_FAILED(rv)) return rv; - nsCOMPtr baseUri; - - char *uriStr = aBaseURI.ToNewCString(); - if (! uriStr) - return NS_ERROR_OUT_OF_MEMORY; - - rv = service->NewURI(uriStr, nsnull, getter_AddRefs(baseUri)); - nsCRT::free(uriStr); - + rv = NS_MakeAbsoluteURI(aURI, base, result); if (NS_FAILED(rv)) return rv; - nsXPIDLCString absUrlStr; - char *urlSpec = aURI.ToNewCString(); - if (! urlSpec) - return NS_ERROR_OUT_OF_MEMORY; - - rv = service->MakeAbsolute(urlSpec, baseUri, getter_Copies(absUrlStr)); - nsCRT::free(urlSpec); - - result = (const char*) absUrlStr; if (NS_SUCCEEDED(rv)) { aURI = result; } @@ -132,18 +117,8 @@ rdf_MakeAbsoluteURI(nsIURI* aURL, nsString& aURI) nsresult rv; nsAutoString result; - NS_WITH_SERVICE(nsIIOService, service, kIOServiceCID, &rv); - if (NS_FAILED(rv)) return rv; + rv = NS_MakeAbsoluteURI(aURI, aURL, result); - nsIURI *baseUri = nsnull; - rv = aURL->QueryInterface(nsIURI::GetIID(), (void**)&baseUri); - if (NS_FAILED(rv)) return rv; - - char *absUrlStr = nsnull; - rv = service->MakeAbsolute(nsCAutoString(aURI), baseUri, &absUrlStr); - NS_RELEASE(baseUri); - result = absUrlStr; - nsCRT::free(absUrlStr); if (NS_SUCCEEDED(rv)) { aURI = result; } diff --git a/rdf/chrome/src/nsChromeProtocolHandler.cpp b/rdf/chrome/src/nsChromeProtocolHandler.cpp index 0e9477adee9b..9de674ea5b86 100644 --- a/rdf/chrome/src/nsChromeProtocolHandler.cpp +++ b/rdf/chrome/src/nsChromeProtocolHandler.cpp @@ -87,23 +87,6 @@ nsChromeProtocolHandler::GetDefaultPort(PRInt32 *result) return NS_OK; } -NS_IMETHODIMP -nsChromeProtocolHandler::MakeAbsolute(const char* aSpec, - nsIURI* aBaseURI, - char* *result) -{ - // XXX optimize this to not needlessly construct the URL - - nsresult rv; - nsIURI* url; - rv = NewURI(aSpec, aBaseURI, &url); - if (NS_FAILED(rv)) return rv; - - rv = url->GetSpec(result); - NS_RELEASE(url); - return rv; -} - NS_IMETHODIMP nsChromeProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **result)