git-svn-id: svn://10.0.0.236/trunk@16514 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
warren%netscape.com 1998-12-16 09:51:02 +00:00
parent 6a28c25b6f
commit fffed9ce8f

View File

@ -1,430 +0,0 @@
/* -*- Mode: C++; tab-width: 2; 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.
*/
#include "nsIURL.h"
#include "nsIInputStream.h"
#include "nsINetService.h"
#include "nsIURLGroup.h"
#include "nsIHttpUrl.h" /* NS_NewHttpUrl(...) */
#include "nsINetlibURL.h"
#include "nsIPostToServer.h"
#include "nsString.h"
#include <stdlib.h>
#include <stdio.h>/* XXX */
#include "plstr.h"
#include "prprf.h" /* PR_snprintf(...) */
#include "prmem.h" /* PR_Malloc(...) / PR_Free(...) */
#if defined(XP_MAC)
#include "xp_mcom.h" /* XP_STRDUP() */
#endif /* XP_MAC */
#if defined(XP_PC)
#include <windows.h> // Needed for Interlocked APIs defined in nsISupports.h
#endif /* XP_PC */
class URLImpl : public nsIURL {
public:
// from nsIURL:
NS_IMETHOD Open(nsIInputStream* *result);
NS_IMETHOD Open(nsIStreamListener* listener);
NS_IMETHOD_(PRBool) Equals(const nsIURL *aURL);
NS_IMETHOD GetSpec(const char* *result);
NS_IMETHOD SetSpec(const char* spec);
NS_IMETHOD GetProtocol(const char* *result);
NS_IMETHOD SetProtocol(const char* protocol);
NS_IMETHOD GetHost(const char* *result);
NS_IMETHOD SetHost(const char* host);
NS_IMETHOD GetHostPort(PRUint32 *result);
NS_IMETHOD SetHostPort(PRUint32 port);
NS_IMETHOD GetFile(const char* *result);
NS_IMETHOD SetFile(const char* file);
NS_IMETHOD GetRef(const char* *result);
NS_IMETHOD SetRef(const char* ref);
NS_IMETHOD GetSearch(const char* *result);
NS_IMETHOD SetSearch(const char* search);
NS_IMETHOD GetContainer(nsISupports* *result);
NS_IMETHOD SetContainer(nsISupports* container);
NS_IMETHOD GetLoadAttribs(nsILoadAttribs* *result);
NS_IMETHOD SetLoadAttribs(nsILoadAttribs* loadAttribs);
NS_IMETHOD GetGroup(nsIURLGroup* *result);
NS_IMETHOD SetGroup(nsIURLGroup* group);
NS_IMETHOD SetPostHeader(const char* name, const char* value);
NS_IMETHOD SetPostData(nsIInputStream* input);
NS_IMETHOD ToString(PRUnichar* *aString);
// from nsINetlibURL:
NS_IMETHOD InitializeURLInfo(URL_Struct_ *URL_s);
// URLImpl:
URLImpl(const nsIURL* aURL,
const nsString& aSpec,
nsISupports* container = nsnull,
nsIURLGroup* aGroup = nsnull);
virtual ~URLImpl();
NS_DECL_ISUPPORTS
protected:
nsINetlibURL* mProtocolUrl;
nsINetlibURL* GetProtocolURL(const nsString& aSpec, const nsIURL* aURL);
};
URLImpl::URLImpl(const nsIURL* aURL, const nsString& aSpec,
nsISupports* aContainer, nsIURLGroup* aGroup)
{
NS_INIT_REFCNT();
mProtocolUrl = GetProtocolURL(aSpec, aURL);
}
NS_IMPL_THREADSAFE_ADDREF(URLImpl)
NS_IMPL_THREADSAFE_RELEASE(URLImpl)
NS_DEFINE_IID(kURLIID, NS_IURL_IID);
nsresult URLImpl::QueryInterface(const nsIID &aIID, void** aInstancePtr)
{
nsresult rv = NS_NOINTERFACE;
if (NULL == aInstancePtr) {
return NS_ERROR_NULL_POINTER;
}
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
if (aIID.Equals(kURLIID)) {
*aInstancePtr = (void*) ((nsIURL*)this);
NS_ADDREF_THIS();
return NS_OK;
}
if (aIID.Equals(kISupportsIID)) {
*aInstancePtr = (void*) ((nsIURL *)this);
NS_ADDREF_THIS();
return NS_OK;
}
/*
* Check for aggregated interfaces...
*/
NS_LOCK_INSTANCE();
if (nsnull != mProtocolUrl) {
rv = mProtocolUrl->QueryInterface(aIID, aInstancePtr);
}
NS_UNLOCK_INSTANCE();
#if defined(NS_DEBUG)
/*
* Check for the debug-only interface indicating thread-safety
*/
static NS_DEFINE_IID(kIsThreadsafeIID, NS_ISTHREADSAFE_IID);
if (aIID.Equals(kIsThreadsafeIID)) {
return NS_OK;
}
#endif /* NS_DEBUG */
return rv;
}
URLImpl::~URLImpl()
{
NS_IF_RELEASE(mProtocolUrl);
}
nsINetlibURL* URLImpl::GetProtocolURL(const nsString& aSpec, const nsIURL* aURL)
{
// XXX this is cheating -- there really should be a table-driven thing here
// based on the protocol part of aSpec
nsresult err;
nsINetlibURL* result;
// XXX parse aSpec, aURL
err = NS_NewHttpURL((nsISupports**)&result, (nsIURL*)this); // XXX cast
return result;
}
////////////////////////////////////////////////////////////////////////////////
PRBool URLImpl::Equals(const nsIURL* aURL)
{
if (mProtocolUrl)
return mProtocolUrl->Equals(aURL);
else
return PR_FALSE;
}
nsresult URLImpl::GetProtocol(const char* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetProtocol(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetProtocol(const char *aNewProtocol)
{
if (mProtocolUrl)
return mProtocolUrl->SetProtocol(aNewProtocol);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetHost(const char* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetHost(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetHost(const char *aNewHost)
{
if (mProtocolUrl)
return mProtocolUrl->SetHost(aNewHost);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetFile(const char* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetFile(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetFile(const char *aNewFile)
{
if (mProtocolUrl)
return mProtocolUrl->SetFile(aNewFile);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetSpec(const char* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetSpec(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetSpec(const char *aNewSpec)
{
if (mProtocolUrl)
return mProtocolUrl->SetSpec(aNewSpec);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetRef(const char* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetRef(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetRef(const char* ref)
{
if (mProtocolUrl)
return mProtocolUrl->SetRef(ref);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetHostPort(PRUint32 *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetHostPort(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetHostPort(PRUint32 port)
{
if (mProtocolUrl)
return mProtocolUrl->SetHostPort(port);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetSearch(const char* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetSearch(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetSearch(const char* search)
{
if (mProtocolUrl)
return mProtocolUrl->SetSearch(search);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetContainer(nsISupports* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetContainer(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetContainer(nsISupports* container)
{
if (mProtocolUrl)
return mProtocolUrl->SetContainer(container);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetLoadAttribs(nsILoadAttribs* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetLoadAttribs(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetLoadAttribs(nsILoadAttribs* loadAttribs)
{
if (mProtocolUrl)
return mProtocolUrl->SetLoadAttribs(loadAttribs);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::GetGroup(nsIURLGroup* *result)
{
if (mProtocolUrl)
return mProtocolUrl->GetGroup(result);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetGroup(nsIURLGroup* group)
{
if (mProtocolUrl)
return mProtocolUrl->SetGroup(group);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetPostHeader(const char* name, const char* value)
{
if (mProtocolUrl)
return mProtocolUrl->SetPostHeader(name, value);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::SetPostData(nsIInputStream* input)
{
if (mProtocolUrl)
return mProtocolUrl->SetPostData(input);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::ToString(PRUnichar* *aString)
{
if (mProtocolUrl)
return mProtocolUrl->ToString(aString);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::Open(nsIInputStream* *aStream)
{
if (mProtocolUrl)
return mProtocolUrl->Open(aStream);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::Open(nsIStreamListener *aListener)
{
if (mProtocolUrl)
return mProtocolUrl->Open(aListener);
else
return NS_ERROR_FAILURE;
}
nsresult URLImpl::InitializeURLInfo(URL_Struct_ *URL_s)
{
if (mProtocolUrl)
return mProtocolUrl->InitializeURLInfo(URL_s);
else
return NS_ERROR_FAILURE;
}
////////////////////////////////////////////////////////////////////////////////
NS_NET nsresult NS_NewURL(nsIURL** aInstancePtrResult,
const nsString& aSpec)
{
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
if (nsnull == aInstancePtrResult) {
return NS_ERROR_NULL_POINTER;
}
URLImpl* it = new URLImpl(nsnull, aSpec);
if (nsnull == it) {
return NS_ERROR_OUT_OF_MEMORY;
}
return it->QueryInterface(kURLIID, (void **) aInstancePtrResult);
}
NS_NET nsresult NS_NewURL(nsIURL** aInstancePtrResult,
const nsIURL* aURL,
const nsString& aSpec,
nsISupports* aContainer,
nsIURLGroup* aGroup)
{
URLImpl* it = new URLImpl(aURL, aSpec, aContainer, aGroup);
if (nsnull == it) {
return NS_ERROR_OUT_OF_MEMORY;
}
return it->QueryInterface(kURLIID, (void **) aInstancePtrResult);
}
NS_NET nsresult NS_MakeAbsoluteURL(nsIURL* aURL,
const nsString& aBaseURL,
const nsString& aSpec,
nsString& aResult)
{
if (0 < aBaseURL.Length()) {
URLImpl base(nsnull, aBaseURL);
URLImpl url(&base, aSpec);
PRUnichar* str;
url.ToString(&str);
aResult = *new nsString(str);
delete str;
} else {
URLImpl url(aURL, aSpec);
PRUnichar* str;
url.ToString(&str);
aResult = *new nsString(str);
delete str;
}
return NS_OK;
}