diff options
Diffstat (limited to 'camel/camel-filter-driver.c')
-rw-r--r-- | camel/camel-filter-driver.c | 79 |
1 files changed, 65 insertions, 14 deletions
diff --git a/camel/camel-filter-driver.c b/camel/camel-filter-driver.c index 1b9c30efb6..221947601c 100644 --- a/camel/camel-filter-driver.c +++ b/camel/camel-filter-driver.c @@ -67,11 +67,16 @@ struct _filter_rule { struct _CamelFilterDriverPrivate { GHashTable *globals; /* global variables */ - - CamelFolder *defaultfolder; /* defualt folder */ - CamelFilterStatusFunc *statusfunc; /* status callback */ - void *statusdata; /* status callback data */ + int filtered_count; /* count of the number of messages filtered so far */ + + CamelFolder *defaultfolder; /* defualt folder */ + + CamelFilterStatusFunc *statusfunc; /* status callback */ + void *statusdata; /* status callback data */ + + CamelFilterShellExecFunc *execfunc; /* execute shell command callback */ + void *execdata; /* execute shell command data */ /* for callback */ CamelFilterGetFolderFunc get_folder; @@ -120,6 +125,7 @@ static ESExpResult *do_stop (struct _ESExp *f, int argc, struct _ESExpResult **a static ESExpResult *do_colour (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFilterDriver *); static ESExpResult *do_score (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFilterDriver *); static ESExpResult *do_flag (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFilterDriver *); +static ESExpResult *shell_exec (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFilterDriver *); /* these are our filter actions - each must have a callback */ static struct { @@ -135,24 +141,26 @@ static struct { { "stop", (ESExpFunc *) do_stop, 0 }, { "set-colour", (ESExpFunc *) do_colour, 0 }, { "set-score", (ESExpFunc *) do_score, 0 }, - { "set-system-flag", (ESExpFunc *) do_flag, 0 } + { "set-system-flag", (ESExpFunc *) do_flag, 0 }, + { "shell-exec", (ESExpFunc *) shell_exec, 0 } }; static CamelObjectClass *camel_filter_driver_parent; -guint +CamelType camel_filter_driver_get_type (void) { static CamelType type = CAMEL_INVALID_TYPE; if (type == CAMEL_INVALID_TYPE) { - type = camel_type_register(CAMEL_OBJECT_TYPE, "CamelFilterDriver", - sizeof(CamelFilterDriver), - sizeof(CamelFilterDriverClass), - (CamelObjectClassInitFunc)camel_filter_driver_class_init, - NULL, - (CamelObjectInitFunc)camel_filter_driver_init, - (CamelObjectFinalizeFunc)camel_filter_driver_finalise); + type = camel_type_register (CAMEL_OBJECT_TYPE, + "CamelFilterDriver", + sizeof (CamelFilterDriver), + sizeof (CamelFilterDriverClass), + (CamelObjectClassInitFunc) camel_filter_driver_class_init, + NULL, + (CamelObjectInitFunc) camel_filter_driver_init, + (CamelObjectFinalizeFunc) camel_filter_driver_finalise); } return type; @@ -241,6 +249,22 @@ camel_filter_driver_new (void) } void +camel_filter_driver_reset_filtered_count (CamelFilterDriver *driver) +{ + struct _CamelFilterDriverPrivate *p = _PRIVATE (driver); + + p->filtered_count = 0; +} + +int +camel_filter_driver_get_filtered_count (CamelFilterDriver *driver) +{ + struct _CamelFilterDriverPrivate *p = _PRIVATE (driver); + + return p->filtered_count; +} + +void camel_filter_driver_set_folder_func (CamelFilterDriver *d, CamelFilterGetFolderFunc get_folder, void *data) { struct _CamelFilterDriverPrivate *p = _PRIVATE (d); @@ -267,6 +291,15 @@ camel_filter_driver_set_status_func (CamelFilterDriver *d, CamelFilterStatusFunc } void +camel_filter_driver_set_shell_exec_func (CamelFilterDriver *d, CamelFilterShellExecFunc *func, void *data) +{ + struct _CamelFilterDriverPrivate *p = _PRIVATE (d); + + p->execfunc = func; + p->execdata = data; +} + +void camel_filter_driver_set_default_folder (CamelFilterDriver *d, CamelFolder *def) { struct _CamelFilterDriverPrivate *p = _PRIVATE (d); @@ -508,6 +541,22 @@ do_flag (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFilterDriv return NULL; } +static ESExpResult * +shell_exec (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFilterDriver *driver) +{ + struct _CamelFilterDriverPrivate *p = _PRIVATE (driver); + + d(fprintf (stderr, "executing shell command\n")); + + if (p->execfunc && argc == 1 && argv[0]->type == ESEXP_RES_STRING) { + p->execfunc (driver, argv[0]->value.string, p->execdata); + camel_filter_driver_log (driver, FILTER_LOG_ACTION, "Executing shell command: [%s]", + argv[0]->value.string); + } + + return NULL; +} + static CamelFolder * open_folder (CamelFilterDriver *driver, const char *folder_url) { @@ -907,7 +956,7 @@ camel_filter_driver_filter_message (CamelFilterDriver *driver, CamelMimeMessage result = camel_filter_search_match (p->message, p->info, original_source_url ? original_source_url : source_url, node->match, p->ex); - + switch (result) { case CAMEL_SEARCH_ERROR: goto error; @@ -964,6 +1013,8 @@ camel_filter_driver_filter_message (CamelFilterDriver *driver, CamelMimeMessage if (freeinfo) camel_message_info_free (info); + p->filtered_count++; + return 0; error: |