/* -*- 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 _MSGRULET_H #define _MSGRULET_H #include "ptrarray.h" #include "dwordarr.h" class MSG_FolderInfo; class MSG_Master; struct MSG_FilterList; struct MSG_Rule; // MSG_RuleTrackAction comprises the set of possible resolutions when // a change to a mail folder conflicts with a filter rule. typedef enum MSG_RuleTrackAction { disableRule, // Allow the folder operation, but disable referring rules breakRule, // Allow the rule to keep firing using old path trackChange, // Change the rule to refer to the new path dontChange // Abort the folder operation with no change } MSG_RuleTrackAction; typedef void (*MSG_RuleTrackCallback) (void*, XPPtrArray&, XPDWordArray&, XP_Bool isDelete); class MSG_RuleTrackElement { public: MSG_RuleTrackElement (MSG_Rule *rule, char *delta) { m_rule = rule; m_parentalPathDelta = delta; } ~MSG_RuleTrackElement () { m_rule = NULL; XP_FREEIF(m_parentalPathDelta); } MSG_Rule *m_rule; char *m_parentalPathDelta; }; class MSG_RuleTrackArray : public XPPtrArray { public: MSG_RuleTrackElement *GetAt (int i) { return (MSG_RuleTrackElement*) XPPtrArray::GetAt(i); } void DeleteElements () { for (int i = 0; i < GetSize(); i++) delete GetAt(i); } }; // MSG_RuleTracker is responsible for watching when mail folder paths // change, and if the changing folder is a target of a rule, ask the user how // to resolve the potential breakage given the options in TrackAction // // MSG_RuleTracker reads and (potentially) writes the rule list, so it // must be used atomically. i.e. it's not legal for a MSG_RuleTracker // object to live across invocations of GetNewMail or the Rules dialog box. class MSG_RuleTracker { public: MSG_RuleTracker (MSG_Master *, MSG_RuleTrackCallback, void *); ~MSG_RuleTracker (); XP_Bool WatchMoveFolders (MSG_FolderInfo **list, int listCount); XP_Bool WatchDeleteFolders (MSG_FolderInfo **list, int listCount); XP_Bool AbortTracking (); protected: XP_Bool WatchFolders (MSG_FolderInfo **list, int listCount); XP_Bool LoadRules (MSG_FolderInfo **list, int listCount); void MatchFolderToRules (MSG_FolderInfo *); void ApplyTrackActions (const char *newPath); MSG_Master *m_master; MSG_FilterList *m_list; XP_Bool m_listIsDirty; MSG_RuleTrackArray m_rulesToTrack; XPDWordArray m_actions; MSG_FolderInfo **m_folderList; int m_folderListCount; MSG_RuleTrackCallback m_callback; void *m_callbackCookie; XP_Bool m_isDelete; }; #endif //_MSGRULET_H