More cleanup of XPPtrArray. Factored nsMsgFolder, adding nsMsgLocalMailFolder.

This commit is contained in:
warren%netscape.com 1999-02-06 02:11:54 +00:00
Родитель 7a1bff7611
Коммит d343f7cbab
16 изменённых файлов: 949 добавлений и 954 удалений

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

@ -237,15 +237,15 @@ class nsIMsgFolder : public nsISupports {
/* starting interface nsIMsgMailFolder */
/* {27D2DE40-BAF1-11d2-9578-00805F8AC615} */
#define NS_IMSGMAILFOLDER_IID_STR "27D2DE40-BAF1-11d2-9578-00805F8AC615"
#define NS_IMSGMAILFOLDER_IID \
#define NS_IMSGLOCALMAILFOLDER_IID_STR "27D2DE40-BAF1-11d2-9578-00805F8AC615"
#define NS_IMSGLOCALMAILFOLDER_IID \
{0x27D2DE40, 0xBAF1, 0x11d2, \
{ 0x95, 0x78, 0x00, 0x80, 0x5F, 0x8A, 0xC6, 0x15 }}
class nsIMsgMailFolder : public nsISupports {
class nsIMsgLocalMailFolder : public nsISupports {
public:
static const nsIID& IID() {
static nsIID iid = NS_IMSGMAILFOLDER_IID;
static nsIID iid = NS_IMSGLOCALMAILFOLDER_IID;
return iid;
}

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

@ -36,6 +36,7 @@ CPPSRCS = \
nsMsgGroupRecord.cpp \
nsMsgRFC822Parser.cpp \
nsMsgFolder.cpp \
nsMsgLocalMailFolder.cpp \
nsNewsSet.cpp \
nsMsg.cpp \
$(NULL)

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

@ -26,20 +26,24 @@ REQUIRES=xpcom js nspr
DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN
CPPSRCS= nsMsgRFC822Parser.cpp \
CPPSRCS= \
nsMsgRFC822Parser.cpp \
nsUInt32Array.cpp \
nsMsgKeyArray.cpp \
nsMsgFolder.cpp \
nsMsgLocalMailFolder.cpp \
nsMsgGroupRecord.cpp \
nsMsgRDFFolder.cpp \
nsNewsSet.cpp \
nsMsg.cpp \
$(NULL)
CPP_OBJS= .\$(OBJDIR)\nsMsgRFC822Parser.obj \
CPP_OBJS= \
.\$(OBJDIR)\nsMsgRFC822Parser.obj \
.\$(OBJDIR)\nsUInt32Array.obj \
.\$(OBJDIR)\nsMsgKeyArray.obj \
.\$(OBJDIR)\nsMsgFolder.obj \
.\$(OBJDIR)\nsMsgLocalMailFolder.obj \
.\$(OBJDIR)\nsMsgGroupRecord.obj \
.\$(OBJDIR)\nsMsgRDFFolder.obj \
.\$(OBJDIR)\nsNewsSet.obj \
@ -47,7 +51,8 @@ CPP_OBJS= .\$(OBJDIR)\nsMsgRFC822Parser.obj \
$(NULL)
EXPORTS= nsMsgRFC822Parser.h \
EXPORTS= \
nsMsgRFC822Parser.h \
nsUInt32Array.h \
nsMsgKeyArray.h \
nsNewsSet.h \

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

@ -17,9 +17,6 @@
*/
#include "nsMsgFolder.h"
#include "nsISupports.h"
#include "nsIRDFNode.h"
#include "nsIRDFResourceFactory.h"
#include "nsMsgFolderFlags.h"
#include "prprf.h"
#include "nsMsgKeyArray.h"
@ -29,11 +26,7 @@
#endif
/* use these macros to define a class IID for our component. */
static NS_DEFINE_IID(kIMsgFolderIID, NS_IMSGFOLDER_IID);
static NS_DEFINE_IID(kIMsgMailFolderIID, NS_IMSGMAILFOLDER_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIRDFResourceIID, NS_IRDFRESOURCE_IID);
static NS_DEFINE_IID(kIRDFNodeIID, NS_IRDFNODE_IID);
static NS_DEFINE_IID(kIRDFResourceFactoryIID, NS_IRDFRESOURCEFACTORY_IID);
nsMsgFolder::nsMsgFolder(const char* uri)
: nsRDFResource(PL_strdup(uri))
@ -188,7 +181,7 @@ NS_IMETHODIMP nsMsgFolder::StartAsyncCopyMessagesInto (MSG_FolderInfo *dstFolder
copyInfo->moveState.haveUploadedMessageSize = FALSE;
MsgERR openErr = eSUCCESS;
XP_Bool wasCreated;
PRBool wasCreated;
if (dstFolder->GetType() == FOLDER_MAIL)
openErr = MailDB::Open (dstFolder->GetMailFolderInfo()->GetPathname(), FALSE, &copyInfo->moveState.destDB, FALSE);
else if (dstFolder->GetType() == FOLDER_IMAPMAIL && !IsNews())
@ -273,7 +266,7 @@ NS_IMETHODIMP nsMsgFolder::CleanupCopyMessagesInto (MessageCopyInfo **info)
MSG_Pane *sourcePane = (*info)->moveState.sourcePane;
XP_Bool searchPane = sourcePane ? sourcePane->GetPaneType() == MSG_SEARCHPANE : FALSE;
PRBool searchPane = sourcePane ? sourcePane->GetPaneType() == MSG_SEARCHPANE : FALSE;
if ((*info)->moveState.destDB != NULL)
{
@ -320,7 +313,7 @@ NS_IMETHODIMP nsMsgFolder::CleanupCopyMessagesInto (MessageCopyInfo **info)
NS_IMETHODIMP nsMsgFolder::SaveMessages(nsMsgKeyArray *, const char *fileName,
MSG_Pane *pane, nsMsgDatabase *msgDB,
int (*doneCB)(void *, int status) = NULL, void *state = NULL,
XP_Bool addMozillaStatus = TRUE)
PRBool addMozillaStatus = TRUE)
{
DownloadArticlesToFolder::SaveMessages(array, fileName, pane, this, msgDB, doneCB, state, addMozillaStatus);
return NS_OK;
@ -964,7 +957,7 @@ NS_IMETHODIMP nsMsgFolder::GetTotalMessages(PRBool deep, PRUint32 *totalMessages
#endif
#ifdef HAVE_PANE
virtual void MarkAllRead(MSG_Pane *pane, XP_Bool deep);
virtual void MarkAllRead(MSG_Pane *pane, PRBool deep);
#endif
#ifdef HAVE_DB
@ -1356,7 +1349,7 @@ NS_IMETHODIMP nsMsgFolder::DownloadToTempFileAndUpload(MessageCopyInfo *copyInfo
}
NS_IMETHODIMP nsMsgFolder::UpdateMoveCopyStatus(MWContext *context, XP_Bool isMove, int32 curMsgCount, int32 totMessages)
NS_IMETHODIMP nsMsgFolder::UpdateMoveCopyStatus(MWContext *context, PRBool isMove, int32 curMsgCount, int32 totMessages)
{
}
@ -1405,722 +1398,6 @@ NS_IMETHODIMP nsMsgFolder::GetHostName(char **hostName)
return NS_OK;
}
nsMsgMailFolder::nsMsgMailFolder(const char* uri)
:nsMsgFolder(uri)
{
mHaveReadNameFromDB = PR_FALSE;
mPathName = nsnull;
}
nsMsgMailFolder::~nsMsgMailFolder()
{
}
NS_IMPL_ADDREF(nsMsgMailFolder)
NS_IMPL_RELEASE(nsMsgMailFolder)
NS_IMETHODIMP
nsMsgMailFolder::QueryInterface(REFNSIID iid, void** result)
{
if (! result)
return NS_ERROR_NULL_POINTER;
*result = nsnull;
if(iid.Equals(kIMsgMailFolderIID) ||
iid.Equals(kISupportsIID))
{
*result = NS_STATIC_CAST(nsIMsgMailFolder*, this);
AddRef();
return NS_OK;
}
return nsMsgFolder::QueryInterface(iid, result);
}
NS_IMETHODIMP nsMsgMailFolder::GetType(FolderType *type)
{
if(!type)
return NS_ERROR_NULL_POINTER;
*type = FOLDER_MAIL;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::BuildFolderURL(char **url)
{
const char *urlScheme = "mailbox:";
if(!url)
return NS_ERROR_NULL_POINTER;
*url = PR_smprintf("%s%s", urlScheme, mPathName);
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::CreateSubfolder(const char *leafNameFromUser, nsIMsgFolder **outFolder, PRUint32 *outPos)
{
#ifdef HAVE_PORT
MsgERR status = 0;
*ppOutFolder = NULL;
*pOutPos = 0;
XP_StatStruct stat;
// Only create a .sbd pathname if we're not in the root folder. The root folder
// e.g. c:\netscape\mail has to behave differently than subfolders.
if (m_depth > 1)
{
// Look around in our directory to get a subdirectory, creating it
// if necessary
XP_BZERO (&stat, sizeof(stat));
if (0 == XP_Stat (m_pathName, &stat, xpMailSubdirectory))
{
if (!S_ISDIR(stat.st_mode))
status = MK_COULD_NOT_CREATE_DIRECTORY; // a file .sbd already exists
}
else {
status = XP_MakeDirectory (m_pathName, xpMailSubdirectory);
if (status == -1)
status = MK_COULD_NOT_CREATE_DIRECTORY;
}
}
char *leafNameForDisk = CreatePlatformLeafNameForDisk(leafNameFromUser,m_master, this);
if (!leafNameForDisk)
status = MK_OUT_OF_MEMORY;
if (0 == status) //ok so far
{
// Now that we have a suitable parent directory created/identified,
// we can create the new mail folder inside the parent dir. Again,
char *newFolderPath = (char*) XP_ALLOC(XP_STRLEN(m_pathName) + XP_STRLEN(leafNameForDisk) + XP_STRLEN(".sbd/") + 1);
if (newFolderPath)
{
XP_STRCPY (newFolderPath, m_pathName);
if (m_depth == 1)
XP_STRCAT (newFolderPath, "/");
else
XP_STRCAT (newFolderPath, ".sbd/");
XP_STRCAT (newFolderPath, leafNameForDisk);
if (0 != XP_Stat (newFolderPath, &stat, xpMailFolder))
{
XP_File file = XP_FileOpen(newFolderPath, xpMailFolder, XP_FILE_WRITE_BIN);
if (file)
{
// Create an empty database for this mail folder, set its name from the user
MailDB *unusedDb = NULL;
MailDB::Open(newFolderPath, TRUE, &unusedDb, TRUE);
if (unusedDb)
{
//need to set the folder name
MSG_FolderInfoMail *newFolder = BuildFolderTree (newFolderPath, m_depth + 1, m_subFolders, m_master);
if (newFolder)
{
// so we don't show ??? in totals
newFolder->SummaryChanged();
*ppOutFolder = newFolder;
*pOutPos = m_subFolders->FindIndex (0, newFolder);
}
else
status = MK_OUT_OF_MEMORY;
unusedDb->SetFolderInfoValid(newFolderPath,0,0);
unusedDb->Close();
}
else
{
XP_FileClose(file);
file = NULL;
XP_FileRemove (newFolderPath, xpMailFolder);
status = MK_MSG_CANT_CREATE_FOLDER;
}
if (file)
{
XP_FileClose(file);
file = NULL;
}
}
else
status = MK_MSG_CANT_CREATE_FOLDER;
}
else
status = MK_MSG_FOLDER_ALREADY_EXISTS;
FREEIF(newFolderPath);
}
else
status = MK_OUT_OF_MEMORY;
}
FREEIF(leafNameForDisk);
return status;
#endif //HAVE_PORT
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::RemoveSubFolder (const nsIMsgFolder *which)
{
// Let the base class do list management
nsMsgFolder::RemoveSubFolder (which);
// Derived class is responsible for managing the subdirectory
#ifdef HAVE_PORT
if (0 == m_subFolders->GetSize())
XP_RemoveDirectory (m_pathName, xpMailSubdirectory);
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::Delete ()
{
#ifdef HAVE_PORT
nsMsgDatabase *db;
// remove the summary file
MsgERR status = CloseDatabase (m_pathName, &db);
if (0 == status)
{
if (db != NULL)
db->Close(); // decrement ref count, so it will leave cache
XP_FileRemove (m_pathName, xpMailFolderSummary);
}
if ((0 == status) && (GetType() == FOLDER_MAIL))
{
// remove the mail folder file
status = XP_FileRemove (m_pathName, xpMailFolder);
// if the delete seems to have failed, but the file doesn't
// exist, that's not really an error condition, is it now?
if (status)
{
XP_StatStruct fileStat;
if (0 == XP_Stat(m_pathName, &fileStat, xpMailFolder))
status = 0;
}
}
if (0 != status)
status = MK_UNABLE_TO_DELETE_FILE;
return status;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::Rename (const char *newName)
{
#ifdef HAVE_PORT
// change the leaf name (stored separately)
MsgERR status = MSG_FolderInfo::Rename (newUserLeafName);
if (status == 0)
{
char *baseDir = XP_STRDUP(m_pathName);
if (baseDir)
{
char *base_slash = XP_STRRCHR (baseDir, '/');
if (base_slash)
*base_slash = '\0';
}
char *leafNameForDisk = CreatePlatformLeafNameForDisk(newUserLeafName,m_master, baseDir);
if (!leafNameForDisk)
status = MK_OUT_OF_MEMORY;
if (0 == status)
{
// calculate the new path name
char *newPath = (char*) XP_ALLOC(XP_STRLEN(m_pathName) + XP_STRLEN(leafNameForDisk) + 1);
XP_STRCPY (newPath, m_pathName);
char *slash = XP_STRRCHR (newPath, '/');
if (slash)
XP_STRCPY (slash + 1, leafNameForDisk);
// rename the mail summary file, if there is one
nsMsgDatabase *db = NULL;
status = CloseDatabase (m_pathName, &db);
XP_StatStruct fileStat;
if (!XP_Stat(m_pathName, &fileStat, xpMailFolderSummary))
status = XP_FileRename(m_pathName, xpMailFolderSummary, newPath, xpMailFolderSummary);
if (0 == status)
{
if (db)
{
if (ReopenDatabase (db, newPath) == 0)
{
//need to set mailbox name
}
}
else
{
MailDB *mailDb = NULL;
MailDB::Open(newPath, TRUE, &mailDb, TRUE);
if (mailDb)
{
//need to set mailbox name
mailDb->Close();
}
}
}
// rename the mail folder file, if its local
if ((status == 0) && (GetType() == FOLDER_MAIL))
status = XP_FileRename (m_pathName, xpMailFolder, newPath, xpMailFolder);
if (status == 0)
{
// rename the subdirectory if there is one
if (m_subFolders->GetSize() > 0)
status = XP_FileRename (m_pathName, xpMailSubdirectory, newPath, xpMailSubdirectory);
// tell all our children about the new pathname
if (status == 0)
{
int startingAt = XP_STRLEN (newPath) - XP_STRLEN (leafNameForDisk) + 1; // add one for trailing '/'
status = PropagateRename (leafNameForDisk, startingAt);
}
}
}
FREEIF(baseDir);
}
return status;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::Adopt(const nsIMsgFolder *srcFolder, PRUint32 *outPos)
{
#ifdef HAVE_PORT
MsgERR err = eSUCCESS;
XP_ASSERT (srcFolder->GetType() == GetType()); // we can only adopt the same type of folder
MSG_FolderInfoMail *mailFolder = (MSG_FolderInfoMail*) srcFolder;
if (srcFolder == this)
return MK_MSG_CANT_COPY_TO_SAME_FOLDER;
if (ContainsChildNamed(mailFolder->GetName()))
return MK_MSG_FOLDER_ALREADY_EXISTS;
// If we aren't already a directory, create the directory and set the flag bits
if (0 == m_subFolders->GetSize())
{
XP_Dir dir = XP_OpenDir (m_pathName, xpMailSubdirectory);
if (dir)
XP_CloseDir (dir);
else
{
XP_MakeDirectory (m_pathName, xpMailSubdirectory);
dir = XP_OpenDir (m_pathName, xpMailSubdirectory);
if (dir)
XP_CloseDir (dir);
else
err = MK_COULD_NOT_CREATE_DIRECTORY;
}
if (eSUCCESS == err)
{
m_flags |= MSG_FOLDER_FLAG_DIRECTORY;
m_flags |= MSG_FOLDER_FLAG_ELIDED;
}
}
// Recurse the tree to adopt srcFolder's children
err = mailFolder->PropagateAdopt (m_pathName, m_depth);
// Add the folder to our tree in the right sorted position
if (eSUCCESS == err)
{
XP_ASSERT(m_subFolders->FindIndex(0, srcFolder) == -1);
*pOutPos = m_subFolders->Add (srcFolder);
}
return err;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetName(char** name)
{
if(!name)
return NS_ERROR_NULL_POINTER;
if (!mHaveReadNameFromDB)
{
if (mDepth == 1)
{
SetName("Local Mail");
mHaveReadNameFromDB = TRUE;
}
else
{
//Need to read the name from the database
}
}
*name = mName;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetPrettyName(char ** prettyName)
{
if (mDepth == 1) {
// Depth == 1 means we are on the mail server level
// override the name here to say "Local Mail"
FolderType type;
GetType(&type);
if (type == FOLDER_MAIL)
*prettyName = PL_strdup("Local Mail");
else
return nsMsgFolder::GetPrettyName(prettyName);
}
else
return nsMsgFolder::GetPrettyName(prettyName);
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GenerateUniqueSubfolderName(const char *prefix,
const nsIMsgFolder *otherFolder,
char** name)
{
if(!name)
return NS_ERROR_NULL_POINTER;
/* only try 256 times */
for (int count = 0; (count < 256); count++)
{
PRUint32 prefixSize = PL_strlen(prefix);
//allocate string big enough for prefix, 256, and '\0'
char *uniqueName = (char*)PR_MALLOC(prefixSize + 4);
PR_snprintf(uniqueName, prefixSize + 4, "%s%d",prefix,count);
PRBool containsChild;
PRBool otherContainsChild = PR_FALSE;
ContainsChildNamed(uniqueName, &containsChild);
if(otherFolder)
{
((nsIMsgFolder*)otherFolder)->ContainsChildNamed(uniqueName, &otherContainsChild);
}
if (!containsChild && !otherContainsChild)
{
*name = uniqueName;
return NS_OK;
}
else
PR_FREEIF(uniqueName);
}
*name = nsnull;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::UpdateSummaryTotals()
{
//We need to read this info from the database
// If we asked, but didn't get any, stop asking
if (mNumUnreadMessages == -1)
mNumUnreadMessages = -2;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetExpungedBytesCount(PRUint32 *count)
{
if(!count)
return NS_ERROR_NULL_POINTER;
*count = mExpungedBytes;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetDeletable (PRBool *deletable)
{
if(!deletable)
return NS_ERROR_NULL_POINTER;
// These are specified in the "Mail/News Windows" UI spec
if (mFlags & MSG_FOLDER_FLAG_TRASH)
{
PRBool moveToTrash;
GetDeleteIsMoveToTrash(&moveToTrash);
if(moveToTrash)
*deletable = PR_TRUE; // allow delete of trash if we don't use trash
}
else if (mDepth == 1)
*deletable = PR_FALSE;
else if (mFlags & MSG_FOLDER_FLAG_INBOX ||
mFlags & MSG_FOLDER_FLAG_DRAFTS ||
mFlags & MSG_FOLDER_FLAG_TRASH ||
mFlags & MSG_FOLDER_FLAG_TEMPLATES)
*deletable = PR_FALSE;
else *deletable = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetCanCreateChildren (PRBool *canCreateChildren)
{
if(!canCreateChildren)
return NS_ERROR_NULL_POINTER;
*canCreateChildren = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetCanBeRenamed (PRBool *canBeRenamed)
{
if(!canBeRenamed)
return NS_ERROR_NULL_POINTER;
// The root mail folder can't be renamed
if (mDepth < 2)
*canBeRenamed = PR_FALSE;
// Here's a weird case necessitated because we don't have a separate
// preference for any folder name except the FCC folder (Sent). Others
// are known by name, and as such, can't be renamed. I guess.
else if (mFlags & MSG_FOLDER_FLAG_TRASH ||
mFlags & MSG_FOLDER_FLAG_DRAFTS ||
mFlags & MSG_FOLDER_FLAG_QUEUE ||
mFlags & MSG_FOLDER_FLAG_INBOX ||
mFlags & MSG_FOLDER_FLAG_TEMPLATES)
*canBeRenamed = PR_FALSE;
else
*canBeRenamed = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetRequiresCleanup(PRBool *requiresCleanup)
{
#ifdef HAVE_PORT
if (m_expungedBytes > 0)
{
int32 purgeThreshhold = m_master->GetPrefs()->GetPurgeThreshhold();
XP_Bool purgePrompt = m_master->GetPrefs()->GetPurgeThreshholdEnabled();;
return (purgePrompt && m_expungedBytes / 1000L > purgeThreshhold);
}
return FALSE;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetRelativePathName (char **pathName)
{
if(!pathName)
return NS_ERROR_NULL_POINTER;
*pathName = mPathName;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetSizeOnDisk(PRUint32 size)
{
#ifdef HAVE_PORT
int32 ret = 0;
XP_StatStruct st;
if (!XP_Stat(GetPathname(), &st, xpMailFolder))
ret += st.st_size;
if (!XP_Stat(GetPathname(), &st, xpMailFolderSummary))
ret += st.st_size;
return ret;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetUserName(char** userName)
{
#ifdef HAVE_PORT
return NET_GetPopUsername();
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetHostName(char** hostName)
{
#ifdef HAVE_PORT
XP_Bool serverIsIMAP = m_master->GetPrefs()->GetMailServerIsIMAP4();
if (serverIsIMAP)
{
MSG_IMAPHost *defaultIMAPHost = m_master->GetIMAPHostTable()->GetDefaultHost();
return (defaultIMAPHost) ? defaultIMAPHost->GetHostName() : 0;
}
else
return m_master->GetPrefs()->GetPopHost();
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::UserNeedsToAuthenticateForFolder(PRBool displayOnly, PRBool *authenticate)
{
#ifdef HAVE_PORT
XP_Bool ret = FALSE;
if (m_master->IsCachePasswordProtected() && !m_master->IsUserAuthenticated() && !m_master->AreLocalFoldersAuthenticated())
{
char *savedPassword = GetRememberedPassword();
if (savedPassword && XP_STRLEN(savedPassword))
ret = TRUE;
FREEIF(savedPassword);
}
return ret;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::RememberPassword(const char *password)
{
#ifdef HAVE_DB
MailDB *mailDb = NULL;
MailDB::Open(m_pathName, TRUE, &mailDb);
if (mailDb)
{
mailDb->SetCachedPassword(password);
mailDb->Close();
}
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetRememberedPassword(char ** password)
{
#ifdef HAVE_PORT
XP_Bool serverIsIMAP = m_master->GetPrefs()->GetMailServerIsIMAP4();
char *savedPassword = NULL;
if (serverIsIMAP)
{
MSG_IMAPHost *defaultIMAPHost = m_master->GetIMAPHostTable()->GetDefaultHost();
if (defaultIMAPHost)
{
MSG_FolderInfo *hostFolderInfo = defaultIMAPHost->GetHostFolderInfo();
MSG_FolderInfo *defaultHostIMAPInbox = NULL;
if (hostFolderInfo->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, &defaultHostIMAPInbox, 1) == 1
&& defaultHostIMAPInbox != NULL)
{
savedPassword = defaultHostIMAPInbox->GetRememberedPassword();
}
}
}
else
{
MSG_FolderInfo *offlineInbox = NULL;
if (m_flags & MSG_FOLDER_FLAG_INBOX)
{
char *retPassword = NULL;
MailDB *mailDb = NULL;
MailDB::Open(m_pathName, FALSE, &mailDb, FALSE);
if (mailDb)
{
mailDb->GetCachedPassword(cachedPassword);
retPassword = XP_STRDUP(cachedPassword);
mailDb->Close();
}
return retPassword;
}
if (m_master->GetLocalMailFolderTree()->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, &offlineInbox, 1) && offlineInbox)
savedPassword = offlineInbox->GetRememberedPassword();
}
return savedPassword;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::GetPathName(char * *aPathName)
{
if(!aPathName)
return NS_ERROR_NULL_POINTER;
if(mPathName)
*aPathName = PL_strdup(mPathName);
else
*aPathName = nsnull;
return NS_OK;
}
NS_IMETHODIMP nsMsgMailFolder::SetPathName(char * aPathName)
{
if(mPathName)
PR_FREEIF(mPathName);
if(aPathName)
mPathName = PL_strdup(aPathName);
else
mPathName = nsnull;
return NS_OK;
}
/**
* This class creates resources for message folder URIs. It should be
* registered for the "mailnewsfolder:" prefix.
*/
class nsMsgFolderResourceFactoryImpl : public nsIRDFResourceFactory
{
public:
nsMsgFolderResourceFactoryImpl(void);
virtual ~nsMsgFolderResourceFactoryImpl(void);
NS_DECL_ISUPPORTS
NS_IMETHOD CreateResource(const char* aURI, nsIRDFResource** aResult);
};
nsMsgFolderResourceFactoryImpl::nsMsgFolderResourceFactoryImpl(void)
{
NS_INIT_REFCNT();
}
nsMsgFolderResourceFactoryImpl::~nsMsgFolderResourceFactoryImpl(void)
{
}
NS_IMPL_ISUPPORTS(nsMsgFolderResourceFactoryImpl, kIRDFResourceFactoryIID);
NS_IMETHODIMP
nsMsgFolderResourceFactoryImpl::CreateResource(const char* aURI, nsIRDFResource** aResult)
{
if (! aResult)
return NS_ERROR_NULL_POINTER;
nsMsgMailFolder *folder = new nsMsgMailFolder(aURI);
if (! folder)
return NS_ERROR_OUT_OF_MEMORY;
folder->QueryInterface(kIRDFResourceIID, (void**)aResult);
return NS_OK;
}
nsresult
NS_NewRDFMsgFolderResourceFactory(nsIRDFResourceFactory** aResult)
{
if (! aResult)
return NS_ERROR_NULL_POINTER;
nsMsgFolderResourceFactoryImpl* factory =
new nsMsgFolderResourceFactoryImpl();
if (! factory)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(factory);
*aResult = factory;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
// Accessing Messages:
@ -2166,4 +1443,3 @@ nsMsgFolder::RemoveMessage(const nsIMsg *msg)
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////

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

@ -305,81 +305,4 @@ protected:
};
class nsMsgMailFolder : public nsMsgFolder, public nsIMsgMailFolder
{
public:
nsMsgMailFolder(const char* uri);
~nsMsgMailFolder();
NS_IMETHOD QueryInterface(REFNSIID aIID,
void** aInstancePtr);
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
NS_IMETHOD GetType(FolderType *type);
#ifdef HAVE_DB
virtual MsgERR BeginCopyingMessages (MSG_FolderInfo *dstFolder,
nsMsgDatabase *sourceDB,
nsMsgKeyArray *srcArray,
MSG_UrlQueue *urlQueue,
int32 srcCount,
MessageCopyInfo *copyInfo);
virtual int FinishCopyingMessages (MWContext *context,
MSG_FolderInfo * srcFolder,
MSG_FolderInfo *dstFolder,
nsMsgDatabase *sourceDB,
nsMsgKeyArray **ppSrcArray,
int32 srcCount,
msg_move_state *state);
#endif
NS_IMETHOD CreateSubfolder(const char *leafNameFromUser, nsIMsgFolder **outFolder, PRUint32 *outPos);
NS_IMETHOD RemoveSubFolder (const nsIMsgFolder *which);
NS_IMETHOD Delete ();
NS_IMETHOD Rename (const char *newName);
NS_IMETHOD Adopt(const nsIMsgFolder *srcFolder, PRUint32 *outPos);
// this override pulls the value from the db
NS_IMETHOD GetName(char** name); // Name of this folder (as presented to user).
NS_IMETHOD GetPrettyName(char ** prettyName); // Override of the base, for top-level mail folder
NS_IMETHOD BuildFolderURL(char **url);
NS_IMETHOD GenerateUniqueSubfolderName(const char *prefix, const nsIMsgFolder *otherFolder, char** name);
NS_IMETHOD UpdateSummaryTotals() ;
NS_IMETHOD GetExpungedBytesCount(PRUint32 *count);
NS_IMETHOD GetDeletable (PRBool *deletable);
NS_IMETHOD GetCanCreateChildren (PRBool *canCreateChildren) ;
NS_IMETHOD GetCanBeRenamed (PRBool *canBeRenamed);
NS_IMETHOD GetRequiresCleanup(PRBool *requiresCleanup);
NS_IMETHOD GetRelativePathName (char **pathName);
NS_IMETHOD GetSizeOnDisk(PRUint32 size);
NS_IMETHOD GetUserName(char** userName);
NS_IMETHOD GetHostName(char** hostName);
NS_IMETHOD UserNeedsToAuthenticateForFolder(PRBool displayOnly, PRBool *authenticate);
NS_IMETHOD RememberPassword(const char *password);
NS_IMETHOD GetRememberedPassword(char ** password);
//nsIMsgMailFolder
NS_IMETHOD GetPathName(char * *aPathName);
NS_IMETHOD SetPathName(char * aPathName);
protected:
char* mPathName;
PRUint32 mExpungedBytes;
PRBool mHaveReadNameFromDB;
PRBool mGettingMail;
};
#endif

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

@ -0,0 +1,682 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsMsgLocalMailFolder.h"
#include "nsMsgFolderFlags.h"
#include "prprf.h"
static NS_DEFINE_IID(kIMsgLocalMailFolderIID, NS_IMSGLOCALMAILFOLDER_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
nsMsgLocalMailFolder::nsMsgLocalMailFolder(const char* uri)
:nsMsgFolder(uri)
{
mHaveReadNameFromDB = PR_FALSE;
mPathName = nsnull;
}
nsMsgLocalMailFolder::~nsMsgLocalMailFolder()
{
}
NS_IMPL_ADDREF(nsMsgLocalMailFolder)
NS_IMPL_RELEASE(nsMsgLocalMailFolder)
NS_IMETHODIMP
nsMsgLocalMailFolder::QueryInterface(REFNSIID iid, void** result)
{
if (! result)
return NS_ERROR_NULL_POINTER;
*result = nsnull;
if (iid.Equals(kIMsgLocalMailFolderIID) ||
iid.Equals(kISupportsIID))
{
*result = NS_STATIC_CAST(nsIMsgLocalMailFolder*, this);
AddRef();
return NS_OK;
}
return nsMsgFolder::QueryInterface(iid, result);
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetType(FolderType *type)
{
if(!type)
return NS_ERROR_NULL_POINTER;
*type = FOLDER_MAIL;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::BuildFolderURL(char **url)
{
const char *urlScheme = "mailbox:";
if(!url)
return NS_ERROR_NULL_POINTER;
*url = PR_smprintf("%s%s", urlScheme, mPathName);
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::CreateSubfolder(const char *leafNameFromUser, nsIMsgFolder **outFolder, PRUint32 *outPos)
{
#ifdef HAVE_PORT
MsgERR status = 0;
*ppOutFolder = NULL;
*pOutPos = 0;
XP_StatStruct stat;
// Only create a .sbd pathname if we're not in the root folder. The root folder
// e.g. c:\netscape\mail has to behave differently than subfolders.
if (m_depth > 1)
{
// Look around in our directory to get a subdirectory, creating it
// if necessary
XP_BZERO (&stat, sizeof(stat));
if (0 == XP_Stat (m_pathName, &stat, xpMailSubdirectory))
{
if (!S_ISDIR(stat.st_mode))
status = MK_COULD_NOT_CREATE_DIRECTORY; // a file .sbd already exists
}
else {
status = XP_MakeDirectory (m_pathName, xpMailSubdirectory);
if (status == -1)
status = MK_COULD_NOT_CREATE_DIRECTORY;
}
}
char *leafNameForDisk = CreatePlatformLeafNameForDisk(leafNameFromUser,m_master, this);
if (!leafNameForDisk)
status = MK_OUT_OF_MEMORY;
if (0 == status) //ok so far
{
// Now that we have a suitable parent directory created/identified,
// we can create the new mail folder inside the parent dir. Again,
char *newFolderPath = (char*) XP_ALLOC(XP_STRLEN(m_pathName) + XP_STRLEN(leafNameForDisk) + XP_STRLEN(".sbd/") + 1);
if (newFolderPath)
{
XP_STRCPY (newFolderPath, m_pathName);
if (m_depth == 1)
XP_STRCAT (newFolderPath, "/");
else
XP_STRCAT (newFolderPath, ".sbd/");
XP_STRCAT (newFolderPath, leafNameForDisk);
if (0 != XP_Stat (newFolderPath, &stat, xpMailFolder))
{
XP_File file = XP_FileOpen(newFolderPath, xpMailFolder, XP_FILE_WRITE_BIN);
if (file)
{
// Create an empty database for this mail folder, set its name from the user
MailDB *unusedDb = NULL;
MailDB::Open(newFolderPath, TRUE, &unusedDb, TRUE);
if (unusedDb)
{
//need to set the folder name
MSG_FolderInfoMail *newFolder = BuildFolderTree (newFolderPath, m_depth + 1, m_subFolders, m_master);
if (newFolder)
{
// so we don't show ??? in totals
newFolder->SummaryChanged();
*ppOutFolder = newFolder;
*pOutPos = m_subFolders->FindIndex (0, newFolder);
}
else
status = MK_OUT_OF_MEMORY;
unusedDb->SetFolderInfoValid(newFolderPath,0,0);
unusedDb->Close();
}
else
{
XP_FileClose(file);
file = NULL;
XP_FileRemove (newFolderPath, xpMailFolder);
status = MK_MSG_CANT_CREATE_FOLDER;
}
if (file)
{
XP_FileClose(file);
file = NULL;
}
}
else
status = MK_MSG_CANT_CREATE_FOLDER;
}
else
status = MK_MSG_FOLDER_ALREADY_EXISTS;
FREEIF(newFolderPath);
}
else
status = MK_OUT_OF_MEMORY;
}
FREEIF(leafNameForDisk);
return status;
#endif //HAVE_PORT
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::RemoveSubFolder (const nsIMsgFolder *which)
{
// Let the base class do list management
nsMsgFolder::RemoveSubFolder (which);
// Derived class is responsible for managing the subdirectory
#ifdef HAVE_PORT
if (0 == m_subFolders->GetSize())
XP_RemoveDirectory (m_pathName, xpMailSubdirectory);
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::Delete ()
{
#ifdef HAVE_PORT
nsMsgDatabase *db;
// remove the summary file
MsgERR status = CloseDatabase (m_pathName, &db);
if (0 == status)
{
if (db != NULL)
db->Close(); // decrement ref count, so it will leave cache
XP_FileRemove (m_pathName, xpMailFolderSummary);
}
if ((0 == status) && (GetType() == FOLDER_MAIL))
{
// remove the mail folder file
status = XP_FileRemove (m_pathName, xpMailFolder);
// if the delete seems to have failed, but the file doesn't
// exist, that's not really an error condition, is it now?
if (status)
{
XP_StatStruct fileStat;
if (0 == XP_Stat(m_pathName, &fileStat, xpMailFolder))
status = 0;
}
}
if (0 != status)
status = MK_UNABLE_TO_DELETE_FILE;
return status;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::Rename (const char *newName)
{
#ifdef HAVE_PORT
// change the leaf name (stored separately)
MsgERR status = MSG_FolderInfo::Rename (newUserLeafName);
if (status == 0)
{
char *baseDir = XP_STRDUP(m_pathName);
if (baseDir)
{
char *base_slash = XP_STRRCHR (baseDir, '/');
if (base_slash)
*base_slash = '\0';
}
char *leafNameForDisk = CreatePlatformLeafNameForDisk(newUserLeafName,m_master, baseDir);
if (!leafNameForDisk)
status = MK_OUT_OF_MEMORY;
if (0 == status)
{
// calculate the new path name
char *newPath = (char*) XP_ALLOC(XP_STRLEN(m_pathName) + XP_STRLEN(leafNameForDisk) + 1);
XP_STRCPY (newPath, m_pathName);
char *slash = XP_STRRCHR (newPath, '/');
if (slash)
XP_STRCPY (slash + 1, leafNameForDisk);
// rename the mail summary file, if there is one
nsMsgDatabase *db = NULL;
status = CloseDatabase (m_pathName, &db);
XP_StatStruct fileStat;
if (!XP_Stat(m_pathName, &fileStat, xpMailFolderSummary))
status = XP_FileRename(m_pathName, xpMailFolderSummary, newPath, xpMailFolderSummary);
if (0 == status)
{
if (db)
{
if (ReopenDatabase (db, newPath) == 0)
{
//need to set mailbox name
}
}
else
{
MailDB *mailDb = NULL;
MailDB::Open(newPath, TRUE, &mailDb, TRUE);
if (mailDb)
{
//need to set mailbox name
mailDb->Close();
}
}
}
// rename the mail folder file, if its local
if ((status == 0) && (GetType() == FOLDER_MAIL))
status = XP_FileRename (m_pathName, xpMailFolder, newPath, xpMailFolder);
if (status == 0)
{
// rename the subdirectory if there is one
if (m_subFolders->GetSize() > 0)
status = XP_FileRename (m_pathName, xpMailSubdirectory, newPath, xpMailSubdirectory);
// tell all our children about the new pathname
if (status == 0)
{
int startingAt = XP_STRLEN (newPath) - XP_STRLEN (leafNameForDisk) + 1; // add one for trailing '/'
status = PropagateRename (leafNameForDisk, startingAt);
}
}
}
FREEIF(baseDir);
}
return status;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::Adopt(const nsIMsgFolder *srcFolder, PRUint32 *outPos)
{
#ifdef HAVE_PORT
MsgERR err = eSUCCESS;
XP_ASSERT (srcFolder->GetType() == GetType()); // we can only adopt the same type of folder
MSG_FolderInfoMail *mailFolder = (MSG_FolderInfoMail*) srcFolder;
if (srcFolder == this)
return MK_MSG_CANT_COPY_TO_SAME_FOLDER;
if (ContainsChildNamed(mailFolder->GetName()))
return MK_MSG_FOLDER_ALREADY_EXISTS;
// If we aren't already a directory, create the directory and set the flag bits
if (0 == m_subFolders->GetSize())
{
XP_Dir dir = XP_OpenDir (m_pathName, xpMailSubdirectory);
if (dir)
XP_CloseDir (dir);
else
{
XP_MakeDirectory (m_pathName, xpMailSubdirectory);
dir = XP_OpenDir (m_pathName, xpMailSubdirectory);
if (dir)
XP_CloseDir (dir);
else
err = MK_COULD_NOT_CREATE_DIRECTORY;
}
if (eSUCCESS == err)
{
m_flags |= MSG_FOLDER_FLAG_DIRECTORY;
m_flags |= MSG_FOLDER_FLAG_ELIDED;
}
}
// Recurse the tree to adopt srcFolder's children
err = mailFolder->PropagateAdopt (m_pathName, m_depth);
// Add the folder to our tree in the right sorted position
if (eSUCCESS == err)
{
XP_ASSERT(m_subFolders->FindIndex(0, srcFolder) == -1);
*pOutPos = m_subFolders->Add (srcFolder);
}
return err;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetName(char** name)
{
if(!name)
return NS_ERROR_NULL_POINTER;
if (!mHaveReadNameFromDB)
{
if (mDepth == 1)
{
SetName("Local Mail");
mHaveReadNameFromDB = TRUE;
}
else
{
//Need to read the name from the database
}
}
*name = mName;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetPrettyName(char ** prettyName)
{
if (mDepth == 1) {
// Depth == 1 means we are on the mail server level
// override the name here to say "Local Mail"
FolderType type;
GetType(&type);
if (type == FOLDER_MAIL)
*prettyName = PL_strdup("Local Mail");
else
return nsMsgFolder::GetPrettyName(prettyName);
}
else
return nsMsgFolder::GetPrettyName(prettyName);
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GenerateUniqueSubfolderName(const char *prefix,
const nsIMsgFolder *otherFolder,
char** name)
{
if(!name)
return NS_ERROR_NULL_POINTER;
/* only try 256 times */
for (int count = 0; (count < 256); count++)
{
PRUint32 prefixSize = PL_strlen(prefix);
//allocate string big enough for prefix, 256, and '\0'
char *uniqueName = (char*)PR_MALLOC(prefixSize + 4);
PR_snprintf(uniqueName, prefixSize + 4, "%s%d",prefix,count);
PRBool containsChild;
PRBool otherContainsChild = PR_FALSE;
ContainsChildNamed(uniqueName, &containsChild);
if(otherFolder)
{
((nsIMsgFolder*)otherFolder)->ContainsChildNamed(uniqueName, &otherContainsChild);
}
if (!containsChild && !otherContainsChild)
{
*name = uniqueName;
return NS_OK;
}
else
PR_FREEIF(uniqueName);
}
*name = nsnull;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::UpdateSummaryTotals()
{
//We need to read this info from the database
// If we asked, but didn't get any, stop asking
if (mNumUnreadMessages == -1)
mNumUnreadMessages = -2;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetExpungedBytesCount(PRUint32 *count)
{
if(!count)
return NS_ERROR_NULL_POINTER;
*count = mExpungedBytes;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetDeletable (PRBool *deletable)
{
if(!deletable)
return NS_ERROR_NULL_POINTER;
// These are specified in the "Mail/News Windows" UI spec
if (mFlags & MSG_FOLDER_FLAG_TRASH)
{
PRBool moveToTrash;
GetDeleteIsMoveToTrash(&moveToTrash);
if(moveToTrash)
*deletable = PR_TRUE; // allow delete of trash if we don't use trash
}
else if (mDepth == 1)
*deletable = PR_FALSE;
else if (mFlags & MSG_FOLDER_FLAG_INBOX ||
mFlags & MSG_FOLDER_FLAG_DRAFTS ||
mFlags & MSG_FOLDER_FLAG_TRASH ||
mFlags & MSG_FOLDER_FLAG_TEMPLATES)
*deletable = PR_FALSE;
else *deletable = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetCanCreateChildren (PRBool *canCreateChildren)
{
if(!canCreateChildren)
return NS_ERROR_NULL_POINTER;
*canCreateChildren = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetCanBeRenamed (PRBool *canBeRenamed)
{
if(!canBeRenamed)
return NS_ERROR_NULL_POINTER;
// The root mail folder can't be renamed
if (mDepth < 2)
*canBeRenamed = PR_FALSE;
// Here's a weird case necessitated because we don't have a separate
// preference for any folder name except the FCC folder (Sent). Others
// are known by name, and as such, can't be renamed. I guess.
else if (mFlags & MSG_FOLDER_FLAG_TRASH ||
mFlags & MSG_FOLDER_FLAG_DRAFTS ||
mFlags & MSG_FOLDER_FLAG_QUEUE ||
mFlags & MSG_FOLDER_FLAG_INBOX ||
mFlags & MSG_FOLDER_FLAG_TEMPLATES)
*canBeRenamed = PR_FALSE;
else
*canBeRenamed = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetRequiresCleanup(PRBool *requiresCleanup)
{
#ifdef HAVE_PORT
if (m_expungedBytes > 0)
{
int32 purgeThreshhold = m_master->GetPrefs()->GetPurgeThreshhold();
PRBool purgePrompt = m_master->GetPrefs()->GetPurgeThreshholdEnabled();;
return (purgePrompt && m_expungedBytes / 1000L > purgeThreshhold);
}
return FALSE;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetRelativePathName (char **pathName)
{
if(!pathName)
return NS_ERROR_NULL_POINTER;
*pathName = mPathName;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetSizeOnDisk(PRUint32 size)
{
#ifdef HAVE_PORT
int32 ret = 0;
XP_StatStruct st;
if (!XP_Stat(GetPathname(), &st, xpMailFolder))
ret += st.st_size;
if (!XP_Stat(GetPathname(), &st, xpMailFolderSummary))
ret += st.st_size;
return ret;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetUserName(char** userName)
{
#ifdef HAVE_PORT
return NET_GetPopUsername();
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetHostName(char** hostName)
{
#ifdef HAVE_PORT
PRBool serverIsIMAP = m_master->GetPrefs()->GetMailServerIsIMAP4();
if (serverIsIMAP)
{
MSG_IMAPHost *defaultIMAPHost = m_master->GetIMAPHostTable()->GetDefaultHost();
return (defaultIMAPHost) ? defaultIMAPHost->GetHostName() : 0;
}
else
return m_master->GetPrefs()->GetPopHost();
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::UserNeedsToAuthenticateForFolder(PRBool displayOnly, PRBool *authenticate)
{
#ifdef HAVE_PORT
PRBool ret = FALSE;
if (m_master->IsCachePasswordProtected() && !m_master->IsUserAuthenticated() && !m_master->AreLocalFoldersAuthenticated())
{
char *savedPassword = GetRememberedPassword();
if (savedPassword && XP_STRLEN(savedPassword))
ret = TRUE;
FREEIF(savedPassword);
}
return ret;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::RememberPassword(const char *password)
{
#ifdef HAVE_DB
MailDB *mailDb = NULL;
MailDB::Open(m_pathName, TRUE, &mailDb);
if (mailDb)
{
mailDb->SetCachedPassword(password);
mailDb->Close();
}
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetRememberedPassword(char ** password)
{
#ifdef HAVE_PORT
PRBool serverIsIMAP = m_master->GetPrefs()->GetMailServerIsIMAP4();
char *savedPassword = NULL;
if (serverIsIMAP)
{
MSG_IMAPHost *defaultIMAPHost = m_master->GetIMAPHostTable()->GetDefaultHost();
if (defaultIMAPHost)
{
MSG_FolderInfo *hostFolderInfo = defaultIMAPHost->GetHostFolderInfo();
MSG_FolderInfo *defaultHostIMAPInbox = NULL;
if (hostFolderInfo->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, &defaultHostIMAPInbox, 1) == 1
&& defaultHostIMAPInbox != NULL)
{
savedPassword = defaultHostIMAPInbox->GetRememberedPassword();
}
}
}
else
{
MSG_FolderInfo *offlineInbox = NULL;
if (m_flags & MSG_FOLDER_FLAG_INBOX)
{
char *retPassword = NULL;
MailDB *mailDb = NULL;
MailDB::Open(m_pathName, FALSE, &mailDb, FALSE);
if (mailDb)
{
mailDb->GetCachedPassword(cachedPassword);
retPassword = XP_STRDUP(cachedPassword);
mailDb->Close();
}
return retPassword;
}
if (m_master->GetLocalMailFolderTree()->GetFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, &offlineInbox, 1) && offlineInbox)
savedPassword = offlineInbox->GetRememberedPassword();
}
return savedPassword;
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::GetPathName(char * *aPathName)
{
if(!aPathName)
return NS_ERROR_NULL_POINTER;
if(mPathName)
*aPathName = PL_strdup(mPathName);
else
*aPathName = nsnull;
return NS_OK;
}
NS_IMETHODIMP nsMsgLocalMailFolder::SetPathName(char * aPathName)
{
if(mPathName)
PR_FREEIF(mPathName);
if(aPathName)
mPathName = PL_strdup(aPathName);
else
mPathName = nsnull;
return NS_OK;
}

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

@ -0,0 +1,107 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/********************************************************************************************************
Interface for representing Messenger folders.
*********************************************************************************************************/
#ifndef nsMsgLocalMailFolder_h__
#define nsMsgLocalMailFolder_h__
#include "nsMsgFolder.h" /* include the interface we are going to support */
class nsMsgLocalMailFolder : public nsMsgFolder, public nsIMsgLocalMailFolder
{
public:
nsMsgLocalMailFolder(const char* uri);
~nsMsgLocalMailFolder();
NS_IMETHOD QueryInterface(REFNSIID aIID,
void** aInstancePtr);
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
NS_IMETHOD GetType(FolderType *type);
#ifdef HAVE_DB
virtual MsgERR BeginCopyingMessages (MSG_FolderInfo *dstFolder,
MessageDB *sourceDB,
IDArray *srcArray,
MSG_UrlQueue *urlQueue,
int32 srcCount,
MessageCopyInfo *copyInfo);
virtual int FinishCopyingMessages (MWContext *context,
MSG_FolderInfo * srcFolder,
MSG_FolderInfo *dstFolder,
MessageDB *sourceDB,
IDArray **ppSrcArray,
int32 srcCount,
msg_move_state *state);
#endif
NS_IMETHOD CreateSubfolder(const char *leafNameFromUser, nsIMsgFolder **outFolder, PRUint32 *outPos);
NS_IMETHOD RemoveSubFolder (const nsIMsgFolder *which);
NS_IMETHOD Delete ();
NS_IMETHOD Rename (const char *newName);
NS_IMETHOD Adopt(const nsIMsgFolder *srcFolder, PRUint32 *outPos);
// this override pulls the value from the db
NS_IMETHOD GetName(char** name); // Name of this folder (as presented to user).
NS_IMETHOD GetPrettyName(char ** prettyName); // Override of the base, for top-level mail folder
NS_IMETHOD BuildFolderURL(char **url);
NS_IMETHOD GenerateUniqueSubfolderName(const char *prefix, const nsIMsgFolder *otherFolder, char** name);
NS_IMETHOD UpdateSummaryTotals() ;
NS_IMETHOD GetExpungedBytesCount(PRUint32 *count);
NS_IMETHOD GetDeletable (PRBool *deletable);
NS_IMETHOD GetCanCreateChildren (PRBool *canCreateChildren) ;
NS_IMETHOD GetCanBeRenamed (PRBool *canBeRenamed);
NS_IMETHOD GetRequiresCleanup(PRBool *requiresCleanup);
NS_IMETHOD GetRelativePathName (char **pathName);
NS_IMETHOD GetSizeOnDisk(PRUint32 size);
NS_IMETHOD GetUserName(char** userName);
NS_IMETHOD GetHostName(char** hostName);
NS_IMETHOD UserNeedsToAuthenticateForFolder(PRBool displayOnly, PRBool *authenticate);
NS_IMETHOD RememberPassword(const char *password);
NS_IMETHOD GetRememberedPassword(char ** password);
//nsIMsgMailFolder
NS_IMETHOD GetPathName(char * *aPathName);
NS_IMETHOD SetPathName(char * aPathName);
protected:
char* mPathName;
PRUint32 mExpungedBytes;
PRBool mHaveReadNameFromDB;
PRBool mGettingMail;
};
#endif // nsMsgLocalMailFolder_h__

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

@ -20,7 +20,7 @@
#include "nsMsgHdr.h"
#include "nsMsgPtrArray.h" // for XPPtrArray
#include "nsVoidArray.h"
#include "nsString.h"
#include "nsFileSpec.h"
#include "nsIDBChangeListener.h"
@ -31,7 +31,7 @@ class nsDBFolderInfo;
class nsMsgKeyArray;
class nsNewsSet;
class nsDBChangeAnnouncer : public XPPtrArray // array of ChangeListeners
class nsDBChangeAnnouncer : public nsVoidArray // array of ChangeListeners
{
public:
nsDBChangeAnnouncer();
@ -47,14 +47,14 @@ public:
// used to cache open db's.
class nsMsgDatabaseArray : public XPPtrArray
class nsMsgDatabaseArray : public nsVoidArray
{
public:
nsMsgDatabaseArray();
// overrides with proper types to avoid casting
nsMsgDatabase* GetAt(int nIndex) const {return((nsMsgDatabase*)XPPtrArray::GetAt(nIndex));}
void* operator[](int nIndex) const {return((nsMsgDatabase*)XPPtrArray::operator[](nIndex));}
nsMsgDatabase* GetAt(int nIndex) const {return((nsMsgDatabase*)nsVoidArray::ElementAt(nIndex));}
void* operator[](int nIndex) const {return((nsMsgDatabase*)nsVoidArray::operator[](nIndex));}
};
// This is to be used as an interchange object, to make creating nsMsgHeaders easier.
@ -142,7 +142,7 @@ public:
static void CleanupCache();
#ifdef DEBUG
static int GetNumInCache(void) {return(GetDBCache()->GetSize());}
static int GetNumInCache(void) {return(GetDBCache()->Count());}
static void DumpCache();
#endif
protected:
@ -157,7 +157,7 @@ protected:
nsrefcnt mRefCnt;
static void AddToCache(nsMsgDatabase* pMessageDB)
{GetDBCache()->Add(pMessageDB);}
{GetDBCache()->AppendElement(pMessageDB);}
static void RemoveFromCache(nsMsgDatabase* pMessageDB);
static int FindInCache(nsMsgDatabase* pMessageDB);
PRBool MatchDbName(nsFilePath &dbName); // returns TRUE if they match

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

@ -118,7 +118,7 @@ nsMailDatabase::~nsMailDatabase()
if (err == NS_OK || err == NS_MSG_ERROR_FOLDER_SUMMARY_MISSING)
{
*pMessageDB = mailDB;
GetDBCache()->Add(mailDB);
GetDBCache()->AppendElement(mailDB);
// if (err == NS_OK)
// mailDB->HandleLatered();

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

@ -64,7 +64,7 @@ nsMsgDatabase::CleanupCache()
{
if (m_dbCache) // clean up memory leak
{
for (int i = 0; i < GetDBCache()->GetSize(); i++)
for (int i = 0; i < GetDBCache()->Count(); i++)
{
nsMsgDatabase* pMessageDB = GetDBCache()->GetAt(i);
if (pMessageDB)
@ -89,7 +89,7 @@ nsMsgDatabase::CleanupCache()
//----------------------------------------------------------------------
nsMsgDatabase* nsMsgDatabase::FindInCache(nsFilePath &dbName)
{
for (int i = 0; i < GetDBCache()->GetSize(); i++)
for (int i = 0; i < GetDBCache()->Count(); i++)
{
nsMsgDatabase* pMessageDB = GetDBCache()->GetAt(i);
if (pMessageDB->MatchDbName(dbName))
@ -105,7 +105,7 @@ nsMsgDatabase* nsMsgDatabase::FindInCache(nsFilePath &dbName)
//----------------------------------------------------------------------
int nsMsgDatabase::FindInCache(nsMsgDatabase* pMessageDB)
{
for (int i = 0; i < GetDBCache()->GetSize(); i++)
for (int i = 0; i < GetDBCache()->Count(); i++)
{
if (GetDBCache()->GetAt(i) == pMessageDB)
{
@ -129,7 +129,7 @@ void nsMsgDatabase::RemoveFromCache(nsMsgDatabase* pMessageDB)
int i = FindInCache(pMessageDB);
if (i != -1)
{
GetDBCache()->RemoveAt(i);
GetDBCache()->RemoveElementAt(i);
}
}
@ -137,7 +137,7 @@ void nsMsgDatabase::RemoveFromCache(nsMsgDatabase* pMessageDB)
#ifdef DEBUG
void nsMsgDatabase::DumpCache()
{
for (int i = 0; i < GetDBCache()->GetSize(); i++)
for (int i = 0; i < GetDBCache()->Count(); i++)
{
#ifdef DEBUG_bienvenu
nsMsgDatabase* pMessageDB =

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

@ -42,7 +42,7 @@ static NS_DEFINE_IID(kIRDFResourceFactoryIID, NS_IRDFRESOURCEFACTORY_IID);
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
static NS_DEFINE_CID(kRDFInMemoryDataSourceCID, NS_RDFINMEMORYDATASOURCE_CID);
static NS_DEFINE_IID(kIMsgFolderIID, NS_IMSGFOLDER_IID);
static NS_DEFINE_IID(kIMsgMailFolderIID, NS_IMSGMAILFOLDER_IID);
static NS_DEFINE_IID(kIMsgLocalMailFolderIID, NS_IMSGLOCALMAILFOLDER_IID);
static NS_DEFINE_IID(kIRDFArcsOutCursorIID, NS_IRDFARCSOUTCURSOR_IID);
static NS_DEFINE_IID(kIRDFAssertionCursorIID, NS_IRDFASSERTIONCURSOR_IID);
static NS_DEFINE_IID(kIRDFCursorIID, NS_IRDFCURSOR_IID);
@ -468,8 +468,8 @@ nsMSGFolderDataSource::InitLocalFolders(nsIMsgFolder* aParentFolder, nsNativeFil
folder->GetNameFromPathName(pathStr, &folderName);
folder->SetName(folderName);
nsIMsgMailFolder *mailFolder;
if(NS_SUCCEEDED(folder->QueryInterface(kIMsgMailFolderIID, (void**)&mailFolder)))
nsIMsgLocalMailFolder *mailFolder;
if(NS_SUCCEEDED(folder->QueryInterface(kIMsgLocalMailFolderIID, (void**)&mailFolder)))
{
mailFolder->SetPathName(pathStr);
NS_IF_RELEASE(mailFolder);
@ -506,8 +506,8 @@ nsMSGFolderDataSource::InitLocalFolders(nsIMsgFolder* aParentFolder, nsNativeFil
folder->GetNameFromPathName(pathStr, &folderName);
folder->SetName(folderName);
nsIMsgMailFolder *mailFolder;
if(NS_SUCCEEDED(folder->QueryInterface(kIMsgMailFolderIID, (void**)&mailFolder)))
nsIMsgLocalMailFolder *mailFolder;
if(NS_SUCCEEDED(folder->QueryInterface(kIMsgLocalMailFolderIID, (void**)&mailFolder)))
{
mailFolder->SetPathName(pathStr);
NS_IF_RELEASE(mailFolder);

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

@ -30,7 +30,6 @@
#include "nsNNTPArticleSet.h"
#include "nsMsgGroupRecord.h"
#include "nsMsgPtrArray.h"
#include "nsINNTPNewsgroup.h"
#include "nsNNTPNewsgroup.h"

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

@ -24,6 +24,8 @@
#include "nsIInputStream.h"
#include "nntpCore.h"
#include "nsCRT.h"
#include "xp.h" // XXX remove!
#include "rosetta.h"
#include HG40855
@ -34,7 +36,6 @@
#include "prerror.h"
#include "nsEscape.h"
#include "xp_str.h"
#include "fe_proto.h"
#include "prprf.h"
#include "merrors.h"
@ -338,7 +339,7 @@ void nsNNTPProtocol::Initialize(nsIURL * aURL, nsITransport * transportLayer)
const char * hostName = NULL;
aURL->GetHost(&hostName);
if (hostName)
m_hostName = PL_strdup(hostName);
m_hostName = nsCRT::strdup(hostName);
else
m_hostName = NULL;
@ -382,6 +383,7 @@ PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
PRBool cancel = FALSE;
char* colon;
nsINNTPNewsgroupPost *message=NULL;
char *message_id = 0;
nsresult rv = NS_OK;
@ -511,22 +513,22 @@ PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
if (PL_strstr(commandSpecificData, "?list-pretty"))
{
m_typeWanted = PRETTY_NAMES_WANTED;
m_commandSpecificData = PL_strdup(commandSpecificData);
m_commandSpecificData = nsCRT::strdup(commandSpecificData);
}
else if (PL_strstr(commandSpecificData, "?profile"))
{
m_typeWanted = PROFILE_WANTED;
m_commandSpecificData = PL_strdup(commandSpecificData);
m_commandSpecificData = nsCRT::strdup(commandSpecificData);
}
else if (PL_strstr(commandSpecificData, "?list-ids"))
{
m_typeWanted= IDS_WANTED;
m_commandSpecificData = PL_strdup(commandSpecificData);
m_commandSpecificData = nsCRT::strdup(commandSpecificData);
}
else
{
m_typeWanted = SEARCH_WANTED;
m_commandSpecificData = PL_strdup(commandSpecificData);
m_commandSpecificData = nsCRT::strdup(commandSpecificData);
m_searchData = m_commandSpecificData;
}
}
@ -569,8 +571,8 @@ PRInt32 nsNNTPProtocol::LoadURL(nsIURL * aURL)
if( (colon = PL_strchr(unamePwd, ':')) != NULL )
{
*colon = '\0';
userName = PL_strdup(unamePwd);
password = PL_strdup(colon+1);
userName = nsCRT::strdup(unamePwd);
password = nsCRT::strdup(colon+1);
*colon = ':';
PR_Free(unamePwd);
}
@ -730,7 +732,7 @@ PRInt32 nsNNTPProtocol::ParseURL(nsIURL * aURL, char ** aHostAndPort, PRBool * b
aURL->GetHost(&host);
if (host)
hostAndPort = PL_strdup(host);
hostAndPort = nsCRT::strdup(host);
// mscott: I took out default code to generate host and port
// if the url didn't have any...add this later...
@ -771,7 +773,7 @@ PRInt32 nsNNTPProtocol::ParseURL(nsIURL * aURL, char ** aHostAndPort, PRBool * b
if (!path_part)
path_part = "";
group = PL_strdup (path_part);
group = nsCRT::strdup (path_part);
if (!group)
{
status = MK_OUT_OF_MEMORY;
@ -828,7 +830,7 @@ PRInt32 nsNNTPProtocol::ParseURL(nsIURL * aURL, char ** aHostAndPort, PRBool * b
if (*s)
{
command_specific_data = PL_strdup (s);
command_specific_data = nsCRT::strdup (s);
*s = 0;
if (!command_specific_data)
{
@ -1517,7 +1519,7 @@ PRInt32 nsNNTPProtocol::GetPropertiesResponse(nsIInputStream * inputStream, PRUi
if ('.' != line[0])
{
char *propertyName = PL_strdup(line);
char *propertyName = nsCRT::strdup(line);
if (propertyName)
{
char *space = PL_strchr(propertyName, ' ');
@ -1961,7 +1963,7 @@ PRInt32 nsNNTPProtocol::BeginArticle()
*/
PL_strfree (m_currentGroup);
#ifdef UNREADY_CODE
ce->URL_s->content_type = PL_strdup (MESSAGE_RFC822);
ce->URL_s->content_type = nsCRT::strdup (MESSAGE_RFC822);
#endif
#ifdef NO_ARTICLE_CACHEING
@ -2072,7 +2074,7 @@ PRInt32 nsNNTPProtocol::ReadArticle(nsIInputStream * inputStream, PRUint32 lengt
/* Don't send content-type to mime parser if we're doing a cancel
because it confuses mime parser into not parsing.
*/
if (m_typeWanted != CANCEL_WANTED || XP_STRNCMP(outputBuffer, "Content-Type:", 13))
if (m_typeWanted != CANCEL_WANTED || nsCRT::strncmp(outputBuffer, "Content-Type:", 13))
{
// 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....
@ -3452,7 +3454,7 @@ PRInt32 nsNNTPProtocol::Cancel()
if (!ok)
{
status = MK_NNTP_CANCEL_DISALLOWED;
m_runningURL->SetErrorMessage(PL_strdup (XP_GetString(status)));
m_runningURL->SetErrorMessage(nsCRT::strdup(XP_GetString(status)));
m_nextState = NEWS_ERROR; /* even though it worked */
ClearFlag(NNTP_PAUSE_FOR_READ);
goto FAIL;

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

@ -29,7 +29,7 @@
#include "nsINNTPNewsgroup.h"
#include "nsMsgGroupRecord.h"
#include "nsMsgPtrArray.h"
#include "nsIMsgFolder.h"
#include "nsNNTPNewsgroupList.h"
#include "nsNNTPNewsgroup.h"