diff options
-rw-r--r-- | camel/ChangeLog | 30 | ||||
-rw-r--r-- | camel/camel-exception.c | 19 | ||||
-rw-r--r-- | camel/camel-remote-store.c | 18 | ||||
-rw-r--r-- | camel/camel-session.c | 8 | ||||
-rw-r--r-- | camel/camel-store.c | 6 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-command.c | 17 |
6 files changed, 78 insertions, 20 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index cb0509d897..86e0ef0963 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,33 @@ +2001-07-17 Peter Williams <peterw@ximian.com> + + Clean up some exception misusage. + + * providers/imap/camel-imap-command.c (camel_imap_command): Use + our own internal exception for sending the string and transfer it + to @ex if anything goes wrong. + (imap_read_response): Use our own internal exception for reading + the untagged responses and blah blah blah. + + * camel-session.c (get_service): Use our own internal exception + when constructing the service and transfer it to @ex if anything + goes wrong. + + * camel-remote-store.c (remote_recv_line): Instead of having + gboolean exception, use our own internal exception and copy + it to @ex if anything goes wrong. + + * camel-store.c (store_sync): Create an internal exception + because sync_folder() checks it for validity. Transfer it to + @ex when done. + + * camel-exception.c (camel_exception_get_description): If @ex is + NULL, complain - passing NULL exceptions to Camel is okay, but + there should be no circumstances under which they're then + examined. + (camel_exception_get_id): Same here, + (camel_exception_xfer): NULL-protect and warn if transferring from + a NULL exception. + 2001-07-17 Jeffrey Stedfast <fejj@ximian.com> * camel-store.c (init_trash): Use CAMEL_VTRASH_NAME. diff --git a/camel/camel-exception.c b/camel/camel-exception.c index 83389c5588..3ae8d74f77 100644 --- a/camel/camel-exception.c +++ b/camel/camel-exception.c @@ -227,6 +227,17 @@ void camel_exception_xfer (CamelException *ex_dst, CamelException *ex_src) { + if (ex_src == NULL) { + g_warning ("camel_exception_xfer: trying to transfer NULL exception to %p\n", ex_dst); + return; + } + + if (ex_dst == NULL) { + /* must have same side-effects */ + camel_exception_clear (ex_src); + return; + } + CAMEL_EXCEPTION_LOCK(exception); if (ex_dst->desc) @@ -255,8 +266,10 @@ camel_exception_get_id (CamelException *ex) { if (ex) return ex->id; - else + else { + g_warning ("camel_exception_get_id called with NULL parameter."); return CAMEL_EXCEPTION_NONE; + } } /** @@ -276,6 +289,8 @@ camel_exception_get_description (CamelException *ex) if (ex) ret = ex->desc; - + else + g_warning ("camel_exception_get_description called with NULL parameter."); + return ret; } diff --git a/camel/camel-remote-store.c b/camel/camel-remote-store.c index 823a4673f4..aca833f7f0 100644 --- a/camel/camel-remote-store.c +++ b/camel/camel-remote-store.c @@ -453,7 +453,7 @@ remote_recv_line (CamelRemoteStore *store, char **dest, CamelException *ex) CamelStreamBuffer *stream; GByteArray *bytes; gchar buf[1024], *ret; - gboolean exception = FALSE; + CamelException internal_ex; gint nread; *dest = NULL; @@ -478,18 +478,18 @@ remote_recv_line (CamelRemoteStore *store, char **dest, CamelException *ex) g_byte_array_append (bytes, buf, nread); } while (nread == sizeof (buf) - 1); + camel_exception_init (&internal_ex); if (nread == -1) { - exception = TRUE; if (errno == EINTR) - camel_exception_set(ex, CAMEL_EXCEPTION_USER_CANCEL, _("Operation cancelled")); + camel_exception_set(&internal_ex, CAMEL_EXCEPTION_USER_CANCEL, _("Operation cancelled")); else - camel_exception_set(ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, strerror(errno)); - } else if (bytes->len == 0) { - exception = TRUE; - camel_exception_set(ex, CAMEL_EXCEPTION_SERVICE_NOT_CONNECTED, + camel_exception_set(&internal_ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, strerror(errno)); + } else if (bytes->len == 0) + camel_exception_set(&internal_ex, CAMEL_EXCEPTION_SERVICE_NOT_CONNECTED, _("Server unexpectedly disconnected")); - } - if (camel_exception_is_set (ex) || exception) { + + if (camel_exception_is_set (&internal_ex)) { + camel_exception_xfer (ex, &internal_ex); g_byte_array_free(bytes, TRUE); camel_service_disconnect (CAMEL_SERVICE (store), FALSE, NULL); return -1; diff --git a/camel/camel-session.c b/camel/camel-session.c index e21d6b7ef2..206553daf3 100644 --- a/camel/camel-session.c +++ b/camel/camel-session.c @@ -351,7 +351,7 @@ get_service (CamelSession *session, const char *url_string, CamelURL *url; CamelProvider *provider; CamelService *service; - + CamelException internal_ex; url = camel_url_new (url_string, ex); if (!url) return NULL; @@ -379,8 +379,10 @@ get_service (CamelSession *session, const char *url_string, } service = (CamelService *)camel_object_new (provider->object_types[type]); - camel_service_construct (service, session, provider, url, ex); - if (camel_exception_is_set (ex)) { + camel_exception_init (&internal_ex); + camel_service_construct (service, session, provider, url, &internal_ex); + if (camel_exception_is_set (&internal_ex)) { + camel_exception_xfer (ex, &internal_ex); camel_object_unref (CAMEL_OBJECT (service)); service = NULL; } else { diff --git a/camel/camel-store.c b/camel/camel-store.c index 7abefba833..23c4b82e9d 100644 --- a/camel/camel-store.c +++ b/camel/camel-store.c @@ -444,9 +444,13 @@ static void store_sync (CamelStore *store, CamelException *ex) { if (store->folders) { + CamelException internal_ex; + + camel_exception_init (&internal_ex); CAMEL_STORE_LOCK(store, cache_lock); - g_hash_table_foreach (store->folders, sync_folder, ex); + g_hash_table_foreach (store->folders, sync_folder, &internal_ex); CAMEL_STORE_UNLOCK(store, cache_lock); + camel_exception_xfer (ex, &internal_ex); } } diff --git a/camel/providers/imap/camel-imap-command.c b/camel/providers/imap/camel-imap-command.c index 6bca74538d..db113e0fd7 100644 --- a/camel/providers/imap/camel-imap-command.c +++ b/camel/providers/imap/camel-imap-command.c @@ -86,6 +86,7 @@ camel_imap_command (CamelImapStore *store, CamelFolder *folder, { gchar *cmdbuf; va_list ap; + CamelException internal_ex; CAMEL_IMAP_STORE_LOCK (store, command_lock); @@ -127,11 +128,13 @@ camel_imap_command (CamelImapStore *store, CamelFolder *folder, cmdbuf = imap_command_strdup_vprintf (store, fmt, ap); va_end (ap); - camel_remote_store_send_string (CAMEL_REMOTE_STORE (store), ex, + camel_exception_init (&internal_ex); + camel_remote_store_send_string (CAMEL_REMOTE_STORE (store), &internal_ex, "%c%.5d %s\r\n", store->tag_prefix, store->command++, cmdbuf); g_free (cmdbuf); - if (camel_exception_is_set (ex)) { + if (camel_exception_is_set (&internal_ex)) { + camel_exception_xfer (ex, &internal_ex); CAMEL_IMAP_STORE_UNLOCK (store, command_lock); return NULL; } @@ -172,6 +175,7 @@ static CamelImapResponse * imap_read_response (CamelImapStore *store, CamelException *ex) { CamelImapResponse *response; + CamelException internal_ex; char *respbuf, *retcode; /* Read first line */ @@ -189,11 +193,13 @@ imap_read_response (CamelImapStore *store, CamelException *ex) } response->untagged = g_ptr_array_new (); + camel_exception_init (&internal_ex); + /* Check for untagged data */ while (!strncmp (respbuf, "* ", 2)) { /* Read the rest of the response if it is multi-line. */ - respbuf = imap_read_untagged (store, respbuf, ex); - if (camel_exception_is_set (ex)) + respbuf = imap_read_untagged (store, respbuf, &internal_ex); + if (camel_exception_is_set (&internal_ex)) break; if (!g_strncasecmp (respbuf, "* BYE", 5)) { @@ -210,7 +216,8 @@ imap_read_response (CamelImapStore *store, CamelException *ex) break; } - if (!respbuf || camel_exception_is_set (ex)) { + if (!respbuf || camel_exception_is_set (&internal_ex)) { + camel_exception_xfer (ex, &internal_ex); camel_imap_response_free_without_processing (store, response); return NULL; } |