1998-03-28 05:44:41 +03:00
|
|
|
/* -*- 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.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.
|
|
|
|
*/
|
|
|
|
/* foobar Public API for mail (and news?) filters */
|
|
|
|
#ifndef MSG_RULE_H
|
|
|
|
#define MSG_RULE_H
|
|
|
|
|
|
|
|
/*
|
|
|
|
Terminology - Filter - either a Rule (defined with GUI) or a (Java) Script
|
|
|
|
Rule -
|
|
|
|
*/
|
|
|
|
#include "msg_srch.h"
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
FilterError_Success = 0, /* no error */
|
|
|
|
FilterError_First = SearchError_Last + 1, /* no functions return this; just for bookkeeping */
|
|
|
|
FilterError_NotImplemented, /* coming soon */
|
|
|
|
FilterError_OutOfMemory, /* out of memory */
|
|
|
|
FilterError_FileError, /* error reading or writing the rules file */
|
|
|
|
FilterError_InvalidVersion, /* invalid filter file version */
|
|
|
|
FilterError_InvalidIndex, /* Invalid filter index */
|
|
|
|
FilterError_InvalidMotion, /* invalid filter move motion */
|
|
|
|
FilterError_InvalidFilterType, /* method doesn't accept this filter type */
|
|
|
|
FilterError_NullPointer, /* a required pointer parameter was null */
|
|
|
|
FilterError_NotRule, /* tried to get rule for non-rule filter */
|
|
|
|
FilterError_NotScript, /* tried to get a script name for a non-script filter */
|
|
|
|
FilterError_InvalidAction, /* invalid action */
|
|
|
|
FilterError_SearchError, /* error in search code */
|
|
|
|
FilterError_Last /* no functions return this; just for bookkeeping */
|
|
|
|
} MSG_FilterError;
|
|
|
|
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
acNone, /* uninitialized state */
|
|
|
|
acMoveToFolder,
|
|
|
|
acChangePriority,
|
|
|
|
acDelete,
|
|
|
|
acMarkRead,
|
|
|
|
acKillThread,
|
|
|
|
acWatchThread
|
|
|
|
} MSG_RuleActionType;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
filterInboxRule = 0x1,
|
|
|
|
filterInboxJavaScript = 0x2,
|
|
|
|
filterInbox = 0x3,
|
|
|
|
filterNewsRule = 0x4,
|
|
|
|
filterNewsJavaScript = 0x8,
|
|
|
|
filterNews=0xb,
|
|
|
|
filterAll=0xf
|
|
|
|
} MSG_FilterType;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
filterUp,
|
|
|
|
filterDown
|
|
|
|
} MSG_FilterMotion;
|
|
|
|
|
|
|
|
typedef int32 MSG_FilterIndex;
|
|
|
|
|
|
|
|
/* opaque struct defs - defined in libmsg/pmsgfilt.h */
|
|
|
|
#ifdef XP_CPLUSPLUS
|
|
|
|
struct MSG_Filter;
|
|
|
|
struct MSG_Rule;
|
|
|
|
struct MSG_RuleAction;
|
|
|
|
struct MSG_FilterList;
|
|
|
|
#else
|
|
|
|
typedef struct MSG_FilterList MSG_FilterList;
|
|
|
|
typedef struct MSG_Filter MSG_Filter;
|
|
|
|
typedef struct MSG_Rule MSG_Rule;
|
|
|
|
typedef struct MSG_RuleAction MSG_RuleAction;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
XP_BEGIN_PROTOS
|
|
|
|
|
|
|
|
/* Front ends call MSG_OpenFilterList to get a handle to a FilterList, of existing MSG_Filter *.
|
|
|
|
These are manipulated by the front ends as a result of user interaction
|
|
|
|
with dialog boxes. To apply the new list, fe's call MSG_CloseFilterList.
|
|
|
|
|
|
|
|
For example, if the user brings up the rule management UI, deletes a rule,
|
|
|
|
and presses OK, the front end calls MSG_RemoveFilterListAt, and
|
|
|
|
then MSG_CloseFilterList.
|
|
|
|
|
|
|
|
*/
|
|
|
|
MSG_FilterError MSG_OpenFilterList(MSG_Master *master, MSG_FilterType type, MSG_FilterList **filterList);
|
|
|
|
MSG_FilterError MSG_OpenFolderFilterList(MSG_Pane *pane, MSG_FolderInfo *folder, MSG_FilterType type, MSG_FilterList **filterList);
|
1998-06-23 01:21:28 +04:00
|
|
|
MSG_FilterError MSG_OpenFolderFilterListFromMaster(MSG_Master *master, MSG_FolderInfo *folder, MSG_FilterType type, MSG_FilterList **filterList);
|
1998-03-28 05:44:41 +03:00
|
|
|
MSG_FilterError MSG_CloseFilterList(MSG_FilterList *filterList);
|
|
|
|
MSG_FilterError MSG_SaveFilterList(MSG_FilterList *filterList); /* save without deleting */
|
|
|
|
MSG_FilterError MSG_CancelFilterList(MSG_FilterList *filterList);
|
|
|
|
|
|
|
|
MSG_FolderInfo *MSG_GetFolderInfoForFilterList(MSG_FilterList *filterList);
|
|
|
|
MSG_FilterError MSG_GetFilterCount(MSG_FilterList *filterList, int32 *pCount);
|
|
|
|
MSG_FilterError MSG_GetFilterAt(MSG_FilterList *filterList,
|
|
|
|
MSG_FilterIndex filterIndex, MSG_Filter **filter);
|
|
|
|
/* these methods don't delete filters - they just change the list. FE still must
|
|
|
|
call MSG_DestroyFilter to delete a filter.
|
|
|
|
*/
|
|
|
|
MSG_FilterError MSG_SetFilterAt(MSG_FilterList *filterList,
|
|
|
|
MSG_FilterIndex filterIndex, MSG_Filter *filter);
|
|
|
|
MSG_FilterError MSG_RemoveFilterAt(MSG_FilterList *filterList,
|
|
|
|
MSG_FilterIndex filterIndex);
|
|
|
|
MSG_FilterError MSG_MoveFilterAt(MSG_FilterList *filterList,
|
|
|
|
MSG_FilterIndex filterIndex, MSG_FilterMotion motion);
|
|
|
|
MSG_FilterError MSG_InsertFilterAt(MSG_FilterList *filterList,
|
|
|
|
MSG_FilterIndex filterIndex, MSG_Filter *filter);
|
|
|
|
|
|
|
|
MSG_FilterError MSG_EnableLogging(MSG_FilterList *filterList, XP_Bool enable);
|
|
|
|
XP_Bool MSG_IsLoggingEnabled(MSG_FilterList *filterList);
|
|
|
|
|
|
|
|
/* In general, any data gotten with MSG_*Get is good until the owning object
|
|
|
|
is deleted, or the data is replaced with a MSG_*Set call. For example, the name
|
|
|
|
returned in MSG_GetFilterName is valid until either the filter is destroyed,
|
|
|
|
or MSG_SetFilterName is called on the same filter.
|
|
|
|
*/
|
|
|
|
MSG_FilterError MSG_CreateFilter (MSG_FilterType type, char *name, MSG_Filter **result);
|
|
|
|
MSG_FilterError MSG_DestroyFilter(MSG_Filter *filter);
|
|
|
|
MSG_FilterError MSG_GetFilterType(MSG_Filter *, MSG_FilterType *filterType);
|
|
|
|
MSG_FilterError MSG_EnableFilter(MSG_Filter *, XP_Bool enable);
|
|
|
|
MSG_FilterError MSG_IsFilterEnabled(MSG_Filter *, XP_Bool *enabled);
|
|
|
|
MSG_FilterError MSG_GetFilterRule(MSG_Filter *, MSG_Rule ** result);
|
|
|
|
MSG_FilterError MSG_GetFilterName(MSG_Filter *, char **name);
|
|
|
|
MSG_FilterError MSG_SetFilterName(MSG_Filter *, const char *name);
|
|
|
|
MSG_FilterError MSG_GetFilterDesc(MSG_Filter *, char **description);
|
|
|
|
MSG_FilterError MSG_SetFilterDesc(MSG_Filter*, const char *description);
|
|
|
|
MSG_FilterError MSG_GetFilterScript(MSG_Filter *, char **name);
|
|
|
|
MSG_FilterError MSG_SetFilterScript(MSG_Filter *, const char *name);
|
|
|
|
|
|
|
|
MSG_FilterError MSG_RuleAddTerm(MSG_Rule *,
|
|
|
|
MSG_SearchAttribute attrib, /* attribute for this term */
|
|
|
|
MSG_SearchOperator op, /* operator e.g. opContains */
|
|
|
|
MSG_SearchValue *value, /* value e.g. "Dogbert" */
|
|
|
|
XP_Bool BooleanAND, /* TRUE if AND is the boolean operator. FALSE if OR is the boolean operators */
|
|
|
|
char * arbitraryHeader); /* arbitrary header specified by user. ignored unless attrib = attribOtherHeader */
|
|
|
|
|
|
|
|
MSG_FilterError MSG_RuleGetNumTerms(MSG_Rule *, int32 *numTerms);
|
|
|
|
|
|
|
|
MSG_FilterError MSG_RuleGetTerm(MSG_Rule *, int32 termIndex,
|
|
|
|
MSG_SearchAttribute *attrib, /* attribute for this term */
|
|
|
|
MSG_SearchOperator *op, /* operator e.g. opContains */
|
|
|
|
MSG_SearchValue *value, /* value e.g. "Dogbert" */
|
|
|
|
XP_Bool *BooleanAnd, /* TRUE if AND is the boolean operator. FALSE if OR is the boolean operator */
|
|
|
|
char ** arbitraryHeader); /* arbitrary header specified by user. ignore unless attrib = attribOtherHeader */
|
|
|
|
|
|
|
|
MSG_FilterError MSG_RuleSetScope(MSG_Rule *, MSG_ScopeTerm *scope);
|
|
|
|
MSG_FilterError MSG_RuleGetScope(MSG_Rule *, MSG_ScopeTerm **scope);
|
|
|
|
|
|
|
|
/* if type is acChangePriority, value is a pointer to priority.
|
|
|
|
If type is acMoveToFolder, value is pointer to folder name.
|
|
|
|
Otherwise, value is ignored.
|
|
|
|
*/
|
|
|
|
MSG_FilterError MSG_RuleSetAction(MSG_Rule *, MSG_RuleActionType type, void *value);
|
|
|
|
MSG_FilterError MSG_RuleGetAction(MSG_Rule *, MSG_RuleActionType *type, void **value);
|
|
|
|
|
|
|
|
/* help FEs manage menu choices in Filter dialog box */
|
|
|
|
|
|
|
|
/* Use this to help build menus in the filter dialogs. See APIs below */
|
|
|
|
typedef struct MSG_RuleMenuItem
|
|
|
|
{
|
|
|
|
int16 attrib;
|
|
|
|
char name[32];
|
|
|
|
} MSG_RuleMenuItem;
|
|
|
|
|
|
|
|
|
|
|
|
MSG_FilterError MSG_GetRuleActionMenuItems (
|
|
|
|
MSG_FilterType type, /* type of filter */
|
|
|
|
MSG_RuleMenuItem *items, /* array of caller-allocated structs */
|
|
|
|
uint16 *maxItems); /* in- max array size; out- num returned */
|
|
|
|
|
|
|
|
MSG_FilterError MSG_GetFilterWidgetForAction( MSG_RuleActionType action,
|
|
|
|
MSG_SearchValueWidget *widget );
|
|
|
|
|
|
|
|
MSG_SearchError MSG_GetValuesForAction( MSG_RuleActionType action,
|
|
|
|
MSG_SearchMenuItem *items,
|
|
|
|
uint16 *maxItems);
|
|
|
|
|
|
|
|
void MSG_ViewFilterLog(MSG_Pane *pane);
|
|
|
|
|
|
|
|
/*
|
|
|
|
** Adding/editting javascript filters.
|
|
|
|
**
|
|
|
|
** The FE calls one of the below functions, along with a callback and some closure
|
|
|
|
** data. This callback is invoked when the user clicks OK in the JS filter dialog.
|
|
|
|
** If CANCEL is pressed, the callback is not invoked.
|
|
|
|
**
|
|
|
|
** If the user called MSG_EditJSFilter, the filter_index parameter of the callback
|
|
|
|
** is the same one passed in. If the user called MSG_NewJSFilter, the filter_index
|
|
|
|
** parameter is -1.
|
|
|
|
**
|
|
|
|
** The filter_changed parameter is TRUE if the user modified any of the fields of
|
|
|
|
** the javascript filter, and FALSE otherwise.
|
|
|
|
*/
|
|
|
|
typedef void (*JSFilterCallback)(void* arg, MSG_FilterIndex filter_index, XP_Bool filter_changed);
|
|
|
|
|
|
|
|
void MSG_EditJSFilter(MWContext *context, MSG_FilterList *filter_list,
|
|
|
|
MSG_FilterIndex filter_index,
|
|
|
|
JSFilterCallback cb, void *arg);
|
|
|
|
void MSG_NewJSFilter(MWContext *context, MSG_FilterList *filter_list,
|
|
|
|
MSG_FilterType filter_type, JSFilterCallback cb, void *arg);
|
|
|
|
|
|
|
|
XP_END_PROTOS
|
|
|
|
|
|
|
|
#endif
|