Beispiel #1
0
/**
 * news_select_group:
 * @session: Active NNTP session.
 * @group: Newsgroup name.
 * @num: Estimated number of articles.
 * @first: First article number.
 * @last: Last article number.
 *
 * Select newsgroup @group with the GROUP command if it is not already
 * selected in @session, or article numbers need to be returned.
 *
 * Return value: NNTP result code.
 **/
static gint news_select_group(Folder *folder, const gchar *group,
			      gint *num, gint *first, gint *last)
{
	gint ok;
	gint num_, first_, last_;
	struct newsnntp_group_info *info = NULL;
	NewsSession *session = NEWS_SESSION(news_session_get(folder));

	cm_return_val_if_fail(session != NULL, -1);
	
	if (!num || !first || !last) {
		if (session->group && g_ascii_strcasecmp(session->group, group) == 0)
			return NEWSNNTP_NO_ERROR;
		num = &num_;
		first = &first_;
		last = &last_;
	}

	g_free(session->group);
	session->group = NULL;

	ok = nntp_threaded_group(folder, group, &info);
	
	if (ok == NEWSNNTP_NO_ERROR && info) {
		session->group = g_strdup(group);
		*num = info->grp_first;
		*first = info->grp_first;
		*last = info->grp_last;
		newsnntp_group_free(info);
	} else {
		log_warning(LOG_PROTOCOL, _("couldn't select group: %s\n"), group);
	}
	return ok;
}
Beispiel #2
0
static void nntpdriver_uninitialize(mailsession * session)
{
  struct nntp_session_state_data * data;

  data = get_data(session);

  clist_foreach(data->nntp_subscribed_list, (clist_func) free, NULL);
  clist_free(data->nntp_subscribed_list);

  if (data->nntp_group_info != NULL)
    newsnntp_group_free(data->nntp_group_info);

  if (data->nntp_group_name != NULL)
    free(data->nntp_group_name);

  if (data->nntp_userid != NULL)
    free(data->nntp_userid);

  if (data->nntp_password != NULL)
    free(data->nntp_password);

  newsnntp_free(data->nntp_session);
  free(data);

  session->sess_data = NULL;
}
Beispiel #3
0
int nntpdriver_select_folder(mailsession * session, const char * mb)
{
    int r;
    struct newsnntp_group_info * info;
    newsnntp * nntp_session;
    struct nntp_session_state_data * data;
    char * new_name;
    int done;

    data = session_get_data(session);

    if (!data->nntp_mode_reader) {
        r = nntpdriver_mode_reader(session);
        if (r != MAIL_NO_ERROR)
            return r;

        data->nntp_mode_reader = TRUE;
    }

    if (data->nntp_group_name != NULL)
        if (strcmp(data->nntp_group_name, mb) == 0)
            return MAIL_NO_ERROR;

    nntp_session = session_get_nntp_session(session);

    done = FALSE;
    do {
        r = newsnntp_group(nntp_session, mb, &info);

        switch (r) {
        case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_USERNAME:
            r = nntpdriver_authenticate_user(session);
            if (r != MAIL_NO_ERROR)
                return r;
            break;

        case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD:
            r = nntpdriver_authenticate_password(session);
            if (r != MAIL_NO_ERROR)
                return r;
            break;

        case NEWSNNTP_NO_ERROR:
            done = TRUE;
            break;

        default:
            return nntpdriver_nntp_error_to_mail_error(r);
        }

    }
    while (!done);

    new_name = strdup(mb);
    if (new_name == NULL)
        return MAIL_ERROR_MEMORY;

    if (data->nntp_group_name != NULL)
        free(data->nntp_group_name);
    data->nntp_group_name = new_name;
    if (data->nntp_group_info != NULL)
        newsnntp_group_free(data->nntp_group_info);
    data->nntp_group_info = info;

    return MAIL_NO_ERROR;
}