Bug 56670 - add error handling ui to movemail

This is the second part of the patch for this bug.
r/sr=sspitzer@netscape.com


git-svn-id: svn://10.0.0.236/trunk@144864 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
pkw%us.ibm.com
2003-07-14 23:19:40 +00:00
parent 1b8d9669ff
commit d9499b1056
2 changed files with 142 additions and 194 deletions

View File

@@ -36,24 +36,11 @@
*
* ***** END LICENSE BLOCK ***** */
#include "prmem.h"
#include "plstr.h"
#include "prprf.h"
//#include "nsCOMPtr.h"
//#include "nsIPref.h"
#include "nsXPIDLString.h"
#include "nsMsgLocalCID.h"
#include "nsMsgFolderFlags.h"
#include "nsIFileSpec.h"
#include "nsIPref.h"
#include "nsIMsgLocalMailFolder.h"
#include "nsIMovemailService.h"
#include "msgCore.h" // pre-compiled headers
#include "nsMovemailIncomingServer.h"
@@ -70,17 +57,13 @@ NS_IMPL_ISUPPORTS_INHERITED2(nsMovemailIncomingServer,
nsMovemailIncomingServer::nsMovemailIncomingServer()
{
m_canHaveFilters = PR_TRUE;
m_canHaveFilters = PR_TRUE;
}
nsMovemailIncomingServer::~nsMovemailIncomingServer()
{
}
/*NS_IMPL_SERVERPREF_BOOL(nsMovemailIncomingServer,
AdamIsASillyhead,
"adam_is_a_sillyhead")*/
NS_IMETHODIMP
nsMovemailIncomingServer::GetIsSecureServer(PRBool *aIsSecureServer)
{
@@ -123,62 +106,64 @@ nsMovemailIncomingServer::SetFlagsOnDefaultMailboxes()
NS_IMETHODIMP nsMovemailIncomingServer::CreateDefaultMailboxes(nsIFileSpec *path)
{
nsresult rv;
PRBool exists;
if (!path) return NS_ERROR_NULL_POINTER;
nsresult rv;
PRBool exists;
if (!path) return NS_ERROR_NULL_POINTER;
rv =path->AppendRelativeUnixPath("Inbox");
rv = path->AppendRelativeUnixPath("Inbox");
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
}
}
rv =path->SetLeafName("Trash");
rv = path->SetLeafName("Trash");
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
}
}
rv = path->SetLeafName("Sent");
rv = path->SetLeafName("Sent");
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
}
}
rv = path->SetLeafName("Drafts");
rv = path->SetLeafName("Drafts");
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
}
}
rv = path->SetLeafName("Templates");
rv = path->SetLeafName("Templates");
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
}
}
rv = path->SetLeafName("Unsent Messages");
rv = path->SetLeafName("Unsent Messages");
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
rv = path->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = path->Touch();
if (NS_FAILED(rv)) return rv;
}
return rv;
}
return rv;
}

View File

