Bug 238257 File URLs aren't respecting user network.dir.format pref r/sr=darin

This commit is contained in:
neil%parkwaycc.co.uk 2004-04-12 22:31:38 +00:00
parent 94b1b6fd03
commit 02a8c74280
4 changed files with 46 additions and 24 deletions

View File

@ -47,6 +47,8 @@
#include "nsITransport.h"
#include "nsIFileURL.h"
#include "nsIMIMEService.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
static NS_DEFINE_CID(kStreamConverterServiceCID, NS_STREAMCONVERTERSERVICE_CID);
static NS_DEFINE_CID(kStreamTransportServiceCID, NS_STREAMTRANSPORTSERVICE_CID);
@ -58,18 +60,17 @@ nsFileChannel::nsFileChannel()
, mUploadLength(-1)
, mLoadFlags(LOAD_NORMAL)
, mStatus(NS_OK)
, mConvertToHTML(PR_FALSE)
, mListFormat(FORMAT_HTML)
, mIsDir(PR_FALSE)
, mUploading(PR_FALSE)
{
}
nsresult
nsFileChannel::Init(nsIURI *uri, PRBool htmlDirs)
nsFileChannel::Init(nsIURI *uri)
{
nsresult rv;
mURL = do_QueryInterface(uri, &rv);
mConvertToHTML = htmlDirs;
return rv;
}
@ -125,14 +126,15 @@ nsFileChannel::EnsureStream()
//-----------------------------------------------------------------------------
// XXX this only needs to be threadsafe because of bug 101252
NS_IMPL_THREADSAFE_ISUPPORTS7(nsFileChannel,
NS_IMPL_THREADSAFE_ISUPPORTS8(nsFileChannel,
nsIRequest,
nsIChannel,
nsIStreamListener,
nsIRequestObserver,
nsIUploadChannel,
nsIFileChannel,
nsITransportEventSink)
nsITransportEventSink,
nsIDirectoryListing)
//-----------------------------------------------------------------------------
// nsIRequest
@ -283,7 +285,7 @@ nsFileChannel::GetContentType(nsACString &aContentType)
if (mContentType.IsEmpty()) {
if (mIsDir) {
if (mConvertToHTML)
if (mListFormat == FORMAT_HTML)
mContentType = NS_LITERAL_CSTRING(TEXT_HTML);
else
mContentType = NS_LITERAL_CSTRING(APPLICATION_HTTP_INDEX_FORMAT);
@ -362,7 +364,7 @@ nsFileChannel::Open(nsIInputStream **result)
rv = EnsureStream();
if (NS_FAILED(rv)) return rv;
if (mIsDir && mConvertToHTML) {
if (mIsDir && mListFormat == FORMAT_HTML) {
nsCOMPtr<nsIStreamConverterService> scs =
do_GetService(kStreamConverterServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
@ -458,7 +460,7 @@ nsFileChannel::AsyncOpen(nsIStreamListener *listener, nsISupports *ctx)
//
// push stream converter if opening a directory.
//
if (mIsDir && mConvertToHTML) {
if (mIsDir && mListFormat == FORMAT_HTML) {
nsCOMPtr<nsIStreamConverterService> scs =
do_GetService(kStreamConverterServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
@ -613,3 +615,33 @@ nsFileChannel::OnTransportStatus(nsITransport *trans, nsresult status,
return NS_OK;
}
NS_IMETHODIMP
nsFileChannel::SetListFormat(PRUint32 format)
{
// Convert the pref value
if (format == FORMAT_PREF) {
format = FORMAT_HTML; // default
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
if (prefs) {
PRInt32 sFormat;
if (NS_SUCCEEDED(prefs->GetIntPref("network.dir.format", &sFormat)))
format = sFormat;
}
}
if (format != FORMAT_RAW &&
format != FORMAT_HTML &&
format != FORMAT_HTTP_INDEX) {
NS_WARNING("invalid directory format");
return NS_ERROR_FAILURE;
}
mListFormat = format;
return NS_OK;
}
NS_IMETHODIMP
nsFileChannel::GetListFormat(PRUint32 *format)
{
*format = mListFormat;
return NS_OK;
}

View File

@ -48,6 +48,7 @@
#include "nsIStreamListener.h"
#include "nsIInputStream.h"
#include "nsITransport.h"
#include "nsIDirectoryListing.h"
#include "nsCOMPtr.h"
#include "nsString.h"
@ -55,6 +56,7 @@ class nsFileChannel : public nsIFileChannel
, public nsIUploadChannel
, public nsIStreamListener
, public nsITransportEventSink
, public nsIDirectoryListing
{
public:
NS_DECL_ISUPPORTS
@ -65,11 +67,12 @@ public:
NS_DECL_NSIREQUESTOBSERVER
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSITRANSPORTEVENTSINK
NS_DECL_NSIDIRECTORYLISTING
nsFileChannel();
virtual ~nsFileChannel() {}
nsresult Init(nsIURI *uri, PRBool htmlDirs);
nsresult Init(nsIURI *uri);
private:
@ -93,7 +96,7 @@ private:
nsCOMPtr<nsIRequest> mRequest;
nsCOMPtr<nsIInputStream> mStream;
PRBool mConvertToHTML; // applies only if is directory
PRUint32 mListFormat;
PRBool mIsDir;
PRBool mUploading;
};

View File

@ -42,28 +42,18 @@
#include "nsURLHelper.h"
#include "nsNetCID.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
#include "nsIServiceManager.h"
#include "nsIDirectoryListing.h"
//-----------------------------------------------------------------------------
nsFileProtocolHandler::nsFileProtocolHandler()
: mGenerateHTMLDirs(PR_FALSE)
{
}
nsresult
nsFileProtocolHandler::Init()
{
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
if (prefs) {
PRInt32 sFormat;
nsresult rv = prefs->GetIntPref("network.dir.format", &sFormat);
if (NS_SUCCEEDED(rv) && sFormat == nsIDirectoryListing::FORMAT_HTML)
mGenerateHTMLDirs = PR_TRUE;
}
return NS_OK;
}
@ -121,7 +111,7 @@ nsFileProtocolHandler::NewChannel(nsIURI *uri, nsIChannel **result)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(chan);
nsresult rv = chan->Init(uri, mGenerateHTMLDirs);
nsresult rv = chan->Init(uri);
if (NS_FAILED(rv)) {
NS_RELEASE(chan);
return rv;

View File

@ -53,9 +53,6 @@ public:
virtual ~nsFileProtocolHandler() {}
nsresult Init();
protected:
PRBool mGenerateHTMLDirs;
};
#endif // !nsFileProtocolHandler_h__