diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-12-15 10:20:07 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-12-15 18:47:19 +0200 |
commit | fa42589cef090379bda4ea4e0838474520f9f4f6 (patch) | |
tree | ab72ba27e1b0f92b559053b2a3034f4105bcaa8e /libproto/imap/tests/imapfolder.c | |
parent | 0e8ae1c37611759936ce66eefff2ef392c3b8de0 (diff) | |
download | mailutils-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.c | 242 |
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; +} |