gecko-dev/lib/libmsg/msgfinfo.h

734 строки
27 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* 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/
*
* 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.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#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_ */