Extra code that came about from my test code. Cleaned up how we load a URL. When processing the state, if we don't have an input stream and the current state is a "response" state then kick out and pause for read. Also cleared up some #ifdef UNREADY_CODE. Incorporated new code added to nsINntpUrl.

This commit is contained in:
mscott%netscape.com 1999-01-31 06:39:23 +00:00
Родитель 56a7c0109b
Коммит a25effbe52
2 изменённых файлов: 296 добавлений и 83 удалений

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

@ -42,6 +42,8 @@
#include "nsMsgRFC822Parser.h" #include "nsMsgRFC822Parser.h"
#include "nsINntpURL.h" #include "nsINntpURL.h"
#include "nsNNTPHost.h"
#include "nsNNTPArticleSet.h"
/* #define UNREADY_CODE */ /* mscott: generic flag for hiding access to url struct and active entry which are now gone */ /* #define UNREADY_CODE */ /* mscott: generic flag for hiding access to url struct and active entry which are now gone */
@ -105,6 +107,86 @@ if (NNTP==NULL) \
NNTP = PR_NewLogModule("NNTP"); \ NNTP = PR_NewLogModule("NNTP"); \
PR_LOG(NNTP, out, buf) ; PR_LOG(NNTP, out, buf) ;
#ifdef DEBUG
char *stateLabels[] = {
"NNTP_RESPONSE",
#ifdef BLOCK_UNTIL_AVAILABLE_CONNECTION
"NNTP_BLOCK_UNTIL_CONNECTIONS_ARE_AVAILABLE",
"NNTP_CONNECTIONS_ARE_AVAILABLE",
#endif
"NNTP_CONNECT",
"NNTP_CONNECT_WAIT",
HG25430
"NNTP_LOGIN_RESPONSE",
"NNTP_SEND_MODE_READER",
"NNTP_SEND_MODE_READER_RESPONSE",
"SEND_LIST_EXTENSIONS",
"SEND_LIST_EXTENSIONS_RESPONSE",
"SEND_LIST_SEARCHES",
"SEND_LIST_SEARCHES_RESPONSE",
"NNTP_LIST_SEARCH_HEADERS",
"NNTP_LIST_SEARCH_HEADERS_RESPONSE",
"NNTP_GET_PROPERTIES",
"NNTP_GET_PROPERTIES_RESPONSE",
"SEND_LIST_SUBSCRIPTIONS",
"SEND_LIST_SUBSCRIPTIONS_RESPONSE",
"SEND_FIRST_NNTP_COMMAND",
"SEND_FIRST_NNTP_COMMAND_RESPONSE",
"SETUP_NEWS_STREAM",
"NNTP_BEGIN_AUTHORIZE",
"NNTP_AUTHORIZE_RESPONSE",
"NNTP_PASSWORD_RESPONSE",
"NNTP_READ_LIST_BEGIN",
"NNTP_READ_LIST",
"DISPLAY_NEWSGROUPS",
"NNTP_NEWGROUPS_BEGIN",
"NNTP_NEWGROUPS",
"NNTP_BEGIN_ARTICLE",
"NNTP_READ_ARTICLE",
"NNTP_XOVER_BEGIN",
"NNTP_FIGURE_NEXT_CHUNK",
"NNTP_XOVER_SEND",
"NNTP_XOVER_RESPONSE",
"NNTP_XOVER",
"NEWS_PROCESS_XOVER",
"NNTP_READ_GROUP",
"NNTP_READ_GROUP_RESPONSE",
"NNTP_READ_GROUP_BODY",
"NNTP_SEND_GROUP_FOR_ARTICLE",
"NNTP_SEND_GROUP_FOR_ARTICLE_RESPONSE",
"NNTP_PROFILE_ADD",
"NNTP_PROFILE_ADD_RESPONSE",
"NNTP_PROFILE_DELETE",
"NNTP_PROFILE_DELETE_RESPONSE",
"NNTP_SEND_ARTICLE_NUMBER",
"NEWS_PROCESS_BODIES",
"NNTP_PRINT_ARTICLE_HEADERS",
"NNTP_SEND_POST_DATA",
"NNTP_SEND_POST_DATA_RESPONSE",
"NNTP_CHECK_FOR_MESSAGE",
"NEWS_NEWS_RC_POST",
"NEWS_DISPLAY_NEWS_RC",
"NEWS_DISPLAY_NEWS_RC_RESPONSE",
"NEWS_START_CANCEL",
"NEWS_DO_CANCEL",
"NNTP_XPAT_SEND",
"NNTP_XPAT_RESPONSE",
"NNTP_SEARCH",
"NNTP_SEARCH_RESPONSE",
"NNTP_SEARCH_RESULTS",
"NNTP_LIST_PRETTY_NAMES",
"NNTP_LIST_PRETTY_NAMES_RESPONSE",
"NNTP_LIST_XACTIVE_RESPONSE",
"NNTP_LIST_XACTIVE",
"NNTP_LIST_GROUP",
"NNTP_LIST_GROUP_RESPONSE",
"NEWS_DONE",
"NEWS_ERROR",
"NNTP_ERROR",
"NEWS_FREE"
};
#endif
/* end logging */ /* end logging */
@ -153,6 +235,12 @@ PRIVATE PRBool net_news_last_username_probably_valid=PR_FALSE;
PRInt32 net_NewsChunkSize=-1; /* default */ PRInt32 net_NewsChunkSize=-1; /* default */
/* PRIVATE PRInt32 net_news_timeout = 170; */ /* PRIVATE PRInt32 net_news_timeout = 170; */
/* seconds that an idle NNTP conn can live */ /* seconds that an idle NNTP conn can live */
extern "C"
{
nsresult NS_NewArticleList(nsINNTPArticleList **articleList, const nsINNTPHost* newsHost, const nsINNTPNewsgroup* newsgroup);
nsresult NS_NewNewsgroup(nsINNTPNewsgroup **info, char *line, nsNNTPArticleSet *set, PRBool subscribed, nsINNTPHost *host, int depth);
nsresult NS_NewNewsgroupList(nsINNTPNewsgroupList **aInstancePtrResult, nsINNTPHost *newsHost, nsINNTPNewsgroup *newsgroup);
}
static char * last_password = 0; static char * last_password = 0;
static char * last_password_hostname = 0; static char * last_password_hostname = 0;
@ -220,8 +308,8 @@ void nsNNTPProtocol::Initialize(nsIURL * aURL, nsITransport * transportLayer)
// okay, now fill in our event sinks...Note that each getter ref counts before // okay, now fill in our event sinks...Note that each getter ref counts before
// it returns the interface to us...we'll release when we are done // it returns the interface to us...we'll release when we are done
m_runningURL->GetNewsgroupList(&m_newsgroupList); m_runningURL->GetNewsgroupList(&m_newsgroupList);
m_runningURL->GetNNTPArticleList(&m_articleList); m_runningURL->GetNntpArticleList(&m_articleList);
m_runningURL->GetNNTPHost(&m_newsHost); m_runningURL->GetNntpHost(&m_newsHost);
m_runningURL->GetNewsgroup(&m_newsgroup); m_runningURL->GetNewsgroup(&m_newsgroup);
m_runningURL->GetOfflineNewsState(&m_offlineNewsState); m_runningURL->GetOfflineNewsState(&m_offlineNewsState);
} }
@ -271,6 +359,8 @@ void nsNNTPProtocol::Initialize(nsIURL * aURL, nsITransport * transportLayer)
m_messageID = NULL; m_messageID = NULL;
m_articleNumber = 0; m_articleNumber = 0;
m_originalContentLength = 0; m_originalContentLength = 0;
m_urlInProgress = PR_FALSE;
m_socketIsOpen = PR_FALSE;
} }
PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL) PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
@ -286,15 +376,39 @@ PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
PRBool cancel = FALSE; PRBool cancel = FALSE;
char* colon; char* colon;
nsresult rv; nsresult rv = NS_OK;
m_articleNumber = -1; m_articleNumber = -1;
// mscott: HACK ALERT until we have an implementation of nsNNTPUrl up and running.... // Query the url for its nsINntpUrl interface...assert and fail to load if they passed us a non news url...
m_url = aURL;
PR_ASSERT (aURL); nsINntpUrl * nntpUrl = NULL;
if (!aURL) if (aURL)
{
rv = aURL->QueryInterface(kINntpURLIID, (void **) &nntpUrl);
if (NS_SUCCEEDED(rv) && nntpUrl)
{
// replace our old url with the new one...
if (m_runningURL) // release our current url if we have one...
NS_RELEASE(m_runningURL);
m_runningURL = nntpUrl;
// okay, now fill in our event sinks...Note that each getter ref counts before
// it returns the interface to us...we'll release when we are done
m_runningURL->GetNewsgroupList(&m_newsgroupList);
m_runningURL->GetNntpArticleList(&m_articleList);
m_runningURL->GetNntpHost(&m_newsHost);
m_runningURL->GetNewsgroup(&m_newsgroup);
m_runningURL->GetOfflineNewsState(&m_offlineNewsState);
}
else
NS_ASSERTION(0, "Invalid url type passed into NNTP Protocol Handler");
}
else
rv = NS_ERROR_FAILURE;
if (NS_FAILED(rv))
{ {
status = -1; status = -1;
goto FAIL; goto FAIL;
@ -312,8 +426,13 @@ PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
} }
if (colon) *colon = ':'; if (colon) *colon = ':';
#ifdef UNREADY_CODE // if we don't have a news host already, go get one...
rv = NS_NewNNTPHost(m_newsHost, hostAndPort, bVal, port); if (m_newsHost == nsnull)
{
rv = NS_NewNNTPHost(&m_newsHost, hostAndPort, port ? port : NEWS_PORT);
// save it on our url for future use....
m_runningURL->SetNntpHost(m_newsHost);
}
PR_ASSERT(NS_SUCCEEDED(rv)); PR_ASSERT(NS_SUCCEEDED(rv));
if (!NS_SUCCEEDED(rv)) if (!NS_SUCCEEDED(rv))
@ -321,14 +440,11 @@ PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
status = -1; status = -1;
goto FAIL; goto FAIL;
} }
#endif
if (messageID && commandSpecificData && !PL_strcmp (commandSpecificData, "?cancel")) if (messageID && commandSpecificData && !PL_strcmp (commandSpecificData, "?cancel"))
cancel = TRUE; cancel = TRUE;
StrAllocCopy(m_path, messageID); StrAllocCopy(m_path, messageID);
if (m_newsgroup)
m_newsgroup->SetName(group);
/* make sure the user has a news host configured */ /* make sure the user has a news host configured */
#if UNREADY_CODE #if UNREADY_CODE
@ -507,6 +623,7 @@ PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
m_nextState = SEND_FIRST_NNTP_COMMAND; m_nextState = SEND_FIRST_NNTP_COMMAND;
m_urlInProgress = PR_TRUE; // we are now running a URL.
@ -526,8 +643,14 @@ PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
} }
else else
{ {
// now tell the transport layer to load the url... // our first state is a process state so drive the state machine...
// m_transport->LoadURL(aURL); if (m_socketIsOpen == PR_FALSE)
{
m_transport->LoadURL(m_runningURL);
m_socketIsOpen = PR_TRUE; // we only want to kick off the socket the first time we make the connection
}
else // the connection is already open so just process it...
status = ProcessNewsState(m_runningURL, nsnull, 0);
return status; return status;
} }
@ -585,7 +708,7 @@ PRInt32 nsNNTPProtocol::ParseURL(nsIURL * aURL, char ** aHostAndPort, PRBool * b
char *message_id = 0; char *message_id = 0;
char *command_specific_data = 0; char *command_specific_data = 0;
const char *path_part; const char *path_part;
char * url = 0; const char * url = 0;
char * s = 0; char * s = 0;
const char * host; const char * host;
@ -609,8 +732,8 @@ PRInt32 nsNNTPProtocol::ParseURL(nsIURL * aURL, char ** aHostAndPort, PRBool * b
*s = 0; *s = 0;
// I think the path part is just the file part of the nsIURL interface... // I think the path part is just the file part of the nsIURL interface...
aURL->GetFile(&path_part); // aURL->GetFile(&path_part);
#if 0 aURL->GetSpec(&url);
path_part = PL_strchr (url, ':'); path_part = PL_strchr (url, ':');
PR_ASSERT (path_part); PR_ASSERT (path_part);
if (!path_part) if (!path_part)
@ -627,7 +750,6 @@ PRInt32 nsNNTPProtocol::ParseURL(nsIURL * aURL, char ** aHostAndPort, PRBool * b
if (path_part) if (path_part)
path_part++; path_part++;
} }
#endif
if (!path_part) if (!path_part)
path_part = ""; path_part = "";
@ -763,8 +885,8 @@ NS_IMETHODIMP nsNNTPProtocol::OnStartBinding(nsIURL* aURL, const char *aContentT
NS_IMETHODIMP nsNNTPProtocol::OnStopBinding(nsIURL* aURL, nsresult aStatus, const PRUnichar* aMsg) NS_IMETHODIMP nsNNTPProtocol::OnStopBinding(nsIURL* aURL, nsresult aStatus, const PRUnichar* aMsg)
{ {
// what can we do? we can close the stream? // what can we do? we can close the stream?
m_urlInProgress = PR_FALSE; // don't close the connection...we may be re-using it.
CloseConnection(); // CloseConnection();
// and we want to mark ourselves for deletion or some how inform our protocol manager that we are // and we want to mark ourselves for deletion or some how inform our protocol manager that we are
// available for another url if there is one.... // available for another url if there is one....
@ -790,11 +912,6 @@ const char *XP_AppCodeName = "Mozilla";
typedef PRUint32 MessageKey; typedef PRUint32 MessageKey;
const MessageKey MSG_MESSAGEKEYNONE = 0xffffffff; const MessageKey MSG_MESSAGEKEYNONE = 0xffffffff;
char * nsUnescape(char * str)
{
return str;
}
/* /*
* This function takes an error code and associated error data * This function takes an error code and associated error data
* and creates a string containing a textual description of * and creates a string containing a textual description of
@ -860,6 +977,35 @@ char * NET_SACat (char **destination, const char *source)
return *destination; return *destination;
} }
char *MSG_UnEscapeSearchUrl (const char *commandSpecificData)
{
char *result = (char*) PR_Malloc (PL_strlen(commandSpecificData) + 1);
if (result)
{
char *resultPtr = result;
while (1)
{
char ch = *commandSpecificData++;
if (!ch)
break;
if (ch == '\\')
{
char scratchBuf[3];
scratchBuf[0] = (char) *commandSpecificData++;
scratchBuf[1] = (char) *commandSpecificData++;
scratchBuf[2] = '\0';
int accum = 0;
sscanf (scratchBuf, "%X", &accum);
*resultPtr++ = (char) accum;
}
else
*resultPtr++ = ch;
}
*resultPtr = '\0';
}
return result;
}
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////
// END OF TEMPORARY HARD CODED FUNCTIONS // END OF TEMPORARY HARD CODED FUNCTIONS
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -901,6 +1047,10 @@ PRInt32 nsNNTPProtocol::ReadLine(nsIInputStream * inputStream, PRUint32 length,
m_dataBuf[numBytesRead] = '\0'; // null terminate the string. m_dataBuf[numBytesRead] = '\0'; // null terminate the string.
// oops....we also want to eat up the '\r' as well....
if (numBytesRead > 0 && m_dataBuf[numBytesRead-1] == '\r')
m_dataBuf[numBytesRead-1] = '\0';
if (line) if (line)
*line = m_dataBuf; *line = m_dataBuf;
return numBytesRead; return numBytesRead;
@ -930,7 +1080,7 @@ PRInt32 nsNNTPProtocol::SendData(const char * dataBuffer)
m_outputStream->QueryInterface(kIInputStreamIID , (void **) &inputStream); m_outputStream->QueryInterface(kIInputStreamIID , (void **) &inputStream);
if (inputStream) if (inputStream)
{ {
m_outputConsumer->OnDataAvailable(m_url, inputStream, writeCount); m_outputConsumer->OnDataAvailable(m_runningURL, inputStream, writeCount);
NS_RELEASE(inputStream); NS_RELEASE(inputStream);
} }
NNTP_LOG_WRITE(dataBuffer); // write the data out to our log file... NNTP_LOG_WRITE(dataBuffer); // write the data out to our log file...
@ -979,9 +1129,7 @@ PRInt32 nsNNTPProtocol::NewsResponse(nsIInputStream * inputStream, PRUint32 leng
return status; return status;
ClearFlag(NNTP_PAUSE_FOR_READ); /* don't pause if we got a line */ ClearFlag(NNTP_PAUSE_FOR_READ); /* don't pause if we got a line */
#ifdef UNREADY_CODE
HG43574 HG43574
#endif
/* almost correct */ /* almost correct */
if(status > 1) if(status > 1)
{ {
@ -1060,9 +1208,7 @@ PRInt32 nsNNTPProtocol::NewsResponse(nsIInputStream * inputStream, PRUint32 leng
return(0); /* everything ok */ return(0); /* everything ok */
} }
#ifdef UNREADY_CODE
HG43072 HG43072
#endif
/* interpret the server response after the connect /* interpret the server response after the connect
* *
@ -1593,8 +1739,7 @@ PRInt32 nsNNTPProtocol::SendFirstNNTPCommand(nsIURL * url)
if (NS_SUCCEEDED(rv) && searchable) if (NS_SUCCEEDED(rv) && searchable)
{ {
/* use the SEARCH extension */ /* use the SEARCH extension */
#ifdef UNREADY_CODE char *slash = PL_strchr (m_commandSpecificData, '/');
char *slash = PL_strchr (cd->command_specific_data, '/');
if (slash) if (slash)
{ {
char *allocatedCommand = MSG_UnEscapeSearchUrl (slash + 1); char *allocatedCommand = MSG_UnEscapeSearchUrl (slash + 1);
@ -1604,7 +1749,6 @@ PRInt32 nsNNTPProtocol::SendFirstNNTPCommand(nsIURL * url)
PR_Free(allocatedCommand); PR_Free(allocatedCommand);
} }
} }
#endif
m_nextState = NNTP_RESPONSE; m_nextState = NNTP_RESPONSE;
m_nextStateAfterResponse = NNTP_SEARCH_RESPONSE; m_nextStateAfterResponse = NNTP_SEARCH_RESPONSE;
} }
@ -1639,8 +1783,7 @@ PRInt32 nsNNTPProtocol::SendFirstNNTPCommand(nsIURL * url)
} }
else if (m_typeWanted == PROFILE_WANTED) else if (m_typeWanted == PROFILE_WANTED)
{ {
#ifdef UNREADY_CODE char *slash = PL_strchr (m_commandSpecificData, '/');
char *slash = PL_strchr (cd->command_specific_data, '/');
if (slash) if (slash)
{ {
char *allocatedCommand = MSG_UnEscapeSearchUrl (slash + 1); char *allocatedCommand = MSG_UnEscapeSearchUrl (slash + 1);
@ -1650,7 +1793,6 @@ PRInt32 nsNNTPProtocol::SendFirstNNTPCommand(nsIURL * url)
PR_Free(allocatedCommand); PR_Free(allocatedCommand);
} }
} }
#endif
m_nextState = NNTP_RESPONSE; m_nextState = NNTP_RESPONSE;
#ifdef UNREADY_CODE #ifdef UNREADY_CODE
if (PL_strstr(ce->URL_s->address, "PROFILE NEW")) if (PL_strstr(ce->URL_s->address, "PROFILE NEW"))
@ -1894,7 +2036,12 @@ PRInt32 nsNNTPProtocol::ReadArticle(nsIInputStream * inputStream, PRUint32 lengt
because it confuses mime parser into not parsing. because it confuses mime parser into not parsing.
*/ */
if (m_typeWanted != CANCEL_WANTED || XP_STRNCMP(outputBuffer, "Content-Type:", 13)) if (m_typeWanted != CANCEL_WANTED || XP_STRNCMP(outputBuffer, "Content-Type:", 13))
status = SendData(outputBuffer); {
// for test purposes...we'd want to write this line out to an rfc-822 stream converter...
// we don't have one now so print the data out so we can verify that we got it....
printf("%s", outputBuffer);
// status = SendData(outputBuffer);
}
} }
return 0; return 0;
@ -2542,11 +2689,8 @@ PRInt32 nsNNTPProtocol::FigureNextChunk()
nsresult rv; nsresult rv;
PRInt32 status = 0; PRInt32 status = 0;
#ifdef UNREADY_CODE const char * host_and_port = NULL;
char * host_and_port = NET_ParseURL (ce->URL_s->address, GET_HOST_PART); m_runningURL->GetHost(&host_and_port);
#else
char * host_and_port = NULL;
#endif
if (!host_and_port) return MK_OUT_OF_MEMORY; if (!host_and_port) return MK_OUT_OF_MEMORY;
@ -2567,7 +2711,6 @@ PRInt32 nsNNTPProtocol::FigureNextChunk()
if (NS_FAILED(rv)) if (NS_FAILED(rv))
{ {
PR_FREEIF (host_and_port);
return status; return status;
} }
} }
@ -2575,7 +2718,6 @@ PRInt32 nsNNTPProtocol::FigureNextChunk()
if (m_numArticlesLoaded >= m_numArticlesWanted) if (m_numArticlesLoaded >= m_numArticlesWanted)
{ {
PR_FREEIF (host_and_port);
m_nextState = NEWS_PROCESS_XOVER; m_nextState = NEWS_PROCESS_XOVER;
ClearFlag(NNTP_PAUSE_FOR_READ); ClearFlag(NNTP_PAUSE_FOR_READ);
return 0; return 0;
@ -2600,7 +2742,6 @@ PRInt32 nsNNTPProtocol::FigureNextChunk()
&status); &status);
if (NS_FAILED(rv)) if (NS_FAILED(rv))
{ {
PR_FREEIF (host_and_port);
return status; return status;
} }
@ -2608,7 +2749,6 @@ PRInt32 nsNNTPProtocol::FigureNextChunk()
if (m_firstArticle <= 0 || m_firstArticle > m_lastArticle) if (m_firstArticle <= 0 || m_firstArticle > m_lastArticle)
{ {
/* Nothing more to get. */ /* Nothing more to get. */
PR_FREEIF (host_and_port);
m_nextState = NEWS_PROCESS_XOVER; m_nextState = NEWS_PROCESS_XOVER;
ClearFlag(NNTP_PAUSE_FOR_READ); ClearFlag(NNTP_PAUSE_FOR_READ);
return 0; return 0;
@ -2625,7 +2765,6 @@ PRInt32 nsNNTPProtocol::FigureNextChunk()
/* convert nsresult->status */ /* convert nsresult->status */
status = !NS_SUCCEEDED(rv); status = !NS_SUCCEEDED(rv);
PR_FREEIF (host_and_port);
if (status < 0) if (status < 0)
return status; return status;
@ -3194,15 +3333,17 @@ PRInt32 nsNNTPProtocol::Cancel()
are done, and it will call news_generate_html_header_fn which will are done, and it will call news_generate_html_header_fn which will
notice the fields we're interested in. notice the fields we're interested in.
*/ */
#ifdef UNREADY_CODE
PL_strcpy (cd->output_buffer, CRLF); /* CRLF used to be LINEBREAK. char outputBuffer[OUTPUT_BUFFER_SIZE];
outputBuffer[0] = '\0';
PL_strcpy (outputBuffer, CRLF); /* CRLF used to be LINEBREAK.
LINEBREAK is platform dependent LINEBREAK is platform dependent
and is only <CR> on a mac. This and is only <CR> on a mac. This
CRLF is the protocol delimiter CRLF is the protocol delimiter
and not platform dependent -km */ and not platform dependent -km */
status = PUTSTRING(cd->output_buffer); status = SendData(outputBuffer);
if (status < 0) return status; if (status < 0) return status;
#endif
/* Now news_generate_html_header_fn should have been called, and these /* Now news_generate_html_header_fn should have been called, and these
should have values. */ should have values. */
id = m_cancelID; id = m_cancelID;
@ -3387,9 +3528,7 @@ PRInt32 nsNNTPProtocol::XPATSend()
*endOfTerm = '\0'; *endOfTerm = '\0';
StrAllocCat (command, CRLF); StrAllocCat (command, CRLF);
#ifdef UNREADY_CODE
unescapedCommand = MSG_UnEscapeSearchUrl(command); unescapedCommand = MSG_UnEscapeSearchUrl(command);
#endif
/* send one term off to the server */ /* send one term off to the server */
NNTP_LOG_WRITE(command); NNTP_LOG_WRITE(command);
@ -3696,10 +3835,8 @@ PRInt32 nsNNTPProtocol::ListGroup()
OUTPUT_BUFFER_SIZE, OUTPUT_BUFFER_SIZE,
"listgroup %.512s" CRLF, "listgroup %.512s" CRLF,
group_name); group_name);
#ifdef UNREADY_CODE rv = NS_NewArticleList(&m_articleList,
rv = NS_NewNNTPArticleList(&m_articleList,
m_newsHost, m_newsgroup); m_newsHost, m_newsgroup);
#endif
status = SendData(outputBuffer); status = SendData(outputBuffer);
@ -3882,7 +4019,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
switch(m_nextState) switch(m_nextState)
{ {
case NNTP_RESPONSE: case NNTP_RESPONSE:
status = NewsResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = NewsResponse(inputStream, length);
break; break;
// mscott: I've removed the states involving connections on the assumption // mscott: I've removed the states involving connections on the assumption
@ -3890,7 +4030,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
HG42871 HG42871
case NNTP_LOGIN_RESPONSE: case NNTP_LOGIN_RESPONSE:
status = LoginResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = LoginResponse();
break; break;
case NNTP_SEND_MODE_READER: case NNTP_SEND_MODE_READER:
@ -3898,52 +4041,76 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
break; break;
case NNTP_SEND_MODE_READER_RESPONSE: case NNTP_SEND_MODE_READER_RESPONSE:
status = SendModeReaderResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = SendModeReaderResponse();
break; break;
case SEND_LIST_EXTENSIONS: case SEND_LIST_EXTENSIONS:
status = SendListExtensions(); status = SendListExtensions();
break; break;
case SEND_LIST_EXTENSIONS_RESPONSE: case SEND_LIST_EXTENSIONS_RESPONSE:
status = SendListExtensionsResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = SendListExtensionsResponse(inputStream, length);
break; break;
case SEND_LIST_SEARCHES: case SEND_LIST_SEARCHES:
status = SendListSearches(); status = SendListSearches();
break; break;
case SEND_LIST_SEARCHES_RESPONSE: case SEND_LIST_SEARCHES_RESPONSE:
status = SendListSearchesResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = SendListSearchesResponse(inputStream, length);
break; break;
case NNTP_LIST_SEARCH_HEADERS: case NNTP_LIST_SEARCH_HEADERS:
status = SendListSearchHeaders(); status = SendListSearchHeaders();
break; break;
case NNTP_LIST_SEARCH_HEADERS_RESPONSE: case NNTP_LIST_SEARCH_HEADERS_RESPONSE:
status = SendListSearchHeadersResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = SendListSearchHeadersResponse(inputStream, length);
break; break;
case NNTP_GET_PROPERTIES: case NNTP_GET_PROPERTIES:
status = GetProperties(); status = GetProperties();
break; break;
case NNTP_GET_PROPERTIES_RESPONSE: case NNTP_GET_PROPERTIES_RESPONSE:
status = GetPropertiesResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = GetPropertiesResponse(inputStream, length);
break; break;
case SEND_LIST_SUBSCRIPTIONS: case SEND_LIST_SUBSCRIPTIONS:
status = SendListSubscriptions(); status = SendListSubscriptions();
break; break;
case SEND_LIST_SUBSCRIPTIONS_RESPONSE: case SEND_LIST_SUBSCRIPTIONS_RESPONSE:
status = SendListSubscriptionsResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = SendListSubscriptionsResponse(inputStream, length);
break; break;
case SEND_FIRST_NNTP_COMMAND: case SEND_FIRST_NNTP_COMMAND:
status = SendFirstNNTPCommand(url); status = SendFirstNNTPCommand(url);
break; break;
case SEND_FIRST_NNTP_COMMAND_RESPONSE: case SEND_FIRST_NNTP_COMMAND_RESPONSE:
status = SendFirstNNTPCommandResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = SendFirstNNTPCommandResponse();
break; break;
case NNTP_SEND_GROUP_FOR_ARTICLE: case NNTP_SEND_GROUP_FOR_ARTICLE:
status = SendGroupForArticle(); status = SendGroupForArticle();
break; break;
case NNTP_SEND_GROUP_FOR_ARTICLE_RESPONSE: case NNTP_SEND_GROUP_FOR_ARTICLE_RESPONSE:
status = SendGroupForArticleResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = SendGroupForArticleResponse();
break; break;
case NNTP_SEND_ARTICLE_NUMBER: case NNTP_SEND_ARTICLE_NUMBER:
status = SendArticleNumber(); status = SendArticleNumber();
@ -3958,11 +4125,17 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
break; break;
case NNTP_AUTHORIZE_RESPONSE: case NNTP_AUTHORIZE_RESPONSE:
status = AuthorizationResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = AuthorizationResponse();
break; break;
case NNTP_PASSWORD_RESPONSE: case NNTP_PASSWORD_RESPONSE:
status = PasswordResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = PasswordResponse();
break; break;
// read list // read list
@ -4013,7 +4186,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
break; break;
case NNTP_XOVER_RESPONSE: case NNTP_XOVER_RESPONSE:
status = ReadXoverResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = ReadXoverResponse();
break; break;
case NEWS_PROCESS_XOVER: case NEWS_PROCESS_XOVER:
@ -4029,7 +4205,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
break; break;
case NNTP_READ_GROUP_RESPONSE: case NNTP_READ_GROUP_RESPONSE:
status = ReadNewsgroupResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = ReadNewsgroupResponse();
break; break;
case NNTP_READ_GROUP_BODY: case NNTP_READ_GROUP_BODY:
@ -4040,7 +4219,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
status = PostData(); status = PostData();
break; break;
case NNTP_SEND_POST_DATA_RESPONSE: case NNTP_SEND_POST_DATA_RESPONSE:
status = PostDataResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = PostDataResponse();
break; break;
case NNTP_CHECK_FOR_MESSAGE: case NNTP_CHECK_FOR_MESSAGE:
@ -4057,7 +4239,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
status = DisplayNewsRC(); status = DisplayNewsRC();
break; break;
case NEWS_DISPLAY_NEWS_RC_RESPONSE: case NEWS_DISPLAY_NEWS_RC_RESPONSE:
status = DisplayNewsRCResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = DisplayNewsRCResponse();
break; break;
// cancel // cancel
@ -4074,7 +4259,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
status = XPATSend(); status = XPATSend();
break; break;
case NNTP_XPAT_RESPONSE: case NNTP_XPAT_RESPONSE:
status = XPATResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = XPATResponse(inputStream, length);
break; break;
// search // search
@ -4082,7 +4270,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
status = Search(); status = Search();
break; break;
case NNTP_SEARCH_RESPONSE: case NNTP_SEARCH_RESPONSE:
status = SearchResponse(); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = SearchResponse();
break; break;
case NNTP_SEARCH_RESULTS: case NNTP_SEARCH_RESULTS:
status = SearchResults(inputStream, length); status = SearchResults(inputStream, length);
@ -4093,26 +4284,37 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
status = ListPrettyNames(); status = ListPrettyNames();
break; break;
case NNTP_LIST_PRETTY_NAMES_RESPONSE: case NNTP_LIST_PRETTY_NAMES_RESPONSE:
status = ListPrettyNamesResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = ListPrettyNamesResponse(inputStream, length);
break; break;
case NNTP_LIST_XACTIVE: case NNTP_LIST_XACTIVE:
status = ListXActive(); status = ListXActive();
break; break;
case NNTP_LIST_XACTIVE_RESPONSE: case NNTP_LIST_XACTIVE_RESPONSE:
status = ListXActiveResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = ListXActiveResponse(inputStream, length);
break; break;
case NNTP_LIST_GROUP: case NNTP_LIST_GROUP:
status = ListGroup(); status = ListGroup();
break; break;
case NNTP_LIST_GROUP_RESPONSE: case NNTP_LIST_GROUP_RESPONSE:
status = ListGroupResponse(inputStream, length); if (inputStream == nsnull)
SetFlag(NNTP_PAUSE_FOR_READ);
else
status = ListGroupResponse(inputStream, length);
break; break;
case NEWS_DONE: case NEWS_DONE:
/* call into libmsg and see if the article counts /* call into libmsg and see if the article counts
* are up to date. If they are not then we * are up to date. If they are not then we
* want to do a "news://host/group" URL so that we * want to do a "news://host/group" URL so that we
* can finish up the article counts. * can finish up the article counts.
*/ */
m_nextState = NEWS_FREE;
#if 0 // mscott 01/04/99. This should be temporary until I figure out what to do with this code..... #if 0 // mscott 01/04/99. This should be temporary until I figure out what to do with this code.....
if (cd->stream) if (cd->stream)
COMPLETE_STREAM; COMPLETE_STREAM;
@ -4129,10 +4331,11 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
break; break;
case NEWS_ERROR: case NEWS_ERROR:
m_nextState = NEWS_FREE;
#if 0 // mscott 01/04/99. This should be temporary until I figure out what to do with this code..... #if 0 // mscott 01/04/99. This should be temporary until I figure out what to do with this code.....
if(cd->stream) if(cd->stream)
ABORT_STREAM(status); ABORT_STREAM(status);
m_nextState = NEWS_FREE;
/* set the connection unbusy /* set the connection unbusy
*/ */
cd->control_con->busy = PR_FALSE; cd->control_con->busy = PR_FALSE;
@ -4188,7 +4391,10 @@ PRInt32 nsNNTPProtocol::ProcessNewsState(nsIURL * url, nsIInputStream * inputStr
break; break;
case NEWS_FREE: case NEWS_FREE:
status = CloseConnection(); // keep going...we never close the connection...
SetFlag(NNTP_PAUSE_FOR_READ);
m_urlInProgress = PR_FALSE; // we are done with the current url...
/* status = CloseConnection(); */
break; break;
default: default:
@ -4245,7 +4451,7 @@ PRInt32 nsNNTPProtocol::CloseConnection()
PR_FREEIF(m_responseText); PR_FREEIF(m_responseText);
PR_FREEIF(m_dataBuf); PR_FREEIF(m_dataBuf);
NS_RELEASE(m_newsgroup); NS_IF_RELEASE(m_newsgroup);
PR_FREEIF (m_cancelID); PR_FREEIF (m_cancelID);
PR_FREEIF (m_cancelFromHdr); PR_FREEIF (m_cancelFromHdr);

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

@ -25,7 +25,7 @@
#include HG40855 #include HG40855
#include "nsIOutputStream.h" #include "nsIOutputStream.h"
#include "nsINntpURL.h" #include "nsINntpUrl.h"
#include "nsINNTPNewsgroupList.h" #include "nsINNTPNewsgroupList.h"
#include "nsINNTPArticleList.h" #include "nsINNTPArticleList.h"
@ -137,6 +137,7 @@ public:
virtual ~nsNNTPProtocol(); virtual ~nsNNTPProtocol();
PRInt32 LoadURL(nsIURL * aURL); PRInt32 LoadURL(nsIURL * aURL);
PRBool IsRunningUrl() { return m_urlInProgress;} // returns true if we are currently running a url and false otherwise...
NS_DECL_ISUPPORTS NS_DECL_ISUPPORTS
@ -175,6 +176,10 @@ public:
void ClearFlag (PRUint32 flag) { m_flags &= ~flag; } void ClearFlag (PRUint32 flag) { m_flags &= ~flag; }
private: private:
// the following flag is used to determine when a url is currently being run. It is cleared on calls
// to ::StopBinding and it is set whenever we call Load on a url
PRBool m_urlInProgress;
// News Event Sinks // News Event Sinks
nsINNTPNewsgroupList * m_newsgroupList; nsINNTPNewsgroupList * m_newsgroupList;
nsINNTPArticleList * m_articleList; nsINNTPArticleList * m_articleList;
@ -189,8 +194,7 @@ private:
nsIStreamListener * m_outputConsumer; // this will be obtained from the transport interface nsIStreamListener * m_outputConsumer; // this will be obtained from the transport interface
// the nsINntpURL that is currently running // the nsINntpURL that is currently running
nsINntpURL * m_runningURL; nsINntpUrl * m_runningURL;
nsIURL * m_url; // eventually this will just be m_runningURL...
PRUint32 m_flags; // used to store flag information PRUint32 m_flags; // used to store flag information
@ -243,6 +247,9 @@ private:
char *m_commandSpecificData; char *m_commandSpecificData;
char *m_searchData; char *m_searchData;
PRBool m_socketIsOpen; // mscott: we should look into keeping this state in the nsSocketTransport...
// I'm using it to make sure I open the socket the first time a URL is loaded into the connection
PRInt32 m_originalContentLength; /* the content length at the time of calling graph progress */ PRInt32 m_originalContentLength; /* the content length at the time of calling graph progress */
PRInt32 ProcessNewsState(nsIURL * url, nsIInputStream * inputStream, PRUint32 length); PRInt32 ProcessNewsState(nsIURL * url, nsIInputStream * inputStream, PRUint32 length);