From 163ed2f930ee0b3b9b4bfb5fb7308ac03b7706a5 Mon Sep 17 00:00:00 2001 From: "sspitzer%netscape.com" Date: Wed, 17 May 2000 05:27:04 +0000 Subject: [PATCH] get the refresh button to work in the subscribe dialog. make it so when we get the list of newsgroups from the server, we'll cache it, and write it to the newsrc file. still a lot of clean up todo before we *truly* support hostinfo.dat, but the hard parts are done. --- .../base/public/nsISubscribableServer.idl | 2 +- mailnews/base/resources/content/subscribe.js | 11 +- mailnews/base/src/nsSubscribableServer.cpp | 2 +- mailnews/imap/src/nsImapIncomingServer.cpp | 2 +- mailnews/news/src/nsNntpIncomingServer.cpp | 133 ++++++++++++++---- mailnews/news/src/nsNntpIncomingServer.h | 6 + 6 files changed, 120 insertions(+), 36 deletions(-) diff --git a/mailnews/base/public/nsISubscribableServer.idl b/mailnews/base/public/nsISubscribableServer.idl index 26c30e64d8af..ad5c52b8f129 100644 --- a/mailnews/base/public/nsISubscribableServer.idl +++ b/mailnews/base/public/nsISubscribableServer.idl @@ -36,7 +36,7 @@ interface nsISubscribeListener : nsISupports { interface nsISubscribableServer : nsISupports { void setIncomingServer(in nsIMsgIncomingServer server); void setDelimiter(in char delimiter); - void populateSubscribeDatasource(in nsIMsgWindow aMsgWindow); + void populateSubscribeDatasource(in nsIMsgWindow aMsgWindow, in boolean forceToServer); attribute nsISubscribeListener subscribeListener; void startPopulatingSubscribeDS(); void stopPopulatingSubscribeDS(); diff --git a/mailnews/base/resources/content/subscribe.js b/mailnews/base/resources/content/subscribe.js index 352199f5139a..e8fc16ca0afe 100644 --- a/mailnews/base/resources/content/subscribe.js +++ b/mailnews/base/resources/content/subscribe.js @@ -62,7 +62,7 @@ function onServerClick(event) //dump("gServerURI="+gServerURI+"\n"); SetServerTypeSpecificTextValues(); - SetUpTree(); + SetUpTree(false); } function SetUpServerMenu() @@ -95,7 +95,7 @@ var MySubscribeListener = { } }; -function SetUpTree() +function SetUpTree(forceToServer) { //dump("SetUpTree()\n"); SetUpRDF(); @@ -113,7 +113,7 @@ function SetUpTree() // Turn progress meter on. gStatusBar.setAttribute("mode","undetermined"); - subscribableServer.populateSubscribeDatasource(null /* eventually, a nsIMsgWindow */); + subscribableServer.populateSubscribeDatasource(null /* eventually, a nsIMsgWindow */, forceToServer); } catch (ex) { dump("failed to populate subscribe ds: " + ex + "\n"); @@ -160,7 +160,7 @@ function SubscribeOnLoad() } SetUpServerMenu(); - SetUpTree(); + SetUpTree(false); gNameField.focus(); @@ -296,7 +296,8 @@ function SubscribeOnClick(event) function RefreshList() { - dump("xxx todo refresh list\n"); + // force it to talk to the server + SetUpTree(true); } function trackGroupInTree() diff --git a/mailnews/base/src/nsSubscribableServer.cpp b/mailnews/base/src/nsSubscribableServer.cpp index 64c3ba526940..3ca898a9bb39 100644 --- a/mailnews/base/src/nsSubscribableServer.cpp +++ b/mailnews/base/src/nsSubscribableServer.cpp @@ -330,7 +330,7 @@ nsSubscribableServer::GetSubscribeListener(nsISubscribeListener **aListener) } NS_IMETHODIMP -nsSubscribableServer::PopulateSubscribeDatasource(nsIMsgWindow *aMsgWindow) +nsSubscribableServer::PopulateSubscribeDatasource(nsIMsgWindow *aMsgWindow, PRBool aForceToServer) { NS_ASSERTION(PR_FALSE,"override this."); return NS_ERROR_FAILURE; diff --git a/mailnews/imap/src/nsImapIncomingServer.cpp b/mailnews/imap/src/nsImapIncomingServer.cpp index 4695ff3e4dda..8102c7e8dba5 100644 --- a/mailnews/imap/src/nsImapIncomingServer.cpp +++ b/mailnews/imap/src/nsImapIncomingServer.cpp @@ -1828,7 +1828,7 @@ NS_IMETHODIMP nsImapIncomingServer::OnLogonRedirectionReply(const PRUnichar *pHo } NS_IMETHODIMP -nsImapIncomingServer::PopulateSubscribeDatasource(nsIMsgWindow *aMsgWindow) +nsImapIncomingServer::PopulateSubscribeDatasource(nsIMsgWindow *aMsgWindow, PRBool aForceToServer /*ignored*/) { nsresult rv; #ifdef DEBUG_sspitzer diff --git a/mailnews/news/src/nsNntpIncomingServer.cpp b/mailnews/news/src/nsNntpIncomingServer.cpp index 491249eb366b..71d8a61d11a6 100644 --- a/mailnews/news/src/nsNntpIncomingServer.cpp +++ b/mailnews/news/src/nsNntpIncomingServer.cpp @@ -38,6 +38,7 @@ #include "nsMsgNewsCID.h" #include "nsNNTPProtocol.h" +#define VALID_VERSION 1 #define NEW_NEWS_DIR_NAME "News" #define PREF_MAIL_NEWSRC_ROOT "mail.newsrc_root" #define HOSTINFO_FILE_NAME "hostinfo.dat" @@ -82,6 +83,11 @@ nsNntpIncomingServer::nsNntpIncomingServer() : nsMsgLineBuffer(nsnull, PR_FALSE) NS_NewISupportsArray(getter_AddRefs(m_connectionCache)); mHostInfoLoaded = PR_FALSE; mHostInfoHasChanged = PR_FALSE; + mLastGroupDate = 0; + mUniqueId = 0; + mPushAuth = PR_FALSE; + mHasSeenBeginGroups = PR_FALSE; + mVersion = 0; } nsNntpIncomingServer::~nsNntpIncomingServer() @@ -668,13 +674,75 @@ nsNntpIncomingServer::SubscribeToNewsgroup(const char *name) return NS_OK; } +PRBool +writeGroupToHostInfo(nsCString &aElement, void *aData) +{ + nsIOFileStream *stream; + stream = (nsIOFileStream *)aData; + + // ",,x,y,z" is a temporary hack + *stream << (const char *)aElement << ",,x,y,z" << MSG_LINEBREAK; + + return PR_TRUE; +} + +PRBool +addGroup(nsCString &aElement, void *aData) +{ + nsresult rv; + nsNntpIncomingServer *server; + server = (nsNntpIncomingServer *)aData; + + rv = server->AddToSubscribeDS((const char *)aElement); + NS_ASSERTION(NS_SUCCEEDED(rv),"AddToSubscribeDS failed"); + return PR_TRUE; +} + + nsresult nsNntpIncomingServer::WriteHostInfoFile() { + nsresult rv; #ifdef DEBUG_sspitzer printf("WriteHostInfoFile()\n"); #endif + + PRInt32 firstnewdate; + + LL_L2I(firstnewdate, mFirstNewDate); + + nsXPIDLCString hostname; + rv = GetHostName(getter_Copies(hostname)); + if (NS_FAILED(rv)) return rv; + + + nsFileSpec hostinfoFileSpec; + rv = mHostInfoFile->GetFileSpec(&hostinfoFileSpec); + if (NS_FAILED(rv)) return rv; + + nsIOFileStream hostinfoStream(hostinfoFileSpec, (PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE)); + +#ifdef DEBUG_sspitzer + printf("xxx todo missing some formatting, need to fix this, see nsNNTPHost.cpp\n"); +#endif + + hostinfoStream << "# Netscape newshost information file." << MSG_LINEBREAK; + hostinfoStream << "# This is a generated file! Do not edit." << MSG_LINEBREAK; + hostinfoStream << "" << MSG_LINEBREAK; + hostinfoStream << "version=1" << MSG_LINEBREAK; + hostinfoStream << "newsrcname=" << (const char*)hostname << MSG_LINEBREAK; + hostinfoStream << "lastgroupdate=" << mLastGroupDate << MSG_LINEBREAK; + hostinfoStream << "firstnewdate=" << firstnewdate << MSG_LINEBREAK; + hostinfoStream << "uniqueid=" << mUniqueId << MSG_LINEBREAK; + hostinfoStream << "pushauth=" << mPushAuth << MSG_LINEBREAK; + hostinfoStream << "" << MSG_LINEBREAK; + hostinfoStream << "begingroups" << MSG_LINEBREAK; + + mGroupsOnServer.EnumerateForwards((nsCStringArrayEnumFunc)writeGroupToHostInfo, (void *)&hostinfoStream); + mHostInfoHasChanged = PR_FALSE; + + hostinfoStream.close(); return NS_OK; } @@ -728,18 +796,6 @@ nsNntpIncomingServer::LoadHostInfoFile() return NS_OK; } -PRBool -addGroup(nsCString &aElement, void *aData) -{ - nsresult rv; - nsNntpIncomingServer *server; - server = (nsNntpIncomingServer *)aData; - - rv = server->AddNewsgroupToSubscribeDS((const char *)aElement); - NS_ASSERTION(NS_SUCCEEDED(rv),"AddNewsgroupToSubscribeDS failed"); - return PR_TRUE; -} - nsresult nsNntpIncomingServer::PopulateSubscribeDatasourceFromHostInfo(nsIMsgWindow *aMsgWindow) { @@ -757,7 +813,7 @@ nsNntpIncomingServer::PopulateSubscribeDatasourceFromHostInfo(nsIMsgWindow *aMsg } NS_IMETHODIMP -nsNntpIncomingServer::PopulateSubscribeDatasource(nsIMsgWindow *aMsgWindow) +nsNntpIncomingServer::PopulateSubscribeDatasource(nsIMsgWindow *aMsgWindow, PRBool aForceToServer) { nsresult rv; @@ -768,20 +824,24 @@ nsNntpIncomingServer::PopulateSubscribeDatasource(nsIMsgWindow *aMsgWindow) if (NS_FAILED(rv)) return rv; if (!nntpService) return NS_ERROR_FAILURE; - if (!mHostInfoLoaded) { + if (!aForceToServer && !mHostInfoLoaded) { // will set mHostInfoLoaded, if we were able to load the hostinfo.dat file rv = LoadHostInfoFile(); + if (NS_FAILED(rv)) return rv; } - if (mHostInfoLoaded) { + if (!aForceToServer && mHostInfoLoaded && (mVersion == VALID_VERSION)) { rv = PopulateSubscribeDatasourceFromHostInfo(aMsgWindow); - if (NS_FAILED(rv)) return rv; + if (NS_FAILED(rv)) return rv; } else { -#ifdef DEBUG_sspitzer - printf("todo: build up the host info stuff, and set mHostInfoLoaded\n"); -#endif + // xxx todo move this somewhere else + mHostInfoHasChanged = PR_TRUE; + mVersion = 1; + mHostInfoLoaded = PR_TRUE; + mGroupsOnServer.Clear(); + rv = nntpService->BuildSubscribeDatasource(this, aMsgWindow); if (NS_FAILED(rv)) return rv; } @@ -792,9 +852,14 @@ nsNntpIncomingServer::PopulateSubscribeDatasource(nsIMsgWindow *aMsgWindow) NS_IMETHODIMP nsNntpIncomingServer::AddNewsgroupToSubscribeDS(const char *aName) { - NS_ASSERTION(mInner,"not initialized"); - if (!mInner) return NS_ERROR_FAILURE; - return AddToSubscribeDS(aName); + nsresult rv; + + // since this comes from the server, append it to the list + mGroupsOnServer.AppendCString(aName); + + rv = AddToSubscribeDS(aName); + if (NS_FAILED(rv)) return rv; + return NS_OK; } NS_IMETHODIMP @@ -960,17 +1025,14 @@ nsNntpIncomingServer::HandleLine(char* line, PRUint32 line_size) NS_ASSERTION(line, "line is null"); if (!line) return 0; + // skip blank lines and comments + if (line[0] == '#' || line[0] == '\0') return 0; + line[line_size] = 0; -#ifdef DEBUG_sspitzer_ - printf("%s",line); -#endif if (mHasSeenBeginGroups) { char *commaPos = PL_strchr(line,','); if (commaPos) *commaPos = 0; -#ifdef DEBUG_sspitzer - printf("%s\n",line); -#endif nsCString str(line); mGroupsOnServer.AppendCString(str); } @@ -979,6 +1041,21 @@ nsNntpIncomingServer::HandleLine(char* line, PRUint32 line_size) mGroupsOnServer.Clear(); mHasSeenBeginGroups = PR_TRUE; } + char*equalPos = PL_strchr(line, '='); + if (equalPos) { + *equalPos++ = '\0'; + if (PL_strcmp(line, "lastgroupdate") == 0) { + mLastGroupDate = strtol(equalPos, nsnull, 16); + } else if (PL_strcmp(line, "firstnewdate") == 0) { + mFirstNewDate = strtol(equalPos, nsnull, 16); + } else if (PL_strcmp(line, "uniqueid") == 0) { + mUniqueId = strtol(equalPos, nsnull, 16); + } else if (PL_strcmp(line, "pushauth") == 0) { + mPushAuth = strtol(equalPos, nsnull, 16); + } else if (PL_strcmp(line, "version") == 0) { + mVersion = strtol(equalPos, nsnull, 16); + } + } } return 0; diff --git a/mailnews/news/src/nsNntpIncomingServer.h b/mailnews/news/src/nsNntpIncomingServer.h index 0a798fc55841..db159266ae2e 100644 --- a/mailnews/news/src/nsNntpIncomingServer.h +++ b/mailnews/news/src/nsNntpIncomingServer.h @@ -88,6 +88,12 @@ private: PRBool mHostInfoHasChanged; nsCOMPtr mInner; nsCOMPtr mHostInfoFile; + + PRUint32 mLastGroupDate; + PRTime mFirstNewDate; + PRInt32 mUniqueId; + PRBool mPushAuth; + PRInt32 mVersion; }; #endif