aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog25
-rw-r--r--camel/providers/imapp/camel-imapp-driver.c54
-rw-r--r--camel/providers/imapp/camel-imapp-engine.c34
-rw-r--r--camel/providers/imapp/camel-imapp-engine.h1
-rw-r--r--camel/providers/imapp/camel-imapp-provider.c6
-rw-r--r--camel/providers/imapp/camel-imapp-store.c215
-rw-r--r--camel/providers/imapp/camel-imapp-stream.c4
7 files changed, 100 insertions, 239 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 66a7e8f731..7f898f9d54 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,28 @@
+2003-09-15 Not Zed <NotZed@Ximian.com>
+
+ * providers/imapp/camel-imapp-store.c (store_resp_list)
+ (imap_login, try_sasl, imap_try_authenticate): removed dead code.
+
+ * providers/imapp/camel-imapp-stream.c: return -1 if stream not
+ set.
+
+ * providers/imapp/camel-imapp-engine.c (iterate_completion): put
+ done request on the done queue, so all requests are always
+ somewhere.
+ (camel_imapp_engine_command_free): just spit warnings of active
+ messages being freed, but abort if the item isn't in any list.
+ Also remove the node from its list before going on.
+ (iterate_untagged, iterate_continuation, iterate_completion):
+ staticifiy.
+
+ * providers/imapp/camel-imapp-provider.c
+ (camel_imapp_module_init): move camel_exception_setup call here.
+
+ * providers/imapp/camel-imapp-driver.c
+ (camel_imapp_driver_get_type): remove execption setup here, it
+ isn't early enough.
+ (camel_imapp_driver_list): handle exceptions.
+
2003-09-12 Jeffrey Stedfast <fejj@ximian.com>
* providers/local/camel-mbox-folder.c
diff --git a/camel/providers/imapp/camel-imapp-driver.c b/camel/providers/imapp/camel-imapp-driver.c
index f9daced770..b0644dc199 100644
--- a/camel/providers/imapp/camel-imapp-driver.c
+++ b/camel/providers/imapp/camel-imapp-driver.c
@@ -69,10 +69,6 @@ camel_imapp_driver_get_type (void)
NULL,
(CamelObjectInitFunc) object_init,
(CamelObjectFinalizeFunc) object_finalise);
-
- /* blah ... could just use it in object setup? */
- /* TEMPORARY */
- camel_exception_setup();
}
return type;
@@ -475,7 +471,7 @@ camel_imapp_driver_fetch(CamelIMAPPDriver *id, CamelIMAPPFolder *folder, const c
GPtrArray *
camel_imapp_driver_list(CamelIMAPPDriver *id, const char *name, guint32 flags)
{
- CamelIMAPPCommand *ic;
+ CamelIMAPPCommand * volatile ic;
GPtrArray *res;
g_assert(id->list_commands == NULL);
@@ -490,23 +486,47 @@ camel_imapp_driver_list(CamelIMAPPDriver *id, const char *name, guint32 flags)
id->list_result = g_ptr_array_new();
id->list_flags = flags;
- ic = camel_imapp_engine_command_new(id->engine, "LIST", NULL, "LIST \"\" %f", name[0]?name:"%");
- camel_imapp_engine_command_queue(id->engine, ic);
- while (ic) {
- while (camel_imapp_engine_iterate(id->engine, ic)>0)
- ;
+ CAMEL_TRY {
+ ic = camel_imapp_engine_command_new(id->engine, "LIST", NULL, "LIST \"\" %f", name[0]?name:"%");
+ camel_imapp_engine_command_queue(id->engine, ic);
+ while (ic) {
+ while (camel_imapp_engine_iterate(id->engine, ic)>0)
+ ;
+ camel_imapp_engine_command_free(id->engine, ic);
+
+ if (id->list_commands) {
+ GSList *top = id->list_commands;
+
+ id->list_commands = top->next;
+ ic = top->data;
+ g_slist_free_1(top);
+ } else {
+ ic = NULL;
+ }
+ }
+ } CAMEL_CATCH(e) {
+ GSList *top = id->list_commands;
+ int i;
+
camel_imapp_engine_command_free(id->engine, ic);
- if (id->list_commands) {
- GSList *top = id->list_commands;
+ while (top) {
+ GSList *topn = top->next;
- id->list_commands = top->next;
- ic = top->data;
+ camel_imapp_engine_command_free(id->engine, ic);
g_slist_free_1(top);
- } else {
- ic = NULL;
+ top = topn;
}
- }
+ id->list_commands = NULL;
+
+ res = id->list_result;
+ for (i=0;i<res->len;i++)
+ imap_free_list(res->pdata[i]);
+ g_ptr_array_free(res, TRUE);
+ id->list_result = NULL;
+
+ camel_exception_throw_ex(e);
+ } CAMEL_DONE;
res = id->list_result;
id->list_result = NULL;
diff --git a/camel/providers/imapp/camel-imapp-engine.c b/camel/providers/imapp/camel-imapp-engine.c
index f6cfcbf86c..df14903c5a 100644
--- a/camel/providers/imapp/camel-imapp-engine.c
+++ b/camel/providers/imapp/camel-imapp-engine.c
@@ -43,6 +43,7 @@ object_init(CamelIMAPPEngine *ie, CamelIMAPPEngineClass *ieclass)
ie->handlers = g_hash_table_new(g_str_hash, g_str_equal);
e_dlist_init(&ie->active);
e_dlist_init(&ie->queue);
+ e_dlist_init(&ie->done);
ie->tagprefix = ieclass->tagprefix;
ieclass->tagprefix++;
@@ -339,7 +340,7 @@ camel_imapp_engine_skip(CamelIMAPPEngine *imap)
}
/* handle any untagged responses */
-int
+static int
iterate_untagged(CamelIMAPPEngine *imap)
{
unsigned int id, len;
@@ -535,6 +536,7 @@ iterate_completion(CamelIMAPPEngine *imap, unsigned char *token)
printf("%p: removing command from qwueue, we were at '%s'\n", ic, ic->current->data);
printf("%p: removing command\n", ic);
e_dlist_remove((EDListNode *)ic);
+ e_dlist_addtail(&imap->done, (EDListNode *)ic);
if (imap->literal == ic)
imap->literal = NULL;
ic->status = imap_parse_status(imap->stream);
@@ -559,6 +561,7 @@ iterate_completion(CamelIMAPPEngine *imap, unsigned char *token)
ic = imap->literal;
/* set the command complete with a failure code? */
e_dlist_remove((EDListNode *)ic);
+ e_dlist_addtail(&imap->done, (EDListNode *)ic);
imap->literal = NULL;
}
@@ -660,21 +663,42 @@ camel_imapp_engine_command_free (CamelIMAPPEngine *imap, CamelIMAPPCommand *ic)
/* maybe we should just have another queue to keep them? */
{
CamelIMAPPCommand *iw;
+ int found = 0;
iw = (CamelIMAPPCommand *)imap->active.head;
while (iw->next) {
- if (iw == ic)
- abort();
+ if (iw == ic) {
+ found = 1;
+ g_warning("command '%s' still in active queue", iw->name);
+ break;
+ }
iw = iw->next;
}
iw = (CamelIMAPPCommand *)imap->queue.head;
while (iw->next) {
- if (iw == ic)
- abort();
+ if (iw == ic) {
+ found = 1;
+ g_warning("command '%s' still in waiting queue", iw->name);
+ break;
+ }
+ iw = iw->next;
+ }
+ iw = (CamelIMAPPCommand *)imap->done.head;
+ while (iw->next) {
+ if (iw == ic) {
+ found = 1;
+ break;
+ }
iw = iw->next;
}
+ if (!found) {
+ g_warning("command '%s' not found anywhere", ic->name);
+ abort();
+ }
}
+ e_dlist_remove((EDListNode *)ic);
+
if (ic->mem)
camel_object_unref((CamelObject *)ic->mem);
imap_free_status(ic->status);
diff --git a/camel/providers/imapp/camel-imapp-engine.h b/camel/providers/imapp/camel-imapp-engine.h
index 6db9968d48..5f74d0654a 100644
--- a/camel/providers/imapp/camel-imapp-engine.h
+++ b/camel/providers/imapp/camel-imapp-engine.h
@@ -115,6 +115,7 @@ struct _CamelIMAPPEngine {
CamelIMAPPCommand *literal;/* current literal op */
EDList active; /* active queue */
EDList queue; /* outstanding queue */
+ EDList done; /* done queue, awaiting reclamation */
/* keep track of running a select */
struct _CamelIMAPPSelectResponse *select_response;
diff --git a/camel/providers/imapp/camel-imapp-provider.c b/camel/providers/imapp/camel-imapp-provider.c
index 4abc633498..6b0cdd2d43 100644
--- a/camel/providers/imapp/camel-imapp-provider.c
+++ b/camel/providers/imapp/camel-imapp-provider.c
@@ -74,6 +74,8 @@ CamelServiceAuthType camel_imapp_password_authtype = {
void
camel_imapp_module_init(CamelSession *session)
{
+ extern void camel_exception_setup(void);
+
imapp_provider.object_types[CAMEL_PROVIDER_STORE] = camel_imapp_store_get_type();
imapp_provider.url_hash = camel_url_hash;
imapp_provider.url_equal = camel_url_equal;
@@ -81,6 +83,10 @@ camel_imapp_module_init(CamelSession *session)
imapp_provider.authtypes = g_list_prepend(imapp_provider.authtypes, camel_sasl_authtype_list(FALSE));
imapp_provider.authtypes = g_list_prepend(imapp_provider.authtypes, &camel_imapp_password_authtype);
+ /* blah ... could just use it in object setup? */
+ /* TEMPORARY */
+ camel_exception_setup();
+
camel_session_register_provider(session, &imapp_provider);
}
diff --git a/camel/providers/imapp/camel-imapp-store.c b/camel/providers/imapp/camel-imapp-store.c
index ae02bcb54e..9123102a03 100644
--- a/camel/providers/imapp/camel-imapp-store.c
+++ b/camel/providers/imapp/camel-imapp-store.c
@@ -337,203 +337,6 @@ imap_query_auth_types (CamelService *service, CamelException *ex)
return types;
}
-#if 0
-static int
-try_sasl(CamelIMAPPStore *store, const char *mech, CamelException *ex)
-{
- CamelIMAPPStream *stream = store->engine->stream;
- unsigned char *line, *resp;
- CamelSasl *sasl;
- unsigned int len;
- int ret;
-
- sasl = camel_sasl_new("imap", mech, (CamelService *)store);
- if (sasl == NULL) {
- camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- _("Unable to connect to POP server.\n"
- "No support for requested "
- "authentication mechanism."));
- return -1;
- }
-
- if (camel_stream_printf((CamelStream *)stream, "AUTH %s\r\n", mech) == -1)
- goto ioerror;
-
- while (1) {
- if (camel_imapp_stream_line(stream, &line, &len) == -1)
- goto ioerror;
- if (strncmp(line, "+OK", 3) == 0)
- break;
- if (strncmp(line, "-ERR", 4) == 0) {
- camel_exception_setv(ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- _("SASL `%s' Login failed: %s"), mech, line);
- goto done;
- }
- /* If we dont get continuation, or the sasl object's run out of work, or we dont get a challenge,
- its a protocol error, so fail, and try reset the server */
- if (strncmp(line, "+ ", 2) != 0
- || camel_sasl_authenticated(sasl)
- || (resp = camel_sasl_challenge_base64(sasl, line+2, ex)) == NULL) {
- camel_stream_printf((CamelStream *)stream, "*\r\n");
- camel_imapp_stream_line(stream, &line, &len);
- camel_exception_setv(ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- _("SASL Protocol error"));
- goto done;
- }
-
- ret = camel_stream_printf((CamelStream *)stream, "%s\r\n", resp);
- g_free(resp);
- if (ret == -1)
- goto ioerror;
-
- }
- camel_object_unref((CamelObject *)sasl);
- return 0;
-
-ioerror:
- camel_exception_setv(ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- _("I/O Error: %s"), strerror(errno));
-done:
- camel_object_unref((CamelObject *)sasl);
- return -1;
-}
-
-static gboolean
-imap_try_authenticate (CamelService *service, const char *errmsg, CamelException *ex)
-{
- CamelIMAPPStore *store = (CamelIMAPPStore *)service;
- CamelIMAPPCommand *pcu = NULL, *pcp = NULL;
- int status;
-
- /* override, testing only */
- /*printf("Forcing authmech to 'login'\n");
- service->url->authmech = g_strdup("LOGIN");*/
-
- if (!service->url->passwd) {
- char *prompt;
-
- prompt = g_strdup_printf (_("%sPlease enter the POP password for %s@%s"),
- errmsg ? errmsg : "",
- service->url->user,
- service->url->host);
- service->url->passwd = camel_session_get_password (camel_service_get_session (service),
- prompt, TRUE, service, "password", ex);
- g_free (prompt);
- if (!service->url->passwd)
- return FALSE;
- }
-
- if (!service->url->authmech) {
- /* pop engine will take care of pipelining ability */
- pcu = camel_imapp_engine_command_new(store->engine, 0, NULL, NULL, "USER %s\r\n", service->url->user);
- pcp = camel_imapp_engine_command_new(store->engine, 0, NULL, NULL, "PASS %s\r\n", service->url->passwd);
- } else if (strcmp(service->url->authmech, "+APOP") == 0 && store->engine->apop) {
- char *secret, md5asc[33], *d;
- unsigned char md5sum[16], *s;
-
- secret = alloca(strlen(store->engine->apop)+strlen(service->url->passwd)+1);
- sprintf(secret, "%s%s", store->engine->apop, service->url->passwd);
- md5_get_digest(secret, strlen (secret), md5sum);
-
- for (s = md5sum, d = md5asc; d < md5asc + 32; s++, d += 2)
- sprintf (d, "%.2x", *s);
-
- pcp = camel_imapp_engine_command_new(store->engine, 0, NULL, NULL, "APOP %s %s\r\n", service->url->user, md5asc);
- } else {
- CamelServiceAuthType *auth;
- GList *l;
-
- l = store->engine->auth;
- while (l) {
- auth = l->data;
- if (strcmp(auth->authproto, service->url->authmech) == 0)
- return try_sasl(store, service->url->authmech, ex) == -1;
- l = l->next;
- }
-
- camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- _("Unable to connect to POP server.\n"
- "No support for requested "
- "authentication mechanism."));
- return FALSE;
- }
-
- while ((status = camel_imapp_engine_iterate (store->engine, pcp)) > 0)
- ;
-
- if (pcp->state != CAMEL_IMAPP_COMMAND_OK) {
- if (status == -1)
- camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
- _("Unable to connect to POP server.\nError sending password: %s"),
- errno ? g_strerror (errno) : _("Unknown error"));
- else
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
- _("Unable to connect to POP server.\nError sending password: %s"),
- store->engine->line);
- }
- camel_imapp_engine_command_free(store->engine, pcp);
-
- if (pcu)
- camel_imapp_engine_command_free(store->engine, pcu);
-
- return status;
-}
-#endif
-
-static gboolean
-imap_login(CamelService *service, char *msg)
-{
- CamelIMAPPStore *store = (CamelIMAPPStore *)service;
- CamelIMAPPCommand * volatile ic = NULL;
-
- /* override, testing only */
- /*printf("Forcing authmech to 'login'\n");
- service->url->authmech = g_strdup("LOGIN");*/
-
- CAMEL_TRY {
- if (!service->url->passwd) {
- char *prompt;
- CamelException *ex = camel_exception_new();
-
- prompt = g_strdup_printf (_("%sPlease enter the IMAP password for %s@%s"),
- msg?msg:"",
- service->url->user,
- service->url->host);
- service->url->passwd = camel_session_get_password(camel_service_get_session(service), prompt, FALSE, TRUE, service, "password", ex);
- g_free (prompt);
- if (camel_exception_is_set(ex))
- camel_exception_throw_ex(ex);
- }
-
- if (service->url->authmech) {
- CamelSasl *sasl = camel_sasl_new("imap", service->url->authmech, service);
-
- if (sasl == NULL)
- camel_exception_throw(1, "unsupported authentication mechanism: %s", service->url->authmech);
- ic = camel_imapp_engine_command_new(store->driver->engine, "AUTHENTICATE", NULL, "AUTHENTICATE %A", sasl);
- camel_object_unref((CamelObject *)sasl);
- } else {
- ic = camel_imapp_engine_command_new(store->driver->engine, "LOGIN", NULL, "LOGIN %s %s", service->url->user, service->url->passwd);
- }
-
- camel_imapp_engine_command_queue(store->driver->engine, ic);
- while (camel_imapp_engine_iterate(store->driver->engine, ic) > 0)
- ;
-
- if (ic->status->result != IMAP_OK)
- camel_exception_throw(CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, "Login failed: %s", ic->status->text);
- } CAMEL_CATCH(ex) {
- if (ic)
- camel_imapp_engine_command_free(store->driver->engine, ic);
- camel_exception_throw_ex(ex);
- } CAMEL_DONE;
-
- if (ic)
- camel_imapp_engine_command_free(store->driver->engine, ic);
-
- return TRUE;
-}
-
static void
store_get_pass(CamelIMAPPStore *store)
{
@@ -977,24 +780,6 @@ imap_create_folder(CamelStore *store, const char *parent_name, const char *folde
}
/* ********************************************************************** */
-
-static int store_resp_list(CamelIMAPPEngine *ie, guint32 id, void *data)
-{
- struct _list_info *linfo;
- CamelIMAPPStore *istore = data;
-
- linfo = imap_parse_list(ie->stream);
- printf("store list: '%s' ('%c')\n", linfo->name, linfo->separator);
- if (istore->pending_list)
- g_ptr_array_add(istore->pending_list, linfo);
- else {
- g_warning("unexpected list response\n");
- imap_free_list(linfo);
- }
-
- return camel_imapp_engine_skip(ie);
-}
-
#if 0
static int store_resp_fetch(CamelIMAPPEngine *ie, guint32 id, void *data)
{
diff --git a/camel/providers/imapp/camel-imapp-stream.c b/camel/providers/imapp/camel-imapp-stream.c
index a9567bf4f8..20876beae2 100644
--- a/camel/providers/imapp/camel-imapp-stream.c
+++ b/camel/providers/imapp/camel-imapp-stream.c
@@ -70,9 +70,9 @@ stream_fill(CamelIMAPPStream *is)
}
}
- printf("camel_imapp_read: 0\n");
+ printf("camel_imapp_read: -1\n");
- return 0;
+ return -1;
}
static ssize_t