From 42479d2a5fd81fd9da887b3a0fb00b666c509a81 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Mon, 21 Feb 2000 18:38:58 +0000 Subject: [PATCH] add CamelExceptions to several functions. Use camel_session_new to * camel-session.h: * camel-session.c: add CamelExceptions to several functions. Use camel_session_new to initialize the session and URL fields of created CamelStores as appropriate. * camel-store.h: * camel-store.c * camel-service.h: * camel-service.c: Move the session and url (and associated functions) from CamelStore to CamelService. Add url_flags to CamelService so subclasses can specify which URL components are mandatory for them. Add camel_session_new for camel_session_get_store* to use. * providers/mbox/camel-mbox-folder.c: * providers/mbox/camel-mbox-store.c: * providers/mbox/camel-mbox-store.h: Update for above changes. --- camel/ChangeLog | 18 ++++ camel/camel-exception-list.def | 6 ++ camel/camel-service.c | 163 ++++++++++++++++++++++++++----- camel/camel-service.h | 17 +++- camel/camel-session.c | 113 ++++++++++++--------- camel/camel-session.h | 8 +- camel/camel-store.c | 82 ---------------- camel/camel-store.h | 8 -- camel/providers/mbox/camel-mbox-folder.c | 4 +- camel/providers/mbox/camel-mbox-store.c | 55 ++--------- camel/providers/mbox/camel-mbox-store.h | 5 +- 11 files changed, 266 insertions(+), 213 deletions(-) diff --git a/camel/ChangeLog b/camel/ChangeLog index 6043cff..c8ec75d 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,23 @@ 2000-02-21 Dan Winship + * camel-session.h: + * camel-session.c: add CamelExceptions to several functions. Use + camel_session_new to initialize the session and URL fields of + created CamelStores as appropriate. + + * camel-store.h: + * camel-store.c + * camel-service.h: + * camel-service.c: Move the session and url (and associated + functions) from CamelStore to CamelService. Add url_flags to + CamelService so subclasses can specify which URL components + are mandatory for them. Add camel_session_new for + camel_session_get_store* to use. + + * providers/mbox/camel-mbox-folder.c: + * providers/mbox/camel-mbox-store.c: + * providers/mbox/camel-mbox-store.h: Update for above changes. + * camel-exception-list.def: Once camel is being used for real, exceptions won't be renumberable. So renumber them now to make more room to add exceptions to the various categories later, and diff --git a/camel/camel-exception-list.def b/camel/camel-exception-list.def index 8e14625..c157d95 100644 --- a/camel/camel-exception-list.def +++ b/camel/camel-exception-list.def @@ -23,3 +23,9 @@ CAMEL_EXCEPTION_FOLDER_INVALID_UID, /* CamelStoreException */ CAMEL_EXCEPTION_STORE_NULL = 200, +CAMEL_EXCEPTION_STORE_INVALID, + +/* CamelServiceException */ +CAMEL_EXCEPTION_SERVICE_NULL = 300, +CAMEL_EXCEPTION_SERVICE_INVALID, +CAMEL_EXCEPTION_SERVICE_URL_INVALID diff --git a/camel/camel-service.c b/camel/camel-service.c index 0b4d2bf..0bd2b42 100644 --- a/camel/camel-service.c +++ b/camel/camel-service.c @@ -26,6 +26,7 @@ #include #include "camel-service.h" #include "camel-log.h" +#include "camel-exception.h" static GtkObjectClass *parent_class=NULL; @@ -38,6 +39,8 @@ static gboolean _connect_with_url (CamelService *service, Gurl *url, static gboolean _disconnect(CamelService *service, CamelException *ex); static gboolean _is_connected (CamelService *service); static void _finalize (GtkObject *object); +static gboolean _set_url (CamelService *service, Gurl *url, + CamelException *ex); static void camel_service_class_init (CamelServiceClass *camel_service_class) @@ -92,27 +95,67 @@ _finalize (GtkObject *object) if (camel_service->url) g_url_free (camel_service->url); + if (camel_service->session) + gtk_object_unref (GTK_OBJECT (camel_service->session)); GTK_OBJECT_CLASS (parent_class)->finalize (object); CAMEL_LOG_FULL_DEBUG ("Leaving CamelService::finalize\n"); } +/** + * camel_service_new: create a new CamelService or subtype + * @type: the GtkType of the class to create + * @session: the session for the service + * @url: the default URL for the service (may be NULL) + * @ex: a CamelException + * + * Creates a new CamelService (or one of its subtypes), initialized + * with the given parameters. + * + * Return value: the CamelService, or NULL. + **/ +CamelService * +camel_service_new (GtkType type, CamelSession *session, Gurl *url, + CamelException *ex) +{ + CamelService *service; + + g_assert(session); + + service = CAMEL_SERVICE (gtk_object_new (type, NULL)); + service->session = session; + gtk_object_ref (GTK_OBJECT (session)); + if (url) { + if (!_set_url (service, url, ex)) + return NULL; + } + + return service; +} /** * _connect : connect to a service + * @service: object to connect + * @ex: a CamelException * * connect to the service using the parameters * stored in the session it is initialized with - * WARNING: session not implemented for the moment * - * @service: object to connect + * Return value: whether or not the connection succeeded **/ static gboolean _connect (CamelService *service, CamelException *ex) { -#warning need to get default URL from somewhere - return CSERV_CLASS(service)->connect_with_url(service, NULL, ex); + g_assert (service->session); + /* XXX it's possible that this should be an exception + * rather than an assertion... I'm not sure how the code + * is supposed to be used. + */ + g_assert (service->url); + + service->connected = TRUE; + return TRUE; } @@ -120,11 +163,12 @@ _connect (CamelService *service, CamelException *ex) /** * camel_service_connect:connect to a service * @service: CamelService object + * @ex: a CamelException * * connect to the service using the parameters * stored in the session it is initialized with - * WARNING: session not implemented for the moment - * + * + * Return value: whether or not the connection succeeded **/ gboolean camel_service_connect (CamelService *service, CamelException *ex) @@ -136,30 +180,36 @@ camel_service_connect (CamelService *service, CamelException *ex) /** * _connect_with_url: connect to the specified address - * + * @service: object to connect + * @url: URL describing service to connect to + * @ex: a CamelException + * * Connect to the service, but do not use the session * default parameters to retrieve server's address * - * @service: object to connect - * @url: URL describing service to connect to + * Return value: whether or not the connection succeeded **/ static gboolean _connect_with_url (CamelService *service, Gurl *url, CamelException *ex) { - service->connected = TRUE; - service->url = url; + g_assert (service->session); - return TRUE; + if (!_set_url (service, url, ex)) + return FALSE; + + return CSERV_CLASS(service)->connect (service, ex); } /** * camel_service_connect_with_url: connect a service * @service: the service to connect * @url: URL describing the service to connect to + * @ex: a CamelException * * Connect to a service, but do not use the session * default parameters to retrieve server's address - * + * + * Return value: whether or not the connection succeeded **/ gboolean camel_service_connect_with_url (CamelService *service, char *url, @@ -173,19 +223,18 @@ camel_service_connect_with_url (CamelService *service, char *url, /** * _disconnect : disconnect from a service + * @service: object to disconnect + * @ex: a CamelException * * disconnect from the service * - * @service: object to disconnect + * Return value: whether or not the disconnection succeeded without + * errors. (Consult @ex if FALSE.) **/ static gboolean _disconnect (CamelService *service, CamelException *ex) { service->connected = FALSE; - if (service->url) { - g_url_free(service->url); - service->url = NULL; - } return TRUE; } @@ -195,6 +244,12 @@ _disconnect (CamelService *service, CamelException *ex) /** * camel_service_disconnect: disconnect from a service * @service: CamelService object + * @ex: a CamelException + * + * disconnect from the service + * + * Return value: whether or not the disconnection succeeded without + * errors. (Consult @ex if FALSE.) **/ gboolean camel_service_disconnect (CamelService *service, CamelException *ex) @@ -208,7 +263,7 @@ camel_service_disconnect (CamelService *service, CamelException *ex) * _is_connected: test if the service object is connected * @service: object to test * - * Return value: + * Return value: whether or not the service is connected **/ static gboolean _is_connected (CamelService *service) @@ -221,7 +276,7 @@ _is_connected (CamelService *service) * camel_service_is_connected: test if the service object is connected * @service: object to test * - * Return value: + * Return value: whether or not the service is connected **/ gboolean camel_service_is_connected (CamelService *service) @@ -231,18 +286,80 @@ camel_service_is_connected (CamelService *service) /** + * _set_url: Validate a URL and set it as the default for a service + * @service: the CamelService + * @url_string: the URL + * @ex: a CamelException + * + * This converts the URL to a Gurl, validates it for the service, + * and sets it as the default URL for the service. + * + * Return value: success or failure + **/ +static gboolean +_set_url (CamelService *service, Gurl *url, CamelException *ex) +{ + char *url_string; + + if (service->url_flags & CAMEL_SERVICE_URL_NEED_USER && + (url->user == NULL || url->user[0] == '\0')) { + url_string = g_url_to_string (url, FALSE); + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, + "URL '%s' needs a username component", + url_string); + g_free (url_string); + return FALSE; + } else if (service->url_flags & CAMEL_SERVICE_URL_NEED_HOST && + (url->host == NULL || url->host[0] == '\0')) { + url_string = g_url_to_string (url, FALSE); + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, + "URL '%s' needs a host component", + url_string); + g_free (url_string); + return FALSE; + } else if (service->url_flags & CAMEL_SERVICE_URL_NEED_PATH && + (url->path == NULL || url->path[0] == '\0')) { + url_string = g_url_to_string (url, FALSE); + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, + "URL '%s' needs a path component", + url_string); + g_free (url_string); + return FALSE; + } + + if (service->url) + g_url_free (service->url); + service->url = url; + return TRUE; +} + +/** * camel_service_get_url: get the url representing a service * @service: the service * - * returns the URL representing a service. For security reasons - * This routine does not return the password. + * returns the URL representing a service. The returned URL must be + * freed when it is no longer needed. For security reasons, this + * routine does not return the password. * * Return value: the url name **/ -gchar * +char * camel_service_get_url (CamelService *service) { return g_url_to_string(service->url, FALSE); } +/** + * camel_service_get_session: return the session associated with a service + * @service: the service + * + * returns the CamelSession associated with the service. + * + * Return value: the session + **/ +CamelSession * +camel_service_get_session (CamelService *service) +{ + return service->session; +} diff --git a/camel/camel-service.h b/camel/camel-service.h index fbcbd78..b6d7b70 100644 --- a/camel/camel-service.h +++ b/camel/camel-service.h @@ -48,8 +48,10 @@ extern "C" { struct _CamelService { GtkObject parent_object; + CamelSession *session; gboolean connected; Gurl *url; + int url_flags; }; @@ -69,13 +71,24 @@ typedef struct { +/* flags for url_flags. (others can be added if needed) */ +#define CAMEL_SERVICE_URL_NEED_USER (1 << 1) +#define CAMEL_SERVICE_URL_NEED_HOST (1 << 4) +#define CAMEL_SERVICE_URL_NEED_PATH (1 << 6) + + /* public methods */ +CamelService *camel_service_new (GtkType type, CamelSession *session, + Gurl *url, CamelException *ex); + gboolean camel_service_connect (CamelService *service, CamelException *ex); -gboolean camel_service_connect_with_url (CamelService *service, gchar *url, +gboolean camel_service_connect_with_url (CamelService *service, char *url, CamelException *ex); +gboolean camel_service_disconnect (CamelService *service, CamelException *ex); gboolean camel_service_is_connected (CamelService *service); -gchar *camel_service_get_url (CamelService *service); +char *camel_service_get_url (CamelService *service); +CamelSession *camel_service_get_session (CamelService *service); /* Standard Gtk function */ GtkType camel_service_get_type (void); diff --git a/camel/camel-session.c b/camel/camel-session.c index ddc74e0..cf5db3c 100644 --- a/camel/camel-session.c +++ b/camel/camel-session.c @@ -26,6 +26,7 @@ #include #include "camel-session.h" #include "camel-store.h" +#include "camel-exception.h" #include "string-utils.h" #include "url-util.h" #include "hash-table-utils.h" @@ -124,94 +125,118 @@ camel_session_set_provider (CamelSession *session, CamelProvider *provider) * camel_session_get_store_from_provider: create a folder instance for a given provider * @session: session object the folder will be initialized with * @provider: provider folder to instantiate - * + * @ex: a CamelException * * * Return value: the newly instantiated store **/ CamelStore * -camel_session_get_store_from_provider (CamelSession *session, CamelProvider *provider) +camel_session_get_store_from_provider (CamelSession *session, + CamelProvider *provider, + CamelException *ex) { - CamelStore *store; - g_assert(session); g_assert(provider); - store = CAMEL_STORE (gtk_object_new (provider->object_type, NULL)); -#warning set the url to a useful value. - camel_store_init(store, session, NULL, NULL); - return store; + return CAMEL_STORE (camel_service_new (provider->object_type, + session, NULL, ex)); } +/** + * get_store_for_protocol_with_url: private helper routine + * @session: CamelSession object + * @protocol: protocol name + * @url: a URL, or NULL + * @ex: a CamelException + * + * Used by camel_session_get_store_for_protocol and + * camel_session_get_store. + * + * Return value: initialized store associated with this protocol, or NULL if no provider was found. + **/ +static CamelStore * +get_store_for_protocol_with_url (CamelSession *session, const char *protocol, + Gurl *url, CamelException *ex) +{ + const CamelProvider *provider = NULL; + + /* See if there is a provider assiciated with this + * protocol in this session. + */ + provider = CAMEL_PROVIDER (g_hash_table_lookup (session->store_provider_list, protocol)); + if (!provider) { + /* No provider was found in this session. See + * if there is a registered provider for this + * protocol. + */ + provider = camel_provider_get_for_protocol (protocol, PROVIDER_STORE); + } + if (!provider) + return NULL; + + return CAMEL_STORE (camel_service_new (provider->object_type, + session, url, ex)); +} + /** * camel_session_get_store_for_protocol: get the store associated to a protocol * @session: CamelSession object * @protocol: protocol name + * @ex: a CamelException * - * Return a CamelStore object associated to a given + * Return a CamelStore object associated with a given * store protocol. If a provider has been set for this * protocol in the session @session using * camel_session_set_provider (), then a store - * obtained from this provider is return. - * Otherwise, if one or more provider corresponding - * to this protocol has been registered (See + * obtained from this provider is returned. + * Otherwise, if one or more providers corresponding + * to this protocol have been registered (See * camel_provider_register_as_module), the last registered * one is used. * - * Return value: store associated to this protocol or NULL if no provider was found. + * Return value: store associated with this protocol, or NULL if no provider was found. **/ CamelStore * -camel_session_get_store_for_protocol (CamelSession *session, const gchar *protocol) +camel_session_get_store_for_protocol (CamelSession *session, + const char *protocol, + CamelException *ex) { - const CamelProvider *provider = NULL; - CamelStore *new_store; - - /* look if there is a provider assiciated to this - protocol in this session */ - provider = CAMEL_PROVIDER (g_hash_table_lookup (session->store_provider_list, protocol)); - if (!provider) - /* no provider was found in this session, look - if there is a registered provider for this - protocol */ - provider = camel_provider_get_for_protocol (protocol, PROVIDER_STORE); - - if (!provider) return NULL; - - new_store = (CamelStore *)gtk_type_new (provider->object_type); - return new_store; + return get_store_for_protocol_with_url (session, protocol, NULL, ex); } - /** * camel_session_get_store: get a store object for an URL * @session: session object - * @url_string: url + * @url_string: url + * @ex: a CamelException * * return a store corresponding to an URL. * * Return value: the store, or NULL if no provider correponds to the protocol **/ CamelStore * -camel_session_get_store (CamelSession *session, const gchar *url_string) +camel_session_get_store (CamelSession *session, const char *url_string, + CamelException *ex) { - Gurl *url = NULL; - CamelStore *new_store = NULL; + Gurl *url; + CamelStore *store; url = g_url_new (url_string); - g_return_val_if_fail (url, NULL); - - if (url->protocol) { - new_store = camel_session_get_store_for_protocol (session, url->protocol); - if (new_store) - camel_store_init (new_store, session, url_string, NULL); + if (url == NULL || url->protocol == NULL) { + camel_exception_setv(ex, CAMEL_EXCEPTION_SERVICE_URL_INVALID, + "Could not determine protocol for " + "URL '%s'", url_string); + return NULL; } - g_url_free (url); - return new_store; - + store = get_store_for_protocol_with_url (session, url->protocol, + url, ex); + if (store == NULL) + g_url_free (url); + return store; } diff --git a/camel/camel-session.h b/camel/camel-session.h index 1dc234f..0b65326 100644 --- a/camel/camel-session.h +++ b/camel/camel-session.h @@ -73,8 +73,12 @@ GtkType camel_session_get_type (void); CamelSession *camel_session_new (void); void camel_session_set_provider (CamelSession *session, CamelProvider *provider); -CamelStore *camel_session_get_store_for_protocol (CamelSession *session, const gchar *protocol); -CamelStore *camel_session_get_store (CamelSession *session, const gchar *url_string); +CamelStore *camel_session_get_store_for_protocol (CamelSession *session, + const gchar *protocol, + CamelException *ex); +CamelStore *camel_session_get_store (CamelSession *session, + const char *url_string, + CamelException *ex); #ifdef __cplusplus diff --git a/camel/camel-store.c b/camel/camel-store.c index 1938fcb..dee1ef2 100644 --- a/camel/camel-store.c +++ b/camel/camel-store.c @@ -36,29 +36,21 @@ static CamelServiceClass *parent_class = NULL; static void _set_separator(CamelStore *store, gchar sep, CamelException *ex); static CamelFolder *_get_root_folder(CamelStore *store, CamelException *ex); static CamelFolder *_get_default_folder(CamelStore *store, CamelException *ex); -static void _init(CamelStore *store, CamelSession *session, const gchar *url_name, CamelException *ex); static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name, CamelException *ex); static gchar _get_separator (CamelStore *store, CamelException *ex); -static void _finalize (GtkObject *object); - static void camel_store_class_init (CamelStoreClass *camel_store_class) { - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_store_class); parent_class = gtk_type_class (camel_service_get_type ()); /* virtual method definition */ - camel_store_class->init = _init; camel_store_class->set_separator = _set_separator; camel_store_class->get_separator = _get_separator; camel_store_class->get_folder = _get_folder; camel_store_class->get_root_folder = _get_root_folder; camel_store_class->get_default_folder = _get_default_folder; - - /* virtual method overload */ - gtk_object_class->finalize = _finalize; } @@ -94,65 +86,6 @@ camel_store_get_type (void) - -/** - * camel_store_init: call store's init method - * @store: the store to initialize - * @session: session which instantiates the store - * @url_name: URL defining the store - * - * This routine is called by the session object from which this - * store is created. It must not be called directly. - * - **/ -void -camel_store_init (CamelStore *store, CamelSession *session, const gchar *url_name, CamelException *ex) -{ - g_assert(store); - CS_CLASS(store)->init (store, session, url_name, ex); -} - - -/** - * init: method called by a session object to initialize a store object - * @store: the store to initialize - * @session: session which instantiates the store - * @url_name: URL defining the store - * - * This routine is called by the session object from which this - * store is created. Be careful, @url_name is used as a private field - * of the store object. - * - **/ -static void -_init (CamelStore *store, CamelSession *session, const gchar *url_name, CamelException *ex) -{ - -#warning re-enable assertion here. - g_assert(session); - g_assert(url_name); - - store->session = session; - gtk_object_ref (GTK_OBJECT (session)); - /*store->url_name = url_name;*/ -} - - -static void -_finalize (GtkObject *object) -{ - CamelStore *camel_store = CAMEL_STORE (object); - CAMEL_LOG_FULL_DEBUG ("Entering CamelStore::finalize\n"); - - /* if (camel_store->url_name) g_free (camel_store->url_name); */ - if (camel_store->session) gtk_object_unref (GTK_OBJECT (camel_store->session)); - - GTK_OBJECT_CLASS (parent_class)->finalize (object); - CAMEL_LOG_FULL_DEBUG ("Leaving CamelStore::finalize\n"); -} - - - /** * camel_store_set_separator: set the character which separates this folder path from the folders names in a lower level of hierarchy. * @@ -259,18 +192,3 @@ _get_default_folder (CamelStore *store, CamelException *ex) { return NULL; } - - -CamelSession * -camel_store_get_session (CamelStore *store, CamelException *ex) -{ - if (!store) { - camel_exception_set (ex, - CAMEL_EXCEPTION_STORE_NULL, - "Store is NULL"); - return NULL; - } - - return store->session; -} - diff --git a/camel/camel-store.h b/camel/camel-store.h index 588e467..d9ffb74 100644 --- a/camel/camel-store.h +++ b/camel/camel-store.h @@ -48,8 +48,6 @@ struct _CamelStore { CamelService parent_object; - CamelSession *session; - /* gchar *url_name; */ gchar separator; }; @@ -58,10 +56,6 @@ struct _CamelStore typedef struct { CamelServiceClass parent_class; - void (*init) (CamelStore *store, - CamelSession *session, - const gchar *url_name, - CamelException *ex); void (*set_separator) (CamelStore *store, gchar sep, CamelException *ex); gchar (*get_separator) (CamelStore *store, @@ -82,10 +76,8 @@ typedef struct { /* Standard Gtk function */ GtkType camel_store_get_type (void); -void camel_store_init (CamelStore *store, CamelSession *session, const gchar *url_name, CamelException *ex); CamelFolder * camel_store_get_folder (CamelStore *store, const gchar *folder_name, CamelException *ex); gchar camel_store_get_separator (CamelStore *store, CamelException *ex); -CamelSession * camel_store_get_session (CamelStore *store, CamelException *ex); #ifdef __cplusplus } diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c index fb5c5a9..ad89909 100644 --- a/camel/providers/mbox/camel-mbox-folder.c +++ b/camel/providers/mbox/camel-mbox-folder.c @@ -362,7 +362,7 @@ _set_name (CamelFolder *folder, const gchar *name, CamelException *ex) g_free (mbox_folder->index_file_path); separator = camel_store_get_separator (folder->parent_store, ex); - root_dir_path = camel_mbox_store_get_toplevel_dir (CAMEL_MBOX_STORE(folder->parent_store), ex); + root_dir_path = camel_mbox_store_get_toplevel_dir (CAMEL_MBOX_STORE(folder->parent_store)); CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name full_name is %s\n", folder->full_name); CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name root_dir_path is %s\n", root_dir_path); @@ -1112,7 +1112,7 @@ _get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) } - message = camel_mime_message_new_with_session (camel_store_get_session (parent_store, ex)); + message = camel_mime_message_new_with_session (camel_service_get_session (CAMEL_SERVICE (parent_store))); camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (message), message_stream); diff --git a/camel/providers/mbox/camel-mbox-store.c b/camel/providers/mbox/camel-mbox-store.c index 12923b1..9c5e889 100644 --- a/camel/providers/mbox/camel-mbox-store.c +++ b/camel/providers/mbox/camel-mbox-store.c @@ -23,16 +23,14 @@ #include "camel-mbox-store.h" #include "camel-mbox-folder.h" +#include "camel-exception.h" #include "url-util.h" -static CamelStoreClass *parent_class=NULL; - /* Returns the class for a CamelMboxStore */ #define CMBOXS_CLASS(so) CAMEL_MBOX_STORE_CLASS (GTK_OBJECT(so)->klass) #define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass) #define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (GTK_OBJECT(so)->klass) -static void _init (CamelStore *store, CamelSession *session, const gchar *url_name, CamelException *ex); static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name, CamelException *ex); @@ -40,12 +38,8 @@ static void camel_mbox_store_class_init (CamelMboxStoreClass *camel_mbox_store_class) { CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_mbox_store_class); - - parent_class = gtk_type_class (camel_store_get_type ()); - /* virtual method definition */ /* virtual method overload */ - camel_store_class->init = _init; camel_store_class->get_folder = _get_folder; } @@ -55,8 +49,10 @@ static void camel_mbox_store_init (gpointer object, gpointer klass) { CamelStore *store = CAMEL_STORE (object); - + CamelService *service = CAMEL_SERVICE (object); + store->separator = '/'; + service->url_flags = CAMEL_SERVICE_URL_NEED_PATH; } @@ -87,50 +83,17 @@ camel_mbox_store_get_type (void) } - - -/* These evil public functions are here for test only */ -void -camel_mbox_store_set_toplevel_dir (CamelMboxStore *store, const gchar *toplevel, CamelException *ex) -{ - store->toplevel_dir = g_strdup (toplevel); - CAMEL_STORE(store)->separator = '/'; -} - - const gchar * -camel_mbox_store_get_toplevel_dir (CamelMboxStore *store, CamelException *ex) +camel_mbox_store_get_toplevel_dir (CamelMboxStore *store) { - return store->toplevel_dir; -} - + Gurl *url = CAMEL_SERVICE (store)->url; - -static void -_init (CamelStore *store, CamelSession *session, const gchar *url_name, CamelException *ex) -{ - CamelMboxStore *mbox_store = CAMEL_MBOX_STORE (store); - Gurl *store_url; - - g_assert (url_name); - /* call parent implementation */ - parent_class->init (store, session, url_name, ex); - - - /* find the path in the URL*/ - store_url = g_url_new (url_name); - - g_return_if_fail (store_url); - g_return_if_fail (store_url->path); - - mbox_store->toplevel_dir = g_strdup (store_url->path); - g_url_free (store_url); - - - + g_assert(url != NULL); + return url->path; } + static CamelFolder * _get_folder (CamelStore *store, const gchar *folder_name, CamelException *ex) { diff --git a/camel/providers/mbox/camel-mbox-store.h b/camel/providers/mbox/camel-mbox-store.h index a5aea96..e336880 100644 --- a/camel/providers/mbox/camel-mbox-store.h +++ b/camel/providers/mbox/camel-mbox-store.h @@ -43,7 +43,6 @@ extern "C" { typedef struct { CamelStore parent_object; - gchar *toplevel_dir; } CamelMboxStore; @@ -51,7 +50,6 @@ typedef struct { typedef struct { CamelStoreClass parent_class; - } CamelMboxStoreClass; @@ -60,8 +58,7 @@ typedef struct { /* Standard Gtk function */ GtkType camel_mbox_store_get_type (void); -void camel_mbox_store_set_toplevel_dir (CamelMboxStore *store, const gchar *toplevel, CamelException *ex); -const gchar *camel_mbox_store_get_toplevel_dir (CamelMboxStore *store, CamelException *ex); +const gchar *camel_mbox_store_get_toplevel_dir (CamelMboxStore *store); #ifdef __cplusplus } -- 2.7.4