Multiple Fixes:

- Stop changing icons when we check the mail and only set to new
mail icon if we actually have mail. Thanks HandAndE :)
     - Only create one ecore_con_server to handle all accounts. Thanks
englebass :)


SVN revision: 23352
This commit is contained in:
Christopher Michael 2006-06-10 12:35:33 +00:00
parent 6684bfeea3
commit 217abbac3e
2 changed files with 145 additions and 117 deletions

View File

@ -21,6 +21,7 @@
#include <dirent.h>
#include <e.h>
#include <Ecore.h>
#include <Ecore_Con.h>
#include <Ecore_File.h>
#include "e_mod_main.h"
@ -63,14 +64,10 @@ struct _Mailbox
int has_mail;
int num_new;
int num_total;
Ecore_Exe *exe;
Ecore_Con_Server *server;
Ecore_Event_Handler *add_handler;
Ecore_Event_Handler *del_handler;
Ecore_Event_Handler *data_handler;
Ecore_File_Monitor *monitor;
Ecore_Event_Handler *exit_handler;
Ecore_Exe *exe;
Ecore_Event_Handler *exit_handler;
};
/* Func Protos for Gadcon */
@ -101,11 +98,16 @@ static void _mail_mdir_check(void *data, Ecore_File_Monitor *monitor, Ecore_File
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;
static E_Config_DD *conf_box_edd = NULL;
static Ecore_Event_Handler *add_handler;
static Ecore_Event_Handler *del_handler;
static Ecore_Event_Handler *data_handler;
Config *mail_config = NULL;
static const E_Gadcon_Client_Class _gc_class =
@ -147,11 +149,18 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
edje_object_signal_emit(inst->mail_obj, "label_active", "");
else
edje_object_signal_emit(inst->mail_obj, "label_passive", "");
mail_config->instances = evas_list_append(mail_config->instances, inst);
if (!ci->boxes) return gcc;
if (!add_handler)
add_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _mail_server_add, inst);
if (!del_handler)
del_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _mail_server_del, inst);
if (!data_handler)
data_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, _mail_server_data, inst);
if (!ci->boxes) return gcc;
for (l = ci->boxes; l; l = l->next)
{
Mailbox *mb;
@ -161,9 +170,9 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
mb = E_NEW(Mailbox, 1);
mb->inst = inst;
mb->config = cb;
mb->server = NULL;
mb->state = STATE_DISCONNECTED;
mb->cmd = 0;
mb->server = NULL;
inst->mboxes = evas_list_append(inst->mboxes, mb);
if (cb->type == MAIL_TYPE_MDIR)
@ -185,19 +194,23 @@ _gc_shutdown(E_Gadcon_Client *gcc)
{
Instance *inst;
if (add_handler) ecore_event_handler_del(add_handler);
if (data_handler) ecore_event_handler_del(data_handler);
if (del_handler) ecore_event_handler_del(del_handler);
inst = gcc->data;
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->add_handler) ecore_event_handler_del(mb->add_handler);
if (mb->data_handler) ecore_event_handler_del(mb->data_handler);
if (mb->del_handler) ecore_event_handler_del(mb->del_handler);
if (mb->server) ecore_con_server_del(mb->server);
mb->server = NULL;
mb->cmd = 0;
mb->state = STATE_DISCONNECTED;
inst->mboxes = evas_list_remove_list(inst->mboxes, inst->mboxes);
free(mb);
}
@ -239,17 +252,12 @@ _gc_icon(Evas *evas)
static void
_mail_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Instance *inst;
Evas_Event_Mouse_Down *ev;
Config_Item *ci;
Instance *inst = data;
Evas_Event_Mouse_Down *ev = event_info;
Evas_List *l;
inst = data;
if (!inst) return;
ci = _mail_config_item_get(inst->gcc->id);
ev = event_info;
if ((ev->button == 3) && (!mail_config->menu))
{
E_Menu *mn, *sn;
@ -305,26 +313,26 @@ _mail_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
ev->timestamp);
evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, EVAS_BUTTON_NONE, ev->timestamp, NULL);
}
else if ((ev->button == 1) && (inst))
else if (ev->button == 1)
_mail_cb_check(inst);
}
static void
_mail_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Instance *inst;
Instance *inst = data;
inst = data;
if (!inst) return;
edje_object_signal_emit(inst->mail_obj, "label_active", "");
}
static void
_mail_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Instance *inst;
Instance *inst = data;
Config_Item *ci;
inst = data;
if (!inst) return;
ci = _mail_config_item_get(inst->gcc->id);
if (!ci->show_label)
edje_object_signal_emit(inst->mail_obj, "label_passive", "");
@ -341,10 +349,10 @@ _mail_menu_cb_post(void *data, E_Menu *m)
static void
_mail_menu_cb_configure(void *data, E_Menu *m, E_Menu_Item *mi)
{
Instance *inst;
Instance *inst = data;
Config_Item *ci;
inst = data;
if (!inst) return;
ci = _mail_config_item_get(inst->gcc->id);
_config_mail_module(ci);
}
@ -535,20 +543,20 @@ _mail_free(Mail *mail)
static int
_mail_cb_check(void *data)
{
Instance *inst;
Instance *inst = data;
Evas_List *l;
Ecore_Con_Type type;
inst = data;
if (!inst->mboxes) return;
Ecore_Con_Server *server;
if (!inst) return 1;
if (!inst->mboxes) return 1;
for (l = inst->mboxes; l; l = l->next)
{
Mailbox *mb;
Config_Box *cb;
mb = l->data;
mb->server = NULL;
mb->inst = inst;
cb = mb->config;
@ -556,62 +564,61 @@ _mail_cb_check(void *data)
if (cb->port <= 0) continue;
if (cb->type > 1) continue;
if (!mb->add_handler)
mb->add_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _mail_server_add, mb);
if (!mb->del_handler)
mb->del_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _mail_server_del, mb);
if (!mb->data_handler)
mb->data_handler = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, _mail_server_data, mb);
type = ECORE_CON_REMOTE_SYSTEM;
if (cb->ssl)
type |= ECORE_CON_USE_SSL;
mb->server = ecore_con_server_connect(type, cb->host, cb->port, mb);
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;
mb = data;
if (!mb) return 1;
Ecore_Con_Event_Server_Add *ev = event;
ev = event;
if ((!mb->server) || (mb->server != ev->server)) return 1;
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;
Ecore_Con_Event_Server_Del *ev = event;
mb = data;
if (!inst) return 1;
if (!inst->mboxes) return 1;
mb = _mail_find_mailbox(inst, ev->server);
if (!mb) return 1;
ev = event;
if ((!mb->server) || (mb->server != ev->server)) return 1;
cb = mb->config;
if (!cb->host) return 1;
if (mb->state == STATE_DISCONNECTED)
printf("Cannot Connect to %s\n", cb->host);
else
mb->state = STATE_DISCONNECTED;
ecore_con_server_del(mb->server);
ecore_con_server_del(ev->server);
mb->server = NULL;
mb->cmd = 0;
mb->state = STATE_DISCONNECTED;
return 1;
}
@ -619,65 +626,68 @@ _mail_server_del(void *data, int type, void *event)
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;
mb = data;
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;
ev = event;
if ((!mb->server) || (mb->server != ev->server)) return 1;
cb = mb->config;
if (cb->type == MAIL_TYPE_POP)
return _mail_parse_pop(mb, ev);
else if (cb->type == MAIL_TYPE_IMAP)
return _mail_parse_imap(mb, ev);
if (!cb) return 1;
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;
Mailbox *mb = data;
Config_Box *cb;
Ecore_Con_Event_Server_Data *ev;
Ecore_Con_Event_Server_Data *ev = data2;
char in[2048], out[2048];
int len;
mb = data;
if (!mb) return;
cb = mb->config;
ev = data2;
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(mb->server);
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(mb->server);
ecore_con_server_del(ev->server);
mb->server = NULL;
mb->cmd = 0;
return 0;
}
if (mb->state == STATE_CONNECTED)
mb->state++;
@ -685,17 +695,17 @@ _mail_parse_pop(void *data, void *data2)
{
case STATE_SERVER_READY:
len = snprintf(out, sizeof(out), "USER %s\r\n", cb->user);
ecore_con_server_send(mb->server, out, len);
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(mb->server, out, len);
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(mb->server, out, len);
ecore_con_server_send(ev->server, out, len);
mb->state = STATE_STATUS_OK;
break;
case STATE_STATUS_OK:
@ -712,8 +722,9 @@ _mail_parse_pop(void *data, void *data2)
_mail_set_text(mb->inst);
ecore_con_server_del(ev->server);
mb->state = STATE_DISCONNECTED;
ecore_con_server_del(mb->server);
mb->cmd = 0;
mb->server = NULL;
if ((cb->use_exec) && (cb->exec != NULL))
{
@ -734,23 +745,20 @@ _mail_parse_pop(void *data, void *data2)
static int
_mail_parse_imap(void *data, void *data2)
{
Mailbox *mb;
Mailbox *mb = data;
Config_Box *cb;
Ecore_Con_Event_Server_Data *ev;
Ecore_Con_Event_Server_Data *ev = data2;
char in[2048], out[2048];
char *spc;
size_t slen;
int len;
mb = data;
if (!mb) return;
cb = mb->config;
ev = data2;
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);
@ -762,19 +770,21 @@ _mail_parse_imap(void *data, void *data2)
if ((slen > 5) && (!strncmp(spc + 1, "NO ", 3)))
{
len = snprintf(out, sizeof(out), "A%03i LOGOUT", ++mb->cmd);
ecore_con_server_send(mb->server, out, len);
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(mb->server, out, len);
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;
}
}
@ -786,12 +796,12 @@ _mail_parse_imap(void *data, void *data2)
{
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(mb->server, out, len);
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(mb->server, out, len);
ecore_con_server_send(ev->server, out, len);
mb->state = STATE_STATUS_OK;
break;
case STATE_STATUS_OK:
@ -807,10 +817,11 @@ _mail_parse_imap(void *data, void *data2)
_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;
len = snprintf(out, sizeof(out), "A%03i LOGOUT", ++mb->cmd);
ecore_con_server_send(mb->server, out, len);
mb->server = NULL;
if ((cb->use_exec) && (cb->exec != NULL))
{
if (mb->num_new <= 0) break;
@ -823,6 +834,7 @@ _mail_parse_imap(void *data, void *data2)
break;
case STATE_DISCONNECTED:
mb->server = NULL;
mb->cmd = 0;
break;
default:
break;
@ -833,16 +845,17 @@ _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)
{
Mailbox *mb;
Mailbox *mb = data;
Config_Box *cb;
FILE *f;
char buf[1024];
int total = 0, unread = 0;
int header;
mb = data;
if (!mb) return;
cb = mb->config;
if (!cb->new_path) return;
if (!(f = fopen(cb->new_path, "r")))
return;
@ -875,9 +888,8 @@ _mail_mbox_check(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event
static void
_mail_mdir_check(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path)
{
Mailbox *mb;
Mailbox *mb = data;
mb = data;
if (!mb) return;
mb->has_mail = 0;
@ -915,17 +927,13 @@ _mail_mdir_get_files(const char *path)
static void
_mail_set_text(void *data)
{
Instance *inst;
Instance *inst = data;
Evas_List *l;
char buf[4096];
int count = 0;
inst = data;
if (!inst) return;
edje_object_part_text_set(inst->mail->mail_obj, "name", "");
edje_object_signal_emit(inst->mail->mail_obj, "no_mail", "");
edje_object_part_text_set(inst->mail->mail_obj, "new_label", "");
for (l = inst->mboxes; l; l = l->next)
{
Mailbox *mb;
@ -935,24 +943,24 @@ _mail_set_text(void *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);
edje_object_signal_emit(inst->mail->mail_obj, "new_mail", "");
break;
}
}
if (count > 0)
edje_object_signal_emit(inst->mail->mail_obj, "new_mail", "");
else
edje_object_signal_emit(inst->mail->mail_obj, "no_mail", "");
}
static int
_mail_cb_exe_exit(void *data, int type, void *event)
{
Mailbox *mb;
Mailbox *mb = data;
mb = data;
if (!mb) return;
mb->exe = NULL;
ecore_event_handler_del(mb->exit_handler);
@ -1045,11 +1053,9 @@ _mail_box_deleted(const char *ci_name, const char *box_name)
(!strcmp(mb->config->name, cb->name)))
{
if (mb->monitor) ecore_file_monitor_del(mb->monitor);
if (mb->add_handler) ecore_event_handler_del(mb->add_handler);
if (mb->data_handler) ecore_event_handler_del(mb->data_handler);
if (mb->del_handler) ecore_event_handler_del(mb->del_handler);
if (mb->server) ecore_con_server_del(mb->server);
mb->server = NULL;
mb->state = STATE_DISCONNECTED;
mb->cmd = 0;
inst->mboxes = evas_list_remove(inst->mboxes, mb);
free(mb);
break;
@ -1099,10 +1105,9 @@ _mail_config_updated(const char *id)
static void
_mail_menu_cb_exec(void *data, E_Menu *m, E_Menu_Item *mi)
{
Mailbox *mb;
Mailbox *mb = data;
Config_Box *cb;
mb = data;
if (!mb) return;
if (mb->exe) return;
cb = mb->config;
@ -1110,3 +1115,25 @@ _mail_menu_cb_exec(void *data, E_Menu *m, E_Menu_Item *mi)
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;
}

View File

@ -47,6 +47,7 @@ collections
{
state: "default" 0.0;
aspect: 1.0 1.0;
visible: 1;
rel1
{
relative: 0.0 0.0;