X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmail.c;h=02b41485379ca70e0f36b0c7cc0c0386adddacd2;hb=29f013b34da725f7be150abcc4880f294a23b5f6;hp=a7aca3ecad631890d89ed554ba3f5d631cdc9c57;hpb=35ecbb3330e3192cc0f135a665289dc2a3b32064;p=monky diff --git a/src/mail.c b/src/mail.c index a7aca3e..02b4148 100644 --- a/src/mail.c +++ b/src/mail.c @@ -10,7 +10,7 @@ * Please see COPYING for details * * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen - * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al. + * Copyright (c) 2005-2010 Brenden Matthews, Philip Kovacs, et. al. * (see AUTHORS) * All rights reserved. * @@ -32,8 +32,8 @@ #include "conky.h" #include "common.h" #include "logging.h" -#include "mail.h" #include "text_object.h" +#include "timed_thread.h" #include #include @@ -58,12 +58,52 @@ * #define MAX(a, b) ((a > b) ? a : b) */ +#define POP3_TYPE 1 +#define IMAP_TYPE 2 + +struct mail_s { // for imap and pop3 + unsigned long unseen; + unsigned long messages; + unsigned long used; + unsigned long quota; + unsigned long port; + unsigned int retries; + float interval; + double last_update; + char host[128]; + char user[128]; + char pass[128]; + char command[1024]; + char folder[128]; + timed_thread *p_timed_thread; + char secure; +}; + +struct local_mail_s { + char *mbox; + int mail_count; + int new_mail_count; + int seen_mail_count; + int unseen_mail_count; + int flagged_mail_count; + int unflagged_mail_count; + int forwarded_mail_count; + int unforwarded_mail_count; + int replied_mail_count; + int unreplied_mail_count; + int draft_mail_count; + int trashed_mail_count; + float interval; + time_t last_mtime; + double last_update; +}; + char *current_mail_spool; static struct mail_s *global_mail; static int global_mail_use = 0; -void update_mail_count(struct local_mail_s *mail) +static void update_mail_count(struct local_mail_s *mail) { struct stat st; @@ -301,6 +341,7 @@ void parse_local_mail_args(struct text_object *obj, const char *arg) { float n1; char mbox[256], dst[256]; + struct local_mail_s *locmail; if (!arg) { n1 = 9.5; @@ -318,15 +359,22 @@ void parse_local_mail_args(struct text_object *obj, const char *arg) } variable_substitute(mbox, dst, sizeof(dst)); - obj->data.local_mail.mbox = strndup(dst, text_buffer_size); - obj->data.local_mail.interval = n1; + + locmail = malloc(sizeof(struct local_mail_s)); + memset(locmail, 0, sizeof(struct local_mail_s)); + locmail->mbox = strndup(dst, text_buffer_size); + locmail->interval = n1; + obj->data.opaque = locmail; } #define PRINT_MAILS_GENERATOR(x) \ void print_##x##mails(struct text_object *obj, char *p, int p_max_size) \ { \ - update_mail_count(&obj->data.local_mail); \ - snprintf(p, p_max_size, "%d", obj->data.local_mail.x##mail_count); \ + struct local_mail_s *locmail = obj->data.opaque; \ + if (!locmail) \ + return; \ + update_mail_count(locmail); \ + snprintf(p, p_max_size, "%d", locmail->x##mail_count); \ } PRINT_MAILS_GENERATOR() @@ -342,6 +390,19 @@ PRINT_MAILS_GENERATOR(unreplied_) PRINT_MAILS_GENERATOR(draft_) PRINT_MAILS_GENERATOR(trashed_) +void free_local_mails(struct text_object *obj) +{ + struct local_mail_s *locmail = obj->data.opaque; + + if (!locmail) + return; + + if (locmail->mbox) + free(locmail->mbox); + free(obj->data.opaque); + obj->data.opaque = 0; +} + #define MAXDATASIZE 1000 struct mail_s *parse_mail_args(char type, const char *arg) @@ -449,12 +510,12 @@ void parse_imap_mail_args(struct text_object *obj, const char *arg) rep = 1; return; } - obj->data.mail = global_mail; + obj->data.opaque = global_mail; global_mail_use++; return; } // proccss - obj->data.mail = parse_mail_args(IMAP_TYPE, arg); + obj->data.opaque = parse_mail_args(IMAP_TYPE, arg); } void parse_pop3_mail_args(struct text_object *obj, const char *arg) @@ -470,12 +531,12 @@ void parse_pop3_mail_args(struct text_object *obj, const char *arg) rep = 1; return; } - obj->data.mail = global_mail; + obj->data.opaque = global_mail; global_mail_use++; return; } // proccss - obj->data.mail = parse_mail_args(POP3_TYPE, arg); + obj->data.opaque = parse_mail_args(POP3_TYPE, arg); } void parse_global_imap_mail_args(const char *value) @@ -490,17 +551,17 @@ void parse_global_pop3_mail_args(const char *value) void free_mail_obj(struct text_object *obj) { - if (!obj->data.mail) + if (!obj->data.opaque) return; - if (obj->data.mail == global_mail) { + if (obj->data.opaque == global_mail) { if (--global_mail_use == 0) { free(global_mail); global_mail = 0; } } else { - free(obj->data.mail); - obj->data.mail = 0; + free(obj->data.opaque); + obj->data.opaque = 0; } } @@ -565,25 +626,20 @@ void imap_unseen_command(struct mail_s *mail, unsigned long old_unseen, unsigned } } -static void ensure_mail_thread(struct text_object *obj, +static void ensure_mail_thread(struct mail_s *mail, void *thread(void *), const char *text) { - if (!obj->data.mail) - return; - - if (obj->data.mail->p_timed_thread) + if (mail->p_timed_thread) return; - obj->data.mail->p_timed_thread = - timed_thread_create(thread, - (void *) obj->data.mail, - obj->data.mail->interval * 1000000); - if (!obj->data.mail->p_timed_thread) { + mail->p_timed_thread = timed_thread_create(thread, + mail, mail->interval * 1000000); + if (!mail->p_timed_thread) { NORM_ERR("Error creating %s timed thread", text); } - timed_thread_register(obj->data.mail->p_timed_thread, - &obj->data.mail->p_timed_thread); - if (timed_thread_run(obj->data.mail->p_timed_thread)) { + timed_thread_register(mail->p_timed_thread, + &mail->p_timed_thread); + if (timed_thread_run(mail->p_timed_thread)) { NORM_ERR("Error running %s timed thread", text); } } @@ -760,7 +816,7 @@ static void *imap_thread(void *arg) recvbuf[numbytes] = '\0'; DBGP2("imap_thread() received: %s", recvbuf); if (strlen(recvbuf) > 2) { - unsigned long messages, recent; + unsigned long messages, recent = 0; char *buf = recvbuf; char force_check = 0; buf = strstr(buf, "EXISTS"); @@ -885,7 +941,12 @@ static void *imap_thread(void *arg) void print_imap_unseen(struct text_object *obj, char *p, int p_max_size) { - struct mail_s *mail = ensure_mail_thread(obj, imap_thread, "imap"); + struct mail_s *mail = obj->data.opaque; + + if (!mail) + return; + + ensure_mail_thread(mail, imap_thread, "imap"); if (mail && mail->p_timed_thread) { timed_thread_lock(mail->p_timed_thread); @@ -896,7 +957,12 @@ void print_imap_unseen(struct text_object *obj, char *p, int p_max_size) void print_imap_messages(struct text_object *obj, char *p, int p_max_size) { - struct mail_s *mail = ensure_mail_thread(obj, imap_thread, "imap"); + struct mail_s *mail = obj->data.opaque; + + if (!mail) + return; + + ensure_mail_thread(mail, imap_thread, "imap"); if (mail && mail->p_timed_thread) { timed_thread_lock(mail->p_timed_thread); @@ -1053,14 +1119,14 @@ static void *pop3_thread(void *arg) sscanf(reply, "%lu %lu", &mail->unseen, &mail->used); timed_thread_unlock(mail->p_timed_thread); } - + strncpy(sendbuf, "QUIT\r\n", MAXDATASIZE); if (pop3_command(sockfd, sendbuf, recvbuf, "+OK")) { NORM_ERR("POP3 logout failed: %s", recvbuf); fail++; break; } - + if (strlen(mail->command) > 1 && mail->unseen > old_unseen) { // new mail goodie if (system(mail->command) == -1) { @@ -1085,7 +1151,12 @@ static void *pop3_thread(void *arg) void print_pop3_unseen(struct text_object *obj, char *p, int p_max_size) { - struct mail_s *mail = ensure_mail_thread(obj, pop3_thread, "pop3"); + struct mail_s *mail = obj->data.opaque; + + if (!mail) + return; + + ensure_mail_thread(mail, pop3_thread, "pop3"); if (mail && mail->p_timed_thread) { timed_thread_lock(mail->p_timed_thread); @@ -1096,7 +1167,12 @@ void print_pop3_unseen(struct text_object *obj, char *p, int p_max_size) void print_pop3_used(struct text_object *obj, char *p, int p_max_size) { - struct mail_s *mail = ensure_mail_thread(obj, pop3_thread, "pop3"); + struct mail_s *mail = obj->data.opaque; + + if (!mail) + return; + + ensure_mail_thread(mail, pop3_thread, "pop3"); if (mail && mail->p_timed_thread) { timed_thread_lock(mail->p_timed_thread);