@@ -73,6 +73,14 @@
#define PREF_MAIL_ROOT_MOVEMAIL "mail.root.movemail"
const char * gDefaultSpoolPaths[] = {
"/var/spool/mail/",
"/usr/spool/mail/",
"/var/mail/",
"/usr/mail/"
};
#define NUM_DEFAULT_SPOOL_PATHS (sizeof(gDefaultSpoolPaths)/sizeof(gDefaultSpoolPaths[0]))
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
nsMovemailService::nsMovemailService()
@@ -261,11 +269,19 @@ PRBool YieldSpoolLock(const char *spoolnameStr)
if (NS_FAILED(rv))
return PR_FALSE;
// Delete the file
rv = locklocfile->Remove(PR_FALSE /* non-recursive */);
// Check if the lock file exists
PRBool exists;
rv = locklocfile->Exists(&exists);
if (NS_FAILED(rv))
return PR_FALSE;
// Delete the file if it exists
if (exists) {
rv = locklocfile->Remove(PR_FALSE /* non-recursive */);
if (NS_FAILED(rv))
return PR_FALSE;
}
#ifdef MOVEMAIL_DEBUG
fprintf(stderr, " LOCK YIELDING WAS SUCCESSFUL.\n");
#endif
@@ -275,49 +291,6 @@ PRBool YieldSpoolLock(const char *spoolnameStr)
}
nsInputFileStream * Probe_SpoolFilePath(const char *pathStr,
PRBool *found_but_locked)
{
*found_but_locked = PR_FALSE;
if (!pathStr) return nsnull;
nsInputFileStream * rtnStream = nsnull;
nsFileSpec * filespec = new nsFileSpec(pathStr);
if (!filespec)
return nsnull;
if ((!filespec->Failed()) &&
filespec->IsFile()) {
#ifdef MOVEMAIL_DEBUG
fprintf(stderr, "##%s@(%s)##", filespec->GetLeafName(),
pathStr);
#endif
// before opening (or truncating) the spool file
// we need to successfully obtain its lock to ensure
// exclusive access (conforming spool-molestors allowing).
if (!ObtainSpoolLock(pathStr, 5 /* seconds of retrying */ )) {
*found_but_locked = PR_TRUE;
}
else { // got lock okay
// open the file for reading
rtnStream = new nsInputFileStream (*filespec);
if (rtnStream) {
if (rtnStream->failed() ||
!rtnStream->is_open()) {
delete rtnStream;
rtnStream = nsnull;
}
}
}
}
delete filespec;
return rtnStream;
}
nsresult
nsMovemailService::GetNewMail(nsIMsgWindow *aMsgWindow,
nsIUrlListener *aUrlListener,
@@ -339,82 +312,63 @@ nsMovemailService::GetNewMail(nsIMsgWindow *aMsgWindow,
// FUN STUFF starts here
{
// we now quest for the mail spool file...
nsInputFileStream * spoolfile = nsnull;
PRBool found_spool_but_it_is_locked = PR_FALSE;
nsFileSpec spoolFileSpec;
PRBool foundSpoolFile = PR_FALSE;
// If $(MAIL) is set then we have things easy.
char * wholeboxname_from_env = PR_GetEnv("MAIL");
if (wholeboxname_from_env) {
wholeboxname.Assign(wholeboxname_from_env);
spoolfile = Probe_SpoolFilePath(wholeboxname_from_env,
&found_spool_but_it_is_locked);
} else {
char * mailEnv = PR_GetEnv("MAIL");
char * userEnv = PR_GetEnv("USER");
if (!userEnv)
userEnv = PR_GetEnv("USERNAME");
if (mailEnv) {
wholeboxname = mailEnv;
spoolFileSpec = wholeboxname.get();
foundSpoolFile = (spoolFileSpec.Valid() && spoolFileSpec.IsFile());
} else if (userEnv) {
// Otherwise try to build the mailbox path from the
// username and a number of guessed spool directory
// paths.
char * boxfilename;
boxfilename = PR_GetEnv("USER"); // UNIXy
if (!boxfilename) {
boxfilename = PR_GetEnv("USERNAME"); // WIN32 (!)
int i;
for (i = 0; i < NUM_DEFAULT_SPOOL_PATHS && !foundSpoolFile; i++) {
wholeboxname = gDefaultSpoolPaths[i];
wholeboxname += userEnv;
spoolFileSpec = wholeboxname.get();
foundSpoolFile = (spoolFileSpec.Valid() && spoolFileSpec.IsFile());
}
}
if (boxfilename) {
// We have the username which is probably also the
// mailbox file name, so now try to find the mailbox
// in a number of likely places.
wholeboxname = "/var/spool/mail/";
wholeboxname += boxfilename;
spoolfile = Probe_SpoolFilePath(wholeboxname.get(),
&found_spool_but_it_is_locked);
if ((!spoolfile) && (!found_spool_but_it_is_locked)) {
wholeboxname = "/usr/spool/mail/";
wholeboxname += boxfilename;
spoolfile = Probe_SpoolFilePath(wholeboxname.get(),
&found_spool_but_it_is_locked);
}
if ((!spoolfile) && (!found_spool_but_it_is_locked)) {
wholeboxname = "/var/mail/";
wholeboxname += boxfilename;
spoolfile = Probe_SpoolFilePath(wholeboxname.get(),
&found_spool_but_it_is_locked);
}
if ((!spoolfile) && (!found_spool_but_it_is_locked)) {
wholeboxname = "/usr/mail/";
wholeboxname += boxfilename;
spoolfile = Probe_SpoolFilePath(wholeboxname.get(),
&found_spool_but_it_is_locked);
}
}
}
if (!spoolfile) {
#ifdef MOVEMAIL_DEBUG
fprintf(stderr,
"Nope, no luck getting spool file name at all.\n");
#endif
if (!foundSpoolFile) {
Error(MOVEMAIL_SPOOL_FILE_NOT_FOUND, nsnull, 0);
return NS_ERROR_FAILURE;
}
if (spoolfile && found_spool_but_it_is_locked) {
#ifdef MOVEMAIL_DEBUG
fprintf(stderr,
"Well, got the spool file but not the lock.\n");
#endif
nsInputFileStream spoolfile(spoolFileSpec);
if (!spoolfile.is_open() || spoolfile.failed()) {
const PRUnichar *params[] = {
NS_ConvertUTF8toUCS2(wholeboxname).get()
};
Error(MOVEMAIL_CANT_OPEN_SPOOL_FILE, params, 1);
return NS_ERROR_FAILURE;
}
// Try and obtain the lock for the spool file
if (!ObtainSpoolLock(wholeboxname.get(), 5)) {
nsAutoString lockFile = NS_ConvertUTF8toUCS2(wholeboxname);
lockFile += NS_LITERAL_STRING(".lock");
const PRUnichar *params[] = {
lockFile.get()
};
Error(MOVEMAIL_CANT_CREATE_LOCK, params, 1);
return NS_ERROR_FAILURE;
}
#define READBUFSIZE 4096
char * buffer = (char*)PR_CALLOC(READBUFSIZE);
nsParseNewMailState *newMailParser = nsnull;
if (!buffer)
rv = NS_ERROR_OUT_OF_MEMORY;
else {
nsIOFileStream* outFileStream;
nsParseNewMailState *newMailParser;
nsCOMPtr<nsIFileSpec> mailDirectory;
rv = in_server->GetLocalPath(getter_AddRefs(mailDirectory));
if (NS_FAILED(rv))
@@ -423,21 +377,17 @@ nsMovemailService::GetNewMail(nsIMsgWindow *aMsgWindow,
nsFileSpec fileSpec;
mailDirectory->GetFileSpec(&fileSpec);
fileSpec += "Inbox";
outFileStream = new nsIOFileStream(fileSpec);
if (!outFileStream) {
rv = NS_ERROR_OUT_OF_MEMORY;
goto freebuff_and_unlock;
}
outFileStream->seek(fileSpec.GetFileSize());
nsIOFileStream outFileStream(fileSpec);
outFileStream.seek(fileSpec.GetFileSize());
// create a new mail parser
newMailParser = new nsParseNewMailState;
NS_IF_ADDREF(newMailParser);
if (newMailParser == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
goto freebuff_and_unlock;
}
nsCOMPtr <nsIMsgParseMailMsgState> iParseMailMsgState = NS_STATIC_CAST(nsIMsgParseMailMsgState*, newMailParser);
nsCOMPtr <nsIFolder> serverFolder;
rv = in_server->GetRootFolder(getter_AddRefs(serverFolder));
@@ -455,7 +405,7 @@ nsMovemailService::GetNewMail(nsIMsgWindow *aMsgWindow,
if (NS_FAILED(rv))
goto freebuff_and_unlock;
rv = newMailParser->Init(serverFolder, inbox,
fileSpec, outFileStream, nsnull);
fileSpec, &outFileStream, nsnull);
if (NS_FAILED(rv))
goto freebuff_and_unlock;
@@ -465,12 +415,12 @@ nsMovemailService::GetNewMail(nsIMsgWindow *aMsgWindow,
int numlines = 0;
// main parsing loop
while (!spoolfile->eof() &&
!spoolfile->failed() &&
spoolfile->is_open())
while (!spoolfile.eof() &&
!spoolfile.failed() &&
spoolfile.is_open())
{
spoolfile->readline(buffer,
READBUFSIZE-(1+PL_strlen(MSG_LINEBREAK)));
spoolfile.readline(buffer,
READBUFSIZE-(1+PL_strlen(MSG_LINEBREAK)));
// 'From' lines delimit messages
if ((numlines>0) &&
@@ -482,7 +432,7 @@ nsMovemailService::GetNewMail(nsIMsgWindow *aMsgWindow,
// (or, alternatively, we got a 'From' line and
// then the file mysteriously ended) then abort
// parsing.
if (numlines == 0 && !*buffer && spoolfile->eof()) {
if (numlines == 0 && !*buffer && spoolfile.eof()) {
#ifdef MOVEMAIL_DEBUG
fprintf(stderr, "*** Utterly empty spool file\n");
#endif
@@ -492,21 +442,21 @@ nsMovemailService::GetNewMail(nsIMsgWindow *aMsgWindow,
PL_strcpy(&buffer[PL_strlen(buffer)], MSG_LINEBREAK);
newMailParser->HandleLine(buffer, PL_strlen(buffer));
*outFileStream << buffer;
outFileStream << buffer;
numlines++;
if (numlines == 1 && !spoolfile->eof()) {
if (numlines == 1 && !spoolfile.eof()) {
PL_strcpy(buffer, "X-Mozilla-Status: 8000"
MSG_LINEBREAK);
newMailParser->HandleLine(buffer,
PL_strlen(buffer));
*outFileStream << buffer;
outFileStream << buffer;
PL_strcpy(buffer, "X-Mozilla-Status2: 00000000"
MSG_LINEBREAK);
newMailParser->HandleLine(buffer,
PL_strlen(buffer));
*outFileStream << buffer;
outFileStream << buffer;
}
}
@@ -514,24 +464,37 @@ nsMovemailService::GetNewMail(nsIMsgWindow *aMsgWindow,
// END
outFileStream->flush(); // try this.
outFileStream.flush(); // try this.
newMailParser->OnStopRequest(nsnull, nsnull, NS_OK);
if (outFileStream->is_open())
outFileStream->close();
delete outFileStream;
outFileStream = 0;
newMailParser->SetDBFolderStream(nsnull); // stream is going away
if (outFileStream.is_open())
outFileStream.close();
// truncate the spool file here.
nsFileSpec filespecForTrunc(wholeboxname.get());
filespecForTrunc.Truncate(0);
if (spoolfile->is_open())
spoolfile->close();
delete spoolfile;
rv = filespecForTrunc.Truncate(0);
if (NS_FAILED(rv)) {
const PRUnichar *params[] = {
NS_ConvertUTF8toUCS2(wholeboxname).get()
};
Error(MOVEMAIL_CANT_TRUNCATE_SPOOL_FILE, params, 1);
}
if (spoolfile.is_open())
spoolfile.close();
}
freebuff_and_unlock:
PR_Free(buffer);
YieldSpoolLock(wholeboxname.get());
NS_IF_RELEASE(newMailParser);
if (!YieldSpoolLock(wholeboxname.get())) {
nsAutoString spoolLock = NS_ConvertUTF8toUCS2(wholeboxname);
spoolLock += NS_LITERAL_STRING(".lock");
const PRUnichar *params[] = {
spoolLock.get()
};
Error(MOVEMAIL_CANT_DELETE_LOCK, params, 1);
}
}
in_server->SetServerBusy(PR_FALSE);