예제 #1
0
static int mailimap_namespace_response_extension_parse(mailstream * fd,
                                                       MMAPString * buffer, size_t * indx,
                                                       struct mailimap_namespace_response_extension ** result,
                                                       size_t progr_rate, progress_function * progr_fun)
{
  int r;
  int res;
  size_t cur_token;
  char * name;
  size_t name_len;
  clist * value_list;
  struct mailimap_namespace_response_extension * ext;
  clistiter * cur;
  
  cur_token = * indx;
  
  r = mailimap_space_parse(fd, buffer, &cur_token);
  if (r == MAILIMAP_ERROR_PARSE) {
    /* do nothing */
  }
  
  r = mailimap_string_parse(fd, buffer, &cur_token, &name, &name_len, progr_rate, progr_fun);
  if (r != MAILIMAP_NO_ERROR) {
    res = r;
    goto err;
  }
  
  r = mailimap_space_parse(fd, buffer, &cur_token);
  if (r == MAILIMAP_ERROR_PARSE) {
    /* do nothing */
  }
  
  r = mailimap_oparenth_parse(fd, buffer, &cur_token);
  if (r != MAILIMAP_NO_ERROR) {
    res = r;
    goto err;
  }
  
  r = mailimap_struct_spaced_list_parse(fd, buffer, &cur_token, &value_list,
                                        (mailimap_struct_parser *)  namespace_extension_value_parse,
                                        (mailimap_struct_destructor *) mailimap_string_free,
                                        progr_rate, progr_fun);
  if (r != MAILIMAP_NO_ERROR) {
    res = r;
    goto free_name;
  }
  
  r = mailimap_cparenth_parse(fd, buffer, &cur_token);
  if (r != MAILIMAP_NO_ERROR) {
    res = r;
    goto free_value_list;
  }
  
  ext = mailimap_namespace_response_extension_new(name, value_list);
  if (ext == NULL) {
    res = MAILIMAP_ERROR_MEMORY;
    goto free_value_list;
  }
  
  * indx = cur_token;
  * result = ext;
  
  return MAILIMAP_NO_ERROR;
  
free_value_list:
  for(cur = clist_begin(value_list) ; cur != NULL ; cur = clist_next(cur)) {
    char * value;
    
    value = clist_content(cur);
    mailimap_string_free(value);
  }
  clist_free(value_list);
free_name:
  mailimap_string_free(name);
err:
  return res;
}
예제 #2
0
void mailimap_id_param_free(struct mailimap_id_param * param)
{
  mailimap_string_free(param->idpa_name);
  mailimap_nstring_free(param->idpa_value);
  free(param);
}
예제 #3
0
static int mailimap_namespace_info_parse(mailstream * fd,
                                         MMAPString * buffer, size_t * indx,
                                         struct mailimap_namespace_info ** result,
                                         size_t progr_rate, progress_function * progr_fun)
{
  size_t cur_token = * indx;
  int r;
  int res;
  char * prefix;
  size_t prefix_len;
  clistiter * cur;
  clist * ext_list;
  char delimiter;
  struct mailimap_namespace_info * info;
  
  r = mailimap_oparenth_parse(fd, buffer, &cur_token);
  if (r != MAILIMAP_NO_ERROR) {
    res = r;
    goto err;
  }
  
  r = mailimap_string_parse(fd, buffer, &cur_token, &prefix, &prefix_len, progr_rate, progr_fun);
  if (r != MAILIMAP_NO_ERROR) {
    res = r;
    goto err;
  }
  
  r = mailimap_space_parse(fd, buffer, &cur_token);
  if (r == MAILIMAP_ERROR_PARSE) {
    /* do nothing */
  }
  
  r = mailimap_nil_parse(fd, buffer, &cur_token);
  if (r == MAILIMAP_NO_ERROR) {
	delimiter = 0;
  }
  else {
    r = mailimap_dquote_parse(fd, buffer, &cur_token);
    if (r == MAILIMAP_ERROR_PARSE) {
      res = r;
      goto free_prefix;
    }
    
    r = mailimap_quoted_char_parse(fd, buffer, &cur_token, &delimiter);
    if (r == MAILIMAP_ERROR_PARSE) {
      res = r;
      goto free_prefix;
    }
    
    r = mailimap_dquote_parse(fd, buffer, &cur_token);
    if (r == MAILIMAP_ERROR_PARSE) {
      res = r;
      goto free_prefix;
    }
  }

  r = mailimap_cparenth_parse(fd, buffer, &cur_token);
  if (r != MAILIMAP_NO_ERROR) {
    res = r;
    goto free_ext;
  }
  
  r = mailimap_struct_multiple_parse(fd, buffer, &cur_token,
                                     &ext_list,
                                     (mailimap_struct_parser *)
                                     mailimap_namespace_response_extension_parse,
                                     (mailimap_struct_destructor *)
                                     mailimap_namespace_response_extension_free,
                                     progr_rate, progr_fun);
  if (r == MAILIMAP_ERROR_PARSE) {
    ext_list = NULL;
  }
  else if (r != MAILIMAP_NO_ERROR) {
    res = r;
    goto free_prefix;
  }
  
  info = mailimap_namespace_info_new(prefix, delimiter, ext_list);
  if (info == NULL) {
    res = MAILIMAP_ERROR_MEMORY;
    goto free_ext;
  }
  
  * result = info;
  * indx = cur_token;
  
  return MAILIMAP_NO_ERROR;
  
free_ext:
  if (ext_list != NULL) {
    for(cur = clist_begin(ext_list) ; cur != NULL ; cur = clist_next(cur)) {
      struct mailimap_namespace_response_extension * ext;
      
      ext = clist_content(cur);
      mailimap_namespace_response_extension_free(ext);
    }
    clist_free(ext_list);
  }
free_prefix:
  mailimap_string_free(prefix);
err:
  return res;
}