summaryrefslogtreecommitdiff
path: root/libproto/imap/tests/imapfolder.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-12-15 10:20:07 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2011-12-15 18:47:19 +0200
commitfa42589cef090379bda4ea4e0838474520f9f4f6 (patch)
treeab72ba27e1b0f92b559053b2a3034f4105bcaa8e /libproto/imap/tests/imapfolder.c
parent0e8ae1c37611759936ce66eefff2ef392c3b8de0 (diff)
downloadmailutils-fa42589cef090379bda4ea4e0838474520f9f4f6.tar.gz
mailutils-fa42589cef090379bda4ea4e0838474520f9f4f6.tar.bz2
imap client: implement folder API.
* libmailutils/list/listlist.c (mu_list_append_list): Do nothing if the source list is empty. * include/mailutils/sys/imap.h (_mu_imap_url_init) (_mu_imaps_url_init): New protos. * libproto/imap/Makefile.am (libmu_imap_la_SOURCES): Restore url.c * libproto/imap/mbox.c: Deleted * libproto/imap/url.c: Rewrite. * libproto/imap/folder.c: Rewrite from scratch. * configure.ac: Build libproto/imap/tests/Makefile * include/mailutils/imap.h (mu_imap_session_state) (mu_imap_iserror, mu_imap_clearerr) (mu_imap_login_secret): New protos. * include/mailutils/sys/imap.h (_mu_imap_list_element_is_nil): New proto. * libmailutils/mailbox/folder.c (mu_folder_list): Pass MU_FOLDER_ATTRIBUTE_ALL. * libproto/imap/fake-folder.c: Remove. * libproto/imap/Makefile.am (libmu_imap_la_SOURCES): Remove fake-folder.c Add url.c and folder.c * libproto/imap/create.c (mu_imap_session_state) (mu_imap_iserror, mu_imap_clearerr): New functions. * libproto/imap/delete.c: Check input parameters. * libproto/imap/fetch.c: Use _mu_imap_list_element_is_nil to check for empty lists. * libproto/imap/genlist.c: Likewise. * libproto/imap/rename.c: Likewise. * libproto/imap/subscribe.c: Likewise. * libproto/imap/unsubscribe.c: Likewise. * libproto/imap/resplist.c: Treat NIL and () equally. * libproto/imap/login.c (mu_imap_login_secret): New function. * mu/imap.c: Fix a typo.
Diffstat (limited to 'libproto/imap/tests/imapfolder.c')
-rw-r--r--libproto/imap/tests/imapfolder.c242
1 files changed, 242 insertions, 0 deletions
diff --git a/libproto/imap/tests/imapfolder.c b/libproto/imap/tests/imapfolder.c
new file mode 100644
index 000000000..cb3a08bf7
--- /dev/null
+++ b/libproto/imap/tests/imapfolder.c
@@ -0,0 +1,242 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ 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; either
+ version 3 of the License, or (at your option) any later version.
+
+ 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <mailutils/mailutils.h>
+
+struct command
+{
+ char *verb;
+ int nargs;
+ char *args;
+ void (*handler) (mu_folder_t folder, char **argv);
+};
+
+static int
+_print_list_entry (void *item, void *data)
+{
+ struct mu_list_response *resp = item;
+ mu_printf ("%c%c %c %4d %s\n",
+ (resp->type & MU_FOLDER_ATTRIBUTE_DIRECTORY) ? 'd' : '-',
+ (resp->type & MU_FOLDER_ATTRIBUTE_FILE) ? 'f' : '-',
+ resp->separator ? resp->separator : ' ',
+ resp->level,
+ resp->name);
+ return 0;
+}
+
+static void
+com_list (mu_folder_t folder, char **argv)
+{
+ int rc;
+ mu_list_t list;
+
+ mu_printf ("listing %s %s\n", argv[0], argv[1]);
+ rc = mu_folder_list (folder, argv[0], argv[1], 0, &list);
+ if (rc)
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_list", argv[0], rc);
+ else
+ {
+ mu_list_foreach (list, _print_list_entry, NULL);
+ mu_list_destroy (&list);
+ }
+}
+
+static void
+com_lsub (mu_folder_t folder, char **argv)
+{
+ int rc;
+ mu_list_t list;
+
+ mu_printf ("listing subscriptions for '%s' '%s'\n", argv[0], argv[1]);
+ rc = mu_folder_lsub (folder, argv[0], argv[1], &list);
+ if (rc)
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_lsub", argv[0], rc);
+ else
+ {
+ mu_list_foreach (list, _print_list_entry, NULL);
+ mu_list_destroy (&list);
+ }
+}
+
+static void
+com_delete (mu_folder_t folder, char **argv)
+{
+ int rc;
+
+ mu_printf ("deleting %s\n", argv[0]);
+ rc = mu_folder_delete (folder, argv[0]);
+ if (rc)
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_lsub", argv[0], rc);
+ else
+ mu_printf ("delete successful\n");
+}
+
+static void
+com_rename (mu_folder_t folder, char **argv)
+{
+ int rc;
+
+ mu_printf ("renaming %s to %s\n", argv[0], argv[1]);
+ rc = mu_folder_rename (folder, argv[0], argv[1]);
+ if (rc)
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_rename", argv[0], rc);
+ else
+ mu_printf ("rename successful\n");
+}
+
+static void
+com_subscribe (mu_folder_t folder, char **argv)
+{
+ int rc;
+
+ mu_printf ("subscribing %s\n", argv[0]);
+ rc = mu_folder_subscribe (folder, argv[0]);
+ if (rc)
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_subscribe", argv[0], rc);
+ else
+ mu_printf ("subscribe successful\n");
+}
+
+static void
+com_unsubscribe (mu_folder_t folder, char **argv)
+{
+ int rc;
+
+ mu_printf ("unsubscribing %s\n", argv[0]);
+ rc = mu_folder_unsubscribe (folder, argv[0]);
+ if (rc)
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_unsubscribe", argv[0], rc);
+ else
+ mu_printf ("unsubscribe successful\n");
+}
+
+static struct command comtab[] = {
+ { "list", 2, "REF MBX", com_list },
+ { "lsub", 2, "REF MBX", com_lsub },
+ { "delete", 1, "MBX", com_delete },
+ { "rename", 2, "OLD NEW", com_rename },
+ { "delete", 1, "MBOX", com_delete },
+ { "subscribe", 1, "MBX", com_subscribe },
+ { "unsubscribe", 1, "MBX", com_unsubscribe },
+ { NULL }
+};
+
+static struct command *
+find_command (const char *name)
+{
+ struct command *cp;
+
+ for (cp = comtab; cp->verb; cp++)
+ if (strcmp (cp->verb, name) == 0)
+ return cp;
+ return NULL;
+}
+
+static void
+usage ()
+{
+ struct command *cp;
+
+ mu_printf (
+ "usage: %s [debug=SPEC] url=URL OP ARG [ARG...] [OP ARG [ARG...]...]\n",
+ mu_program_name);
+ mu_printf ("OPerations and corresponding ARGuments are:\n");
+ for (cp = comtab; cp->verb; cp++)
+ mu_printf (" %s %s\n", cp->verb, cp->args);
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ int rc;
+ mu_folder_t folder;
+ char *fname = NULL;
+
+ mu_set_program_name (argv[0]);
+ mu_registrar_record (mu_imap_record);
+ mu_registrar_record (mu_imaps_record);
+
+ if (argc == 1)
+ {
+ usage ();
+ exit (0);
+ }
+
+ for (i = 1; i < argc; i++)
+ {
+ if (strncmp (argv[i], "debug=", 6) == 0)
+ mu_debug_parse_spec (argv[i] + 6);
+ else if (strncmp (argv[i], "url=", 4) == 0)
+ fname = argv[i] + 4;
+ else
+ break;
+ }
+
+ if (!fname)
+ {
+ mu_error ("URL not specified");
+ exit (1);
+ }
+
+ rc = mu_folder_create (&folder, fname);
+ if (rc)
+ {
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_create", fname, rc);
+ return 1;
+ }
+
+ rc = mu_folder_open (folder, MU_STREAM_READ);
+ if (rc)
+ {
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_open", fname, rc);
+ return 1;
+ }
+
+ while (i < argc)
+ {
+ char *comargs[2];
+ struct command *cmd;
+
+ cmd = find_command (argv[i]);
+ if (!cmd)
+ {
+ mu_error ("unknown command %s\n", argv[i]);
+ break;
+ }
+
+ i++;
+ if (i + cmd->nargs > argc)
+ {
+ mu_error ("not enough arguments for %s", cmd->verb);
+ break;
+ }
+ memcpy (comargs, argv + i, cmd->nargs * sizeof (comargs[0]));
+ i += cmd->nargs;
+
+ cmd->handler (folder, comargs);
+ }
+
+ mu_folder_close (folder);
+ mu_folder_destroy (&folder);
+
+ return 0;
+}

Return to:

Send suggestions and report system problems to the System administrator.