diff --git a/Makefile.am b/Makefile.am index 26367c2..ffc5249 100644 --- a/Makefile.am +++ b/Makefile.am @@ -22,7 +22,11 @@ module_la_SOURCES = e_mod_main.c \ e_mod_main.h \ e_mod_config.c \ e_mod_config_box.h \ - e_mod_config_box.c + e_mod_config_box.c \ + imap.h imap.c \ + pop.h pop.c \ + mdir.h mdir.c \ + mbox.h mbox.c module_la_LIBADD = @e_libs@ -lm module_la_LDFLAGS = -module -avoid-version diff --git a/e_mod_config.c b/e_mod_config.c index 3473efb..8512697 100644 --- a/e_mod_config.c +++ b/e_mod_config.c @@ -172,7 +172,7 @@ _load_boxes(E_Config_Dialog *cfd) break; } found = _ilist_header_exists(il, name); - if (found < 0) + if (found <= 0) e_widget_ilist_header_append(il, NULL, name); for (box = ci->boxes; box; box = box->next) diff --git a/e_mod_main.c b/e_mod_main.c index 24474d9..a96343a 100644 --- a/e_mod_main.c +++ b/e_mod_main.c @@ -17,40 +17,23 @@ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ -#include -#include #include -#include -#include -#include #include "e_mod_main.h" - -typedef enum -{ - STATE_DISCONNECTED, - STATE_CONNECTED, - STATE_SERVER_READY, - STATE_LOGGED_IN, - STATE_USER_OK, - STATE_PASS_OK, - STATE_STATUS_OK -} State; +#include "imap.h" +#include "pop.h" +#include "mdir.h" +#include "mbox.h" typedef struct _Instance Instance; typedef struct _Mail Mail; -typedef struct _Mailbox Mailbox; struct _Instance { E_Gadcon_Client *gcc; Evas_Object *mail_obj; Mail *mail; + Ecore_Exe *exe; Ecore_Timer *check_timer; - Evas_List *mboxes; - - Ecore_Event_Handler *add_handler; - Ecore_Event_Handler *del_handler; - Ecore_Event_Handler *data_handler; }; struct _Mail @@ -59,21 +42,6 @@ struct _Mail Evas_Object *mail_obj; }; -struct _Mailbox -{ - Instance *inst; - Config_Box *config; - int state; - int cmd; - int has_mail; - int num_new; - int num_total; - Ecore_Con_Server *server; - Ecore_File_Monitor *monitor; - Ecore_Exe *exe; - Ecore_Event_Handler *exit_handler; -}; - /* Func Protos for Gadcon */ static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style); static void _gc_shutdown(E_Gadcon_Client *gcc); @@ -92,17 +60,7 @@ static Config_Item *_mail_config_item_get(const char *id); static Mail *_mail_new(Evas *evas); static void _mail_free(Mail *mail); static int _mail_cb_check(void *data); -static int _mail_server_add(void *data, int type, void *event); -static int _mail_server_del(void *data, int type, void *event); -static int _mail_server_data(void *data, int type, void *event); -static int _mail_parse_pop(void *data, void *data2); -static int _mail_parse_imap(void *data, void *data2); -static void _mail_mbox_check(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path); -static void _mail_mdir_check(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path); -static int _mail_mdir_get_files(const char *path); -static void _mail_set_text(void *data); static int _mail_cb_exe_exit(void *data, int type, void *event); -static Mailbox *_mail_find_mailbox(void *data, void *data2); static E_Config_DD *conf_edd = NULL; static E_Config_DD *conf_item_edd = NULL; @@ -110,6 +68,8 @@ static E_Config_DD *conf_box_edd = NULL; Config *mail_config = NULL; +static Ecore_Event_Handler *exit_handler; + static const E_Gadcon_Client_Class _gc_class = { GADCON_CLIENT_CLASS_VERSION, @@ -119,13 +79,11 @@ static const E_Gadcon_Client_Class _gc_class = static E_Gadcon_Client * _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) { - Evas_Object *o; E_Gadcon_Client *gcc; Instance *inst; Mail *mail; Config_Item *ci; - Evas_List *l; - char buf[4096]; + Evas_List *l, *j; inst = E_NEW(Instance, 1); ci = _mail_config_item_get(id); @@ -135,15 +93,14 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) mail->inst = inst; inst->mail = mail; - o = mail->mail_obj; - gcc = e_gadcon_client_new(gc, name, id, style, o); + gcc = e_gadcon_client_new(gc, name, id, style, mail->mail_obj); gcc->data = inst; inst->gcc = gcc; - inst->mail_obj = o; + inst->mail_obj = mail->mail_obj; - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _mail_cb_mouse_down, inst); - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_IN, _mail_cb_mouse_in, inst); - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT, _mail_cb_mouse_out, inst); + evas_object_event_callback_add(inst->mail_obj, EVAS_CALLBACK_MOUSE_DOWN, _mail_cb_mouse_down, inst); + evas_object_event_callback_add(inst->mail_obj, EVAS_CALLBACK_MOUSE_IN, _mail_cb_mouse_in, inst); + evas_object_event_callback_add(inst->mail_obj, EVAS_CALLBACK_MOUSE_OUT, _mail_cb_mouse_out, inst); if (ci->show_label) edje_object_signal_emit(inst->mail_obj, "label_active", ""); @@ -151,41 +108,36 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) edje_object_signal_emit(inst->mail_obj, "label_passive", ""); mail_config->instances = evas_list_append(mail_config->instances, inst); - - if (!ci->boxes) return gcc; - - for (l = ci->boxes; l; l = l->next) + for (l = mail_config->items; l; l = l->next) { - Mailbox *mb; - Config_Box *cb; - - cb = l->data; - mb = E_NEW(Mailbox, 1); - mb->inst = inst; - mb->config = cb; - mb->state = STATE_DISCONNECTED; - mb->cmd = 0; - mb->server = NULL; - inst->mboxes = evas_list_append(inst->mboxes, mb); - - if (cb->type == MAIL_TYPE_MDIR) - mb->monitor = ecore_file_monitor_add(cb->new_path, _mail_mdir_check, mb); - else if (cb->type == MAIL_TYPE_MBOX) - mb->monitor = ecore_file_monitor_add(cb->new_path, _mail_mbox_check, mb); - else + Config_Item *ci; + + ci = l->data; + for (j = ci->boxes; j; j = j->next) { - if (!inst->add_handler) - inst->add_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _mail_server_add, inst); - if (!inst->del_handler) - inst->del_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _mail_server_del, inst); - if (!inst->data_handler) - inst->data_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, _mail_server_data, inst); - - _mail_cb_check(inst); - if (!inst->check_timer) - inst->check_timer = ecore_timer_add((ci->check_time * 60.0), _mail_cb_check, inst); - } - } + Config_Box *cb; + + cb = j->data; + switch (cb->type) + { + case MAIL_TYPE_IMAP: + _mail_imap_add_mailbox(cb); + if (!inst->check_timer) + inst->check_timer = ecore_timer_add((ci->check_time * 60.0), _mail_cb_check, inst); + break; + case MAIL_TYPE_POP: + if (!inst->check_timer) + inst->check_timer = ecore_timer_add((ci->check_time * 60.0), _mail_cb_check, inst); + break; + case MAIL_TYPE_MDIR: + _mail_mdir_add_mailbox(inst, cb); + break; + case MAIL_TYPE_MBOX: + _mail_mbox_add_mailbox(inst, cb); + break; + } + } + } return gcc; } @@ -193,34 +145,13 @@ static void _gc_shutdown(E_Gadcon_Client *gcc) { Instance *inst; - + inst = gcc->data; - if (inst->add_handler) ecore_event_handler_del(inst->add_handler); - if (inst->data_handler) ecore_event_handler_del(inst->data_handler); - if (inst->del_handler) ecore_event_handler_del(inst->del_handler); - if (inst->check_timer) ecore_timer_del(inst->check_timer); - - while (inst->mboxes) - { - Mailbox *mb; - - mb = inst->mboxes->data; - if (mb->monitor) ecore_file_monitor_del(mb->monitor); - if (mb->server) ecore_con_server_del(mb->server); - if (mb->exit_handler) ecore_event_handler_del(mb->exit_handler); - mb->exe = NULL; - mb->server = NULL; - mb->cmd = 0; - mb->state = STATE_DISCONNECTED; - inst->mboxes = evas_list_remove_list(inst->mboxes, inst->mboxes); - free(mb); - } - - evas_object_event_callback_del(inst->mail->mail_obj, EVAS_CALLBACK_MOUSE_DOWN, _mail_cb_mouse_down); - evas_object_event_callback_del(inst->mail->mail_obj, EVAS_CALLBACK_MOUSE_IN, _mail_cb_mouse_in); - evas_object_event_callback_del(inst->mail->mail_obj, EVAS_CALLBACK_MOUSE_OUT, _mail_cb_mouse_out); - + evas_object_event_callback_del(inst->mail_obj, EVAS_CALLBACK_MOUSE_DOWN, _mail_cb_mouse_down); + evas_object_event_callback_del(inst->mail_obj, EVAS_CALLBACK_MOUSE_IN, _mail_cb_mouse_in); + evas_object_event_callback_del(inst->mail_obj, EVAS_CALLBACK_MOUSE_OUT, _mail_cb_mouse_out); + mail_config->instances = evas_list_remove(mail_config->instances, inst); _mail_free(inst->mail); free(inst); @@ -255,11 +186,11 @@ static void _mail_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) { Instance *inst = data; + Config_Item *ci; Evas_Event_Mouse_Down *ev = event_info; Evas_List *l; if (!inst) return; - if ((ev->button == 3) && (!mail_config->menu)) { E_Menu *mn, *sn; @@ -271,34 +202,34 @@ _mail_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) e_menu_post_deactivate_callback_set(mn, _mail_menu_cb_post, inst); mail_config->menu = mn; - if ((inst->mboxes) && (evas_list_count(inst->mboxes) > 0)) + ci = _mail_config_item_get(inst->gcc->id); + if ((ci->boxes) && (evas_list_count(ci->boxes) > 0)) { E_Menu_Item *mm; - + snprintf(buf, sizeof(buf), "%s/module.eap", e_module_dir_get(mail_config->module)); mm = e_menu_item_new(mn); e_menu_item_label_set(mm, _("Mailboxes")); e_menu_item_icon_edje_set(mm, buf, "icon"); sn = e_menu_new(); - for (l = inst->mboxes; l; l = l->next) + for (l = ci->boxes; l; l = l->next) { - Mailbox *mb; + Config_Box *cb; - mb = l->data; - if (!mb) continue; - + cb = l->data; + if (!cb) continue; mi = e_menu_item_new(sn); - snprintf(buf, sizeof(buf), "%s: %d/%d", mb->config->name, mb->num_new, mb->num_total); + snprintf(buf, sizeof(buf), "%s: %d/%d", cb->name, cb->num_new, cb->num_total); e_menu_item_label_set(mi, buf); - if (mb->config->exec) - e_menu_item_callback_set(mi, _mail_menu_cb_exec, mb); + if ((cb->exec) && (cb->use_exec)) + e_menu_item_callback_set(mi, _mail_menu_cb_exec, cb); } e_menu_item_submenu_set(mm, sn); mi = e_menu_item_new(mn); - e_menu_item_separator_set(mi, 1); + e_menu_item_separator_set(mi, 1); } - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Configuration")); e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration"); @@ -450,6 +381,9 @@ e_modapi_shutdown(E_Module *m) { mail_config->module = NULL; e_gadcon_provider_unregister(&_gc_class); + + if (exit_handler) + ecore_event_handler_del(exit_handler); if (mail_config->config_dialog) e_object_del(E_OBJECT(mail_config->config_dialog)); @@ -469,6 +403,20 @@ e_modapi_shutdown(E_Module *m) Config_Box *cb; cb = ci->boxes->data; + switch (cb->type) + { + case MAIL_TYPE_IMAP: + _mail_imap_del_mailbox(cb); + break; + case MAIL_TYPE_POP: + break; + case MAIL_TYPE_MDIR: + _mail_mdir_del_mailbox(cb); + break; + case MAIL_TYPE_MBOX: + _mail_mbox_del_mailbox(cb); + break; + } if (cb->name) evas_stringshare_del(cb->name); if (cb->host) evas_stringshare_del(cb->host); if (cb->user) evas_stringshare_del(cb->user); @@ -546,418 +494,53 @@ static int _mail_cb_check(void *data) { Instance *inst = data; + Config_Item *ci; Evas_List *l; - Ecore_Con_Type type; - Ecore_Con_Server *server; + int have_imap = 0; if (!inst) return 1; - if (!inst->mboxes) return 1; - - for (l = inst->mboxes; l; l = l->next) + ci = _mail_config_item_get(inst->gcc->id); + if (!ci->boxes) return 1; + for (l = ci->boxes; l; l = l->next) { - Mailbox *mb; Config_Box *cb; - - mb = l->data; - mb->inst = inst; - - cb = mb->config; - if (!cb->host) continue; - if (cb->port <= 0) continue; - if (cb->type > 1) continue; - - type = ECORE_CON_REMOTE_SYSTEM; - if (cb->ssl) - type |= ECORE_CON_USE_SSL; - server = ecore_con_server_connect(type, cb->host, cb->port, inst); - mb->server = server; - mb->state = STATE_CONNECTED; - mb->cmd = 0; - } - - return 1; -} - -static int -_mail_server_add(void *data, int type, void *event) -{ - Instance *inst = data; - Mailbox *mb; - Ecore_Con_Event_Server_Add *ev = event; - - if (!inst) return 1; - if (!inst->mboxes) return 1; - - mb = _mail_find_mailbox(inst, ev->server); - if (!mb) return 1; - - mb->state = STATE_CONNECTED; - mb->cmd = 0; - - return 1; -} - -static int -_mail_server_del(void *data, int type, void *event) -{ - Instance *inst = data; - Mailbox *mb; - Config_Box *cb; - Ecore_Con_Event_Server_Del *ev = event; - - if (!inst) return 1; - if (!inst->mboxes) return 1; - - mb = _mail_find_mailbox(inst, ev->server); - if (!mb) return 1; - - cb = mb->config; - if (!cb->host) return 1; - - if (mb->state == STATE_DISCONNECTED) - printf("Cannot Connect to %s\n", cb->host); - - ecore_con_server_del(ev->server); - mb->server = NULL; - mb->cmd = 0; - mb->state = STATE_DISCONNECTED; - - return 1; -} - -static int -_mail_server_data(void *data, int type, void *event) -{ - Instance *inst = data; - Mailbox *mb; - Config_Box *cb; - Ecore_Con_Event_Server_Data *ev = event; - int ret; - - if (!inst) return 1; - if (!inst->mboxes) return 1; - - mb = _mail_find_mailbox(inst, ev->server); - if (!mb) return 1; - - cb = mb->config; - if (!cb) return 1; - - if (cb->type == MAIL_TYPE_POP) - ret = _mail_parse_pop(mb, ev); - else if (cb->type == MAIL_TYPE_IMAP) - ret = _mail_parse_imap(mb, ev); - - return ret; -} - -static int -_mail_parse_pop(void *data, void *data2) -{ - Mailbox *mb = data; - Config_Box *cb; - Ecore_Con_Event_Server_Data *ev = data2; - char in[2048], out[2048]; - int len; - - if (!mb) return; - if (!ev) return; - if ((!mb->server) || (mb->server != ev->server)) return; - - cb = mb->config; - - len = sizeof(in) -1; - len = (((len) > (ev->size)) ? ev->size : len); - memcpy(in, ev->data, len); - in[len] = 0; - - if (!strncmp(in, "-ERR", 4)) - { - printf("ERROR: %s\n", in); - mb->state = STATE_DISCONNECTED; - ecore_con_server_del(ev->server); - mb->server = NULL; - mb->cmd = 0; - return 0; - } - else if (strncmp(in, "+OK", 3)) - { - printf("Unexpected reply: %s\n", in); - mb->state = STATE_DISCONNECTED; - ecore_con_server_del(ev->server); - mb->server = NULL; - mb->cmd = 0; - return 0; - } - - if (mb->state == STATE_CONNECTED) - mb->state++; - - switch (mb->state) - { - case STATE_SERVER_READY: - len = snprintf(out, sizeof(out), "USER %s\r\n", cb->user); - ecore_con_server_send(ev->server, out, len); - mb->state = STATE_USER_OK; - break; - case STATE_USER_OK: - len = snprintf(out, sizeof(out), "PASS %s\r\n", cb->pass); - ecore_con_server_send(ev->server, out, len); - mb->state = STATE_PASS_OK; - break; - case STATE_PASS_OK: - len = snprintf(out, sizeof(out), "STAT\r\n"); - ecore_con_server_send(ev->server, out, len); - mb->state = STATE_STATUS_OK; - break; - case STATE_STATUS_OK: - mb->has_mail = 0; - mb->num_new = 0; - mb->num_total = 0; - if (sscanf(in, "+OK %i %i", &mb->num_new, &mb->num_total) == 2) - { - if (mb->num_new > 0) - mb->has_mail = 1; - } - /* Reset total to be new mail as total above gets set to msg size */ - mb->num_total = mb->num_new; - - _mail_set_text(mb->inst); - ecore_con_server_del(ev->server); - mb->state = STATE_DISCONNECTED; - mb->cmd = 0; - mb->server = NULL; - if ((cb->use_exec) && (cb->exec != NULL)) + cb = l->data; + switch (cb->type) { - if (mb->num_new <= 0) break; - if (!mb->exe) - { - mb->exit_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _mail_cb_exe_exit, mb); - mb->exe = ecore_exe_run(cb->exec, mb); - } - } - break; - default: - break; - } - return 0; -} - -static int -_mail_parse_imap(void *data, void *data2) -{ - Mailbox *mb = data; - Config_Box *cb; - Ecore_Con_Event_Server_Data *ev = data2; - char in[2048], out[2048]; - char *spc; - size_t slen; - int len; - - if (!mb) return; - if (!ev) return; - if ((!mb->server) || (mb->server != ev->server)) return; - - cb = mb->config; - - len = sizeof(in) -1; - len = (((len) > (ev->size)) ? ev->size : len); - memcpy(in, ev->data, len); - in[len] = 0; - - if (spc = strchr(in, ' ')) - { - slen = strlen(spc); - if ((slen > 5) && (!strncmp(spc + 1, "NO ", 3))) - { - len = snprintf(out, sizeof(out), "A%03i LOGOUT", ++mb->cmd); - ecore_con_server_send(ev->server, out, len); - printf("Imap Failure: %s\n", spc + 4); - mb->state = STATE_DISCONNECTED; - mb->cmd = 0; - mb->server = NULL; - return 0; - } - else if ((slen > 6) && (!strncmp(spc + 1, "BAD ", 4))) - { - len = snprintf(out, sizeof(out), "A%03i LOGOUT", ++mb->cmd); - ecore_con_server_send(ev->server, out, len); - printf("Imap Bad Command: %s\n", spc + 5); - mb->state = STATE_DISCONNECTED; - mb->cmd = 0; - mb->server = NULL; - return 0; + case MAIL_TYPE_MDIR: + break; + case MAIL_TYPE_MBOX: + break; + case MAIL_TYPE_POP: + _mail_pop_check_mail(inst, cb); + break; + case MAIL_TYPE_IMAP: + have_imap = 1; + break; } } - - if (mb->state == STATE_CONNECTED) - mb->state++; - - switch (mb->state) - { - case STATE_SERVER_READY: - len = snprintf(out, sizeof(out), "A%03i LOGIN %s %s\r\n", ++mb->cmd, cb->user, cb->pass); - ecore_con_server_send(ev->server, out, len); - mb->state = STATE_LOGGED_IN; - break; - case STATE_LOGGED_IN: - len = snprintf(out, sizeof(out), "A%03i STATUS %s (MESSAGES UNSEEN)\r\n",++mb->cmd, cb->new_path); - ecore_con_server_send(ev->server, out, len); - mb->state = STATE_STATUS_OK; - break; - case STATE_STATUS_OK: - mb->has_mail = 0; - mb->num_new = 0; - mb->num_total = 0; - - if (sscanf(in, "* STATUS %*s (MESSAGES %i UNSEEN %i)", &mb->num_total, &mb->num_new) == 2) - { - if (mb->num_new > 0) - mb->has_mail = 1; - } - - _mail_set_text(mb->inst); - - len = snprintf(out, sizeof(out), "A%03i LOGOUT", ++mb->cmd); - ecore_con_server_send(ev->server, out, len); - mb->state = STATE_DISCONNECTED; - mb->cmd = 0; - mb->server = NULL; - if ((cb->use_exec) && (cb->exec != NULL)) - { - if (mb->num_new <= 0) break; - if (!mb->exe) - { - mb->exit_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _mail_cb_exe_exit, mb); - mb->exe = ecore_exe_run(cb->exec, mb); - } - } - break; - case STATE_DISCONNECTED: - mb->server = NULL; - mb->cmd = 0; - break; - default: - break; - } - return 0; + if (have_imap) _mail_imap_check_mail(inst); + return 1; } -static void -_mail_mbox_check(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path) +void +_mail_set_text(void *data, int count) { - Mailbox *mb = data; - Config_Box *cb; - FILE *f; + Instance *inst = data; char buf[1024]; - int total = 0, unread = 0; - int header; - - if (!mb) return; - - cb = mb->config; - if (!cb->new_path) return; - - if (!(f = fopen(cb->new_path, "r"))) - return; - - mb->has_mail = 0; - mb->num_new = 0; - mb->num_total = 0; - - while (fgets(buf, sizeof(buf), f)) - { - if (buf[0] == '\n') - header = 0; - else if (!strncmp(buf, "From ", 5)) - { - header = 1; - mb->num_total++; - mb->num_new++; - } - else if ((header) && (!strncmp(buf, "Status: ", 7)) && (strchr(buf, 'R'))) - mb->num_new--; - } - fclose(f); - - if (mb->num_new > 0) - mb->has_mail = 1; - - _mail_set_text(mb->inst); -} - -static void -_mail_mdir_check(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path) -{ - Mailbox *mb = data; - - if (!mb) return; - - mb->has_mail = 0; - mb->num_total = 0; - mb->num_new = 0; - - mb->num_total = _mail_mdir_get_files(mb->config->cur_path); - mb->num_new = _mail_mdir_get_files(mb->config->new_path); - - if (mb->num_new > 0) - mb->has_mail = 1; - - _mail_set_text(mb->inst); -} - -static int -_mail_mdir_get_files(const char *path) -{ - Ecore_List *l; - char *item; - int i = 0; - - l = ecore_file_ls(path); - ecore_list_goto_first(l); - while ((item = (char *)ecore_list_next(l)) != NULL) - { - if ((!strcmp(item, ".")) || (!strcmp(item, ".."))) continue; - i++; - } - - ecore_list_destroy(l); - return i; -} - -static void -_mail_set_text(void *data) -{ - Instance *inst = data; - Evas_List *l; - char buf[4096]; - int count = 0; if (!inst) return; - - for (l = inst->mboxes; l; l = l->next) - { - Mailbox *mb; - Config_Box *cb; - - mb = l->data; - cb = mb->config; - if (mb->has_mail) - { - count++; - edje_object_part_text_set(inst->mail->mail_obj, "name", cb->user); - snprintf(buf, sizeof(buf), "%d/%d", mb->num_new, mb->num_total); - edje_object_part_text_set(inst->mail->mail_obj, "new_label", buf); - } - } - if (count > 0) - edje_object_signal_emit(inst->mail->mail_obj, "new_mail", ""); + if (count > 0) + { + snprintf(buf, sizeof(buf), "%d", count); + edje_object_part_text_set(inst->mail->mail_obj, "new_label", buf); + edje_object_signal_emit(inst->mail->mail_obj, "new_mail", ""); + } else { edje_object_signal_emit(inst->mail->mail_obj, "no_mail", ""); - edje_object_part_text_set(inst->mail->mail_obj, "name", ""); edje_object_part_text_set(inst->mail->mail_obj, "new_label", ""); } } @@ -965,11 +548,12 @@ _mail_set_text(void *data) static int _mail_cb_exe_exit(void *data, int type, void *event) { - Mailbox *mb = data; + Config_Box *cb; - if (!mb) return; - mb->exe = NULL; - ecore_event_handler_del(mb->exit_handler); + cb = data; + if (!cb) return; + cb->exe = NULL; + ecore_event_handler_del(exit_handler); } void @@ -993,32 +577,19 @@ _mail_box_added(const char *ci_name, const char *box_name) cb = b->data; if ((cb->name) && (!strcmp(cb->name, box_name))) { - Mailbox *mb; - - mb = E_NEW(Mailbox, 1); - mb->inst = inst; - mb->config = cb; - mb->server = NULL; - mb->state = STATE_DISCONNECTED; - mb->cmd = 0; - inst->mboxes = evas_list_append(inst->mboxes, mb); - - if (cb->type == MAIL_TYPE_MDIR) - mb->monitor = ecore_file_monitor_add(cb->new_path, _mail_mdir_check, mb); - else if (cb->type == MAIL_TYPE_MBOX) - mb->monitor = ecore_file_monitor_add(cb->new_path, _mail_mbox_check, mb); - else + switch (cb->type) { - if (!inst->add_handler) - inst->add_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _mail_server_add, inst); - if (!inst->del_handler) - inst->del_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _mail_server_del, inst); - if (!inst->data_handler) - inst->data_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, _mail_server_data, inst); - - _mail_cb_check(inst); - if (!inst->check_timer) - inst->check_timer = ecore_timer_add((ci->check_time * 60.0), _mail_cb_check, inst); + case MAIL_TYPE_IMAP: + _mail_imap_add_mailbox(cb); + break; + case MAIL_TYPE_POP: + break; + case MAIL_TYPE_MDIR: + _mail_mdir_add_mailbox(inst, cb); + break; + case MAIL_TYPE_MBOX: + _mail_mbox_add_mailbox(inst, cb); + break; } break; } @@ -1060,25 +631,19 @@ _mail_box_deleted(const char *ci_name, const char *box_name) } if (found) { - for (l = inst->mboxes; l; l = l->next) + switch (cb->type) { - Mailbox *mb; - - mb = l->data; - if (((mb->config->name) && (cb->name)) && - (!strcmp(mb->config->name, cb->name))) - { - if (mb->monitor) ecore_file_monitor_del(mb->monitor); - if (mb->server) ecore_con_server_del(mb->server); - if (mb->exit_handler) ecore_event_handler_del(mb->exit_handler); - mb->server = NULL; - mb->exe = NULL; - mb->state = STATE_DISCONNECTED; - mb->cmd = 0; - inst->mboxes = evas_list_remove(inst->mboxes, mb); - free(mb); - break; - } + case MAIL_TYPE_IMAP: + _mail_imap_del_mailbox(cb); + break; + case MAIL_TYPE_POP: + break; + case MAIL_TYPE_MDIR: + _mail_mdir_del_mailbox(cb); + break; + case MAIL_TYPE_MBOX: + _mail_mbox_del_mailbox(cb); + break; } ci->boxes = evas_list_remove(ci->boxes, cb); e_config_save_queue(); @@ -1124,35 +689,11 @@ _mail_config_updated(const char *id) static void _mail_menu_cb_exec(void *data, E_Menu *m, E_Menu_Item *mi) { - Mailbox *mb = data; Config_Box *cb; - if (!mb) return; - if (mb->exe) return; - cb = mb->config; + cb = data; + if (!cb) return; - mb->exit_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _mail_cb_exe_exit, mb); - mb->exe = ecore_exe_run(cb->exec, mb); -} - -static Mailbox * -_mail_find_mailbox(void *data, void *data2) -{ - Instance *inst = data; - Ecore_Con_Server *serv = data2; - Evas_List *l; - Mailbox *mb; - - if (!inst) return NULL; - if (!serv) return NULL; - - for (l = inst->mboxes; l; l = l->next) - { - mb = l->data; - if (!mb) continue; - if (!mb->server) continue; - if (mb->server != serv) continue; - return mb; - } - return NULL; + exit_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _mail_cb_exe_exit, cb); + cb->exe = ecore_exe_run(cb->exec, cb); } diff --git a/e_mod_main.h b/e_mod_main.h index f5cf8ed..ab8b73f 100644 --- a/e_mod_main.h +++ b/e_mod_main.h @@ -3,9 +3,6 @@ #ifndef E_MOD_MAIN_H #define E_MOD_MAIN_H -//IMAP: 143 -//POP: 110 - typedef enum { MAIL_TYPE_POP, @@ -25,7 +22,6 @@ struct _Config E_Menu *menu; Evas_List *instances; Evas_List *items; - Ecore_Event_Handler *exe_exit_handler; }; struct _Config_Item @@ -51,8 +47,11 @@ struct _Config_Box const char *new_path; const char *cur_path; + int num_new, num_total; + unsigned char use_exec; const char *exec; + Ecore_Exe *exe; }; EAPI extern E_Module_Api e_modapi; @@ -67,6 +66,7 @@ void _mail_config_updated(const char *id); void _mail_box_config_updated(E_Config_Dialog *cfd); void _mail_box_deleted(const char *ci_name, const char *box_name); void _mail_box_added(const char *ci_name, const char *box_name); +void _mail_set_text(void *data, int count); extern Config *mail_config; diff --git a/mail.edc b/mail.edc index c42de3e..2906f7c 100644 --- a/mail.edc +++ b/mail.edc @@ -74,50 +74,6 @@ collections } } } - part - { - name: "name"; - type: TEXT; - clip_to: "clip"; - effect: SOFT_SHADOW; - mouse_events: 0; - description - { - state: "default" 0.0; - color: 0 0 0 255; - color3: 255 255 255 42; - visible: 0; - rel1 - { - relative: 0.0 0.9; - offset: 0 0; - to: "logo"; - } - rel2 - { - relative: 1.0 1.0; - offset: -1 -1; - to: "logo"; - } - text - { - text: ""; - font: "VeraBold"; - size: 10; - min: 1 1; - align: 0.5 0.5; - text_class: "module_normal"; - } - } - description - { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - color: 0 0 0 255; - color3: 255 255 255 42; - } - } part { name: "new_label"; @@ -133,13 +89,13 @@ collections visible: 0; rel1 { - relative: 0.0 0.3; + relative: 0.0 0.0; offset: 0 0; to: "logo"; } rel2 { - relative: 1.0 0.5; + relative: 1.0 1.0; offset: -1 -1; to: "logo"; } @@ -147,10 +103,10 @@ collections { text: ""; font: "VeraBold"; - size: 9; + size: 14; min: 1 1; - align: 1.0 0.5; - text_class: "module_small"; + align: 0.5 0.5; + text_class: "module_large"; } } description @@ -172,7 +128,6 @@ collections source: ""; action: STATE_SET "visible" 0.0; transition: SINUSOIDAL 0.5; - target: "name"; target: "new_label"; } program @@ -190,7 +145,6 @@ collections source: ""; action: STATE_SET "default" 0.0; transition: SINUSOIDAL 1.0; - target: "name"; target: "new_label"; } program