Changeset efeec7f


Ignore:
Timestamp:
Jul 9, 2011, 4:11:45 PM (13 years ago)
Author:
Jason Gross <jgross@mit.edu>
Branches:
master, release-1.10, release-1.8, release-1.9
Children:
a130fc5
Parents:
3eeb6ed
git-author:
Jason Gross <jgross@mit.edu> (05/23/11 19:06:48)
git-committer:
Jason Gross <jgross@mit.edu> (07/09/11 16:11:45)
Message:
Added a delete-and-expunge command.

This command is analogous to the delete command, except that it also
expunges only the {current,given} message.  It also takes an optional
--quiet parameter, because I plan to use it internally and don't want
spew on success.  Perhaps there's a better way to accomplish this...

I couldn't figure out how the existing delete command is supposed to
work internally.  The logic behind the delete-and-expunge command is as
follows:
We always update both the message list and the display.  So model the
command that will do much of the work,
owl_function_delete_and_expunge_message, off of owl_function_expunge.
owl_function_delete_and_expunge_message takes one argument, which is the
position of the item in the message list.  It deletes it from the
message list with a new function
owl_messagelist_delete_and_expunge_element.  This calls delete on the
underlying owl_list, so the errors (if any) on an index that is too big
might be unhelpful.

owl_function_delete_and_expunge_cur and
owl_function_delete_and_expunge_by_id both get the index of the relevant
message (and a function owl_messagelist_get_index_by_id is added to
messagelist.c to help the latter).  They owl_function_error if no such
message exists, and conditionally owl_function_makemsg on success.
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • commands.c

    ra16d7e5 refeec7f  
    693693              "current view.\n"),
    694694  OWLCMD_ALIAS("del", "delete"),
     695
     696  OWLCMD_ARGS("delete-and-expunge", owl_command_delete_and_expunge, OWL_CTX_INTERACTIVE,
     697              "delete a message",
     698              "delete-and-expunge [-id msgid] [-q | --quiet]",
     699              "If no message id is specified the current message is deleted.\n"
     700              "Otherwise the message with the given message id is deleted.\n"
     701              "If --quiet is specified, then there is no message displayed on\n"
     702              "success.\n"),
     703  OWLCMD_ALIAS("delx", "delete-and-expunge"),
    695704
    696705  OWLCMD_ARGS("undelete", owl_command_undelete, OWL_CTX_INTERACTIVE,
     
    23542363}
    23552364
     2365char *owl_command_delete_and_expunge(int argc, const char *const *argv, const char *buff)
     2366{
     2367  bool exclaim_success = true;
     2368
     2369  if (argc > 1 && (!strcmp(argv[1], "-q") || !strcmp(argv[1], "--quiet"))) {
     2370    exclaim_success = false;
     2371    argc--;
     2372    argv++;
     2373  } else if (!strcmp(argv[argc - 1], "-q") || !strcmp(argv[argc - 1], "--quiet")) {
     2374    exclaim_success = false;
     2375    argc--;
     2376  }
     2377
     2378  if (argc == 1) {
     2379    owl_function_delete_and_expunge_cur(exclaim_success);
     2380    return NULL;
     2381  }
     2382
     2383  if (argc == 3 && (!strcmp(argv[1], "-id") || !strcmp(argv[1], "--id"))) {
     2384    owl_function_delete_and_expunge_by_id(atoi(argv[2]), exclaim_success);
     2385    return NULL;
     2386  }
     2387
     2388  owl_function_makemsg("Unknown arguments to delete-and-expunge command");
     2389  return NULL;
     2390}
     2391
    23562392char *owl_command_undelete(int argc, const char *const *argv, const char *buff)
    23572393{
  • functions.c

    r3eeb6ed refeec7f  
    662662}
    663663
     664void owl_function_delete_and_expunge_message(int n)
     665{
     666  owl_messagelist *ml = owl_global_get_msglist(&g);
     667  owl_view *v = owl_global_get_current_view(&g);
     668  int lastmsgid = owl_function_get_curmsg_id(v);
     669
     670  /* delete and expunge the message */
     671  owl_messagelist_delete_and_expunge_element(ml, n);
     672
     673  owl_function_redisplay_to_nearest(lastmsgid, v);
     674}
     675
     676void owl_function_delete_and_expunge_cur(bool exclaim_success)
     677{
     678  int curmsg;
     679  const owl_view *v = owl_global_get_current_view(&g);
     680
     681  /* bail if there's no current message */
     682  if (owl_view_get_size(v) < 1) {
     683    owl_function_error("No current message to delete");
     684    return;
     685  }
     686
     687  /* delete the current message */
     688  curmsg = owl_global_get_curmsg(&g);
     689  owl_function_delete_and_expunge_message(curmsg);
     690  if (exclaim_success)
     691    owl_function_makemsg("Message deleted and expunged");
     692}
     693
    664694/* if move_after is 1, moves after the delete */
    665695void owl_function_deletecur(int move_after)
     
    16641694}
    16651695
     1696void owl_function_delete_and_expunge_by_id(int id, bool exclaim_success)
     1697{
     1698  const owl_messagelist *ml = owl_global_get_msglist(&g);
     1699  int msg = owl_messagelist_get_index_by_id(ml, id);
     1700  if (msg < 0) {
     1701    owl_function_error("No message with id %d: unable to delete", id);
     1702  } else {
     1703    owl_function_delete_and_expunge_message(msg);
     1704    if (exclaim_success)
     1705      owl_function_makemsg("Message deleted and expunged");
     1706  }
     1707}
     1708
    16661709/* note: this applies to global message list, not to view.
    16671710 * If flag is 1, deletes.  If flag is 0, undeletes. */
  • messagelist.c

    r901cee9 refeec7f  
    3030}
    3131
    32 owl_message *owl_messagelist_get_by_id(const owl_messagelist *ml, int target_id)
     32int owl_messagelist_get_index_by_id(const owl_messagelist *ml, int target_id)
    3333{
    34   /* return the message with id == 'id'.  If it doesn't exist return NULL. */
     34  /* return the message index with id == 'id'.  If it doesn't exist return -1. */
    3535  int first, last, mid, msg_id;
    3636  owl_message *m;
     
    4343    msg_id = owl_message_get_id(m);
    4444    if (msg_id == target_id) {
    45       return(m);
     45      return mid;
    4646    } else if (msg_id < target_id) {
    4747      first = mid + 1;
     
    5050    }
    5151  }
    52   return(NULL);
     52  return -1;
     53}
     54
     55owl_message *owl_messagelist_get_by_id(const owl_messagelist *ml, int target_id)
     56{
     57  /* return the message with id == 'id'.  If it doesn't exist return NULL. */
     58  int n = owl_messagelist_get_index_by_id(ml, target_id);
     59  if (n < 0) return NULL;
     60  return ml->list->pdata[n];
    5361}
    5462
     
    7179  owl_message_unmark_delete(ml->list->pdata[n]);
    7280  return(0);
     81}
     82
     83void owl_messagelist_delete_and_expunge_element(owl_messagelist *ml, int n)
     84{
     85  owl_message_delete(g_ptr_array_remove_index(ml->list, n));
    7386}
    7487
Note: See TracChangeset for help on using the changeset viewer.