/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . * * Authors: Michael Zucchi */ #if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION) #error "Only can be included directly." #endif #ifndef CAMEL_FOLDER_SEARCH_H #define CAMEL_FOLDER_SEARCH_H #include #include #include /* Standard GObject macros */ #define CAMEL_TYPE_FOLDER_SEARCH \ (camel_folder_search_get_type ()) #define CAMEL_FOLDER_SEARCH(obj) \ (G_TYPE_CHECK_INSTANCE_CAST \ ((obj), CAMEL_TYPE_FOLDER_SEARCH, CamelFolderSearch)) #define CAMEL_FOLDER_SEARCH_CLASS(cls) \ (G_TYPE_CHECK_CLASS_CAST \ ((cls), CAMEL_TYPE_FOLDER_SEARCH, CamelFolderSearchClass)) #define CAMEL_IS_FOLDER_SEARCH(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE \ ((obj), CAMEL_TYPE_FOLDER_SEARCH)) #define CAMEL_IS_FOLDER_SEARCH_CLASS(cls) \ (G_TYPE_CHECK_CLASS_TYPE \ ((cls), CAMEL_TYPE_FOLDER_SEARCH)) #define CAMEL_FOLDER_SEARCH_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS \ ((obj), CAMEL_TYPE_FOLDER_SEARCH, CamelFolderSearchClass)) G_BEGIN_DECLS typedef struct _CamelFolderSearch CamelFolderSearch; typedef struct _CamelFolderSearchClass CamelFolderSearchClass; typedef struct _CamelFolderSearchPrivate CamelFolderSearchPrivate; struct _CamelFolderSearch { GObject parent; CamelFolderSearchPrivate *priv; CamelSExp *sexp; /* s-exp evaluator */ gchar *last_search; /* last searched expression */ /* these are only valid during the search, and are reset afterwards */ CamelFolder *folder; /* folder for current search */ GPtrArray *summary; /* summary array for current search */ GPtrArray *summary_set; /* subset of summary to actually include in search */ CamelMessageInfo *current; /* current message info, when searching one by one */ CamelMimeMessage *current_message; /* cache of current message, if required */ CamelIndex *body_index; }; struct _CamelFolderSearchClass { GObjectClass parent_class; /* General bool/comparison options. Usually these won't need * to be set, unless it is compiling into another language. */ CamelSExpResult * (*and_) (CamelSExp *sexp, gint argc, CamelSExpTerm **argv, CamelFolderSearch *search); CamelSExpResult * (*or_) (CamelSExp *sexp, gint argc, CamelSExpTerm **argv, CamelFolderSearch *search); CamelSExpResult * (*not_) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); CamelSExpResult * (*lt) (CamelSExp *sexp, gint argc, CamelSExpTerm **argv, CamelFolderSearch *search); CamelSExpResult * (*gt) (CamelSExp *sexp, gint argc, CamelSExpTerm **argv, CamelFolderSearch *search); CamelSExpResult * (*eq) (CamelSExp *sexp, gint argc, CamelSExpTerm **argv, CamelFolderSearch *search); /* Search Options */ /* (match-all [boolean expression]) * Apply match to all messages. */ CamelSExpResult * (*match_all) (CamelSExp *sexp, gint argc, CamelSExpTerm **argv, CamelFolderSearch *search); /* (match-threads "type" [array expression]) * Add all related threads. */ CamelSExpResult * (*match_threads) (CamelSExp *sexp, gint argc, CamelSExpTerm **argv, CamelFolderSearch *search); /* (body-contains "string1" "string2" ...) * Returns a list of matches, or true if in single-message mode. */ CamelSExpResult * (*body_contains) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (body-regex "regex") * Returns a list of matches, or true if in single-message mode. */ CamelSExpResult * (*body_regex) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (header-contains "headername" "string1" ...) * List of matches, or true if in single-message mode. */ CamelSExpResult * (*header_contains) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (header-matches "headername" "string") */ CamelSExpResult * (*header_matches) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (header-starts-with "headername" "string") */ CamelSExpResult * (*header_starts_with) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (header-ends-with "headername" "string") */ CamelSExpResult * (*header_ends_with) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (header-exists "headername") */ CamelSExpResult * (*header_exists) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (header-soundex "headername" "string") */ CamelSExpResult * (*header_soundex) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (header-regex "headername" "regex_string") */ CamelSExpResult * (*header_regex) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (header-full-regex "regex") */ CamelSExpResult * (*header_full_regex) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (user-flag "flagname" "flagname" ...) * If one of user-flag set. */ CamelSExpResult * (*user_flag) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (user-tag "flagname") * Returns the value of a user tag. Can only be used in match-all. */ CamelSExpResult * (*user_tag) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (system-flag "flagname") * Returns the value of a system flag. * Can only be used in match-all. */ CamelSExpResult * (*system_flag) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (get-sent-date) * Retrieve the date that the message was sent on as a time_t. */ CamelSExpResult * (*get_sent_date) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (get-received-date) * Retrieve the date that the message was received on as a time_t. */ CamelSExpResult * (*get_received_date) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (get-current-date) * Retrieve 'now' as a time_t. */ CamelSExpResult * (*get_current_date) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (get-relative-months) * Retrieve relative seconds from 'now' and * specified number of months as a time_t. */ CamelSExpResult * (*get_relative_months) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (get-size) * Retrieve message size as an gint (in kilobytes). */ CamelSExpResult * (*get_size) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (uid "uid" ...) * True if the uid is in the list. */ CamelSExpResult * (*uid) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); /* (message-location "folder_string") * True if the message is in the folder's full name "folder_string". */ CamelSExpResult * (*message_location) (CamelSExp *sexp, gint argc, CamelSExpResult **argv, CamelFolderSearch *search); }; GType camel_folder_search_get_type (void) G_GNUC_CONST; CamelFolderSearch * camel_folder_search_new (void); /* XXX This stuff currently gets cleared when you run a search. * What on earth was i thinking ... */ void camel_folder_search_set_folder (CamelFolderSearch *search, CamelFolder *folder); void camel_folder_search_set_summary (CamelFolderSearch *search, GPtrArray *summary); void camel_folder_search_set_body_index (CamelFolderSearch *search, CamelIndex *body_index); GPtrArray * camel_folder_search_search (CamelFolderSearch *search, const gchar *expr, GPtrArray *uids, GCancellable *cancellable, GError **error); guint32 camel_folder_search_count (CamelFolderSearch *search, const gchar *expr, GCancellable *cancellable, GError **error); void camel_folder_search_free_result (CamelFolderSearch *search, GPtrArray *); /* XXX This belongs in a general utility file. */ time_t camel_folder_search_util_add_months (time_t t, gint months); #ifndef CAMEL_DISABLE_DEPRECATED void camel_folder_search_construct (CamelFolderSearch *search); #endif /* CAMEL_DISABLE_DEPRECATED */ G_END_DECLS #endif /* CAMEL_FOLDER_SEARCH_H */