Bug 388195 - Remove gopher support. r=jduell,gavin sr=bz

This commit is contained in:
Joe Drew 2010-04-16 17:05:47 -04:00
Родитель 2d9fa26437
Коммит 308e5cd202
29 изменённых файлов: 135 добавлений и 1580 удалений

Просмотреть файл

@ -928,7 +928,7 @@ function makePreview(row)
var imageContainer = document.getElementById("theimagecontainer");
var oldImage = document.getElementById("thepreviewimage");
const regex = /^(https?|ftp|file|gopher|about|chrome|resource):/;
const regex = /^(https?|ftp|file|about|chrome|resource):/;
var isProtocolAllowed = regex.test(url);
if (/^data:/.test(url) && /^image\//.test(mimeType))
isProtocolAllowed = true;

Просмотреть файл

@ -407,8 +407,6 @@ nsDogbertProfileMigrator::PrefTransform gTransforms[] = {
{ "network.proxy.autoconfig_url", 0, F(GetString), F(SetString), PR_FALSE, { -1 } },
{ "network.proxy.ftp", 0, F(GetString), F(SetString), PR_FALSE, { -1 } },
{ "network.proxy.ftp_port", 0, F(GetInt), F(SetInt), PR_FALSE, { -1 } },
{ "network.proxy.gopher", 0, F(GetString), F(SetString), PR_FALSE, { -1 } },
{ "network.proxy.gopher_port", 0, F(GetInt), F(SetInt), PR_FALSE, { -1 } },
{ "network.proxy.http", 0, F(GetString), F(SetString), PR_FALSE, { -1 } },
{ "network.proxy.http_port", 0, F(GetInt), F(SetInt), PR_FALSE, { -1 } },
{ "network.proxy.ssl", 0, F(GetString), F(SetString), PR_FALSE, { -1 } },

Просмотреть файл

@ -2151,8 +2151,6 @@ nsIEProfileMigrator::CopyProxyPreferences(nsIPrefBranch* aPrefs)
ProxyData data[] = {
{ "ftp=", 4, PR_FALSE, "network.proxy.ftp",
"network.proxy.ftp_port" },
{ "gopher=", 7, PR_FALSE, "network.proxy.gopher",
"network.proxy.gopher_port" },
{ "http=", 5, PR_FALSE, "network.proxy.http",
"network.proxy.http_port" },
{ "https=", 6, PR_FALSE, "network.proxy.ssl",
@ -2163,7 +2161,7 @@ nsIEProfileMigrator::CopyProxyPreferences(nsIPrefBranch* aPrefs)
PRInt32 startIndex = 0, count = 0;
PRBool foundSpecificProxy = PR_FALSE;
for (PRUint32 i = 0; i < 5; ++i) {
for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(data); ++i) {
PRInt32 offset = buf.Find(NS_ConvertASCIItoUTF16(data[i].prefix));
if (offset >= 0) {
foundSpecificProxy = PR_TRUE;
@ -2186,7 +2184,7 @@ nsIEProfileMigrator::CopyProxyPreferences(nsIPrefBranch* aPrefs)
// No proxy config for any specific type was found, assume
// the ProxyServer value is of the form host:port and that
// it applies to all protocols.
for (PRUint32 i = 0; i < 5; ++i)
for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(data); ++i)
SetProxyPref(buf, data[i].hostPref, data[i].portPref, aPrefs);
aPrefs->SetBoolPref("network.proxy.share_proxy_settings", PR_TRUE);
}

Просмотреть файл

@ -486,12 +486,12 @@ nsOperaProfileMigrator::CopyProxySettings(nsINIParser &aParser,
PRInt32 networkProxyType = 0;
const char* protocols[4] = { "HTTP", "HTTPS", "FTP", "GOPHER" };
const char* protocols_l[4] = { "http", "https", "ftp", "gopher" };
const char* protocols[] = { "HTTP", "HTTPS", "FTP" };
const char* protocols_l[] = { "http", "https", "ftp" };
char toggleBuf[15], serverBuf[20], serverPrefBuf[20],
serverPortPrefBuf[25];
PRInt32 enabled;
for (PRUint32 i = 0; i < 4; ++i) {
for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(protocols); ++i) {
sprintf(toggleBuf, "Use %s", protocols[i]);
GetInteger(aParser, "Proxy", toggleBuf, &enabled);
if (enabled) {

Просмотреть файл

@ -386,8 +386,6 @@ nsSeamonkeyProfileMigrator::PrefTransform gTransforms[] = {
MAKESAMETYPEPREFTRANSFORM("network.proxy.ssl_port", Int),
MAKESAMETYPEPREFTRANSFORM("network.proxy.socks", String),
MAKESAMETYPEPREFTRANSFORM("network.proxy.socks_port", Int),
MAKESAMETYPEPREFTRANSFORM("network.proxy.gopher", String),
MAKESAMETYPEPREFTRANSFORM("network.proxy.gopher_port", Int),
MAKESAMETYPEPREFTRANSFORM("network.proxy.no_proxies_on", String),
MAKESAMETYPEPREFTRANSFORM("network.proxy.autoconfig_url", String),
MAKESAMETYPEPREFTRANSFORM("browser.display.foreground_color", String),

Просмотреть файл

@ -52,7 +52,7 @@ var gConnectionsDialog = {
var httpProxyPortPref = document.getElementById("network.proxy.http_port");
var shareProxiesPref = document.getElementById("network.proxy.share_proxy_settings");
if (shareProxiesPref.value) {
var proxyPrefs = ["ssl", "ftp", "socks", "gopher"];
var proxyPrefs = ["ssl", "ftp", "socks"];
for (var i = 0; i < proxyPrefs.length; ++i) {
var proxyServerURLPref = document.getElementById("network.proxy." + proxyPrefs[i]);
var proxyPortPref = document.getElementById("network.proxy." + proxyPrefs[i] + "_port");
@ -134,7 +134,7 @@ var gConnectionsDialog = {
{
var proxyTypePref = document.getElementById("network.proxy.type");
var shareProxiesPref = document.getElementById("network.proxy.share_proxy_settings");
var proxyPrefs = ["ssl", "ftp", "socks", "gopher"];
var proxyPrefs = ["ssl", "ftp", "socks"];
for (var i = 0; i < proxyPrefs.length; ++i) {
var proxyServerURLPref = document.getElementById("network.proxy." + proxyPrefs[i]);
var proxyPortPref = document.getElementById("network.proxy." + proxyPrefs[i] + "_port");

Просмотреть файл

@ -70,8 +70,6 @@
<preference id="network.proxy.ssl_port" name="network.proxy.ssl_port" type="int"/>
<preference id="network.proxy.socks" name="network.proxy.socks" type="string"/>
<preference id="network.proxy.socks_port" name="network.proxy.socks_port" type="int"/>
<preference id="network.proxy.gopher" name="network.proxy.gopher" type="string"/>
<preference id="network.proxy.gopher_port" name="network.proxy.gopher_port" type="int"/>
<preference id="network.proxy.socks_version" name="network.proxy.socks_version" type="int"/>
<preference id="network.proxy.no_proxies_on" name="network.proxy.no_proxies_on" type="string"/>
<preference id="network.proxy.autoconfig_url" name="network.proxy.autoconfig_url" type="string"/>
@ -89,8 +87,6 @@
<preference id="network.proxy.backup.ssl_port" name="network.proxy.backup.ssl_port" type="int"/>
<preference id="network.proxy.backup.socks" name="network.proxy.backup.socks" type="string"/>
<preference id="network.proxy.backup.socks_port" name="network.proxy.backup.socks_port" type="int"/>
<preference id="network.proxy.backup.gopher" name="network.proxy.backup.gopher" type="string"/>
<preference id="network.proxy.backup.gopher_port" name="network.proxy.backup.gopher_port" type="int"/>
</preferences>
<script type="application/javascript" src="chrome://browser/content/preferences/connection.js"/>
@ -156,18 +152,6 @@
onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('ftp', true);"/>
</hbox>
</row>
<row align="center">
<hbox pack="end">
<label value="&gopher.label;" accesskey="&gopher.accesskey;" control="networkProxyGopher"/>
</hbox>
<hbox align="center">
<textbox id="networkProxyGopher" flex="1" preference="network.proxy.gopher"
onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('gopher', false);"/>
<label value="&port.label;" accesskey="&gopherPort.accesskey;" control="networkProxyGopher_Port"/>
<textbox id="networkProxyGopher_Port" type="number" max="65535" size="5" preference="network.proxy.gopher_port"
onsyncfrompreference="return gConnectionsDialog.readProxyProtocolPref('gopher', true);"/>
</hbox>
</row>
<row align="center">
<hbox pack="end">
<label value="&socks.label;" accesskey="&socks.accesskey;" control="networkProxySOCKS"/>

Просмотреть файл

@ -18,8 +18,6 @@
<!ENTITY reload.accesskey "e">
<!ENTITY ftp.label "FTP Proxy:">
<!ENTITY ftp.accesskey "F">
<!ENTITY gopher.label "Gopher Proxy:">
<!ENTITY gopher.accesskey "G">
<!ENTITY http.label "HTTP Proxy:">
<!ENTITY http.accesskey "x">
<!ENTITY ssl.label "SSL Proxy:">
@ -34,8 +32,6 @@
<!ENTITY HTTPport.accesskey "P">
<!ENTITY SSLport.accesskey "o">
<!ENTITY FTPport.accesskey "r">
<!-- No accesskey for gopher (':' doesn't go well) - mpt's going to redesign the window -->
<!ENTITY gopherPort.accesskey "">
<!ENTITY SOCKSport.accesskey "t">
<!ENTITY noproxy.label "No Proxy for:">
<!ENTITY noproxy.accesskey "n">

Просмотреть файл

@ -4950,7 +4950,7 @@ NSS_DISABLE_DBM=
NECKO_WIFI=1
NECKO_COOKIES=1
NECKO_DISK_CACHE=1
NECKO_PROTOCOLS_DEFAULT="about data file ftp gopher http res viewsource"
NECKO_PROTOCOLS_DEFAULT="about data file ftp http res viewsource"
USE_ARM_KUSER=
BUILD_CTYPES=1
XPC_IDISPATCH_SUPPORT=

Просмотреть файл

@ -56,7 +56,6 @@ var reporterListener = {
case "http":
case "https":
case "ftp":
case "gopher":
isEnabled = true;
}
}

Просмотреть файл

@ -710,8 +710,6 @@ pref("network.http.prompt-temp-redirect", true);
// in a DSCP environment this should be 40 (0x28, or AF11), per RFC-4594,
// Section 4.8 "High-Throughput Data Service Class"
pref("network.http.qos", 0);
// ditto for Gopher
pref("network.gopher.qos", 0);
// default values for FTP
// in a DSCP environment this should be 40 (0x28, or AF11), per RFC-4594,
@ -907,8 +905,6 @@ pref("permissions.default.image", 1); // 1-Accept, 2-Deny, 3-dontAccep
pref("network.proxy.type", 5);
pref("network.proxy.ftp", "");
pref("network.proxy.ftp_port", 0);
pref("network.proxy.gopher", "");
pref("network.proxy.gopher_port", 0);
pref("network.proxy.http", "");
pref("network.proxy.http_port", 0);
pref("network.proxy.ssl", "");

Просмотреть файл

@ -301,7 +301,6 @@ nsProtocolProxyService::nsProtocolProxyService()
, mProxyConfig(eProxyConfig_Direct)
, mHTTPProxyPort(-1)
, mFTPProxyPort(-1)
, mGopherProxyPort(-1)
, mHTTPSProxyPort(-1)
, mSOCKSProxyPort(-1)
, mSOCKSProxyVersion(4)
@ -430,12 +429,6 @@ nsProtocolProxyService::PrefsChanged(nsIPrefBranch *prefBranch,
if (!pref || !strcmp(pref, PROXY_PREF("ftp_port")))
proxy_GetIntPref(prefBranch, PROXY_PREF("ftp_port"), mFTPProxyPort);
if (!pref || !strcmp(pref, PROXY_PREF("gopher")))
proxy_GetStringPref(prefBranch, PROXY_PREF("gopher"), mGopherProxyHost);
if (!pref || !strcmp(pref, PROXY_PREF("gopher_port")))
proxy_GetIntPref(prefBranch, PROXY_PREF("gopher_port"), mGopherProxyPort);
if (!pref || !strcmp(pref, PROXY_PREF("socks")))
proxy_GetStringPref(prefBranch, PROXY_PREF("socks"), mSOCKSProxyHost);
@ -1299,12 +1292,6 @@ nsProtocolProxyService::Resolve_Internal(nsIURI *uri,
type = kProxyType_HTTP;
port = mFTPProxyPort;
}
else if (!mGopherProxyHost.IsEmpty() && mGopherProxyPort > 0 &&
info.scheme.EqualsLiteral("gopher")) {
host = &mGopherProxyHost;
type = kProxyType_HTTP;
port = mGopherProxyPort;
}
else if (!mSOCKSProxyHost.IsEmpty() && mSOCKSProxyPort > 0) {
host = &mSOCKSProxyHost;
if (mSOCKSProxyVersion == 4)

Просмотреть файл

@ -365,9 +365,6 @@ protected:
nsCString mFTPProxyHost;
PRInt32 mFTPProxyPort;
nsCString mGopherProxyHost;
PRInt32 mGopherProxyPort;
nsCString mHTTPSProxyHost;
PRInt32 mHTTPSProxyPort;

Просмотреть файл

@ -250,11 +250,6 @@ NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsResProtocolHandler, Init)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsResURL)
#endif
#ifdef NECKO_PROTOCOL_gopher
#include "nsGopherHandler.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(nsGopherHandler)
#endif
#ifdef NECKO_PROTOCOL_viewsource
#include "nsViewSourceHandler.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(nsViewSourceHandler)
@ -307,11 +302,6 @@ NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMaemoNetworkLinkService, Init)
nsresult NS_NewFTPDirListingConv(nsFTPDirListingConv** result);
#endif
#ifdef NECKO_PROTOCOL_gopher
#include "nsGopherDirListingConv.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(nsGopherDirListingConv)
#endif
#include "nsMultiMixedConv.h"
#include "nsHTTPCompressConv.h"
#include "mozTXTToHTMLConv.h"
@ -329,7 +319,6 @@ nsresult NS_NewNSTXTToHTMLConv(nsTXTToHTMLConv** result);
nsresult NS_NewStreamConv(nsStreamConverterService **aStreamConv);
#define FTP_TO_INDEX "?from=text/ftp-dir&to=application/http-index-format"
#define GOPHER_TO_INDEX "?from=text/gopher-dir&to=application/http-index-format"
#define INDEX_TO_HTML "?from=application/http-index-format&to=text/html"
#define MULTI_MIXED_X "?from=multipart/x-mixed-replace&to=*/*"
#define MULTI_MIXED "?from=multipart/mixed&to=*/*"
@ -348,7 +337,6 @@ nsresult NS_NewStreamConv(nsStreamConverterService **aStreamConv);
static const char *const sStreamConverterArray[] = {
FTP_TO_INDEX,
GOPHER_TO_INDEX,
INDEX_TO_HTML,
MULTI_MIXED_X,
MULTI_MIXED,
@ -841,14 +829,6 @@ static const nsModuleComponentInfo gNetModuleInfo[] = {
},
#endif
#ifdef NECKO_PROTOCOL_gopher
{ "GopherDirListingConverter",
NS_GOPHERDIRLISTINGCONVERTER_CID,
NS_ISTREAMCONVERTER_KEY GOPHER_TO_INDEX,
nsGopherDirListingConvConstructor
},
#endif
{ "Indexed to HTML Converter",
NS_NSINDEXEDTOHTMLCONVERTER_CID,
NS_ISTREAMCONVERTER_KEY INDEX_TO_HTML,
@ -1125,15 +1105,6 @@ static const nsModuleComponentInfo gNetModuleInfo[] = {
},
#endif
#ifdef NECKO_PROTOCOL_gopher
//gopher:
{ "The Gopher Protocol Handler",
NS_GOPHERHANDLER_CID,
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "gopher",
nsGopherHandlerConstructor
},
#endif
#ifdef NECKO_PROTOCOL_data
// from netwerk/protocol/data:
{ "Data Protocol Handler",

Просмотреть файл

@ -64,10 +64,6 @@ DirColSize=Size
DirColMTime=Last Modified
DirFileLabel=File:
#Gopher Search Prompt
GopherPromptTitle=Search
GopherPromptText=Enter a search term:
PhishingAuth=You are about to visit "%1$S". This site may be attempting to trick you into thinking you are visiting a different site. Use extreme caution.
PhishingAuthAccept=I understand and will be very careful
SuperfluousAuth=You are about to log in to the site "%1$S" with the username "%2$S", but the website does not require authentication. This may be an attempt to trick you.\n\nIs "%1$S" the site you want to visit?

Просмотреть файл

@ -47,7 +47,6 @@
#undef NECKO_PROTOCOL_data
#undef NECKO_PROTOCOL_file
#undef NECKO_PROTOCOL_ftp
#undef NECKO_PROTOCOL_gopher
#undef NECKO_PROTOCOL_http
#undef NECKO_PROTOCOL_res
#undef NECKO_PROTOCOL_viewsource

Просмотреть файл

@ -47,7 +47,6 @@ PARALLEL_DIRS = \
data \
file \
ftp \
gopher \
http \
res \
viewsource \

Просмотреть файл

@ -1,61 +0,0 @@
#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Bradley Baetz.
# Portions created by the Initial Developer are Copyright (C) 2000
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Bradley Baetz <bbaetz@student.usyd.edu.au>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = necko
LIBRARY_NAME = nkgopher_s
LIBXUL_LIBRARY = 1
FORCE_STATIC_LIB = 1
CPPSRCS = \
nsGopherHandler.cpp \
nsGopherChannel.cpp \
$(NULL)
LOCAL_INCLUDES = \
-I$(srcdir)/../../base/src \
$(NULL)
include $(topsrcdir)/config/rules.mk

Просмотреть файл

@ -1,498 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim:set ts=4 sw=4 sts=4 cin et:
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Gopher protocol code.
*
* The Initial Developer of the Original Code is
* Bradley Baetz.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bradley Baetz <bbaetz@student.usyd.edu.au>
* Darin Fisher <darin@netscape.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsGopherChannel.h"
#include "nsGopherHandler.h"
#include "nsBaseContentStream.h"
#include "nsIAsyncInputStream.h"
#include "nsIAsyncOutputStream.h"
#include "nsISocketTransportService.h"
#include "nsISocketTransport.h"
#include "nsIStringBundle.h"
#include "nsITXTToHTMLConv.h"
#include "nsIPrompt.h"
#include "nsServiceManagerUtils.h"
#include "nsThreadUtils.h"
#include "nsStreamUtils.h"
#include "nsMimeTypes.h"
#include "nsNetCID.h"
#include "nsCOMPtr.h"
#include "nsAutoPtr.h"
#include "nsEscape.h"
#include "nsCRT.h"
#include "netCore.h"
// Specifies the maximum number of output stream buffer segments that we can
// allocate before giving up. At 4k per segment, this corresponds to a max
// gopher request of 400k, which should be plenty.
#define GOPHER_MAX_WRITE_SEGMENT_COUNT 100
//-----------------------------------------------------------------------------
class nsGopherContentStream : public nsBaseContentStream
, public nsIInputStreamCallback
, public nsIOutputStreamCallback
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIINPUTSTREAMCALLBACK
NS_DECL_NSIOUTPUTSTREAMCALLBACK
// stream methods that we override:
NS_IMETHOD Available(PRUint32 *result);
NS_IMETHOD ReadSegments(nsWriteSegmentFun writer, void *closure,
PRUint32 count, PRUint32 *result);
NS_IMETHOD CloseWithStatus(nsresult status);
nsGopherContentStream(nsGopherChannel *channel)
: nsBaseContentStream(PR_TRUE) // non-blocking
, mChannel(channel) {
}
nsresult OpenSocket(nsIEventTarget *target);
nsresult OnSocketWritable();
nsresult ParseTypeAndSelector(char &type, nsCString &selector);
nsresult PromptForQueryString(nsCString &result);
void UpdateContentType(char type);
nsresult SendRequest();
protected:
virtual void OnCallbackPending();
private:
nsRefPtr<nsGopherChannel> mChannel;
nsCOMPtr<nsISocketTransport> mSocket;
nsCOMPtr<nsIAsyncOutputStream> mSocketOutput;
nsCOMPtr<nsIAsyncInputStream> mSocketInput;
};
NS_IMPL_ISUPPORTS_INHERITED2(nsGopherContentStream,
nsBaseContentStream,
nsIInputStreamCallback,
nsIOutputStreamCallback)
NS_IMETHODIMP
nsGopherContentStream::Available(PRUint32 *result)
{
if (mSocketInput)
return mSocketInput->Available(result);
return nsBaseContentStream::Available(result);
}
NS_IMETHODIMP
nsGopherContentStream::ReadSegments(nsWriteSegmentFun writer, void *closure,
PRUint32 count, PRUint32 *result)
{
// Insert a thunk here so that the input stream passed to the writer is
// this input stream instead of mSocketInput.
if (mSocketInput) {
nsWriteSegmentThunk thunk = { this, writer, closure };
return mSocketInput->ReadSegments(NS_WriteSegmentThunk, &thunk, count,
result);
}
return nsBaseContentStream::ReadSegments(writer, closure, count, result);
}
NS_IMETHODIMP
nsGopherContentStream::CloseWithStatus(nsresult status)
{
if (mSocket) {
mSocket->Close(status);
mSocket = nsnull;
mSocketInput = nsnull;
mSocketOutput = nsnull;
}
return nsBaseContentStream::CloseWithStatus(status);
}
NS_IMETHODIMP
nsGopherContentStream::OnInputStreamReady(nsIAsyncInputStream *stream)
{
// Forward this notification
DispatchCallbackSync();
return NS_OK;
}
NS_IMETHODIMP
nsGopherContentStream::OnOutputStreamReady(nsIAsyncOutputStream *stream)
{
// If we're already closed, mSocketOutput is going to be null and we'll
// just be getting notified that it got closed (by outselves). In that
// case, nothing to do here.
if (!mSocketOutput) {
NS_ASSERTION(NS_FAILED(Status()), "How did that happen?");
return NS_OK;
}
// We have to close ourselves if we hit an error here in order to propagate
// the error to our consumer. Otherwise, just forward the notification so
// that the consumer will know to start reading.
nsresult rv = OnSocketWritable();
if (NS_FAILED(rv))
CloseWithStatus(rv);
return NS_OK;
}
void
nsGopherContentStream::OnCallbackPending()
{
nsresult rv;
// We have a callback, so failure means we should close the stream.
if (!mSocket) {
rv = OpenSocket(CallbackTarget());
} else if (mSocketInput) {
rv = mSocketInput->AsyncWait(this, 0, 0, CallbackTarget());
}
if (NS_FAILED(rv))
CloseWithStatus(rv);
}
nsresult
nsGopherContentStream::OpenSocket(nsIEventTarget *target)
{
// This function is called to get things started.
// We begin by opening a socket to the specified host and wait for the
// socket to become writable.
nsCAutoString host;
nsresult rv = mChannel->URI()->GetAsciiHost(host);
if (NS_FAILED(rv))
return rv;
if (host.IsEmpty())
return NS_ERROR_MALFORMED_URI;
// For security reasons, don't allow anything expect the default
// gopher port (70). See bug 71916 - bbaetz@cs.mcgill.ca
PRInt32 port = GOPHER_PORT;
// Create socket tranport
nsCOMPtr<nsISocketTransportService> sts =
do_GetService(NS_SOCKETTRANSPORTSERVICE_CONTRACTID, &rv);
if (NS_FAILED(rv))
return rv;
rv = sts->CreateTransport(nsnull, 0, host, port, mChannel->ProxyInfo(),
getter_AddRefs(mSocket));
if (NS_FAILED(rv))
return rv;
mSocket->SetQoSBits(gGopherHandler->GetQoSBits());
// Setup progress and status notifications
rv = mSocket->SetEventSink(mChannel, target);
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsIOutputStream> output;
rv = mSocket->OpenOutputStream(0, 0, GOPHER_MAX_WRITE_SEGMENT_COUNT,
getter_AddRefs(output));
if (NS_FAILED(rv))
return rv;
mSocketOutput = do_QueryInterface(output);
NS_ENSURE_STATE(mSocketOutput);
return mSocketOutput->AsyncWait(this, 0, 0, target);
}
nsresult
nsGopherContentStream::OnSocketWritable()
{
// Write to output stream (we can do this in one big chunk)
nsresult rv = SendRequest();
if (NS_FAILED(rv))
return rv;
// Open input stream
nsCOMPtr<nsIInputStream> input;
rv = mSocket->OpenInputStream(0, 0, 0, getter_AddRefs(input));
if (NS_FAILED(rv))
return rv;
mSocketInput = do_QueryInterface(input, &rv);
NS_ASSERTION(CallbackTarget(), "where is my pending callback?");
rv = mSocketInput->AsyncWait(this, 0, 0, CallbackTarget());
return rv;
}
nsresult
nsGopherContentStream::ParseTypeAndSelector(char &type, nsCString &selector)
{
nsCAutoString buffer;
nsresult rv = mChannel->URI()->GetPath(buffer); // unescaped down below
if (NS_FAILED(rv))
return rv;
// No path given
if (buffer[0] == '\0' || (buffer[0] == '/' && buffer[1] == '\0')) {
type = '1';
selector.Truncate();
} else {
NS_ENSURE_STATE(buffer[1] != '\0');
type = buffer[1]; // Ignore leading '/'
// Do it this way in case selector contains embedded nulls after
// unescaping.
char *sel = buffer.BeginWriting() + 2;
PRInt32 count = nsUnescapeCount(sel);
selector.Assign(sel, count);
// NOTE: FindCharInSet cannot be used to search for a null byte.
if (selector.FindCharInSet("\t\n\r") != kNotFound ||
selector.FindChar('\0') != kNotFound) {
// gopher selectors cannot containt tab, cr, lf, or \0
return NS_ERROR_MALFORMED_URI;
}
}
return NS_OK;
}
nsresult
nsGopherContentStream::PromptForQueryString(nsCString &result)
{
nsCOMPtr<nsIPrompt> prompter;
mChannel->GetCallback(prompter);
if (!prompter) {
NS_ERROR("We need a prompter!");
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIStringBundle> bundle;
nsCOMPtr<nsIStringBundleService> bundleSvc =
do_GetService(NS_STRINGBUNDLE_CONTRACTID);
if (bundleSvc)
bundleSvc->CreateBundle(NECKO_MSGS_URL, getter_AddRefs(bundle));
nsXPIDLString promptTitle, promptText;
if (bundle) {
bundle->GetStringFromName(NS_LITERAL_STRING("GopherPromptTitle").get(),
getter_Copies(promptTitle));
bundle->GetStringFromName(NS_LITERAL_STRING("GopherPromptText").get(),
getter_Copies(promptText));
}
if (promptTitle.IsEmpty())
promptTitle.AssignLiteral("Search");
if (promptText.IsEmpty())
promptText.AssignLiteral("Enter a search term:");
nsXPIDLString value;
PRBool res = PR_FALSE;
PRBool checkState;
prompter->Prompt(promptTitle.get(), promptText.get(),
getter_Copies(value), NULL, &checkState, &res);
if (!res || value.IsEmpty())
return NS_ERROR_FAILURE;
CopyUTF16toUTF8(value, result); // XXX Is UTF-8 the right thing?
return NS_OK;
}
void
nsGopherContentStream::UpdateContentType(char type)
{
const char *contentType = nsnull;
switch(type) {
case '0':
case 'h':
case '2': // CSO search - unhandled, should not be selectable
case '3': // "Error" - should not be selectable
case 'i': // info line- should not be selectable
contentType = TEXT_HTML;
break;
case '1':
case '7': // search - returns a directory listing
contentType = APPLICATION_HTTP_INDEX_FORMAT;
break;
case 'g':
case 'I':
contentType = IMAGE_GIF;
break;
case 'T': // tn3270 - type doesn't make sense
case '8': // telnet - type doesn't make sense
contentType = TEXT_PLAIN;
break;
case '5': // "DOS binary archive of some sort" - is the mime-type correct?
case '9': // "Binary file!"
contentType = APPLICATION_OCTET_STREAM;
break;
case '4': // "BinHexed Macintosh file"
contentType = APPLICATION_BINHEX;
break;
case '6':
contentType = APPLICATION_UUENCODE;
break;
}
if (contentType)
mChannel->SetContentType(nsDependentCString(contentType));
}
nsresult
nsGopherContentStream::SendRequest()
{
char type;
nsCAutoString request; // used to build request data
nsresult rv = ParseTypeAndSelector(type, request);
if (NS_FAILED(rv))
return rv;
// So, we use the selector as is unless it is a search url
if (type == '7') {
// Note that we don't use the "standard" nsIURL parsing stuff here
// because the only special character is ?, and its possible to search
// for a string containing a #, and so on
// XXX - should this find the last or first entry?
// '?' is valid in both the search string and the url
// so no matter what this does, it may be incorrect
// This only affects people codeing the query directly into the URL
PRInt32 pos = request.RFindChar('?');
if (pos != kNotFound) {
// Just replace it with a tab
request.SetCharAt('\t', pos);
} else {
// We require a query string here - if we don't have one,
// then we need to ask the user
nsCAutoString search;
rv = PromptForQueryString(search);
if (NS_FAILED(rv))
return rv;
request.Append('\t');
request.Append(search);
// and update our uri (XXX should probably redirect instead to avoid
// confusing consumers of the channel)
nsCAutoString spec;
rv = mChannel->URI()->GetAsciiSpec(spec);
if (NS_FAILED(rv))
return rv;
spec.Append('?');
spec.Append(search);
rv = mChannel->URI()->SetSpec(spec);
if (NS_FAILED(rv))
return rv;
}
}
request.Append(CRLF);
PRUint32 n;
rv = mSocketOutput->Write(request.get(), request.Length(), &n);
if (NS_FAILED(rv))
return rv;
NS_ENSURE_STATE(n == request.Length());
// Now, push stream converters appropriately based on our 'type'
if (type == '1' || type == '7') {
rv = mChannel->PushStreamConverter("text/gopher-dir",
APPLICATION_HTTP_INDEX_FORMAT);
if (NS_FAILED(rv))
return rv;
} else if (type == '0') {
nsCOMPtr<nsIStreamListener> converter;
rv = mChannel->PushStreamConverter(TEXT_PLAIN, TEXT_HTML, PR_TRUE,
getter_AddRefs(converter));
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsITXTToHTMLConv> config = do_QueryInterface(converter);
if (config) {
nsCAutoString spec;
mChannel->URI()->GetSpec(spec);
config->SetTitle(NS_ConvertUTF8toUTF16(spec).get());
config->PreFormatHTML(PR_TRUE);
}
}
UpdateContentType(type);
return NS_OK;
}
//-----------------------------------------------------------------------------
NS_IMPL_ISUPPORTS_INHERITED1(nsGopherChannel,
nsBaseChannel,
nsIProxiedChannel)
NS_IMETHODIMP
nsGopherChannel::GetProxyInfo(nsIProxyInfo** aProxyInfo)
{
*aProxyInfo = ProxyInfo();
NS_IF_ADDREF(*aProxyInfo);
return NS_OK;
}
nsresult
nsGopherChannel::OpenContentStream(PRBool async, nsIInputStream **result,
nsIChannel** channel)
{
// Implement nsIChannel::Open in terms of nsIChannel::AsyncOpen
if (!async)
return NS_ERROR_NOT_IMPLEMENTED;
nsRefPtr<nsIInputStream> stream = new nsGopherContentStream(this);
if (!stream)
return NS_ERROR_OUT_OF_MEMORY;
*result = nsnull;
stream.swap(*result);
return NS_OK;
}
PRBool
nsGopherChannel::GetStatusArg(nsresult status, nsString &statusArg)
{
nsCAutoString host;
URI()->GetHost(host);
CopyUTF8toUTF16(host, statusArg);
return PR_TRUE;
}

Просмотреть файл

@ -1,72 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Gopher protocol code.
*
* The Initial Developer of the Original Code is
* Bradley Baetz.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bradley Baetz <bbaetz@student.usyd.edu.au>
* Darin Fisher <darin@netscape.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsGopherChannel_h__
#define nsGopherChannel_h__
#include "nsBaseChannel.h"
#include "nsIProxyInfo.h"
#include "nsIProxiedChannel.h"
class nsGopherChannel : public nsBaseChannel, public nsIProxiedChannel {
public:
nsGopherChannel(nsIURI *uri, nsIProxyInfo *pi) : mProxyInfo(pi) {
SetURI(uri);
}
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIPROXIEDCHANNEL
nsIProxyInfo *ProxyInfo() { return mProxyInfo; }
protected:
virtual ~nsGopherChannel() {}
virtual nsresult OpenContentStream(PRBool async, nsIInputStream **result,
nsIChannel** channel);
virtual PRBool GetStatusArg(nsresult status, nsString &statusArg);
private:
nsresult SendRequest(nsIOutputStream *stream);
nsCOMPtr<nsIProxyInfo> mProxyInfo;
};
#endif // !nsGopherChannel_h__

Просмотреть файл

@ -1,159 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Gopher protocol code.
*
* The Initial Developer of the Original Code is
* Bradley Baetz.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bradley Baetz <bbaetz@student.usyd.edu.au>
* Darin Fisher <darin@meer.net>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsGopherChannel.h"
#include "nsGopherHandler.h"
#include "nsIURL.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsIStandardURL.h"
#include "nsStandardURL.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch2.h"
//-----------------------------------------------------------------------------
NS_IMPL_THREADSAFE_ISUPPORTS2(nsGopherHandler,
nsIProxiedProtocolHandler,
nsIProtocolHandler)
//-----------------------------------------------------------------------------
nsGopherHandler *gGopherHandler = nsnull;
nsGopherHandler::nsGopherHandler()
{
gGopherHandler = this;
}
nsGopherHandler::~nsGopherHandler()
{
gGopherHandler = nsnull;
}
PRUint8
nsGopherHandler::GetQoSBits()
{
nsresult rv;
nsCOMPtr<nsIPrefBranch2> branch = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv)) {
PRInt32 val;
rv = branch->GetIntPref("network.gopher.qos", &val);
if (NS_SUCCEEDED(rv))
return NS_CLAMP(val, 0, 0xff);
}
return 0x00;
}
NS_IMETHODIMP
nsGopherHandler::GetScheme(nsACString &result)
{
result.AssignLiteral("gopher");
return NS_OK;
}
NS_IMETHODIMP
nsGopherHandler::GetDefaultPort(PRInt32 *result)
{
*result = GOPHER_PORT;
return NS_OK;
}
NS_IMETHODIMP
nsGopherHandler::GetProtocolFlags(PRUint32 *result)
{
*result = URI_NORELATIVE | ALLOWS_PROXY | ALLOWS_PROXY_HTTP |
URI_LOADABLE_BY_ANYONE;
return NS_OK;
}
NS_IMETHODIMP
nsGopherHandler::NewURI(const nsACString &spec, const char *originCharset,
nsIURI *baseURI, nsIURI **result)
{
nsStandardURL *url = new nsStandardURL();
if (!url)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(url);
nsresult rv = url->Init(nsIStandardURL::URLTYPE_STANDARD, GOPHER_PORT,
spec, originCharset, baseURI);
if (NS_FAILED(rv)) {
NS_RELEASE(url);
return rv;
}
*result = url; // no QI needed
return NS_OK;
}
NS_IMETHODIMP
nsGopherHandler::NewProxiedChannel(nsIURI *uri, nsIProxyInfo *proxyInfo,
nsIChannel **result)
{
NS_ENSURE_ARG_POINTER(uri);
nsGopherChannel *chan = new nsGopherChannel(uri, proxyInfo);
if (!chan)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(chan);
nsresult rv = chan->Init();
if (NS_FAILED(rv)) {
NS_RELEASE(chan);
return rv;
}
*result = chan;
return NS_OK;
}
NS_IMETHODIMP
nsGopherHandler::NewChannel(nsIURI *uri, nsIChannel **result)
{
return NewProxiedChannel(uri, nsnull, result);
}
NS_IMETHODIMP
nsGopherHandler::AllowPort(PRInt32 port, const char *scheme, PRBool *result)
{
*result = (port == GOPHER_PORT);
return NS_OK;
}

Просмотреть файл

@ -1,75 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Gopher protocol code.
*
* The Initial Developer of the Original Code is
* Bradley Baetz.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bradley Baetz <bbaetz@student.usyd.edu.au>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsGopherHandler_h___
#define nsGopherHandler_h___
#include "nsIProxiedProtocolHandler.h"
#include "nsIProtocolProxyService.h"
#include "nsString.h"
#include "nsCOMPtr.h"
#define GOPHER_PORT 70
// {0x44588c1f-2ce8-4ad8-9b16-dfb9d9d513a7}
#define NS_GOPHERHANDLER_CID \
{ 0x44588c1f, 0x2ce8, 0x4ad8, \
{0x9b, 0x16, 0xdf, 0xb9, 0xd9, 0xd5, 0x13, 0xa7} }
class nsGopherHandler : public nsIProxiedProtocolHandler
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROTOCOLHANDLER
NS_DECL_NSIPROXIEDPROTOCOLHANDLER
// nsGopherHandler methods:
nsGopherHandler();
virtual ~nsGopherHandler();
PRUint8 GetQoSBits();
protected:
nsCOMPtr<nsIProtocolProxyService> mProxySvc;
};
extern nsGopherHandler *gGopherHandler;
#endif /* nsGopherHandler_h___ */

Просмотреть файл

@ -4620,7 +4620,6 @@ nsHttpChannel::SetReferrer(nsIURI *referrer)
"http",
"https",
"ftp",
"gopher",
nsnull
};
match = PR_FALSE;

Просмотреть файл

@ -67,14 +67,6 @@ CPPSRCS += \
$(NULL)
endif
# only include Gopher directory listing support if the Gopher
# protocol is being built.
ifneq (,$(filter gopher,$(NECKO_PROTOCOLS)))
CPPSRCS += \
nsGopherDirListingConv.cpp \
$(NULL)
endif
ifneq (cocoa,$(MOZ_WIDGET_TOOLKIT))
CPPSRCS += \
nsBinHexDecoder.cpp \

Просмотреть файл

@ -1,350 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the gopher-directory to http-index code.
*
* The Initial Developer of the Original Code is
* Bradley Baetz.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bradley Baetz <bbaetz@student.usyd.edu.au>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/* This code is based on the ftp directory translation code */
#include "plstr.h"
#include "nsMemory.h"
#include "nsCRT.h"
#include "nsIServiceManager.h"
#include "nsIGenericFactory.h"
#include "nsString.h"
#include "nsReadableUtils.h"
#include "nsCOMPtr.h"
#include "nsIURI.h"
#include "nsEscape.h"
#include "nsIStreamListener.h"
#include "nsIStreamConverter.h"
#include "nsStringStream.h"
#include "nsIRequestObserver.h"
#include "nsNetUtil.h"
#include "nsMimeTypes.h"
#include "nsGopherDirListingConv.h"
// nsISupports implementation
NS_IMPL_ISUPPORTS3(nsGopherDirListingConv,
nsIStreamConverter,
nsIStreamListener,
nsIRequestObserver)
// nsIStreamConverter implementation
#define CONV_BUF_SIZE (4*1024)
NS_IMETHODIMP
nsGopherDirListingConv::Convert(nsIInputStream *aFromStream,
const char *aFromType,
const char *aToType,
nsISupports *aCtxt, nsIInputStream **_retval) {
return NS_ERROR_NOT_IMPLEMENTED;
}
// Stream converter service calls this to initialize the actual
// stream converter (us).
NS_IMETHODIMP
nsGopherDirListingConv::AsyncConvertData(const char *aFromType,
const char *aToType,
nsIStreamListener *aListener,
nsISupports *aCtxt) {
NS_ASSERTION(aListener && aFromType && aToType,
"null pointer passed into gopher dir listing converter");
// hook up our final listener. this guy gets the various On*() calls
// we want to throw at him.
mFinalListener = aListener;
return NS_OK;
}
// nsIStreamListener implementation
NS_IMETHODIMP
nsGopherDirListingConv::OnDataAvailable(nsIRequest *request,
nsISupports *ctxt,
nsIInputStream *inStr,
PRUint32 sourceOffset,
PRUint32 count) {
nsresult rv;
PRUint32 read, streamLen;
nsCAutoString indexFormat;
rv = inStr->Available(&streamLen);
if (NS_FAILED(rv)) return rv;
char *buffer = (char*)nsMemory::Alloc(streamLen + 1);
if (!buffer)
return NS_ERROR_OUT_OF_MEMORY;
rv = inStr->Read(buffer, streamLen, &read);
if (NS_FAILED(rv))
return rv;
// the dir listings are ascii text, null terminate this sucker.
buffer[streamLen] = '\0';
if (!mBuffer.IsEmpty()) {
// we have data left over from a previous OnDataAvailable() call.
// combine the buffers so we don't lose any data.
mBuffer.Append(buffer);
nsMemory::Free(buffer);
buffer = ToNewCString(mBuffer);
mBuffer.Truncate();
}
if (!mSentHeading) {
nsCOMPtr<nsIChannel> channel = do_QueryInterface(request);
NS_ENSURE_STATE(channel);
nsCOMPtr<nsIURI> uri;
channel->GetURI(getter_AddRefs(uri));
NS_ENSURE_STATE(uri);
// build up the 300: line
nsCAutoString spec;
rv = uri->GetAsciiSpec(spec);
if (NS_FAILED(rv))
return rv;
//printf("spec is %s\n",spec.get());
indexFormat.AppendLiteral("300: ");
indexFormat.Append(spec);
indexFormat.Append(char(nsCRT::LF));
// END 300:
// build up the column heading; 200:
indexFormat.AppendLiteral("200: description filename file-type\n");
// END 200:
mSentHeading = PR_TRUE;
}
char *line = DigestBufferLines(buffer, indexFormat);
// if there's any data left over, buffer it.
if (line && *line) {
mBuffer.Append(line);
}
nsMemory::Free(buffer);
// send the converted data out.
nsCOMPtr<nsIInputStream> inputData;
rv = NS_NewCStringInputStream(getter_AddRefs(inputData), indexFormat);
if (NS_FAILED(rv))
return rv;
rv = mFinalListener->OnDataAvailable(request, ctxt, inputData, 0,
indexFormat.Length());
return rv;
}
// nsIRequestObserver implementation
NS_IMETHODIMP
nsGopherDirListingConv::OnStartRequest(nsIRequest *request, nsISupports *ctxt) {
// we don't care about start. move along... but start masqeurading
// as the http-index channel now.
return mFinalListener->OnStartRequest(request, ctxt);
}
NS_IMETHODIMP
nsGopherDirListingConv::OnStopRequest(nsIRequest *request, nsISupports *ctxt,
nsresult aStatus) {
return mFinalListener->OnStopRequest(request, ctxt, aStatus);
}
// nsGopherDirListingConv methods
nsGopherDirListingConv::nsGopherDirListingConv() {
mSentHeading = PR_FALSE;
}
char*
nsGopherDirListingConv::DigestBufferLines(char* aBuffer, nsCAutoString& aString) {
char *line = aBuffer;
char *eol;
PRBool cr = PR_FALSE;
// while we have new lines, parse 'em into application/http-index-format.
while (line && (eol = PL_strchr(line, nsCRT::LF)) ) {
// yank any carriage returns too.
if (eol > line && *(eol-1) == nsCRT::CR) {
eol--;
*eol = '\0';
cr = PR_TRUE;
} else {
*eol = '\0';
cr = PR_FALSE;
}
if (line[0]=='.' && line[1]=='\0') {
if (cr)
line = eol+2;
else
line = eol+1;
continue;
}
char type;
nsCAutoString desc, selector, host;
PRInt32 port = GOPHER_PORT;
type = line[0];
line++;
char* tabPos = PL_strchr(line,'\t');
/* Get the description */
if (tabPos) {
/* if the description is not empty */
if (tabPos != line) {
char* descStr = PL_strndup(line,tabPos-line);
if (!descStr)
return nsnull;
char* escName = nsEscape(descStr,url_Path);
if (!escName) {
PL_strfree(descStr);
return nsnull;
}
desc = escName;
NS_Free(escName);
PL_strfree(descStr);
} else {
desc = "%20";
}
line = tabPos+1;
tabPos = PL_strchr(line,'\t');
}
/* Get selector */
if (tabPos) {
char* sel = PL_strndup(line,tabPos-line);
if (!sel)
return nsnull;
char* escName = nsEscape(sel,url_Path);
if (!escName) {
PL_strfree(sel);
return nsnull;
}
selector = escName;
NS_Free(escName);
PL_strfree(sel);
line = tabPos+1;
tabPos = PL_strchr(line,'\t');
}
/* Host and Port - put together because there is
no tab after the port */
if (tabPos) {
host.Assign(line, tabPos - line);
line = tabPos+1;
tabPos = PL_strchr(line,'\t');
if (tabPos == NULL)
tabPos = PL_strchr(line,'\0');
/* Port */
nsCAutoString portStr(line, tabPos - line);
port = atol(portStr.get());
line = tabPos+1;
}
// Now create the url
nsCAutoString filename;
if (type != '8' && type != 'T') {
filename.AssignLiteral("gopher://");
filename.Append(host);
if (port != GOPHER_PORT) {
filename.Append(':');
filename.AppendInt(port);
}
filename.Append('/');
filename.Append(type);
filename.Append(selector);
} else {
// construct telnet/tn3270 url.
// Moz doesn't support these, so this is UNTESTED!!!!!
// (I do get the correct error message though)
if (type == '8')
// telnet
filename.AssignLiteral("telnet://");
else
// tn3270
filename.AssignLiteral("tn3270://");
if (!selector.IsEmpty()) {
filename.Append(selector);
filename.Append('@');
}
filename.Append(host);
if (port != 23) { // telnet port
filename.Append(':');
filename.AppendInt(port);
}
}
if (tabPos) {
/* Don't display error messages or informative messages
because they could be selected, and they'll be sorted
out of order.
If FTP displays .messages/READMEs ever, then I could use the
same method to display these
*/
if (type != '3' && type != 'i') {
aString.AppendLiteral("201: ");
aString.Append(desc);
aString.Append(' ');
aString.Append(filename);
aString.Append(' ');
if (type == '1')
aString.AppendLiteral("DIRECTORY");
else
aString.AppendLiteral("FILE");
aString.Append(char(nsCRT::LF));
} else if(type == 'i'){
aString.AppendLiteral("101: ");
aString.Append(desc);
aString.Append(char(nsCRT::LF));
}
} else {
NS_WARNING("Error parsing gopher directory response.\n");
}
if (cr)
line = eol+2;
else
line = eol+1;
}
return line;
}

Просмотреть файл

@ -1,83 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the gopher-directory to http-index code.
*
* The Initial Developer of the Original Code is
* Bradley Baetz.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bradley Baetz <bbaetz@student.usyd.edu.au>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/* This code is heavily based on nsFTPDirListingConv.{cpp,h} */
#ifndef __nsgopherdirlistingconv__h__
#define __nsgopherdirlistingconv__h__
#include "nspr.h"
#include "prtypes.h"
#include "nsIStreamConverter.h"
#include "nsIChannel.h"
#include "nsString.h"
#include "nsIChannel.h"
#include "nsCOMPtr.h"
#include "nsIURI.h"
#include "nsIFactory.h"
#define NS_GOPHERDIRLISTINGCONVERTER_CID \
{ /* ea617873-3b73-4efd-a2c4-fc39bfab809d */ \
0xea617873, \
0x3b73, \
0x4efd, \
{ 0xa2, 0xc4, 0xfc, 0x39, 0xbf, 0xab, 0x80, 0x9d} \
}
#define GOPHER_PORT 70
class nsGopherDirListingConv : public nsIStreamConverter {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSISTREAMCONVERTER
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSIREQUESTOBSERVER
nsGopherDirListingConv();
private:
char* DigestBufferLines(char *aBuffer, nsCAutoString& aString);
nsCString mBuffer; // buffered data.
PRBool mSentHeading;
nsCOMPtr<nsIStreamListener> mFinalListener; // this guy gets the converted data via his OnDataAvailable()
};
#endif /* __nsgopherdirlistingdconv__h__ */

Просмотреть файл

@ -185,7 +185,6 @@ nsIndexedToHTML::OnStartRequest(nsIRequest* request, nsISupports *aContext) {
PRBool isScheme = PR_FALSE;
PRBool isSchemeFile = PR_FALSE;
PRBool isSchemeGopher = PR_FALSE;
if (NS_SUCCEEDED(uri->SchemeIs("ftp", &isScheme)) && isScheme) {
// strip out the password here, so it doesn't show in the page title
@ -240,8 +239,6 @@ nsIndexedToHTML::OnStartRequest(nsIRequest* request, nsISupports *aContext) {
rv = mParser->SetEncoding("UTF-8");
NS_ENSURE_SUCCESS(rv, rv);
} else if (NS_SUCCEEDED(uri->SchemeIs("gopher", &isSchemeGopher)) && isSchemeGopher) {
mExpectAbsLoc = PR_TRUE;
} else if (NS_SUCCEEDED(uri->SchemeIs("jar", &isScheme)) && isScheme) {
nsCAutoString path;
rv = uri->GetPath(path);
@ -363,15 +360,6 @@ nsIndexedToHTML::OnStartRequest(nsIRequest* request, nsISupports *aContext) {
" -moz-padding-start: .5em;\n"
" white-space: nowrap;\n"
"}\n"
"@-moz-document url-prefix(gopher://) {\n"
" td {\n"
" white-space: pre !important;\n"
" font-family: monospace;\n"
" }\n"
" table {\n"
" direction: ltr;\n"
" }\n"
"}\n"
".symlink {\n"
" font-style: italic;\n"
"}\n"
@ -391,89 +379,87 @@ nsIndexedToHTML::OnStartRequest(nsIRequest* request, nsISupports *aContext) {
"}\n"
"]]></style>\n"
"<link rel=\"stylesheet\" media=\"screen, projection\" type=\"text/css\""
" href=\"chrome://global/skin/dirListing/dirListing.css\" />\n");
" href=\"chrome://global/skin/dirListing/dirListing.css\" />\n"
"<script type=\"application/javascript\"><![CDATA[\n"
"var gTable, gOrderBy, gTBody, gRows, gUI_showHidden;\n"
"document.addEventListener(\"DOMContentLoaded\", function() {\n"
" gTable = document.getElementsByTagName(\"table\")[0];\n"
" gTBody = gTable.tBodies[0];\n"
" if (gTBody.rows.length < 2)\n"
" return;\n"
" gUI_showHidden = document.getElementById(\"UI_showHidden\");\n"
" var headCells = gTable.tHead.rows[0].cells,\n"
" hiddenObjects = false;\n"
" function rowAction(i) {\n"
" return function(event) {\n"
" event.preventDefault();\n"
" orderBy(i);\n"
" }\n"
" }\n"
" for (var i = headCells.length - 1; i >= 0; i--) {\n"
" var anchor = document.createElement(\"a\");\n"
" anchor.href = \"\";\n"
" anchor.appendChild(headCells[i].firstChild);\n"
" headCells[i].appendChild(anchor);\n"
" headCells[i].addEventListener(\"click\", rowAction(i), true);\n"
" }\n"
" if (gUI_showHidden) {\n"
" gRows = Array.slice(gTBody.rows);\n"
" hiddenObjects = gRows.some(function (row) row.className == \"hidden-object\");\n"
" }\n"
" gTable.setAttribute(\"order\", \"\");\n"
" if (hiddenObjects) {\n"
" gUI_showHidden.style.display = \"block\";\n"
" updateHidden();\n"
" }\n"
"}, \"false\");\n"
"function compareRows(rowA, rowB) {\n"
" var a = rowA.cells[gOrderBy].getAttribute(\"sortable-data\") || \"\";\n"
" var b = rowB.cells[gOrderBy].getAttribute(\"sortable-data\") || \"\";\n"
" var intA = +a;\n"
" var intB = +b;\n"
" if (a == intA && b == intB) {\n"
" a = intA;\n"
" b = intB;\n"
" } else {\n"
" a = a.toLowerCase();\n"
" b = b.toLowerCase();\n"
" }\n"
" if (a < b)\n"
" return -1;\n"
" if (a > b)\n"
" return 1;\n"
" return 0;\n"
"}\n"
"function orderBy(column) {\n"
" if (!gRows)\n"
" gRows = Array.slice(gTBody.rows);\n"
" var order;\n"
" if (gOrderBy == column) {\n"
" order = gTable.getAttribute(\"order\") == \"asc\" ? \"desc\" : \"asc\";\n"
" } else {\n"
" order = \"asc\";\n"
" gOrderBy = column;\n"
" gTable.setAttribute(\"order-by\", column);\n"
" gRows.sort(compareRows);\n"
" }\n"
" gTable.removeChild(gTBody);\n"
" gTable.setAttribute(\"order\", order);\n"
" if (order == \"asc\")\n"
" for (var i = 0; i < gRows.length; i++)\n"
" gTBody.appendChild(gRows[i]);\n"
" else\n"
" for (var i = gRows.length - 1; i >= 0; i--)\n"
" gTBody.appendChild(gRows[i]);\n"
" gTable.appendChild(gTBody);\n"
"}\n"
"function updateHidden() {\n"
" gTable.className = gUI_showHidden.getElementsByTagName(\"input\")[0].checked ?\n"
" \"\" :\n"
" \"remove-hidden\";\n"
"}\n"
"]]></script>\n");
if (!isSchemeGopher) {
buffer.AppendLiteral("<script type=\"application/javascript\"><![CDATA[\n"
"var gTable, gOrderBy, gTBody, gRows, gUI_showHidden;\n"
"document.addEventListener(\"DOMContentLoaded\", function() {\n"
" gTable = document.getElementsByTagName(\"table\")[0];\n"
" gTBody = gTable.tBodies[0];\n"
" if (gTBody.rows.length < 2)\n"
" return;\n"
" gUI_showHidden = document.getElementById(\"UI_showHidden\");\n"
" var headCells = gTable.tHead.rows[0].cells,\n"
" hiddenObjects = false;\n"
" function rowAction(i) {\n"
" return function(event) {\n"
" event.preventDefault();\n"
" orderBy(i);\n"
" }\n"
" }\n"
" for (var i = headCells.length - 1; i >= 0; i--) {\n"
" var anchor = document.createElement(\"a\");\n"
" anchor.href = \"\";\n"
" anchor.appendChild(headCells[i].firstChild);\n"
" headCells[i].appendChild(anchor);\n"
" headCells[i].addEventListener(\"click\", rowAction(i), true);\n"
" }\n"
" if (gUI_showHidden) {\n"
" gRows = Array.slice(gTBody.rows);\n"
" hiddenObjects = gRows.some(function (row) row.className == \"hidden-object\");\n"
" }\n"
" gTable.setAttribute(\"order\", \"\");\n"
" if (hiddenObjects) {\n"
" gUI_showHidden.style.display = \"block\";\n"
" updateHidden();\n"
" }\n"
"}, \"false\");\n"
"function compareRows(rowA, rowB) {\n"
" var a = rowA.cells[gOrderBy].getAttribute(\"sortable-data\") || \"\";\n"
" var b = rowB.cells[gOrderBy].getAttribute(\"sortable-data\") || \"\";\n"
" var intA = +a;\n"
" var intB = +b;\n"
" if (a == intA && b == intB) {\n"
" a = intA;\n"
" b = intB;\n"
" } else {\n"
" a = a.toLowerCase();\n"
" b = b.toLowerCase();\n"
" }\n"
" if (a < b)\n"
" return -1;\n"
" if (a > b)\n"
" return 1;\n"
" return 0;\n"
"}\n"
"function orderBy(column) {\n"
" if (!gRows)\n"
" gRows = Array.slice(gTBody.rows);\n"
" var order;\n"
" if (gOrderBy == column) {\n"
" order = gTable.getAttribute(\"order\") == \"asc\" ? \"desc\" : \"asc\";\n"
" } else {\n"
" order = \"asc\";\n"
" gOrderBy = column;\n"
" gTable.setAttribute(\"order-by\", column);\n"
" gRows.sort(compareRows);\n"
" }\n"
" gTable.removeChild(gTBody);\n"
" gTable.setAttribute(\"order\", order);\n"
" if (order == \"asc\")\n"
" for (var i = 0; i < gRows.length; i++)\n"
" gTBody.appendChild(gRows[i]);\n"
" else\n"
" for (var i = gRows.length - 1; i >= 0; i--)\n"
" gTBody.appendChild(gRows[i]);\n"
" gTable.appendChild(gTBody);\n"
"}\n"
"function updateHidden() {\n"
" gTable.className = gUI_showHidden.getElementsByTagName(\"input\")[0].checked ?\n"
" \"\" :\n"
" \"remove-hidden\";\n"
"}\n"
"]]></script>\n");
}
buffer.AppendLiteral("<link rel=\"icon\" type=\"image/png\" href=\"");
nsCOMPtr<nsIURI> innerUri = NS_GetInnermostURI(uri);
if (!innerUri)
@ -525,7 +511,7 @@ nsIndexedToHTML::OnStartRequest(nsIRequest* request, nsISupports *aContext) {
}
buffer.AppendLiteral("\" />\n<title>");
// Anything but a gopher url needs to end in a /,
// Everything needs to end in a /,
// otherwise we end up linking to file:///foo/dirfile
if (!mTextToSubURI) {
@ -644,35 +630,33 @@ nsIndexedToHTML::OnStartRequest(nsIRequest* request, nsISupports *aContext) {
buffer.AppendLiteral("<table>\n");
if (!isSchemeGopher) {
nsXPIDLString columnText;
nsXPIDLString columnText;
buffer.AppendLiteral(" <thead>\n"
" <tr>\n"
" <th>");
buffer.AppendLiteral(" <thead>\n"
" <tr>\n"
" <th>");
rv = mBundle->GetStringFromName(NS_LITERAL_STRING("DirColName").get(),
getter_Copies(columnText));
if (NS_FAILED(rv)) return rv;
AppendNonAsciiToNCR(columnText, buffer);
buffer.AppendLiteral("</th>\n"
" <th>");
rv = mBundle->GetStringFromName(NS_LITERAL_STRING("DirColName").get(),
getter_Copies(columnText));
if (NS_FAILED(rv)) return rv;
AppendNonAsciiToNCR(columnText, buffer);
buffer.AppendLiteral("</th>\n"
" <th>");
rv = mBundle->GetStringFromName(NS_LITERAL_STRING("DirColSize").get(),
getter_Copies(columnText));
if (NS_FAILED(rv)) return rv;
AppendNonAsciiToNCR(columnText, buffer);
buffer.AppendLiteral("</th>\n"
" <th colspan=\"2\">");
rv = mBundle->GetStringFromName(NS_LITERAL_STRING("DirColSize").get(),
getter_Copies(columnText));
if (NS_FAILED(rv)) return rv;
AppendNonAsciiToNCR(columnText, buffer);
buffer.AppendLiteral("</th>\n"
" <th colspan=\"2\">");
rv = mBundle->GetStringFromName(NS_LITERAL_STRING("DirColMTime").get(),
getter_Copies(columnText));
if (NS_FAILED(rv)) return rv;
AppendNonAsciiToNCR(columnText, buffer);
buffer.AppendLiteral("</th>\n"
" </tr>\n"
" </thead>\n");
}
rv = mBundle->GetStringFromName(NS_LITERAL_STRING("DirColMTime").get(),
getter_Copies(columnText));
if (NS_FAILED(rv)) return rv;
AppendNonAsciiToNCR(columnText, buffer);
buffer.AppendLiteral("</th>\n"
" </tr>\n"
" </thead>\n");
buffer.AppendLiteral(" <tbody>\n");
// Push buffer to the listener now, so the initial HTML will not
@ -845,32 +829,28 @@ nsIndexedToHTML::OnIndexAvailable(nsIRequest *aRequest,
rv = channel->GetURI(getter_AddRefs(uri));
if (NS_FAILED(rv)) return rv;
// No need to do this for Gopher, as the table has only one column in that case
PRBool isSchemeGopher = PR_FALSE;
if (!(NS_SUCCEEDED(uri->SchemeIs("gopher", &isSchemeGopher)) && isSchemeGopher)) {
//XXX this potentially truncates after a combining char (bug 391472)
nsXPIDLString descriptionAffix;
descriptionAffix.Assign(description);
descriptionAffix.Cut(0, descriptionAffix.Length() - 25);
if (NS_IS_LOW_SURROGATE(descriptionAffix.First()))
descriptionAffix.Cut(0, 1);
description.Truncate(PR_MIN(71, description.Length() - 28));
if (NS_IS_HIGH_SURROGATE(description.Last()))
description.Truncate(description.Length() - 1);
//XXX this potentially truncates after a combining char (bug 391472)
nsXPIDLString descriptionAffix;
descriptionAffix.Assign(description);
descriptionAffix.Cut(0, descriptionAffix.Length() - 25);
if (NS_IS_LOW_SURROGATE(descriptionAffix.First()))
descriptionAffix.Cut(0, 1);
description.Truncate(PR_MIN(71, description.Length() - 28));
if (NS_IS_HIGH_SURROGATE(description.Last()))
description.Truncate(description.Length() - 1);
escapedShort.Adopt(nsEscapeHTML2(description.get(), description.Length()));
escapedShort.Adopt(nsEscapeHTML2(description.get(), description.Length()));
escapedShort.Append(mEscapedEllipsis);
// add ZERO WIDTH SPACE (U+200B) for wrapping
escapedShort.AppendLiteral("&#8203;");
nsString tmp;
tmp.Adopt(nsEscapeHTML2(descriptionAffix.get(), descriptionAffix.Length()));
escapedShort.Append(tmp);
escapedShort.Append(mEscapedEllipsis);
// add ZERO WIDTH SPACE (U+200B) for wrapping
escapedShort.AppendLiteral("&#8203;");
nsString tmp;
tmp.Adopt(nsEscapeHTML2(descriptionAffix.get(), descriptionAffix.Length()));
escapedShort.Append(tmp);
pushBuffer.AppendLiteral(" title=\"");
pushBuffer.Append(escaped);
pushBuffer.AppendLiteral("\"");
}
pushBuffer.AppendLiteral(" title=\"");
pushBuffer.Append(escaped);
pushBuffer.AppendLiteral("\"");
}
if (escapedShort.IsEmpty())
escapedShort.Assign(escaped);
@ -908,7 +888,7 @@ nsIndexedToHTML::OnIndexAvailable(nsIRequest *aRequest,
// now minimally re-escape the location...
PRUint32 escFlags;
// for some protocols, like gopher, we expect the location to be absolute.
// for some protocols, we expect the location to be absolute.
// if so, and if the location indeed appears to be a valid URI, then go
// ahead and treat it like one.
if (mExpectAbsLoc &&

Просмотреть файл

@ -374,7 +374,6 @@ MAKEFILES_netwerk="
netwerk/protocol/data/Makefile
netwerk/protocol/file/Makefile
netwerk/protocol/ftp/Makefile
netwerk/protocol/gopher/Makefile
netwerk/protocol/http/Makefile
netwerk/protocol/res/Makefile
netwerk/protocol/viewsource/Makefile

Просмотреть файл

@ -47,7 +47,7 @@
http://www.mozilla.org/projects/netlib/dirindexformat.html
One added change is for a description entry, for when the
target does not match the filename (ie gopher)
target does not match the filename
*/
@ -107,7 +107,6 @@ static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
// Various protocols we have to special case
static const char kFTPProtocol[] = "ftp://";
static const char kGopherProtocol[] = "gopher://";
//----------------------------------------------------------------------
//
@ -428,19 +427,12 @@ nsHTTPIndex::OnIndexAvailable(nsIRequest* aRequest, nsISupports *aContext,
// we found the filename; construct a resource for its entry
nsCAutoString entryuriC(baseStr);
// gopher resources don't point to an entry in the same directory
// like ftp uris. So the entryuriC is just a unique string, while
// the URL attribute is the destination of this element
// The naming scheme for the attributes is taken from the bookmarks
nsXPIDLCString filename;
nsresult rv = aIndex->GetLocation(getter_Copies(filename));
if (NS_FAILED(rv)) return rv;
entryuriC.Append(filename);
// if its a directory, make sure it ends with a trailing slash.
// This doesn't matter for gopher, (where directories don't have
// to end in a trailing /), because the filename is used for the URL
// attribute.
PRUint32 type;
rv = aIndex->GetType(&type);
if (NS_FAILED(rv))
@ -464,14 +456,7 @@ nsHTTPIndex::OnIndexAvailable(nsIRequest* aRequest, nsISupports *aContext,
nsCOMPtr<nsIRDFLiteral> lit;
nsString str;
// For gopher, the target is the filename. We still have to do all
// the above string manipulation though, because we need the entryuric
// as the key for the RDF data source
if (!strncmp(entryuriC.get(), kGopherProtocol, sizeof(kGopherProtocol)-1))
str.AssignWithConversion(filename);
else {
str.AssignWithConversion(entryuriC.get());
}
str.AssignWithConversion(entryuriC.get());
rv = mDirRDF->GetLiteral(str.get(), getter_AddRefs(lit));
@ -789,7 +774,6 @@ void nsHTTPIndex::GetDestination(nsIRDFResource* r, nsXPIDLCString& dest) {
// get double the # of answers we really want... also, "rdf:file" is
// less expensive in terms of both memory usage as well as speed
// We also handle gopher now
// We use an rdf attribute to mark if this is a container or not.
@ -809,8 +793,6 @@ nsHTTPIndex::isWellknownContainerURI(nsIRDFResource *r)
} else {
nsXPIDLCString uri;
// For gopher, we need to follow the URL attribute to get the
// real destination
GetDestination(r,uri);
if ((uri.get()) && (!strncmp(uri, kFTPProtocol, sizeof(kFTPProtocol) - 1))) {
@ -818,23 +800,6 @@ nsHTTPIndex::isWellknownContainerURI(nsIRDFResource *r)
isContainerFlag = PR_TRUE;
}
}
// A gopher url is of the form:
// gopher://example.com/xFileNameToGet
// where x is a single character representing the type of file
// 1 is a directory, and 7 is a search.
// Searches will cause a dialog to be popped up (asking the user what
// to search for), and so even though searches return a directory as a
// result, don't treat it as a directory here.
// The isContainerFlag test above will correctly handle this when a
// search url is passed in as the baseuri
if ((uri.get()) &&
(!strncmp(uri,kGopherProtocol, sizeof(kGopherProtocol)-1))) {
char* pos = PL_strchr(uri+sizeof(kGopherProtocol)-1, '/');
if (!pos || pos[1] == '\0' || pos[1] == '1')
isContainerFlag = PR_TRUE;
}
}
return isContainerFlag;
}