summaryrefslogtreecommitdiff
path: root/src/camel/camel-folder-search.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/camel/camel-folder-search.h')
-rw-r--r--src/camel/camel-folder-search.h305
1 files changed, 305 insertions, 0 deletions
diff --git a/src/camel/camel-folder-search.h b/src/camel/camel-folder-search.h
new file mode 100644
index 000000000..7c88f68d9
--- /dev/null
+++ b/src/camel/camel-folder-search.h
@@ -0,0 +1,305 @@
+/* -*- 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Michael Zucchi <notzed@ximian.com>
+ */
+
+#if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
+#error "Only <camel/camel.h> can be included directly."
+#endif
+
+#ifndef CAMEL_FOLDER_SEARCH_H
+#define CAMEL_FOLDER_SEARCH_H
+
+#include <camel/camel-folder.h>
+#include <camel/camel-index.h>
+#include <camel/camel-sexp.h>
+
+/* 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 *result);
+
+/* 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 */