NS_IMETHODIMP nsResProtocolHandler::SetSubstitution(const nsACString& root, nsIURI *baseURI) { if (!baseURI) { mSubstitutions.Remove(root); return NS_OK; } // If baseURI isn't a resource URI, we can set the substitution immediately. nsCAutoString scheme; nsresult rv = baseURI->GetScheme(scheme); NS_ENSURE_SUCCESS(rv, rv); if (!scheme.Equals(NS_LITERAL_CSTRING("resource"))) { return mSubstitutions.Put(root, baseURI) ? NS_OK : NS_ERROR_UNEXPECTED; } // baseURI is a resource URI, let's resolve it first. nsCAutoString newBase; rv = ResolveURI(baseURI, newBase); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIURI> newBaseURI; rv = mIOService->NewURI(newBase, nsnull, nsnull, getter_AddRefs(newBaseURI)); NS_ENSURE_SUCCESS(rv, rv); return mSubstitutions.Put(root, newBaseURI) ? NS_OK : NS_ERROR_UNEXPECTED; }
nsresult SubstitutingProtocolHandler::NewChannel2(nsIURI* uri, nsILoadInfo* aLoadInfo, nsIChannel** result) { NS_ENSURE_ARG_POINTER(uri); nsAutoCString spec; nsresult rv = ResolveURI(uri, spec); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIURI> newURI; rv = NS_NewURI(getter_AddRefs(newURI), spec); NS_ENSURE_SUCCESS(rv, rv); rv = NS_NewChannelInternal(result, newURI, aLoadInfo); NS_ENSURE_SUCCESS(rv, rv); nsLoadFlags loadFlags = 0; (*result)->GetLoadFlags(&loadFlags); (*result)->SetLoadFlags(loadFlags & ~nsIChannel::LOAD_REPLACE); rv = (*result)->SetOriginalURI(uri); NS_ENSURE_SUCCESS(rv, rv); return SubstituteChannel(uri, aLoadInfo, result); }
NS_IMETHODIMP nsResProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result) { NS_ENSURE_ARG_POINTER(uri); nsresult rv; nsCAutoString spec; rv = ResolveURI(uri, spec); if (NS_FAILED(rv)) return rv; rv = mIOService->NewChannel(spec, nsnull, nsnull, result); if (NS_FAILED(rv)) return rv; return (*result)->SetOriginalURI(uri); }
NS_IMETHODIMP nsResProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result) { NS_ENSURE_ARG_POINTER(uri); nsresult rv; nsCAutoString spec; rv = ResolveURI(uri, spec); if (NS_FAILED(rv)) return rv; rv = mIOService->NewChannel(spec, nsnull, nsnull, result); if (NS_FAILED(rv)) return rv; nsLoadFlags loadFlags = 0; (*result)->GetLoadFlags(&loadFlags); (*result)->SetLoadFlags(loadFlags & ~nsIChannel::LOAD_REPLACE); return (*result)->SetOriginalURI(uri); }
nsresult SubstitutingProtocolHandler::SetSubstitution(const nsACString& root, nsIURI *baseURI) { if (!baseURI) { mSubstitutions.Remove(root); SendSubstitution(root, baseURI); return NS_OK; } // If baseURI isn't a same-scheme URI, we can set the substitution immediately. nsAutoCString scheme; nsresult rv = baseURI->GetScheme(scheme); NS_ENSURE_SUCCESS(rv, rv); if (!scheme.Equals(mScheme)) { if (mEnforceFileOrJar && !scheme.EqualsLiteral("file") && !scheme.EqualsLiteral("jar") && !scheme.EqualsLiteral("app")) { NS_WARNING("Refusing to create substituting URI to non-file:// target"); return NS_ERROR_INVALID_ARG; } mSubstitutions.Put(root, baseURI); SendSubstitution(root, baseURI); return NS_OK; } // baseURI is a same-type substituting URI, let's resolve it first. nsAutoCString newBase; rv = ResolveURI(baseURI, newBase); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIURI> newBaseURI; rv = mIOService->NewURI(newBase, nullptr, nullptr, getter_AddRefs(newBaseURI)); NS_ENSURE_SUCCESS(rv, rv); mSubstitutions.Put(root, newBaseURI); SendSubstitution(root, newBaseURI); return NS_OK; }