diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/ChangeLog | 12 | ||||
-rw-r--r-- | camel/camel-object.c | 12 | ||||
-rw-r--r-- | camel/camel-service.c | 38 | ||||
-rw-r--r-- | camel/camel-session.c | 29 |
4 files changed, 53 insertions, 38 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index f3b2a50004..b5ad5d1ceb 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,17 @@ 2004-01-29 Not Zed <NotZed@Ximian.com> + * camel-object.c (camel_object_bag_rekey): added a doc comment. + + ** See bug #53520. + + * camel-session.c (get_service): free the url once done, it now + gets copied by the service. + + * camel-service.c (construct): copy the url that comes in, don't + just '0Wn34z' it. clena up exception handling too. + +2004-01-29 Not Zed <NotZed@Ximian.com> + * camel-object.c (cobject_state_write): output scan->name and scan->value for writing metadata, rather than meta->name/value which just duplicates the last entry, related to #53195. diff --git a/camel/camel-object.c b/camel/camel-object.c index 7ca9e84d8a..682c0e1924 100644 --- a/camel/camel-object.c +++ b/camel/camel-object.c @@ -1897,7 +1897,17 @@ camel_object_bag_abort(CamelObjectBag *bag, const void *key) E_UNLOCK(type_lock); } - +/** + * camel_object_bag_rekey: + * @bag: + * @o: + * @newkey: + * + * Re-key an object, atomically. The key for object @o is set to + * @newkey, in an atomic manner. + * + * It is an api (fatal) error if @o is not currently in the bag. + **/ void camel_object_bag_rekey(CamelObjectBag *bag, void *o, const void *newkey) { diff --git a/camel/camel-service.c b/camel/camel-service.c index cd66bb9cb1..b5f5b4bc4c 100644 --- a/camel/camel-service.c +++ b/camel/camel-service.c @@ -266,43 +266,37 @@ service_getv (CamelObject *object, CamelException *ex, CamelArgGetV *args) } static void -construct (CamelService *service, CamelSession *session, - CamelProvider *provider, CamelURL *url, CamelException *ex) +construct (CamelService *service, CamelSession *session, CamelProvider *provider, CamelURL *url, CamelException *ex) { - char *url_string; + char *err, *url_string; if (CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_USER) && (url->user == NULL || url->user[0] == '\0')) { - url_string = camel_url_to_string (url, CAMEL_URL_HIDE_PASSWORD); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("URL '%s' needs a username component"), - url_string); - g_free (url_string); - return; + err = _("URL '%s' needs a username component"); + goto fail; } else if (CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_HOST) && (url->host == NULL || url->host[0] == '\0')) { - url_string = camel_url_to_string (url, CAMEL_URL_HIDE_PASSWORD); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("URL '%s' needs a host component"), - url_string); - g_free (url_string); - return; + err = _("URL '%s' needs a host component"); + goto fail; } else if (CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_PATH) && (url->path == NULL || url->path[0] == '\0')) { - url_string = camel_url_to_string (url, CAMEL_URL_HIDE_PASSWORD); - camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, - _("URL '%s' needs a path component"), - url_string); - g_free (url_string); - return; + err = _("URL '%s' needs a path component"); + goto fail; } service->provider = provider; - service->url = url; + service->url = camel_url_copy(url); service->session = session; camel_object_ref (session); service->status = CAMEL_SERVICE_DISCONNECTED; + + return; + +fail: + url_string = camel_url_to_string(url, CAMEL_URL_HIDE_PASSWORD); + camel_exception_setv(ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, err, url_string); + g_free(url_string); } /** diff --git a/camel/camel-session.c b/camel/camel-session.c index 0e5efa1d9c..8b2268908e 100644 --- a/camel/camel-session.c +++ b/camel/camel-session.c @@ -416,22 +416,21 @@ get_service (CamelSession *session, const char *url_string, /* Now look up the service in the provider's cache */ service = camel_object_bag_reserve(provider->service_cache[type], url); - if (service != NULL) { - camel_url_free (url); - return service; - } - - service = (CamelService *)camel_object_new (provider->object_types[type]); - 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 (service); - service = NULL; - camel_object_bag_abort(provider->service_cache[type], url); - } else { - camel_object_bag_add(provider->service_cache[type], url, service); + if (service == NULL) { + service = (CamelService *)camel_object_new (provider->object_types[type]); + 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 (service); + service = NULL; + camel_object_bag_abort(provider->service_cache[type], url); + } else { + camel_object_bag_add(provider->service_cache[type], url, service); + } } +done: + camel_url_free (url); return service; } |