aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/imap/camel-imap-search.c
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers/imap/camel-imap-search.c')
-rw-r--r--camel/providers/imap/camel-imap-search.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/camel/providers/imap/camel-imap-search.c b/camel/providers/imap/camel-imap-search.c
new file mode 100644
index 0000000000..1aa6b55bc5
--- /dev/null
+++ b/camel/providers/imap/camel-imap-search.c
@@ -0,0 +1,131 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* camel-imap-search.c: IMAP folder search */
+
+/*
+ * Authors:
+ * Dan Winship <danw@helixcode.com>
+ *
+ * Copyright 2000 Helix Code, Inc. (www.helixcode.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#include <config.h>
+
+#include <string.h>
+
+#include "camel-imap-command.h"
+#include "camel-imap-folder.h"
+#include "camel-imap-search.h"
+
+static ESExpResult *
+imap_body_contains (struct _ESExp *f, int argc, struct _ESExpResult **argv,
+ CamelFolderSearch *s);
+
+static void
+camel_imap_search_class_init (CamelImapSearchClass *camel_imap_search_class)
+{
+ /* virtual method overload */
+ CamelFolderSearchClass *camel_folder_search_class =
+ CAMEL_FOLDER_SEARCH_CLASS (camel_imap_search_class);
+
+ /* virtual method overload */
+ camel_folder_search_class->body_contains = imap_body_contains;
+}
+
+CamelType
+camel_imap_search_get_type (void)
+{
+ static CamelType camel_imap_search_type = CAMEL_INVALID_TYPE;
+
+ if (camel_imap_search_type == CAMEL_INVALID_TYPE) {
+ camel_imap_search_type = camel_type_register (
+ CAMEL_FOLDER_SEARCH_TYPE, "CamelImapSearch",
+ sizeof (CamelImapSearch),
+ sizeof (CamelImapSearchClass),
+ (CamelObjectClassInitFunc) camel_imap_search_class_init,
+ NULL, NULL, NULL);
+ }
+
+ return camel_imap_search_type;
+}
+
+static ESExpResult *
+imap_body_contains (struct _ESExp *f, int argc, struct _ESExpResult **argv,
+ CamelFolderSearch *s)
+{
+ CamelImapStore *store = CAMEL_IMAP_STORE (s->folder->parent_store);
+ CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (s->folder);
+ char *value = argv[0]->value.string;
+ CamelImapResponse *response;
+ char *result, *p, *lasts = NULL;
+ const char *uid;
+ ESExpResult *r;
+ CamelMessageInfo *info;
+
+ if (s->current) {
+ uid = camel_message_info_uid (s->current);
+ r = e_sexp_result_new (ESEXP_RES_BOOL);
+ r->value.bool = FALSE;
+ response = camel_imap_command (store, s->folder, NULL,
+ "UID SEARCH UID %s BODY \"%s\"",
+ uid, value);
+ } else {
+ r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR);
+ r->value.ptrarray = g_ptr_array_new ();
+ response = camel_imap_command (store, s->folder, NULL,
+ "UID SEARCH BODY \"%s\"",
+ value);
+ }
+ if (!response)
+ return r;
+ result = camel_imap_response_extract (response, "SEARCH", NULL);
+ if (!result)
+ return r;
+
+ p = result + sizeof ("* SEARCH");
+ for (p = strtok_r (p, " ", &lasts); p; p = strtok_r (NULL, " ", &lasts)) {
+ if (s->current) {
+ if (!strcmp (uid, p)) {
+ r->value.bool = TRUE;
+ break;
+ }
+ } else {
+ /* FIXME: The strings added to the array must be
+ * static...
+ */
+ info = camel_folder_summary_uid (imap_folder->summary, p);
+ g_ptr_array_add (r->value.ptrarray, (char *)camel_message_info_uid (info));
+ }
+ }
+
+ return r;
+}
+
+/**
+ * camel_imap_search_new:
+ *
+ * Return value: A new CamelImapSearch widget.
+ **/
+CamelFolderSearch *
+camel_imap_search_new (void)
+{
+ CamelFolderSearch *new = CAMEL_FOLDER_SEARCH (camel_object_new (camel_imap_search_get_type ()));
+
+ camel_folder_search_construct (new);
+ return new;
+}