1998-06-23 02:39:40 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* The contents of this file are subject to the Netscape Public
|
|
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.mozilla.org/NPL/
|
1998-06-23 02:39:40 +04:00
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* Software distributed under the License is distributed on an "AS
|
|
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
|
|
* implied. See the License for the specific language governing
|
|
|
|
* rights and limitations under the License.
|
1998-06-23 02:39:40 +04:00
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is Netscape
|
1998-06-23 02:39:40 +04:00
|
|
|
* Communications Corporation. Portions created by Netscape are
|
1999-11-06 06:43:54 +03:00
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
|
|
* Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
1998-06-23 02:39:40 +04:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _MsgFInfo_H_
|
|
|
|
#define _MsgFInfo_H_
|
|
|
|
|
|
|
|
#include "ptrarray.h"
|
|
|
|
#include "imap.h"
|
|
|
|
#include "errcode.h"
|
|
|
|
#include "msgmast.h"
|
|
|
|
#include "dberror.h"
|
|
|
|
#include "idarray.h"
|
|
|
|
#include "msgundmg.h"
|
|
|
|
|
|
|
|
class MessageDB;
|
|
|
|
class NewsGroupDB;
|
|
|
|
class MailDB;
|
|
|
|
class MailMessageHdr;
|
|
|
|
class DBMessageHdr;
|
|
|
|
class MessageDBView;
|
|
|
|
class msg_NewsArtSet;
|
|
|
|
class MSG_NewsHost;
|
|
|
|
class MSG_FolderInfoContainer;
|
|
|
|
class MSG_FolderInfoCategoryContainer;
|
|
|
|
class ImapMailDB;
|
|
|
|
class ParseMailboxState;
|
|
|
|
class DBFolderInfo;
|
|
|
|
class MSG_UrlQueue;
|
|
|
|
class msg_GroupRecord;
|
|
|
|
class DBOfflineImapOperation;
|
|
|
|
class MSG_FolderArray;
|
|
|
|
class MSG_IMAPHost;
|
|
|
|
|
|
|
|
struct MSG_Filter;
|
|
|
|
|
|
|
|
|
|
|
|
/* Info about a single folder. */
|
|
|
|
|
|
|
|
|
|
|
|
enum FolderType {
|
|
|
|
FOLDER_MAIL,
|
|
|
|
FOLDER_IMAPMAIL,
|
|
|
|
FOLDER_NEWSGROUP,
|
|
|
|
FOLDER_CONTAINERONLY, // Can't actually hold messages, just other
|
|
|
|
// folders.
|
|
|
|
FOLDER_CATEGORYCONTAINER,
|
|
|
|
FOLDER_IMAPSERVERCONTAINER
|
|
|
|
}; /* What kind of folder thingy this is. */
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct msg_write_state {
|
|
|
|
XP_Bool inhead;
|
|
|
|
|
|
|
|
XP_File fid;
|
|
|
|
uint32 statusPosition;
|
|
|
|
uint32 position;
|
|
|
|
uint32 header_bytes;
|
|
|
|
XP_Bool update_msg;
|
|
|
|
char *uidl;
|
|
|
|
int numskip;
|
|
|
|
int32 (*writefunc)(char* line, uint32 length, void* closure);
|
|
|
|
void* writeclosure;
|
|
|
|
uint32 flags;
|
|
|
|
} msg_write_state;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct msg_move_state {
|
|
|
|
XP_Bool ismove;
|
|
|
|
XP_Bool midMessage; // in the middle of copying a large message
|
|
|
|
uint32 messageBytesMovedSoFar; // for the current message
|
|
|
|
|
|
|
|
uint32 totalSizeForProgressGraph;
|
|
|
|
uint32 finalDownLoadMessageSize;
|
|
|
|
XP_File infid;
|
|
|
|
|
|
|
|
PRFileDesc *uploadToIMAPsocket;
|
|
|
|
UploadCompleteFunctionPointer *uploadCompleteFunction;
|
|
|
|
void *uploadCompleteArgument;
|
|
|
|
|
|
|
|
char* buf;
|
|
|
|
int size; /* size of buf */
|
|
|
|
MSG_FolderInfo* destfolder;
|
|
|
|
MSG_Pane* sourcePane;
|
|
|
|
TNavigatorImapConnection *imap_connection;
|
|
|
|
XP_Bool haveUploadedMessageSize; /* for imap uploading of msg size*/
|
|
|
|
uint32 msgSize;
|
|
|
|
uint32 msg_flags;
|
|
|
|
|
|
|
|
MailDB *destDB;
|
|
|
|
NewsGroupDB *sourceNewsDB;
|
|
|
|
msg_write_state writestate;
|
|
|
|
char *ibuffer;
|
|
|
|
uint32 ibuffer_size;
|
|
|
|
uint32 ibuffer_fp;
|
|
|
|
int num;
|
|
|
|
int numunread;
|
|
|
|
MessageKey nextKeyToLoad; // what to load after delete from message pane
|
|
|
|
char *urlForNextKeyLoad;
|
|
|
|
|
|
|
|
int32 msgIndex;
|
|
|
|
XP_Bool moveCompleted;
|
|
|
|
|
|
|
|
|
|
|
|
} msg_move_state;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
PurgeNeeded,
|
|
|
|
PurgeNotNeeded,
|
|
|
|
PurgeMaybeNeeded
|
|
|
|
} MSG_PurgeStatus;
|
|
|
|
|
|
|
|
class MSG_FolderInfo {
|
|
|
|
public:
|
|
|
|
MSG_FolderInfo(const char* name, uint8 depth, XPCompareFunc* comparator = NULL);
|
|
|
|
virtual ~MSG_FolderInfo();
|
|
|
|
|
|
|
|
virtual FolderType GetType() = 0;
|
|
|
|
|
|
|
|
// Gets the URL that represents the given message. Returns a newly
|
|
|
|
// created string that must be free'd using XP_FREE().
|
|
|
|
// If the db is NULL, then returns a URL that represents the entire
|
|
|
|
// folder as a whole.
|
|
|
|
virtual char *BuildUrl (MessageDB *db, MessageKey key) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
virtual void StartAsyncCopyMessagesInto (MSG_FolderInfo *dstFolder,
|
|
|
|
MSG_Pane* sourcePane,
|
|
|
|
MessageDB *sourceDB,
|
|
|
|
IDArray *srcArray,
|
|
|
|
int32 srcCount,
|
|
|
|
MWContext *currentContext,
|
|
|
|
MSG_UrlQueue *urlQueue,
|
|
|
|
XP_Bool deleteAfterCopy,
|
|
|
|
MessageKey nextKey = MSG_MESSAGEKEYNONE);
|
|
|
|
|
|
|
|
|
|
|
|
virtual MsgERR BeginCopyingMessages (MSG_FolderInfo *dstFolder,
|
|
|
|
MessageDB *sourceDB,
|
|
|
|
IDArray *srcArray,
|
|
|
|
MSG_UrlQueue *urlQueue,
|
|
|
|
int32 srcCount,
|
|
|
|
MessageCopyInfo *copyInfo) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
virtual int FinishCopyingMessages (MWContext *context,
|
|
|
|
MSG_FolderInfo * srcFolder,
|
|
|
|
MSG_FolderInfo *dstFolder,
|
|
|
|
MessageDB *sourceDB,
|
|
|
|
IDArray *srcArray,
|
|
|
|
int32 srcCount,
|
|
|
|
msg_move_state *state) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
virtual void CleanupCopyMessagesInto (MessageCopyInfo **info);
|
|
|
|
|
|
|
|
virtual MsgERR SaveMessages(IDArray *, const char *fileName,
|
|
|
|
MSG_Pane *pane, MessageDB *msgDB,
|
|
|
|
int (*doneCB)(void *, int status) = NULL, void *state = NULL);
|
|
|
|
|
|
|
|
virtual const char *GetPrettyName(); // so news can override and return pretty name
|
|
|
|
virtual const char* GetName(); // Name of this folder (as presented to user).
|
|
|
|
virtual void SetName(const char *name);
|
|
|
|
|
|
|
|
virtual const char *GetPrettiestName() ;
|
|
|
|
XP_Bool HasSubFolders() const;
|
|
|
|
int GetNumSubFolders() const;
|
|
|
|
virtual int GetNumSubFoldersToDisplay() const;
|
|
|
|
MSG_FolderInfo* GetSubFolder(int which) const;
|
|
|
|
MSG_FolderArray *GetSubFolders ();
|
|
|
|
virtual void RemoveSubFolder (MSG_FolderInfo *which);
|
|
|
|
void GetVisibleSubFolders (MSG_FolderArray&);
|
|
|
|
|
|
|
|
virtual XP_Bool GetAdminUrl(MWContext *context, MSG_AdminURLType type);
|
|
|
|
virtual XP_Bool HaveAdminUrl(MSG_AdminURLType type);
|
|
|
|
virtual XP_Bool DeleteIsMoveToTrash();
|
|
|
|
virtual XP_Bool ShowDeletedMessages();
|
|
|
|
virtual MsgERR OnCloseFolder () ;
|
|
|
|
virtual MsgERR Delete () = 0;
|
|
|
|
MsgERR PropagateDelete (MSG_FolderInfo **folder, XP_Bool deleteStorage = TRUE);
|
|
|
|
MsgERR RecursiveDelete (XP_Bool deleteStorage = TRUE); // called by PropagateDelete
|
|
|
|
virtual MsgERR CreateSubfolder (const char *, MSG_FolderInfo**, int32*) = 0;
|
|
|
|
virtual MsgERR Rename (const char *name);
|
|
|
|
virtual MsgERR Adopt (MSG_FolderInfo *srcFolder, int32*) = 0;
|
|
|
|
|
|
|
|
virtual XP_Bool ContainsChildNamed (const char *name);
|
|
|
|
virtual MSG_FolderInfo *FindChildNamed (const char *name);
|
|
|
|
virtual MSG_FolderInfo *FindParentOf (MSG_FolderInfo *);
|
|
|
|
virtual XP_Bool IsParentOf (MSG_FolderInfo *, XP_Bool deep = TRUE);
|
|
|
|
|
|
|
|
virtual const char *GenerateUniqueSubfolderName(const char *prefix, MSG_FolderInfo *otherFolder = NULL);
|
|
|
|
|
|
|
|
uint8 GetDepth() const;
|
|
|
|
void SetDepth(uint8 depth);
|
|
|
|
|
|
|
|
// updates num messages and num unread - should be pure virtual
|
|
|
|
// when I get around to implementing in all subclasses?
|
|
|
|
virtual XP_Bool UpdateSummaryTotals();
|
|
|
|
void SummaryChanged();
|
|
|
|
int32 GetNumUnread(XP_Bool deep = FALSE) const; // How many unread messages in this folder.
|
|
|
|
int32 GetTotalMessages(XP_Bool deep = FALSE) const; // Total number of messages in this folder.
|
|
|
|
virtual int32 GetTotalMessagesInDB() const; // How many messages in database.
|
|
|
|
virtual void MarkAllRead(MWContext *context, XP_Bool deep);
|
|
|
|
|
|
|
|
// These functions are used for tricking the front end into thinking that we have more
|
|
|
|
// messages than are really in the DB. This is usually after and IMAP message copy where
|
|
|
|
// we don't want to do an expensive select until the user actually opens that folder
|
|
|
|
// These functions are called when MSG_Master::GetFolderLineById is populating a MSG_FolderLine
|
|
|
|
// struct used by the FE
|
|
|
|
int32 GetNumPendingUnread(XP_Bool deep = FALSE) const;
|
|
|
|
int32 GetNumPendingTotalMessages(XP_Bool deep = FALSE) const;
|
|
|
|
|
|
|
|
void ChangeNumPendingUnread(int32 delta);
|
|
|
|
void ChangeNumPendingTotalMessages(int32 delta);
|
|
|
|
|
|
|
|
void SetFolderPrefFlags(int32 flags);
|
|
|
|
int32 GetFolderPrefFlags();
|
|
|
|
void SetFolderCSID(int16 csid);
|
|
|
|
int16 GetFolderCSID();
|
|
|
|
void SetLastMessageLoaded(MessageKey lastMessageLoaded);
|
|
|
|
MessageKey GetLastMessageLoaded();
|
|
|
|
uint32 GetFlags() const ;
|
|
|
|
void ToggleFlag (uint32 which);
|
|
|
|
void SetFlag (uint32 which);
|
|
|
|
|
|
|
|
void SetFlagInAllFolderPanes(uint32 which);
|
|
|
|
void ClearFlag (uint32 which);
|
|
|
|
XP_Bool TestFlag (uint32 which) { return (m_flags & which) != 0; } // Type conversion to char-sized XP_Bool
|
|
|
|
|
|
|
|
int32 GetFoldersWithFlag(uint32 flags, MSG_FolderInfo** result,
|
|
|
|
int32 resultsize);
|
|
|
|
// for everyone else...
|
|
|
|
virtual void GetExpansionArray (MSG_FolderArray &array );
|
|
|
|
|
|
|
|
char *EscapeMessageId (const char *messageId);
|
|
|
|
|
|
|
|
virtual int32 GetExpungedBytesCount() const;
|
|
|
|
virtual MSG_FolderInfoMail *GetMailFolderInfo() ;
|
|
|
|
virtual MSG_FolderInfoNews *GetNewsFolderInfo() ;
|
|
|
|
virtual MSG_IMAPFolderInfoMail *GetIMAPFolderInfoMail() ;
|
|
|
|
virtual MSG_IMAPFolderInfoContainer *GetIMAPFolderInfoContainer() ;
|
|
|
|
virtual MSG_IMAPHost *GetIMAPHost() ;
|
|
|
|
|
|
|
|
virtual XP_Bool IsMail () = 0;
|
|
|
|
virtual XP_Bool IsNews () = 0;
|
|
|
|
virtual XP_Bool IsDeletable () = 0;
|
|
|
|
virtual XP_Bool CanCreateChildren ();
|
|
|
|
virtual XP_Bool CanBeRenamed () ;
|
|
|
|
virtual XP_Bool RequiresCleanup();
|
|
|
|
virtual void ClearRequiresCleanup();
|
|
|
|
virtual XP_Bool CanBeInFolderPane ();
|
|
|
|
virtual XP_Bool KnowsSearchNntpExtension();
|
|
|
|
virtual XP_Bool AllowsPosting();
|
|
|
|
virtual XP_Bool DisplayRecipients();
|
|
|
|
|
|
|
|
MsgERR AcquireSemaphore (void *semHolder);
|
|
|
|
void ReleaseSemaphore (void *semHolder);
|
|
|
|
XP_Bool TestSemaphore (void *semHolder);
|
|
|
|
XP_Bool IsLocked () { return m_semaphoreHolder != NULL; }
|
|
|
|
MWContext *GetFolderPaneContext();
|
|
|
|
MSG_Master *GetMaster() {return m_master;}
|
|
|
|
virtual MsgERR GetDBFolderInfoAndDB(DBFolderInfo **folderInfo, MessageDB **db) = 0;
|
|
|
|
virtual MsgERR ReadDBFolderInfo (XP_Bool force = FALSE);
|
|
|
|
|
|
|
|
virtual MsgERR WriteToCache (XP_File);
|
|
|
|
virtual MsgERR ReadFromCache (char *);
|
|
|
|
virtual XP_Bool IsCachable ();
|
|
|
|
void SkipCacheTokens (char **ppBuf, int numTokens);
|
|
|
|
virtual const char *GetRelativePathName ();
|
|
|
|
|
|
|
|
virtual int32 GetSizeOnDisk();
|
|
|
|
|
|
|
|
virtual XP_Bool ShouldPerformOperationOffline();
|
|
|
|
static int CompareFolderDepth (const void *, const void *);
|
|
|
|
|
|
|
|
int DownloadToTempFileAndUpload(MessageCopyInfo *copyInfo, IDArray &keysToSave, MSG_FolderInfo *dstFolder, MessageDB *sourceDB);
|
|
|
|
virtual void RememberPassword(const char *password);
|
|
|
|
virtual char *GetRememberedPassword();
|
|
|
|
virtual XP_Bool UserNeedsToAuthenticateForFolder(XP_Bool displayOnly);
|
|
|
|
virtual const char *GetUserName();
|
|
|
|
virtual const char *GetHostName();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
char* m_name;
|
|
|
|
uint32 m_flags;
|
|
|
|
int32 m_numUnreadMessages; /* count of unread messages (-1 means
|
|
|
|
unknown; -2 means unknown but we already
|
|
|
|
tried to find out.) */
|
|
|
|
int32 m_numTotalMessages; /* count of existing messages. */
|
|
|
|
MSG_FolderArray *m_subFolders;
|
|
|
|
MSG_Master *m_master;
|
|
|
|
int16 m_csid; // default csid for folder/newsgroup - maintained by fe.
|
|
|
|
uint8 m_depth;
|
|
|
|
int32 m_prefFlags; // prefs like MSG_PREF_OFFLINE, MSG_PREF_ONE_PANE, etc
|
|
|
|
void *m_semaphoreHolder; // set when the folder is being written to
|
|
|
|
MessageKey m_lastMessageLoaded;
|
|
|
|
|
|
|
|
// These values are used for tricking the front end into thinking that we have more
|
|
|
|
// messages than are really in the DB. This is usually after and IMAP message copy where
|
|
|
|
// we don't want to do an expensive select until the user actually opens that folder
|
|
|
|
int32 m_numPendingUnreadMessages;
|
|
|
|
int32 m_numPendingTotalMessages;
|
|
|
|
|
|
|
|
XP_Bool m_isCachable;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct MessageCopyInfo {
|
|
|
|
MSG_FolderInfo *srcFolder;
|
|
|
|
MSG_FolderInfo *dstFolder;
|
|
|
|
MessageCopyInfo *nextCopyInfo;
|
|
|
|
|
|
|
|
XP_Bool dstIMAPfolderUpdated;
|
|
|
|
uint32 offlineFolderPositionOfMostRecentMessage;
|
|
|
|
MessageDB *srcDB;
|
|
|
|
IDArray *srcArray;
|
|
|
|
int32 srcCount;
|
|
|
|
msg_move_state moveState;
|
|
|
|
ImapOnlineCopyState imapOnLineCopyState;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MSG_FolderInfoMail : public MSG_FolderInfo {
|
|
|
|
public:
|
|
|
|
static MSG_FolderInfoMail *BuildFolderTree (const char *path,
|
|
|
|
uint8 depth, MSG_FolderArray *parentArray, MSG_Master *master,
|
|
|
|
XP_Bool buildingImapTree = FALSE, MSG_IMAPHost *host = NULL);
|
|
|
|
|
|
|
|
MSG_FolderInfoMail(char* pathname, MSG_Master *master, uint8 depth, uint32 flags);
|
|
|
|
virtual ~MSG_FolderInfoMail();
|
|
|
|
|
|
|
|
virtual void SetPrefFolderFlag();
|
|
|
|
|
|
|
|
virtual FolderType GetType();
|
|
|
|
|
|
|
|
virtual char *BuildUrl (MessageDB *db, MessageKey key);
|
|
|
|
|
|
|
|
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 *srcArray,
|
|
|
|
int32 srcCount,
|
|
|
|
msg_move_state *state);
|
|
|
|
|
|
|
|
virtual MsgERR CheckForLegalCopy(MSG_FolderInfo *dstFolder);
|
|
|
|
|
|
|
|
virtual MsgERR CreateSubfolder (const char *, MSG_FolderInfo**, int32*);
|
|
|
|
|
|
|
|
virtual void RemoveSubFolder (MSG_FolderInfo *which);
|
|
|
|
virtual MsgERR Delete ();
|
|
|
|
virtual MsgERR Rename (const char *newName);
|
|
|
|
virtual MsgERR Adopt (MSG_FolderInfo *srcFolder, int32 *newPos);
|
|
|
|
|
|
|
|
MsgERR PropagateRename (const char *newName, int startingAt);
|
|
|
|
MsgERR PropagateAdopt (const char *parentPath, uint8 parentDepth);
|
|
|
|
|
|
|
|
// this override pulls the value from the db
|
|
|
|
virtual const char* GetName(); // Name of this folder (as presented to user).
|
|
|
|
virtual const char* GetPrettyName(); // Override of the base, for top-level mail folder
|
|
|
|
|
|
|
|
virtual const char *GenerateUniqueSubfolderName(const char *prefix, MSG_FolderInfo *otherFolder = NULL);
|
|
|
|
|
|
|
|
const char* GetPathname() {return m_pathName;} // Full path to this folder.
|
|
|
|
MSG_FolderInfoMail* FindPathname(const char* pathname);
|
|
|
|
XP_Bool UpdateSummaryTotals() ;
|
|
|
|
|
|
|
|
// used in copying messages
|
|
|
|
virtual int CreateMessageWriteStream(msg_move_state *state, uint32 msgSize, uint32 msg_flags);
|
|
|
|
// only makes sense if CreateMessageWriteStream worked
|
|
|
|
virtual XP_Bool MessageWriteStreamIsReadyForWrite(msg_move_state *state);
|
|
|
|
virtual uint32 SeekToEndOfMessageStore(msg_move_state *state);
|
|
|
|
virtual uint32 WriteMessageBuffer(msg_move_state *state, char *buffer, uint32 bytesToWrite, MailMessageHdr *offlineHdr);
|
|
|
|
virtual void CloseMessageWriteStream(msg_move_state *state);
|
|
|
|
|
|
|
|
// srcDB is passed in when we are dealing with a search pane & it it doesn't have an message view. everyone else
|
|
|
|
// should ignore this extra parameter..
|
|
|
|
virtual void SaveMessageHeader(msg_move_state *state, MailMessageHdr *hdr, uint32 messageKey, MessageDB * srcDB = NULL);
|
|
|
|
|
|
|
|
virtual void CloseOfflineDestinationDbAfterMove(msg_move_state *state);
|
|
|
|
|
|
|
|
void SetMaster(MSG_Master *master) {m_master = master;}
|
|
|
|
// these methods handle current folder being parsed, if any.
|
|
|
|
ParseMailboxState *GetParseMailboxState() {return m_parseMailboxState;}
|
|
|
|
void SetParseMailboxState(ParseMailboxState *state) {m_parseMailboxState = state;}
|
|
|
|
|
|
|
|
virtual uint32 MessageCopySize(DBMessageHdr *msgHeader, msg_move_state *state);
|
|
|
|
|
|
|
|
virtual MSG_FolderInfoMail *GetMailFolderInfo() {return this;}
|
|
|
|
virtual int32 GetExpungedBytesCount() const;
|
|
|
|
virtual void SetExpungedBytesCount(int32 count) ;
|
|
|
|
virtual XP_Bool IsMail () ;
|
|
|
|
virtual XP_Bool IsNews () ;
|
|
|
|
virtual XP_Bool IsDeletable ();
|
|
|
|
virtual XP_Bool CanCreateChildren () ;
|
|
|
|
virtual XP_Bool CanBeRenamed ();
|
|
|
|
virtual XP_Bool RequiresCleanup();
|
|
|
|
|
|
|
|
MsgERR GetDBFolderInfoAndDB(DBFolderInfo **folderInfo, MessageDB **db);
|
|
|
|
virtual MsgERR ReadDBFolderInfo (XP_Bool force = FALSE);
|
|
|
|
|
|
|
|
virtual MsgERR WriteToCache (XP_File);
|
|
|
|
virtual MsgERR ReadFromCache (char *);
|
|
|
|
virtual const char *GetRelativePathName ();
|
|
|
|
|
|
|
|
static char *CreatePlatformLeafNameForDisk(const char *userLeafName, MSG_Master *master, const char *baseDir);
|
|
|
|
static char *CreatePlatformLeafNameForDisk(const char *userLeafName, MSG_Master *master, MSG_FolderInfoMail *parentFolder);
|
|
|
|
IDArray *GetImapIdsToMoveFromInbox() {return &m_imapIdsToMoveFromInbox;}
|
|
|
|
void ClearImapIdsToMoveFromInbox() {m_imapIdsToMoveFromInbox.RemoveAll();}
|
|
|
|
|
|
|
|
virtual int32 GetSizeOnDisk();
|
|
|
|
|
|
|
|
static int CompareFolders (const void *, const void *);
|
|
|
|
void UpdatePendingCounts(MSG_FolderInfo * dstFolder,
|
|
|
|
IDArray *srcArray,
|
|
|
|
XP_Bool countUnread = TRUE,
|
|
|
|
XP_Bool missingAreRead = TRUE);
|
|
|
|
void SetGettingMail(XP_Bool flag);
|
|
|
|
XP_Bool GetGettingMail();
|
|
|
|
virtual const char *GetUserName();
|
|
|
|
virtual const char *GetHostName();
|
|
|
|
virtual void DeleteMsgsOnServer(msg_move_state *state, MessageDB *sourceDB, IDArray *srcArray, int32 srcCount);
|
|
|
|
virtual XP_Bool UserNeedsToAuthenticateForFolder(XP_Bool displayOnly);
|
|
|
|
virtual char *GetRememberedPassword();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
// a factory that deals with pathname to long for us to append ".snm" to. Useful when the user imports
|
|
|
|
// a mailbox file with a long name. If there is a new name then pathname is replaced.
|
|
|
|
static MSG_FolderInfoMail *CreateMailFolderInfo(char* pathname, MSG_Master *master, uint8 depth, uint32 flags);
|
|
|
|
|
|
|
|
MsgERR BeginOfflineAppend(MSG_IMAPFolderInfoMail *dstFolder,
|
|
|
|
MessageDB *sourceDB,
|
|
|
|
IDArray *srcArray,
|
|
|
|
int32 srcCount,
|
|
|
|
msg_move_state *state);
|
|
|
|
|
|
|
|
MsgERR CloseDatabase (const char *name, MessageDB **outDB);
|
|
|
|
MsgERR ReopenDatabase (MessageDB *db, const char *newName);
|
|
|
|
|
|
|
|
// This function ensures that each line in the buffer ends in
|
|
|
|
// CRLF, as required by RFC822 and therefore IMAP APPEND.
|
|
|
|
//
|
|
|
|
// This function assumes that there is enough room in the buffer to
|
|
|
|
// double its size. The return value is the new buffer size.
|
|
|
|
uint32 ConvertBufferToRFC822LineTermination(char *buffer, uint32 bufferSize,
|
|
|
|
XP_Bool *lastCharacterOfPrevBufferWasCR);
|
|
|
|
|
|
|
|
void SetUrlForNextMessageLoad(msg_move_state *state, MessageDBView *view, MSG_ViewIndex doomedIndex);
|
|
|
|
|
|
|
|
char *FindNextLineTerminatingCharacter(char *bufferToSearch);
|
|
|
|
|
|
|
|
|
|
|
|
virtual XP_Bool ShouldIgnoreFile (const char *fileName);
|
|
|
|
char* m_pathName;
|
|
|
|
ParseMailboxState *m_parseMailboxState;
|
|
|
|
int32 m_expungedBytes;
|
|
|
|
XP_Bool m_HaveReadNameFromDB;
|
|
|
|
IDArray m_imapIdsToMoveFromInbox; // use to apply imap move filters with this
|
|
|
|
// folder as a destination.
|
|
|
|
XP_Bool m_gettingMail;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class MSG_FolderInfoNews : public MSG_FolderInfo {
|
|
|
|
public:
|
|
|
|
MSG_FolderInfoNews(char *groupName, msg_NewsArtSet* set,
|
|
|
|
XP_Bool subscribed, MSG_NewsHost* host, uint8 depth);
|
|
|
|
virtual ~MSG_FolderInfoNews();
|
|
|
|
|
|
|
|
virtual FolderType GetType();
|
|
|
|
virtual char *BuildUrl (MessageDB *db, MessageKey key);
|
|
|
|
|
|
|
|
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 *srcArray,
|
|
|
|
int32 srcCount,
|
|
|
|
msg_move_state * state) ;
|
|
|
|
|
|
|
|
virtual MsgERR CreateSubfolder (const char *, MSG_FolderInfo**, int32*);
|
|
|
|
virtual MsgERR Delete ();
|
|
|
|
virtual MsgERR Rename (const char *newName);
|
|
|
|
virtual MsgERR Adopt (MSG_FolderInfo *srcFolder, int32 *newPos);
|
|
|
|
|
|
|
|
virtual const char *GetRelativePathName ();
|
|
|
|
const char *GetNewsgroupName() const {return m_name;}
|
|
|
|
const char *GetDBFileName(); // Fully expanded filename, suitable to pass to db
|
|
|
|
const char *GetXPDBFileName(); // filename suitable to pass to xp routines
|
|
|
|
const char *GetXPRuleFileName(); // newsgroup rule filename suitable to pass to xp routines.
|
|
|
|
|
|
|
|
void SetNewsgroupUsername(const char * username); // munged username
|
|
|
|
const char *GetNewsgroupUsername(void); // return munged username;
|
|
|
|
|
|
|
|
void SetNewsgroupPassword(const char * password); // munged password
|
|
|
|
const char *GetNewsgroupPassword(void); // return munged password;
|
|
|
|
|
|
|
|
virtual const char *GetPrettyName();
|
|
|
|
virtual void ClearPrettyName();
|
|
|
|
virtual char *GetHostUrl();
|
|
|
|
|
|
|
|
XP_Bool IsSubscribed();
|
|
|
|
MsgERR Subscribe(XP_Bool bSubscribe, MSG_Pane *invokingPane = NULL);
|
|
|
|
msg_NewsArtSet* GetSet();
|
|
|
|
void ClearSet() {m_set = NULL;}
|
|
|
|
virtual XP_Bool UpdateSummaryTotals();
|
|
|
|
virtual void UpdateSummaryFromNNTPInfo(int32 oldest_message,
|
|
|
|
int32 youngest_message,
|
|
|
|
int32 total_messages);
|
|
|
|
|
|
|
|
MSG_FolderInfoCategoryContainer *CloneIntoCategoryContainer();
|
|
|
|
|
|
|
|
void SetWantNewTotals(XP_Bool value) {m_wantNewTotals = value;}
|
|
|
|
XP_Bool GetWantNewTotals() {return m_wantNewTotals;}
|
|
|
|
|
|
|
|
void SetAutoSubscribed(XP_Bool value) {m_autoSubscribed = value;}
|
|
|
|
XP_Bool GetAutoSubscribed() {return m_autoSubscribed;}
|
|
|
|
|
|
|
|
virtual void MarkAllRead(MWContext *context, XP_Bool deep);
|
|
|
|
|
|
|
|
virtual int32 GetTotalMessagesInDB() const; // How many messages in database.
|
|
|
|
MSG_NewsHost* GetHost() {return m_host;}
|
|
|
|
|
|
|
|
virtual XP_Bool CanBeInFolderPane ();
|
|
|
|
virtual XP_Bool IsMail () ;
|
|
|
|
virtual XP_Bool IsNews ();
|
|
|
|
virtual XP_Bool IsDeletable ();
|
|
|
|
virtual XP_Bool IsCategory();
|
|
|
|
virtual XP_Bool RequiresCleanup();
|
|
|
|
virtual void ClearRequiresCleanup();
|
|
|
|
virtual XP_Bool KnowsSearchNntpExtension();
|
|
|
|
virtual XP_Bool AllowsPosting();
|
|
|
|
|
|
|
|
virtual MSG_FolderInfoNews *GetNewsFolderInfo();
|
|
|
|
virtual NewsGroupDB *OpenNewsDB(XP_Bool deleteInvalidDB = FALSE, MsgERR *pErr = NULL);
|
|
|
|
MsgERR GetDBFolderInfoAndDB(DBFolderInfo **folderInfo, MessageDB **db);
|
|
|
|
// these methods handle current folder being parsed, if any.
|
|
|
|
ListNewsGroupState *GetListNewsGroupState() {return m_listNewsGroupState;}
|
|
|
|
void SetListNewsGroupState(ListNewsGroupState *state) {m_listNewsGroupState = state;}
|
|
|
|
|
|
|
|
virtual int32 GetSizeOnDisk();
|
|
|
|
|
|
|
|
virtual MsgERR ReadFromCache (char*);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
char * GetUniqueFileName(const char *extension);
|
|
|
|
|
|
|
|
MSG_NewsHost* m_host;
|
|
|
|
msg_NewsArtSet* m_set;
|
|
|
|
int32 m_nntpHighwater;
|
|
|
|
int32 m_nntpTotalArticles;
|
|
|
|
int32 m_totalInDB;
|
|
|
|
int32 m_unreadInDB;
|
|
|
|
XP_Bool m_subscribed;
|
|
|
|
XP_Bool m_autoSubscribed;
|
|
|
|
XP_Bool m_wantNewTotals;
|
|
|
|
char * m_dbfilename;
|
|
|
|
char * m_XPDBFileName; // name to pass to XPFile routines
|
|
|
|
char * m_XPRuleFileName; // name to pass to XPFile routines
|
|
|
|
char * m_prettyName;
|
|
|
|
MSG_PurgeStatus m_purgeStatus;
|
|
|
|
ListNewsGroupState *m_listNewsGroupState;
|
|
|
|
char * m_username; // munged username
|
|
|
|
char * m_password; // munged password
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class MSG_FolderInfoCategoryContainer : public MSG_FolderInfoNews {
|
|
|
|
public:
|
|
|
|
MSG_FolderInfoCategoryContainer(char *groupName, msg_NewsArtSet* set,
|
|
|
|
XP_Bool subscribed, MSG_NewsHost* host, uint8 depth);
|
|
|
|
virtual ~MSG_FolderInfoCategoryContainer();
|
|
|
|
|
|
|
|
MSG_FolderInfoNews *BuildCategoryTree(MSG_FolderInfoNews *parent,
|
|
|
|
const char *catName,
|
|
|
|
msg_GroupRecord* group,
|
|
|
|
uint8 depth, MSG_Master *master);
|
|
|
|
|
|
|
|
MSG_FolderInfoNews *AddToCategoryTree(MSG_FolderInfoNews *parent,
|
|
|
|
const char *groupName,
|
|
|
|
msg_GroupRecord* group,
|
|
|
|
MSG_Master *master);
|
|
|
|
|
|
|
|
virtual FolderType GetType();
|
|
|
|
// these don't expand in folder pane.
|
|
|
|
MSG_FolderInfoNews *CloneIntoNewsFolder();
|
|
|
|
MSG_FolderInfoNews *GetRootCategory();
|
|
|
|
virtual MSG_FolderInfoNews *GetNewsFolderInfo() ;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// A folder that contains other folders, but doesn't do much else.
|
|
|
|
class MSG_FolderInfoContainer : public MSG_FolderInfo {
|
|
|
|
public:
|
|
|
|
MSG_FolderInfoContainer(const char* name, uint8 depth, XPCompareFunc* f);
|
|
|
|
virtual ~MSG_FolderInfoContainer();
|
|
|
|
virtual FolderType GetType();
|
|
|
|
virtual char *BuildUrl (MessageDB *db, MessageKey key);
|
|
|
|
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 *srcArray,
|
|
|
|
int32 srcCount,
|
|
|
|
msg_move_state *state);
|
|
|
|
|
|
|
|
virtual MsgERR CreateSubfolder (const char *, MSG_FolderInfo**, int32*);
|
|
|
|
|
|
|
|
virtual MsgERR SaveMessages (IDArray*, const char *fileName,
|
|
|
|
MSG_Pane *pane, MessageDB *msgDB,
|
|
|
|
int (*doneCB)(void *, int status) = NULL, void *state = NULL);
|
|
|
|
|
|
|
|
virtual MsgERR Delete();
|
|
|
|
virtual MsgERR Adopt (MSG_FolderInfo *srcFolder, int32 *newPos);
|
|
|
|
|
|
|
|
// returns mail folder within container
|
|
|
|
virtual MSG_FolderInfoMail* FindMailPathname(const char* p);
|
|
|
|
|
|
|
|
// move these into msgfinfo.cpp
|
|
|
|
virtual XP_Bool IsMail () { return FALSE; }
|
|
|
|
virtual XP_Bool IsNews () { return FALSE; }
|
|
|
|
virtual XP_Bool IsDeletable () { return FALSE; }
|
|
|
|
virtual MSG_NewsHost* GetHost() {return NULL;}
|
|
|
|
MsgERR GetDBFolderInfoAndDB(DBFolderInfo ** /*folderInfo*/, MessageDB ** /*db*/)
|
|
|
|
{return eFAILURE;}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class MSG_NewsFolderInfoContainer : public MSG_FolderInfoContainer
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MSG_NewsFolderInfoContainer(MSG_NewsHost* host, uint8 depth);
|
|
|
|
virtual ~MSG_NewsFolderInfoContainer();
|
|
|
|
|
|
|
|
virtual XP_Bool IsDeletable();
|
|
|
|
virtual MsgERR Delete();
|
|
|
|
virtual MSG_NewsHost* GetHost() {return m_host;}
|
|
|
|
virtual XP_Bool KnowsSearchNntpExtension ();
|
|
|
|
virtual XP_Bool AllowsPosting();
|
|
|
|
virtual int GetNumSubFoldersToDisplay() const;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
MSG_NewsHost* m_host;
|
|
|
|
char *m_prettyName;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct MSG_FolderIteratorStackElement
|
|
|
|
{
|
|
|
|
MSG_FolderInfo *m_parent;
|
|
|
|
int m_currentIndex;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
MSG_FolderIterator: A class for traversing folder lists.
|
|
|
|
### mw Right now, traversal is depth first. Other people can add
|
|
|
|
their favorite traversal methods.
|
|
|
|
*/
|
|
|
|
class MSG_FolderIterator
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MSG_FolderInfo *m_masterParent; // Top of tree
|
|
|
|
MSG_FolderArray m_stack; // Stack of pointer indices
|
|
|
|
|
|
|
|
MSG_FolderInfo *m_currentParent; // Currently iterating
|
|
|
|
int m_currentIndex;
|
|
|
|
|
|
|
|
MSG_FolderIterator(MSG_FolderInfo *parent);
|
|
|
|
~MSG_FolderIterator();
|
|
|
|
|
|
|
|
XP_Bool Push();
|
|
|
|
XP_Bool Pop();
|
|
|
|
void Init();
|
|
|
|
void Advance();
|
|
|
|
|
|
|
|
MSG_FolderInfo *First();
|
|
|
|
MSG_FolderInfo *Next();
|
|
|
|
MSG_FolderInfo *NextNoAdvance();
|
|
|
|
MSG_FolderInfo *AdvanceToFolder(MSG_FolderInfo *);
|
|
|
|
XP_Bool More();
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* _MsgFInfo_H_ */
|