Override the default noop implementation.

2002-08-20  Jeffrey Stedfast  <fejj@ximian.com>

	* providers/imap/camel-imap-store.c (imap_noop): Override the
	default noop implementation.

	* camel-store.c (camel_store_noop): New virtual method to ping a
	store.

	* camel-session.c (get_service): Register a timeout that calls
	camel_store_noop() every 10 minutes.

svn path=/trunk/; revision=17822
This commit is contained in:
Jeffrey Stedfast
2002-08-20 21:44:29 +00:00
committed by Jeffrey Stedfast
parent 07c805c9f5
commit 164f4653dd
5 changed files with 100 additions and 3 deletions

View File

@ -1,3 +1,14 @@
2002-08-20 Jeffrey Stedfast <fejj@ximian.com>
* providers/imap/camel-imap-store.c (imap_noop): Override the
default noop implementation.
* camel-store.c (camel_store_noop): New virtual method to ping a
store.
* camel-session.c (get_service): Register a timeout that calls
camel_store_noop() every 10 minutes.
2002-08-19 Peter Williams <peterw@ximian.com>
Plug some large leaks in the indexing code.

View File

@ -398,6 +398,29 @@ service_cache_remove (CamelService *service, gpointer event_data, gpointer user_
CAMEL_SESSION_UNLOCK(session, lock);
}
static gboolean
noop_cb (gpointer user_data)
{
CamelStore *store = (CamelStore *) user_data;
CamelException ex;
camel_exception_init (&ex);
camel_store_noop (store, &ex);
camel_exception_clear (&ex);
return TRUE;
}
static void
unregister_noop (CamelObject *object, gpointer event_data, gpointer user_data)
{
CamelService *service = (CamelService *) object;
guint id;
id = GPOINTER_TO_INT (user_data);
camel_session_remove_timeout (service->session, id);
}
static CamelService *
get_service (CamelSession *session, const char *url_string,
@ -407,6 +430,7 @@ get_service (CamelSession *session, const char *url_string,
CamelProvider *provider;
CamelService *service;
CamelException internal_ex;
url = camel_url_new (url_string, ex);
if (!url)
return NULL;
@ -420,6 +444,7 @@ get_service (CamelSession *session, const char *url_string,
url->protocol);
provider = NULL;
}
if (!provider) {
camel_url_free (url);
return NULL;
@ -430,7 +455,7 @@ get_service (CamelSession *session, const char *url_string,
*/
if (url->path && !CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_PATH))
camel_url_set_path (url, NULL);
/* Now look up the service in the provider's cache */
service = g_hash_table_lookup (provider->service_cache[type], url);
if (service != NULL) {
@ -447,8 +472,19 @@ get_service (CamelSession *session, const char *url_string,
camel_object_unref (CAMEL_OBJECT (service));
service = NULL;
} else {
if (type == CAMEL_PROVIDER_STORE) {
guint id;
id = camel_session_register_timeout (session, 36000, noop_cb, service);
camel_object_hook_event (CAMEL_OBJECT (service), "finalize",
(CamelObjectEventHookFunc) unregister_noop,
GINT_TO_POINTER (id));
}
g_hash_table_insert (provider->service_cache[type], url, service);
camel_object_hook_event (CAMEL_OBJECT (service), "finalize", (CamelObjectEventHookFunc) service_cache_remove, GINT_TO_POINTER (type));
camel_object_hook_event (CAMEL_OBJECT (service), "finalize",
(CamelObjectEventHookFunc) service_cache_remove,
GINT_TO_POINTER (type));
}
return service;

View File

@ -71,6 +71,8 @@ static gboolean folder_subscribed (CamelStore *store, const char *folder_name);
static void subscribe_folder (CamelStore *store, const char *folder_name, CamelException *ex);
static void unsubscribe_folder (CamelStore *store, const char *folder_name, CamelException *ex);
static void noop (CamelStore *store, CamelException *ex);
static void construct (CamelService *service, CamelSession *session,
CamelProvider *provider, CamelURL *url,
CamelException *ex);
@ -102,6 +104,7 @@ camel_store_class_init (CamelStoreClass *camel_store_class)
camel_store_class->folder_subscribed = folder_subscribed;
camel_store_class->subscribe_folder = subscribe_folder;
camel_store_class->unsubscribe_folder = unsubscribe_folder;
camel_store_class->noop = noop;
/* virtual method overload */
camel_service_class->construct = construct;
@ -1115,6 +1118,28 @@ camel_store_unsubscribe_folder (CamelStore *store,
}
static void
noop (CamelStore *store, CamelException *ex)
{
/* no-op */
;
}
/**
* camel_store_noop:
* @store: CamelStore
* @ex: exception
*
* Pings @store so that its connection doesn't timeout.
**/
void
camel_store_noop (CamelStore *store, CamelException *ex)
{
CS_CLASS (store)->noop (store, ex);
}
int
camel_mkdir_hier (const char *path, mode_t mode)
{

View File

@ -155,6 +155,8 @@ typedef struct {
void (*unsubscribe_folder) (CamelStore *store,
const char *folder_name,
CamelException *ex);
void (*noop) (CamelStore *store,
CamelException *ex);
} CamelStoreClass;
@ -218,6 +220,9 @@ void camel_store_unsubscribe_folder (CamelStore *store,
const char *folder_name,
CamelException *ex);
void camel_store_noop (CamelStore *store,
CamelException *ex);
gboolean camel_store_uri_cmp (CamelStore *store, const char *uria, const char *urib);
/* utility needed by some stores */

View File

@ -86,6 +86,7 @@ static gboolean imap_connect_online (CamelService *service, CamelException *ex);
static gboolean imap_connect_offline (CamelService *service, CamelException *ex);
static gboolean imap_disconnect_online (CamelService *service, gboolean clean, CamelException *ex);
static gboolean imap_disconnect_offline (CamelService *service, gboolean clean, CamelException *ex);
static void imap_noop (CamelStore *store, CamelException *ex);
static GList *query_auth_types (CamelService *service, CamelException *ex);
static guint hash_folder_name (gconstpointer key);
static gint compare_folder_name (gconstpointer a, gconstpointer b);
@ -108,7 +109,6 @@ static void subscribe_folder (CamelStore *store, const char *folder_name,
static void unsubscribe_folder (CamelStore *store, const char *folder_name,
CamelException *ex);
static void get_folders_online (CamelImapStore *imap_store, const char *pattern,
GPtrArray *folders, gboolean lsub, CamelException *ex);
@ -153,6 +153,7 @@ camel_imap_store_class_init (CamelImapStoreClass *camel_imap_store_class)
camel_store_class->folder_subscribed = folder_subscribed;
camel_store_class->subscribe_folder = subscribe_folder;
camel_store_class->unsubscribe_folder = unsubscribe_folder;
camel_store_class->noop = imap_noop;
camel_disco_store_class->can_work_offline = can_work_offline;
camel_disco_store_class->connect_online = imap_connect_online;
@ -1404,6 +1405,25 @@ imap_disconnect_online (CamelService *service, gboolean clean, CamelException *e
return TRUE;
}
static void
imap_noop (CamelStore *store, CamelException *ex)
{
CamelImapStore *imap_store = (CamelImapStore *) store;
CamelDiscoStore *disco = (CamelDiscoStore *) store;
CamelImapResponse *response;
switch (camel_disco_store_status (disco)) {
case CAMEL_DISCO_STORE_ONLINE:
case CAMEL_DISCO_STORE_RESYNCING:
response = camel_imap_command (imap_store, NULL, NULL, "NOOP");
if (response)
camel_imap_response_free (imap_store, response);
break;
case CAMEL_DISCO_STORE_OFFLINE:
break;
}
}
static guint
hash_folder_name (gconstpointer key)
{