[2897] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

Re: [PATCH] Rewrite aimwrite

daemon@ATHENA.MIT.EDU (Nelson Elhage)
Thu Feb 10 21:03:54 2011

Date: Thu, 10 Feb 2011 21:03:49 -0500
From: Nelson Elhage <nelhage@nelhage.com>
To: David Benjamin <davidben@mit.edu>
Cc: barnowl-dev@mit.edu
In-Reply-To: <1295935347-10274-1-git-send-email-davidben@mit.edu>

lgtm

- Nelson

On Tue, Jan 25, 2011 at 01:02:27AM -0500, David Benjamin wrote:
> This now makes more gratuitous use of glib and should, as a bonus, be
> more sensible. In particular, we now consistently handle multi-word
> recipients with and without -m. Also avoid duplicating sending code.
> ---
>  commands.c  |   84 +++++++++++++++++++----------------------------------------
>  functions.c |   24 ++++++++--------
>  2 files changed, 39 insertions(+), 69 deletions(-)
> 
> diff --git a/commands.c b/commands.c
> index a513f9a..1422075 100644
> --- a/commands.c
> +++ b/commands.c
> @@ -1973,81 +1973,51 @@ char *owl_command_zwrite(int argc, const char *const *argv, const char *buff)
>  
>  char *owl_command_aimwrite(int argc, const char *const *argv, const char *buff)
>  {
> -  char *newbuff, *recip;
> +  char *message = NULL;
> +  GString *recip = g_string_new("");
>    const char *const *myargv;
> -  int i, j, myargc;
> -  owl_message *m;
> +  int myargc;
>    
>    if (!owl_global_is_aimloggedin(&g)) {
> -    owl_function_makemsg("You are not logged in to AIM.");
> -    return(NULL);
> -  }
> -
> -  if (argc < 2) {
> -    owl_function_makemsg("Not enough arguments to the aimwrite command.");
> -    return(NULL);
> +    owl_function_error("You are not logged in to AIM.");
> +    goto err;
>    }
>  
> -  myargv=argv;
> -  if (argc<0) {
> -    owl_function_error("Unbalanced quotes in aimwrite");
> -    return(NULL);
> -  }
> -  myargc=argc;
> -  if (myargc && *(myargv[0])!='-') {
> -    myargc--;
> -    myargv++;
> -  }
> +  /* Skip argv[0]. */
> +  myargv = argv+1;
> +  myargc = argc-1;
>    while (myargc) {
>      if (!strcmp(myargv[0], "-m")) {
> -      if (myargc<2) {
> -	break;
> +      if (myargc <= 1) {
> +	owl_function_error("No message specified.");
> +	goto err;
>        }
> -
>        /* Once we have -m, gobble up everything else on the line */
>        myargv++;
>        myargc--;
> -      newbuff=owl_strdup("");
> -      while (myargc) {
> -	newbuff=owl_realloc(newbuff, strlen(newbuff)+strlen(myargv[0])+5);
> -	strcat(newbuff, myargv[0]);
> -	strcat(newbuff, " ");
> -	myargc--;
> -	myargv++;
> -      }
> -      if (strlen(newbuff) >= 1)
> -	newbuff[strlen(newbuff) - 1] = '\0'; /* remove last space */
> -
> -      recip=owl_strdup(argv[1]);
> -      owl_aim_send_im(recip, newbuff);
> -      m=owl_function_make_outgoing_aim(newbuff, recip);
> -      if (m) { 
> -          owl_global_messagequeue_addmsg(&g, m);
> -      } else {
> -          owl_function_error("Could not create outgoing AIM message");
> -      }
> -
> -      owl_free(recip);
> -      owl_free(newbuff);
> -      return(NULL);
> +      message = g_strjoinv(" ", (char**)myargv);
> +      break;
>      } else {
> -      /* we don't care */
> +      /* squish arguments together to make one screenname w/o spaces for now */
> +      g_string_append(recip, myargv[0]);
>        myargv++;
>        myargc--;
>      }
>    }
>  
> -  /* squish arguments together to make one screenname w/o spaces for now */
> -  newbuff=owl_malloc(strlen(buff)+5);
> -  sprintf(newbuff, "%s ", argv[0]);
> -  j=argc-1;
> -  for (i=0; i<j; i++) {
> -    strcat(newbuff, argv[i+1]);
> +  if (recip->str[0] == '\0') {
> +    owl_function_error("No recipient specified");
> +    goto err;
>    }
> -    
> -  owl_function_aimwrite_setup(newbuff);
> -  owl_free(newbuff);
> -  return(NULL);
> +
> +  if (message != NULL)
> +    owl_function_aimwrite(recip->str, message, false);
> +  else
> +    owl_function_aimwrite_setup(recip->str);
> + err:
> +  g_string_free(recip, true);
> +  owl_free(message);
> +  return NULL;
>  }
>  
>  char *owl_command_loopwrite(int argc, const char *const *argv, const char *buff)
> diff --git a/functions.c b/functions.c
> index 1edae0e..f059dbf 100644
> --- a/functions.c
> +++ b/functions.c
> @@ -349,14 +349,17 @@ void owl_function_zwrite_setup(owl_zwrite *z)
>                                z, (void(*)(void*))owl_zwrite_delete);
>  }
>  
> -void owl_function_aimwrite_setup(const char *line)
> +void owl_function_aimwrite_setup(const char *to)
>  {
> +  /* TODO: We probably actually want an owl_aimwrite object like
> +   * owl_zwrite. */
> +  char *line = owl_sprintf("aimwrite %s", to);
>    owl_function_write_setup("message");
>    owl_function_start_edit_win(line,
>                                &owl_callback_aimwrite,
> -                              owl_strdup(line),
> +                              owl_strdup(to),
>                                owl_free);
> -
> +  owl_free(line);
>  }
>  
>  void owl_function_loopwrite_setup(void)
> @@ -476,23 +479,20 @@ void owl_function_zcrypt(owl_zwrite *z, const char *msg)
>  }
>  
>  void owl_callback_aimwrite(owl_editwin *e) {
> -  char *command = owl_editwin_get_cbdata(e);
> -  owl_function_aimwrite(command,
> -                        owl_editwin_get_text(e));
> +  char *to = owl_editwin_get_cbdata(e);
> +  owl_function_aimwrite(to, owl_editwin_get_text(e), true);
>  }
>  
> -void owl_function_aimwrite(const char *line, const char *msg)
> +void owl_function_aimwrite(const char *to, const char *msg, bool unwrap)
>  {
>    int ret;
> -  const char *to;
>    char *format_msg;
>    owl_message *m;
>  
> -  to = line + 9;
> -
>    /* make a formatted copy of the message */
> -  format_msg=owl_strdup(msg);
> -  owl_text_wordunwrap(format_msg);
> +  format_msg = owl_strdup(msg);
> +  if (unwrap)
> +    owl_text_wordunwrap(format_msg);
>    
>    /* send the message */
>    ret=owl_aim_send_im(to, format_msg);
> -- 
> 1.7.3.3.399.g06ddf
> 

home help back first fref pref prev next nref lref last post