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
master
Christopher Michael 17 years ago
parent 7e72655941
commit 5f92b6ff6c
  1. 6
      Makefile.am
  2. 2
      e_mod_config.c
  3. 731
      e_mod_main.c
  4. 8
      e_mod_main.h
  5. 54
      mail.edc

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

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

@ -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))
{
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;
}
}
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;
}
static void
_mail_mbox_check(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path)
{
Mailbox *mb = data;
Config_Box *cb;
FILE *f;
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))
cb = l->data;
switch (cb->type)
{
header = 1;
mb->num_total++;
mb->num_new++;
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;
}
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;
if (have_imap) _mail_imap_check_mail(inst);
return 1;
}
static void
_mail_set_text(void *data)
void
_mail_set_text(void *data, int count)
{
Instance *inst = data;
Evas_List *l;
char buf[4096];
int count = 0;
char buf[1024];
if (!inst) return;
for (l = inst->mboxes; l; l = l->next)
if (count > 0)
{
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);
}
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", "");
}
if (count > 0)
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;
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;
cb = data;
if (!cb) return;
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);
}

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

@ -76,7 +76,7 @@ collections
}
part
{
name: "name";
name: "new_label";
type: TEXT;
clip_to: "clip";
effect: SOFT_SHADOW;
@ -89,7 +89,7 @@ collections
visible: 0;
rel1
{
relative: 0.0 0.9;
relative: 0.0 0.0;
offset: 0 0;
to: "logo";
}
@ -103,54 +103,10 @@ collections
{
text: "";
font: "VeraBold";
size: 10;
size: 14;
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";
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.3;
offset: 0 0;
to: "logo";
}
rel2
{
relative: 1.0 0.5;
offset: -1 -1;
to: "logo";
}
text
{
text: "";
font: "VeraBold";
size: 9;
min: 1 1;
align: 1.0 0.5;
text_class: "module_small";
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

Loading…
Cancel
Save