зеркало из https://github.com/mozilla/gecko-dev.git
nsIURL.h and nsURL.cpp have been moved to mozilla\lib\libnet
This commit is contained in:
Родитель
0f858aa87a
Коммит
aea366fb04
|
@ -1,90 +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.
|
||||
*/
|
||||
#ifndef nsIURL_h___
|
||||
#define nsIURL_h___
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsISupports.h"
|
||||
class nsIInputStream;
|
||||
class nsString;
|
||||
|
||||
#define NS_IURL_IID \
|
||||
{ 0x6ecb2900, 0x93b5, 0x11d1, \
|
||||
{0x89, 0x5b, 0x00, 0x60, 0x08, 0x91, 0x1b, 0x81} }
|
||||
|
||||
/**
|
||||
* TEMPORARY INTERFACE; this <B><EM><STRONG>will</STRONG></EM></B> will be
|
||||
* going away
|
||||
*/
|
||||
class nsIURL : public nsISupports {
|
||||
public:
|
||||
/** Open the url for reading and return a new input stream for the
|
||||
* url. The caller must release the input stream when done with it.
|
||||
*/
|
||||
virtual nsIInputStream* Open(PRInt32* aErrorCode) const = 0;
|
||||
|
||||
/** Equality operator */
|
||||
virtual PRBool operator==(const nsIURL& aURL) const = 0;
|
||||
|
||||
|
||||
/** Accessors */
|
||||
//@{
|
||||
/**
|
||||
@return protocol part of the URL */
|
||||
virtual const char* GetProtocol() const = 0;
|
||||
|
||||
/** @return host part of the URL */
|
||||
virtual const char* GetHost() const = 0;
|
||||
|
||||
/** @return file part of the URL */
|
||||
virtual const char* GetFile() const = 0;
|
||||
|
||||
/** @return ref part of the URL */
|
||||
virtual const char* GetRef() const = 0;
|
||||
|
||||
/** @return string originally used to construct the URL */
|
||||
virtual const char* GetSpec() const = 0;
|
||||
|
||||
/** @return ref part of the URL */
|
||||
virtual PRInt32 GetPort() const = 0;
|
||||
//@}
|
||||
|
||||
/** Write the URL to aString, overwriting previous contents. */
|
||||
virtual void ToString(nsString& aString) const = 0;
|
||||
};
|
||||
|
||||
/** Create a new URL from aSpec. */
|
||||
extern NS_BASE nsresult NS_NewURL(nsIURL** aInstancePtrResult,
|
||||
const nsString& aSpec);
|
||||
|
||||
/** Create a new URL, interpreting aSpec as relative to aURL. */
|
||||
extern NS_BASE nsresult NS_NewURL(nsIURL** aInstancePtrResult,
|
||||
const nsIURL* aURL,
|
||||
const nsString& aSpec);
|
||||
|
||||
/**
|
||||
* Utility routine to take a url (may be nsnull) and a base url (may
|
||||
* be empty), and a url spec and combine them properly into a new
|
||||
* absolute url.
|
||||
*/
|
||||
extern NS_BASE nsresult NS_MakeAbsoluteURL(nsIURL* aURL,
|
||||
const nsString& aBaseURL,
|
||||
const nsString& aSpec,
|
||||
nsString& aResult);
|
||||
|
||||
#endif /* nsIURL_h___ */
|
|
@ -1,344 +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 "nsString.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <stdio.h>/* XXX */
|
||||
#include "plstr.h"
|
||||
|
||||
class URLImpl : public nsIURL {
|
||||
public:
|
||||
URLImpl(const nsString& aSpec);
|
||||
URLImpl(const nsIURL* aURL, const nsString& aSpec);
|
||||
~URLImpl();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
virtual PRBool operator==(const nsIURL& aURL) const;
|
||||
virtual nsIInputStream* Open(PRInt32* aErrorCode) const;
|
||||
virtual const char* GetProtocol() const;
|
||||
virtual const char* GetHost() const;
|
||||
virtual const char* GetFile() const;
|
||||
virtual const char* GetRef() const;
|
||||
virtual const char* GetSpec() const;
|
||||
virtual PRInt32 GetPort() const;
|
||||
|
||||
virtual void ToString(nsString& aString) const;
|
||||
|
||||
char* mSpec;
|
||||
char* mProtocol;
|
||||
char* mHost;
|
||||
char* mFile;
|
||||
char* mRef;
|
||||
PRInt32 mPort;
|
||||
PRBool mOK;
|
||||
|
||||
nsresult ParseURL(const nsIURL* aURL, const nsString& aSpec);
|
||||
};
|
||||
|
||||
URLImpl::URLImpl(const nsString& aSpec)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
ParseURL(nsnull, aSpec);
|
||||
}
|
||||
|
||||
URLImpl::URLImpl(const nsIURL* aURL, const nsString& aSpec)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
ParseURL(aURL, aSpec);
|
||||
}
|
||||
|
||||
NS_DEFINE_IID(kURLIID, NS_IURL_IID);
|
||||
|
||||
NS_IMPL_ISUPPORTS(URLImpl, kURLIID)
|
||||
|
||||
URLImpl::~URLImpl()
|
||||
{
|
||||
free(mSpec);
|
||||
free(mProtocol);
|
||||
free(mHost);
|
||||
free(mFile);
|
||||
free(mRef);
|
||||
}
|
||||
|
||||
PRBool URLImpl::operator==(const nsIURL& aURL) const
|
||||
{
|
||||
URLImpl& other = (URLImpl&)aURL; // XXX ?
|
||||
return PRBool((0 == PL_strcmp(mProtocol, other.mProtocol)) &&
|
||||
(0 == PL_strcasecmp(mHost, other.mHost)) &&
|
||||
(0 == PL_strcmp(mFile, other.mFile)));
|
||||
}
|
||||
|
||||
const char* URLImpl::GetProtocol() const
|
||||
{
|
||||
return mProtocol;
|
||||
}
|
||||
|
||||
const char* URLImpl::GetHost() const
|
||||
{
|
||||
return mHost;
|
||||
}
|
||||
|
||||
const char* URLImpl::GetFile() const
|
||||
{
|
||||
return mFile;
|
||||
}
|
||||
|
||||
const char* URLImpl::GetSpec() const
|
||||
{
|
||||
return mSpec;
|
||||
}
|
||||
|
||||
const char* URLImpl::GetRef() const
|
||||
{
|
||||
return mRef;
|
||||
}
|
||||
|
||||
PRInt32 URLImpl::GetPort() const
|
||||
{
|
||||
return mPort;
|
||||
}
|
||||
|
||||
|
||||
void URLImpl::ToString(nsString& aString) const
|
||||
{
|
||||
aString.SetLength(0);
|
||||
aString.Append(mProtocol);
|
||||
aString.Append("://");
|
||||
if (nsnull != mHost) {
|
||||
aString.Append(mHost);
|
||||
if (0 < mPort) {
|
||||
aString.Append(':');
|
||||
aString.Append(mPort, 10);
|
||||
}
|
||||
}
|
||||
aString.Append(mFile);
|
||||
if (nsnull != mRef) {
|
||||
aString.Append('#');
|
||||
aString.Append(mRef);
|
||||
}
|
||||
}
|
||||
|
||||
// XXX recode to use nsString api's
|
||||
|
||||
// XXX don't bother with port numbers
|
||||
// XXX don't bother with ref's
|
||||
// XXX null pointer checks are incomplete
|
||||
nsresult URLImpl::ParseURL(const nsIURL* aURL, const nsString& aSpec)
|
||||
{
|
||||
// XXX hack!
|
||||
char* cSpec = aSpec.ToNewCString();
|
||||
|
||||
const char* uProtocol = nsnull;
|
||||
const char* uHost = nsnull;
|
||||
const char* uFile = nsnull;
|
||||
PRInt32 uPort = -1;
|
||||
if (nsnull != aURL) {
|
||||
uProtocol = aURL->GetProtocol();
|
||||
uHost = aURL->GetHost();
|
||||
uFile = aURL->GetFile();
|
||||
uPort = aURL->GetPort();
|
||||
}
|
||||
|
||||
mProtocol = nsnull;
|
||||
mHost = nsnull;
|
||||
mFile = nsnull;
|
||||
mRef = nsnull;
|
||||
mPort = -1;
|
||||
mSpec = nsnull;
|
||||
|
||||
if (nsnull == cSpec) {
|
||||
delete cSpec;
|
||||
if (nsnull == aURL) {
|
||||
delete cSpec;
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
mProtocol = (nsnull != uProtocol) ? PL_strdup(uProtocol) : nsnull;
|
||||
mHost = (nsnull != uHost) ? PL_strdup(uHost) : nsnull;
|
||||
mPort = uPort;
|
||||
mFile = (nsnull != uFile) ? PL_strdup(uFile) : nsnull;
|
||||
delete cSpec;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
mSpec = PL_strdup(cSpec);
|
||||
const char* cp = PL_strchr(cSpec, ':');
|
||||
if (nsnull == cp) {
|
||||
// relative spec
|
||||
if (nsnull == aURL) {
|
||||
delete cSpec;
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
|
||||
// keep protocol and host
|
||||
mProtocol = (nsnull != uProtocol) ? PL_strdup(uProtocol) : nsnull;
|
||||
mHost = (nsnull != uHost) ? PL_strdup(uHost) : nsnull;
|
||||
mPort = uPort;
|
||||
|
||||
// figure out file name
|
||||
PRInt32 len = PL_strlen(cSpec) + 1;
|
||||
if ((len > 1) && (cSpec[0] == '/')) {
|
||||
// Relative spec is absolute to the server
|
||||
mFile = PL_strdup(cSpec);
|
||||
} else {
|
||||
char* dp = PL_strrchr(uFile, '/');
|
||||
PRInt32 dirlen = (dp + 1) - uFile;
|
||||
mFile = (char*) malloc(dirlen + len);
|
||||
PL_strncpy(mFile, uFile, dirlen);
|
||||
PL_strcpy(mFile + dirlen, cSpec);
|
||||
}
|
||||
} else {
|
||||
// absolute spec
|
||||
|
||||
// get protocol first
|
||||
PRInt32 plen = cp - cSpec;
|
||||
mProtocol = (char*) malloc(plen + 1);
|
||||
PL_strncpy(mProtocol, cSpec, plen);
|
||||
mProtocol[plen] = 0;
|
||||
cp++; // eat : in protocol
|
||||
|
||||
// skip over one, two or three slashes
|
||||
if (*cp == '/') {
|
||||
cp++;
|
||||
if (*cp == '/') {
|
||||
cp++;
|
||||
if (*cp == '/') {
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
delete cSpec;
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
|
||||
const char* cp0 = cp;
|
||||
if ((PL_strcmp(mProtocol, "resource") == 0) ||
|
||||
(PL_strcmp(mProtocol, "file") == 0)) {
|
||||
// resource/file url's do not have host names.
|
||||
// The remainder of the string is the file name
|
||||
PRInt32 flen = PL_strlen(cp);
|
||||
mFile = (char*) malloc(flen + 1);
|
||||
PL_strcpy(mFile, cp);
|
||||
|
||||
#ifdef NS_WIN32
|
||||
if (PL_strcmp(mProtocol, "file") == 0) {
|
||||
// If the filename starts with a "x|" where is an single
|
||||
// character then we assume it's a drive name and change the
|
||||
// vertical bar back to a ":"
|
||||
if ((flen >= 2) && (mFile[1] == '|')) {
|
||||
mFile[1] = ':';
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
// Host name follows protocol for http style urls
|
||||
cp = PL_strchr(cp, '/');
|
||||
if (nsnull == cp) {
|
||||
// There is no file name, only a host name
|
||||
PRInt32 hlen = PL_strlen(cp0);
|
||||
mHost = (char*) malloc(hlen + 1);
|
||||
PL_strcpy(mHost, cp0);
|
||||
|
||||
// Set filename to "/"
|
||||
mFile = (char*) malloc(2);
|
||||
mFile[0] = '/';
|
||||
mFile[1] = 0;
|
||||
}
|
||||
else {
|
||||
PRInt32 hlen = cp - cp0;
|
||||
mHost = (char*) malloc(hlen + 1);
|
||||
PL_strncpy(mHost, cp0, hlen);
|
||||
mHost[hlen] = 0;
|
||||
|
||||
// The rest is the file name
|
||||
PRInt32 flen = PL_strlen(cp);
|
||||
mFile = (char*) malloc(flen + 1);
|
||||
PL_strcpy(mFile, cp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//printf("protocol='%s' host='%s' file='%s'\n", mProtocol, mHost, mFile);
|
||||
delete cSpec;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsIInputStream* URLImpl::Open(PRInt32* aErrorCode) const
|
||||
{
|
||||
nsresult rv;
|
||||
nsIInputStream* in = nsnull;
|
||||
|
||||
if (PL_strcmp(mProtocol, "file") == 0) {
|
||||
rv = NS_OpenFile(&in, mFile);
|
||||
} else if (PL_strcmp(mProtocol, "resource") == 0) {
|
||||
rv = NS_OpenResource(&in, mFile);
|
||||
} else {
|
||||
nsINetService *inet;
|
||||
|
||||
rv = NS_NewINetService(&inet, nsnull);
|
||||
if (NS_OK == rv) {
|
||||
rv = inet->OpenBlockingStream(mSpec, NULL, &in);
|
||||
}
|
||||
}
|
||||
*aErrorCode = rv;
|
||||
return in;
|
||||
}
|
||||
|
||||
NS_BASE 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(aSpec);
|
||||
if (nsnull == it) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return it->QueryInterface(kURLIID, (void **) aInstancePtrResult);
|
||||
}
|
||||
|
||||
NS_BASE nsresult NS_NewURL(nsIURL** aInstancePtrResult,
|
||||
const nsIURL* aURL,
|
||||
const nsString& aSpec)
|
||||
{
|
||||
URLImpl* it = new URLImpl(aURL, aSpec);
|
||||
if (nsnull == it) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return it->QueryInterface(kURLIID, (void **) aInstancePtrResult);
|
||||
}
|
||||
|
||||
NS_BASE nsresult NS_MakeAbsoluteURL(nsIURL* aURL,
|
||||
const nsString& aBaseURL,
|
||||
const nsString& aSpec,
|
||||
nsString& aResult)
|
||||
{
|
||||
if (0 < aBaseURL.Length()) {
|
||||
URLImpl base(aBaseURL);
|
||||
URLImpl url(&base, aSpec);
|
||||
url.ToString(aResult);
|
||||
} else {
|
||||
URLImpl url(aURL, aSpec);
|
||||
url.ToString(aResult);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
Загрузка…
Ссылка в новой задаче