Split mail checking code into seperate files for easier fixes.

When checking imap servers, if accounts use the same server, then only
connect once and check all the boxes for this server. Englebass, I think
this is what you meant :)

Some edc changes.


SVN revision: 23381
This commit is contained in:
Christopher Michael 2006-06-11 17:41:42 +00:00
parent 7e72655941
commit 5f92b6ff6c
5 changed files with 152 additions and 653 deletions

View File

@ -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

View File

@ -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)

View File

@ -17,40 +17,23 @@
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
#include <sys/types.h>
#include <dirent.h>
#include <e.h>
#include <Ecore.h>
#include <Ecore_Con.h>
#include <Ecore_File.h>
#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);
}

View File

@ -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;

View File

@ -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