Enlightenment CVS committal

Author  : tsauerbeck
Project : misc
Module  : embrace

Dir     : misc/embrace/src/plugins/imap


Modified Files:
        imap.c 


Log Message:
ported the recent fixes for POP3 to the IMAP plugin
===================================================================
RCS file: /cvsroot/enlightenment/misc/embrace/src/plugins/imap/imap.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -3 -r1.10 -r1.11
--- imap.c      17 Apr 2004 17:40:13 -0000      1.10
+++ imap.c      18 Apr 2004 13:02:36 -0000      1.11
@@ -1,5 +1,5 @@
 /*
- * $Id: imap.c,v 1.10 2004/04/17 17:40:13 tsauerbeck Exp $
+ * $Id: imap.c,v 1.11 2004/04/18 13:02:36 tsauerbeck Exp $
  * vim:noexpandtab:ts=4:sw=4:sts=4
  *
  * Copyright (C) 2004 Embrace project.
@@ -29,6 +29,14 @@
 
 #include <embrace_plugin.h>
 
+typedef enum {
+       STATE_DISCONNECTED,
+       STATE_CONNECTED,
+       STATE_SERVER_READY,
+       STATE_LOGGED_IN,
+       STATE_STATUS_OK
+} State;
+
 #define MAX_INTERVAL 300
 
 static EmbracePlugin *plugin = NULL;
@@ -37,8 +45,6 @@
 {
        Ecore_Con_Event_Server_Add *ev = event;
        MailBox *mb;
-       char buf[256];
-       int len;
 
        mb = ecore_con_server_data_get (ev->server);
        assert (mb);
@@ -46,12 +52,7 @@
        if (mailbox_plugin_get (mb) != plugin)
                return 1;
 
-       /* now login to the server */
-       len = snprintf (buf, sizeof (buf), "A001 LOGIN %s %s\r\n",
-                       (char *) mailbox_property_get (mb, "user"),
-                       (char *) mailbox_property_get (mb, "pass"));
-
-       ecore_con_server_send (ev->server, buf, len);
+       mailbox_property_set (mb, "state", (void *) STATE_CONNECTED);
 
        return 0;
 }
