summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/generic/nntpdriver.c
Side-by-side diff
Diffstat (limited to 'kmicromail/libetpan/generic/nntpdriver.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/generic/nntpdriver.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/kmicromail/libetpan/generic/nntpdriver.c b/kmicromail/libetpan/generic/nntpdriver.c
index fde5f1a..1b65838 100644
--- a/kmicromail/libetpan/generic/nntpdriver.c
+++ b/kmicromail/libetpan/generic/nntpdriver.c
@@ -24,156 +24,160 @@
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* $Id$
*/
#include "nntpdriver.h"
#include <string.h>
#include <stdlib.h>
#include "mail.h"
#include "mailmessage.h"
#include "nntpdriver_tools.h"
#include "maildriver_tools.h"
#include "nntpdriver_message.h"
static int nntpdriver_initialize(mailsession * session);
static void nntpdriver_uninitialize(mailsession * session);
static int nntpdriver_parameters(mailsession * session,
int id, void * value);
static int nntpdriver_connect_stream(mailsession * session, mailstream * s);
static int nntpdriver_login(mailsession * session,
char * userid, char * password);
static int nntpdriver_logout(mailsession * session);
static int nntpdriver_status_folder(mailsession * session, char * mb,
uint32_t * result_messages,
uint32_t * result_recent,
uint32_t * result_unseen);
static int nntpdriver_messages_number(mailsession * session, char * mb,
uint32_t * result);
static int nntpdriver_append_message(mailsession * session,
char * message, size_t size);
+static int nntpdriver_append_message_flags(mailsession * session,
+ char * message, size_t size, struct mail_flags * flags);
+
static int
nntpdriver_get_envelopes_list(mailsession * session,
struct mailmessage_list * env_list);
static int nntpdriver_get_messages_list(mailsession * session,
struct mailmessage_list ** result);
static int nntpdriver_list_folders(mailsession * session, char * mb,
struct mail_list ** result);
static int nntpdriver_lsub_folders(mailsession * session, char * mb,
struct mail_list ** result);
static int nntpdriver_subscribe_folder(mailsession * session, char * mb);
static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb);
static int nntpdriver_get_message(mailsession * session,
uint32_t num, mailmessage ** result);
static int nntpdriver_get_message_by_uid(mailsession * session,
const char * uid,
mailmessage ** result);
static int nntpdriver_noop(mailsession * session);
static mailsession_driver local_nntp_session_driver = {
.sess_name = "nntp",
.sess_initialize = nntpdriver_initialize,
.sess_uninitialize = nntpdriver_uninitialize,
.sess_parameters = nntpdriver_parameters,
.sess_connect_stream = nntpdriver_connect_stream,
.sess_connect_path = NULL,
.sess_starttls = NULL,
.sess_login = nntpdriver_login,
.sess_logout = nntpdriver_logout,
.sess_noop = nntpdriver_noop,
.sess_build_folder_name = NULL,
.sess_create_folder = NULL,
.sess_delete_folder = NULL,
.sess_rename_folder = NULL,
.sess_check_folder = NULL,
.sess_examine_folder = NULL,
.sess_select_folder = nntpdriver_select_folder,
.sess_expunge_folder = NULL,
.sess_status_folder = nntpdriver_status_folder,
.sess_messages_number = nntpdriver_messages_number,
.sess_recent_number = nntpdriver_messages_number,
.sess_unseen_number = nntpdriver_messages_number,
.sess_list_folders = nntpdriver_list_folders,
.sess_lsub_folders = nntpdriver_lsub_folders,
.sess_subscribe_folder = nntpdriver_subscribe_folder,
.sess_unsubscribe_folder = nntpdriver_unsubscribe_folder,
.sess_append_message = nntpdriver_append_message,
+ .sess_append_message_flags = nntpdriver_append_message_flags,
.sess_copy_message = NULL,
.sess_move_message = NULL,
.sess_get_messages_list = nntpdriver_get_messages_list,
.sess_get_envelopes_list = nntpdriver_get_envelopes_list,
.sess_remove_message = NULL,
#if 0
.sess_search_messages = maildriver_generic_search_messages,
#endif
.sess_get_message = nntpdriver_get_message,
.sess_get_message_by_uid = nntpdriver_get_message_by_uid,
};
mailsession_driver * nntp_session_driver = &local_nntp_session_driver;
static inline struct nntp_session_state_data *
get_data(mailsession * session)
{
return session->sess_data;
}
static inline newsnntp * get_nntp_session(mailsession * session)
{
return get_data(session)->nntp_session;
}
static int nntpdriver_initialize(mailsession * session)
{
struct nntp_session_state_data * data;
newsnntp * nntp;
nntp = newsnntp_new(0, NULL);
if (nntp == NULL)
goto err;
data = malloc(sizeof(* data));
if (data == NULL)
goto free;
data->nntp_session = nntp;
data->nntp_userid = NULL;
data->nntp_password = NULL;
data->nntp_group_info = NULL;
data->nntp_group_name = NULL;
@@ -585,96 +589,102 @@ static int nntpdriver_subscribe_folder(mailsession * session, char * mb)
return MAIL_NO_ERROR;
}
static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb)
{
int r;
r = remove_from_list(session, mb);
if (r < 0)
return MAIL_ERROR_UNSUBSCRIBE;
return MAIL_NO_ERROR;
}
/* messages operations */
static int nntpdriver_append_message(mailsession * session,
char * message, size_t size)
{
int r;
struct nntp_session_state_data * data;
data = get_data(session);
do {
r = newsnntp_post(get_nntp_session(session), message, size);
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;
default:
return nntpdriver_nntp_error_to_mail_error(r);
}
}
while (1);
}
+static int nntpdriver_append_message_flags(mailsession * session,
+ char * message, size_t size, struct mail_flags * flags)
+{
+ return nntpdriver_append_message(session, message, size);
+}
+
static int xover_resp_to_fields(struct newsnntp_xover_resp_item * item,
struct mailimf_fields ** result);
static int
nntpdriver_get_envelopes_list(mailsession * session,
struct mailmessage_list * env_list)
{
newsnntp * nntp;
int r;
struct nntp_session_state_data * data;
clist * list;
int done;
clistiter * cur;
uint32_t first_seq;
unsigned int i;
nntp = get_nntp_session(session);
data = get_data(session);
if (data->nntp_group_info == NULL)
return MAIL_ERROR_BAD_STATE;
first_seq = data->nntp_group_info->grp_first;
if (carray_count(env_list->msg_tab) > 0) {
mailmessage * msg;
msg = carray_get(env_list->msg_tab, 0);
first_seq = msg->msg_index;
}
if (carray_count(env_list->msg_tab) > 0) {
i = carray_count(env_list->msg_tab) - 1;
while (1) {
mailmessage * msg;
msg = carray_get(env_list->msg_tab, i);
if (msg->msg_fields != NULL) {
first_seq = msg->msg_index + 1;
break;
}
if (i == 0)