Beispiel #1
0
static int mailimap_namespace_item_parse(mailstream * fd,
                                         MMAPString * buffer, size_t * indx,
                                         struct mailimap_namespace_item ** result,
                                         size_t progr_rate, progress_function * progr_fun)
{
  size_t cur_token = * indx;
  int r;
  int res;
  clist * info_list;
  clistiter * cur;
  struct mailimap_namespace_item * item;
  
  r = mailimap_nil_parse(fd, buffer, &cur_token);
  if (r == MAILIMAP_NO_ERROR) {
    * indx = cur_token;
    * result = NULL;
    return MAILIMAP_NO_ERROR;
  }
  
  r = mailimap_oparenth_parse(fd, buffer, &cur_token);
  if (r != MAILIMAP_NO_ERROR) {
    return r;
  }
  
  r = mailimap_struct_multiple_parse(fd, buffer, &cur_token,
                                     &info_list,
                                     (mailimap_struct_parser *)
                                     mailimap_namespace_info_parse,
                                     (mailimap_struct_destructor *)
                                     mailimap_namespace_info_free,
                                     progr_rate, progr_fun);
  if (r == MAILIMAP_ERROR_PARSE) {
    res = r;
    goto err;
  }
  
  r = mailimap_cparenth_parse(fd, buffer, &cur_token);
  if (r != MAILIMAP_NO_ERROR) {
	res = r;
    goto free_info_list;
  }

  item = mailimap_namespace_item_new(info_list);
  if (item == NULL) {
    res = MAILIMAP_ERROR_MEMORY;
    goto free_info_list;
  }
  
  * indx = cur_token;
  * result = item;
  
  return MAILIMAP_NO_ERROR;
  
free_info_list:
  for(cur = clist_begin(info_list) ; cur != NULL ; cur = clist_next(cur)) {
    struct mailimap_namespace_info * info;
    
    info = clist_content(cur);
    mailimap_namespace_info_free(info);
  }
  clist_free(info_list);
err:
  return res;
}
Beispiel #2
0
LIBETPAN_EXPORT
int mailimap_idle(mailimap * session)
{
  int r;
  size_t indx;
  struct mailimap_continue_req * cont_req;
  struct mailimap_response * response;
  clist * resp_data_list;
  struct mailimap_parser_context * parser_ctx;
  
  session->imap_selection_info->sel_has_exists = 0;
  session->imap_selection_info->sel_has_recent = 0;
  session->imap_idle_timestamp = time(NULL);
  
  r = mailimap_send_current_tag(session);
  if (r != MAILIMAP_NO_ERROR)
	return r;
  
  r = mailimap_idle_send(session);
  if (r != MAILIMAP_NO_ERROR)
	return r;
  
  r = mailimap_crlf_send(session->imap_stream);
  if (r != MAILIMAP_NO_ERROR)
	return r;

  if (mailstream_flush(session->imap_stream) == -1)
    return MAILIMAP_ERROR_STREAM;
  
  if (mailimap_read_line(session) == NULL)
    return MAILIMAP_ERROR_STREAM;
  
  indx = 0;

  parser_ctx = mailimap_parser_context_new(session);
  if (parser_ctx == NULL)
    return MAILIMAP_ERROR_MEMORY;

  r = mailimap_struct_multiple_parse(session->imap_stream,
					session->imap_stream_buffer, parser_ctx,
					&indx,
					&resp_data_list,
					(mailimap_struct_parser *)
					mailimap_response_data_parse,
					(mailimap_struct_destructor *)
					mailimap_response_data_free,
					session->imap_progr_rate, session->imap_progr_fun);
  mailimap_parser_context_free(parser_ctx);
  if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE))
    return r;
  if (r == MAILIMAP_NO_ERROR) {
    clist_foreach(resp_data_list,
	  (clist_func) mailimap_response_data_free, NULL);
    clist_free(resp_data_list);
  }

  r = mailimap_continue_req_parse(session->imap_stream,
      session->imap_stream_buffer, NULL,
      &indx, &cont_req,
      session->imap_progr_rate, session->imap_progr_fun);
  
  if (r == MAILIMAP_NO_ERROR)
    mailimap_continue_req_free(cont_req);

  if (r == MAILIMAP_ERROR_PARSE) {
    r = mailimap_parse_response(session, &response);
    if (r != MAILIMAP_NO_ERROR)
      return r;
    mailimap_response_free(response);
    
    return MAILIMAP_ERROR_PARSE;
  }
  
  return MAILIMAP_NO_ERROR;
}
Beispiel #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;
}