@@ -60,8 +61,9 @@
 {
        Ecore_Con_Event_Server_Data *ev = event;
        MailBox *mb;
-       char realbuf[1024], *buf = realbuf;
-       int num = 0, new = 0, len;
+       State state;
+       char inbuf[1024], outbuf[256];
+       int total = 0, unseen = 0, len;
 
        mb = ecore_con_server_data_get (ev->server);
        assert (mb);
@@ -70,43 +72,96 @@
                return 1;
 
        /* take the data and make a NUL-terminated string out of it */
-       len = sizeof (realbuf) - 1;
-       len = MIN(len, ev->size);
+       len = sizeof (inbuf) - 1;
+       len = MIN (len, ev->size);
 
-       memcpy (buf, ev->data, len);
-       buf[len] = 0;
+       memcpy (inbuf, ev->data, len);
+       inbuf[len] = 0;
+       embrace_strstrip (inbuf);
 
-       /* STATUS the correct directory on successful login */
-       if (!strncmp(buf, "A001 OK LOGIN", 13)) {
-               len = snprintf (buf, sizeof (realbuf),
-                               "A002 STATUS %s (MESSAGES UNSEEN)\r\n",
-                               (char *) mailbox_property_get (mb, "path"));
-               ecore_con_server_send (ev->server, buf, len);
+       state = (State) mailbox_property_get (mb, "state");
 
+       if (!strncmp (inbuf, "* NO", 4)) {
+               fprintf (stderr, "[imap] failure: %s\n", &inbuf[5]);
                return 0;
+       } else if (!strncmp (inbuf, "* BAD", 5)) {
+               fprintf (stderr, "[imap] bad command: %s\n", &inbuf[6]);
+               return 0;
+       }
+
+       mailbox_property_set (mb, "state", (void *) ++state);
+
+       switch (state) {
+               case STATE_SERVER_READY:
+                       len = snprintf (outbuf, sizeof (outbuf),
+                                       "A001 LOGIN %s %s\r\n",
+                                       (char *) mailbox_property_get (mb, "user"),
+                                       (char *) mailbox_property_get (mb, "pass"));
+                       ecore_con_server_send (ev->server, outbuf, len);
+                       break;
+               case STATE_LOGGED_IN:
+                       len = snprintf (outbuf, sizeof (outbuf),
+                                       "A002 STATUS %s (MESSAGES UNSEEN)\r\n",
+                                       (char *) mailbox_property_get (mb, "path"));
+                       ecore_con_server_send (ev->server, outbuf, len);
+                       break;
+               case STATE_STATUS_OK:
+                       if (sscanf (inbuf, "* STATUS %*s (MESSAGES %i UNSEEN %i)",
+                                   &total, &unseen) == 2) {
+                               mailbox_unseen_set (mb, unseen);
+                               mailbox_total_set (mb, total);
+
+                               ecore_con_server_send (ev->server, "A003 LOGOUT", 11);
+                               ecore_con_server_del (ev->server);
+                       }
+
+                       break;
+               default:
+                       assert (false);
        }
 
-       /* check for STATUS response, fetch numbers */
-       while (*buf != '\0' && *buf != '(')
-               buf++;
-
-       if (sscanf (buf, "(MESSAGES %i UNSEEN %i)", &num, &new) == 2) {
-               mailbox_total_set (mb, num);
-               mailbox_unseen_set (mb, new);
+       return 0;
+}
 
-               ecore_con_server_send (ev->server, "A003 LOGOUT", 11);
-               ecore_con_server_del (ev->server);
+static int on_server_del (void *udata, int type, void *event)
+{
+       Ecore_Con_Event_Server_Del *ev = event;
+       MailBox *mb;
+       char *host;
+
+       mb = ecore_con_server_data_get (ev->server);
+       assert (mb);
+
+       if (mailbox_plugin_get (mb) != plugin)
+               return 1;
+
+       host = (char *) mailbox_property_get (mb, "host");
+
+       if (mailbox_property_get (mb, "state") == STATE_DISCONNECTED)
+               fprintf (stderr, "[imap] cannot connect to '%s'\n", host);
+       else {
+               mailbox_property_set (mb, "state", STATE_DISCONNECTED);
+               fprintf (stderr, "[imap] lost connection to '%s'\n", host);
        }
 
+       ecore_con_server_del (ev->server);
+       mailbox_property_set (mb, "server", NULL);
+
        return 0;
 }
 
 static bool imap_check (MailBox *mb)
 {
        Ecore_Con_Type type = ECORE_CON_REMOTE_SYSTEM;
+       Ecore_Con_Server *server;
        char *host;
        int port;
 
+       if (mailbox_property_get (mb, "server")) {
+               fprintf (stderr, "[imap] already connected!\n");
+               return false;
+       }
+
        host = mailbox_property_get (mb, "host"),
        port = (int) mailbox_property_get (mb, "port");
 
@@ -118,7 +173,10 @@
                type |= ECORE_CON_USE_SSL;
 #endif
 
-       ecore_con_server_connect (type, host, port, mb);
+       server = ecore_con_server_connect (type, host, port, mb);
+
+       mailbox_property_set (mb, "state", STATE_DISCONNECTED);
+       mailbox_property_set (mb, "server", server);
 
        return true;
 }
@@ -209,7 +267,7 @@
                fprintf (stderr, "[imap] 'user' not specified!\n");
                return false;
        }
-       
+
        mailbox_property_set (mb, "user", str);
 
        /* read password */
@@ -219,17 +277,17 @@
                fprintf (stderr, "[imap] 'user' not specified!\n");
                return false;
        }
-       
+
        mailbox_property_set (mb, "pass", str);
-       
+
        /* read mailbox path */
        snprintf (key, sizeof (key), "%s/path", root);
-       
+
        if (!(str = e_db_str_get (edb, key))) {
                fprintf (stderr, "[imap] 'path' not specified!\n");
                return false;
        }
-       
+
        mailbox_property_set (mb, "path", str);
 
        return true;
@@ -258,6 +316,8 @@
                                 on_server_add, NULL);
        ecore_event_handler_add (ECORE_CON_EVENT_SERVER_DATA,
                                 on_server_data, NULL);
+       ecore_event_handler_add (ECORE_CON_EVENT_SERVER_DEL,
+                                on_server_del, NULL);
 
        return true;
 }




-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to