Update for CamelObject and some other changes

svn path=/trunk/; revision=5210
This commit is contained in:
Dan Winship
2000-09-05 21:18:00 +00:00
parent 69b79e75f6
commit dc2a0341af
5 changed files with 69 additions and 90 deletions

View File

@ -67,8 +67,7 @@
#include <camel/camel-exception.h>
#include <camel/camel-medium.h>
static CamelFolderClass *parent_class;
#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass)
#define CF_CLASS(so) CAMEL_FOLDER_CLASS (CAMEL_OBJECT_GET_CLASS(so))
static void init (CamelFolder *folder, CamelStore *parent_store,
CamelFolder *parent_folder, const gchar *name,
@ -83,7 +82,7 @@ static void expunge (CamelFolder *folder, CamelException *ex);
static gint get_message_count (CamelFolder *folder);
static void append_message (CamelFolder *folder, CamelMimeMessage *message,
guint32 flags, CamelException *ex);
const CamelMessageInfo *info, CamelException *ex);
static guint32 get_message_flags (CamelFolder *folder, const char *uid);
static void set_message_flags (CamelFolder *folder, const char *uid,
@ -109,17 +108,13 @@ static GPtrArray *search_by_expression (CamelFolder *folder,
static const CamelMessageInfo *get_message_info (CamelFolder *folder,
const char *uid);
static void finalize (GtkObject *object);
static void finalize (CamelObject *object);
static void
camel_cache_folder_class_init (CamelCacheFolderClass *camel_cache_folder_class)
{
CamelFolderClass *camel_folder_class =
CAMEL_FOLDER_CLASS (camel_cache_folder_class);
GtkObjectClass *gtk_object_class =
GTK_OBJECT_CLASS (camel_cache_folder_class);
parent_class = gtk_type_class (camel_folder_get_type ());
/* virtual method overload */
camel_folder_class->init = init;
@ -140,29 +135,22 @@ camel_cache_folder_class_init (CamelCacheFolderClass *camel_cache_folder_class)
camel_folder_class->free_subfolder_names = free_subfolder_names;
camel_folder_class->search_by_expression = search_by_expression;
camel_folder_class->get_message_info = get_message_info;
gtk_object_class->finalize = finalize;
}
GtkType
CamelType
camel_cache_folder_get_type (void)
{
static GtkType camel_cache_folder_type = 0;
static CamelType camel_cache_folder_type = CAMEL_INVALID_TYPE;
if (!camel_cache_folder_type) {
GtkTypeInfo camel_cache_folder_info =
{
"CamelCacheFolder",
if (camel_cache_folder_type == CAMEL_INVALID_TYPE) {
camel_cache_folder_type = camel_type_register (
CAMEL_FOLDER_TYPE, "CamelCacheFolder",
sizeof (CamelCacheFolder),
sizeof (CamelCacheFolderClass),
(GtkClassInitFunc) camel_cache_folder_class_init,
(GtkObjectInitFunc) NULL,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL,
};
camel_cache_folder_type = gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_cache_folder_info);
(CamelObjectClassInitFunc) camel_cache_folder_class_init,
NULL,
NULL,
(CamelObjectFinalizeFunc) finalize);
}
return camel_cache_folder_type;
@ -188,7 +176,7 @@ cache_free_summary (CamelCacheFolder *cache_folder)
}
static void
finalize (GtkObject *object)
finalize (CamelObject *object)
{
CamelCacheFolder *cache_folder = CAMEL_CACHE_FOLDER (object);
@ -202,12 +190,10 @@ finalize (GtkObject *object)
if (cache_folder->uidmap)
camel_cache_map_destroy (cache_folder->uidmap);
gtk_object_unref (GTK_OBJECT (cache_folder->local));
gtk_object_unref (GTK_OBJECT (cache_folder->remote));
camel_object_unref (CAMEL_OBJECT (cache_folder->local));
camel_object_unref (CAMEL_OBJECT (cache_folder->remote));
g_free (cache_folder->mapfile);
GTK_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -318,21 +304,23 @@ init (CamelFolder *folder, CamelStore *parent_store,
* update the summary, and propagate the signal.
*/
static void
remote_folder_changed (CamelFolder *remote_folder, int type, gpointer data)
remote_folder_changed (CamelObject *remote_folder, gpointer type,
gpointer user_data)
{
CamelCacheFolder *cache_folder = data;
CamelCacheFolder *cache_folder = user_data;
update (cache_folder, NULL);
gtk_signal_emit_by_name (GTK_OBJECT (cache_folder), "folder_changed",
type);
camel_object_trigger_event (CAMEL_OBJECT (cache_folder),
"folder_changed", type);
}
/* If the local folder changes, it's because we just cached a message
* or expunged messages. Look for new messages and update the UID maps.
*/
static void
local_folder_changed (CamelFolder *local_folder, int type, gpointer data)
local_folder_changed (CamelObject *local, gpointer type, gpointer data)
{
CamelFolder *local_folder = CAMEL_FOLDER (local);
CamelCacheFolder *cache_folder = data;
CamelMimeMessage *msg;
GPtrArray *new_luids;
@ -407,7 +395,7 @@ get_message_count (CamelFolder *folder)
/* DONE */
static void
append_message (CamelFolder *folder, CamelMimeMessage *message,
guint32 flags, CamelException *ex)
const CamelMessageInfo *info, CamelException *ex)
{
CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder;
@ -415,7 +403,7 @@ append_message (CamelFolder *folder, CamelMimeMessage *message,
* 100% reliable way to determine the UID assigned to the
* remote message, so we can't.
*/
camel_folder_append_message (cache_folder->remote, message, flags, ex);
camel_folder_append_message (cache_folder->remote, message, info, ex);
}
/* DONE */
@ -480,7 +468,7 @@ get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
{
CamelCacheFolder *cache_folder = (CamelCacheFolder *)folder;
CamelMimeMessage *msg;
guint32 flags;
const CamelMessageInfo *info;
const char *luid;
/* Check if we have it cached first. */
@ -499,7 +487,7 @@ get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
msg = camel_folder_get_message (cache_folder->remote, uid, ex);
if (!msg)
return NULL;
flags = camel_folder_get_message_flags (cache_folder->remote, uid);
info = camel_folder_get_message_info (cache_folder->remote, uid);
/* Add a header giving the remote UID and append it to the
* local folder. (This should eventually invoke
@ -508,7 +496,7 @@ get_message (CamelFolder *folder, const gchar *uid, CamelException *ex)
*/
camel_medium_add_header (CAMEL_MEDIUM (msg), "X-Evolution-Remote-UID",
uid);
camel_folder_append_message (cache_folder->local, msg, flags, NULL);
camel_folder_append_message (cache_folder->local, msg, info, NULL);
return msg;
}
@ -608,20 +596,18 @@ camel_cache_folder_new (CamelStore *store, CamelFolder *parent,
CamelCacheFolder *cache_folder;
CamelFolder *folder;
cache_folder = gtk_type_new (CAMEL_CACHE_FOLDER_TYPE);
cache_folder = CAMEL_CACHE_FOLDER (camel_object_new (CAMEL_CACHE_FOLDER_TYPE));
folder = (CamelFolder *)cache_folder;
cache_folder->local = local;
gtk_object_ref (GTK_OBJECT (local));
gtk_signal_connect (GTK_OBJECT (local), "folder_changed",
GTK_SIGNAL_FUNC (local_folder_changed),
cache_folder);
camel_object_ref (CAMEL_OBJECT (local));
camel_object_hook_event (CAMEL_OBJECT (local), "folder_changed",
local_folder_changed, cache_folder);
cache_folder->remote = remote;
gtk_object_ref (GTK_OBJECT (remote));
gtk_signal_connect (GTK_OBJECT (remote), "folder_changed",
GTK_SIGNAL_FUNC (remote_folder_changed),
cache_folder);
camel_object_ref (CAMEL_OBJECT (remote));
camel_object_hook_event (CAMEL_OBJECT (remote), "folder_changed",
remote_folder_changed, cache_folder);
/* XXX */
@ -634,7 +620,7 @@ camel_cache_folder_sync (CamelCacheFolder *cache_folder, CamelException *ex)
CamelMimeMessage *msg;
const char *ruid, *luid;
int lsize, i;
guint32 flags;
const CamelMessageInfo *info;
lsize = camel_folder_get_message_count (cache_folder->local);
@ -652,13 +638,13 @@ camel_cache_folder_sync (CamelCacheFolder *cache_folder, CamelException *ex)
ruid, ex);
if (camel_exception_is_set (ex))
return;
flags = camel_folder_get_message_flags (cache_folder->remote,
ruid);
info = camel_folder_get_message_info (cache_folder->remote,
ruid);
camel_medium_add_header (CAMEL_MEDIUM (msg),
"X-Evolution-Remote-UID", ruid);
camel_folder_append_message (cache_folder->local, msg,
flags, ex);
info, ex);
if (camel_exception_is_set (ex))
return;
}

View File

@ -35,9 +35,9 @@ extern "C" {
#include "camel-cache-map.h"
#define CAMEL_CACHE_FOLDER_TYPE (camel_cache_folder_get_type ())
#define CAMEL_CACHE_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_CACHE_FOLDER_TYPE, CamelCacheFolder))
#define CAMEL_CACHE_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_CACHE_FOLDER_TYPE, CamelCacheFolderClass))
#define IS_CAMEL_CACHE_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_CACHE_FOLDER_TYPE))
#define CAMEL_CACHE_FOLDER(obj) (CAMEL_CHECK_CAST((obj), CAMEL_CACHE_FOLDER_TYPE, CamelCacheFolder))
#define CAMEL_CACHE_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_CACHE_FOLDER_TYPE, CamelCacheFolderClass))
#define IS_CAMEL_CACHE_FOLDER(o) (CAMEL_CHECK_TYPE((o), CAMEL_CACHE_FOLDER_TYPE))
typedef struct {
@ -77,8 +77,8 @@ CamelFolder *camel_cache_folder_new (CamelStore *store, CamelFolder *parent,
void camel_cache_folder_sync (CamelCacheFolder *cache_folder,
CamelException *ex);
/* Standard Gtk function */
GtkType camel_cache_folder_get_type (void);
/* Standard Camel function */
CamelType camel_cache_folder_get_type (void);
#ifdef __cplusplus
}

View File

@ -32,12 +32,13 @@ static CamelProvider cache_provider = {
"cache",
"Cache",
"For caching remote mail into a local store."
"For caching remote mail into a local store.",
"cache",
0,
{ 0, 0 },
{ 0, 0 }
};

View File

@ -46,15 +46,15 @@
static CamelServiceClass *service_class = NULL;
static void finalize (GtkObject *object);
static void finalize (CamelObject *object);
static gboolean cache_connect (CamelService *service, CamelException *ex);
static gboolean cache_disconnect (CamelService *service, CamelException *ex);
static CamelFolder *get_folder (CamelStore *store, const char *folder_name,
gboolean create, CamelException *ex);
static CamelFolder *delete_folder (CamelStore *store, const char *folder_name,
CamelException *ex);
static void delete_folder (CamelStore *store, const char *folder_name,
CamelException *ex);
static char *get_folder_name (CamelStore *store, const char *folder_name,
CamelException *ex);
static char *get_root_folder_name (CamelStore *store, CamelException *ex);
@ -64,18 +64,14 @@ static char *get_default_folder_name (CamelStore *store, CamelException *ex);
static void
camel_cache_store_class_init (CamelCacheStoreClass *camel_cache_store_class)
{
GtkObjectClass *object_class =
GTK_OBJECT_CLASS (camel_cache_store_class);
CamelServiceClass *camel_service_class =
CAMEL_SERVICE_CLASS (camel_cache_store_class);
CamelStoreClass *camel_store_class =
CAMEL_STORE_CLASS (camel_cache_store_class);
service_class = gtk_type_class (camel_service_get_type ());
service_class = CAMEL_SERVICE_CLASS (camel_type_get_global_classfuncs (camel_service_get_type ()));
/* virtual method overload */
object_class->finalize = finalize;
camel_service_class->connect = cache_connect;
camel_service_class->disconnect = cache_disconnect;
@ -90,44 +86,38 @@ camel_cache_store_class_init (CamelCacheStoreClass *camel_cache_store_class)
static void
camel_cache_store_init (gpointer object, gpointer klass)
{
CamelCacheStore *cache_store = CAMEL_CACHE_STORE (object);
CamelService *service = CAMEL_SERVICE (object);
service->url_flags = CAMEL_SERVICE_URL_NEED_PATH;
}
GtkType
CamelType
camel_cache_store_get_type (void)
{
static GtkType camel_cache_store_type = 0;
static CamelType camel_cache_store_type = CAMEL_INVALID_TYPE;
if (!camel_cache_store_type) {
GtkTypeInfo camel_cache_store_info =
{
"CamelCacheStore",
if (camel_cache_store_type == CAMEL_INVALID_TYPE) {
camel_cache_store_type = camel_type_register (
CAMEL_STORE_TYPE, "CamelCacheStore",
sizeof (CamelCacheStore),
sizeof (CamelCacheStoreClass),
(GtkClassInitFunc) camel_cache_store_class_init,
(GtkObjectInitFunc) camel_cache_store_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL,
};
camel_cache_store_type = gtk_type_unique (CAMEL_STORE_TYPE, &camel_cache_store_info);
(CamelObjectClassInitFunc) camel_cache_store_class_init,
NULL,
(CamelObjectInitFunc) camel_cache_store_init,
(CamelObjectFinalizeFunc) finalize);
}
return camel_cache_store_type;
}
static void
finalize (GtkObject *object)
finalize (CamelObject *object)
{
CamelCacheStore *cache_store = CAMEL_CACHE_STORE (object);
gtk_object_unref (GTK_OBJECT (cache_store->local));
gtk_object_unref (GTK_OBJECT (cache_store->remote));
camel_object_unref (CAMEL_OBJECT (cache_store->local));
camel_object_unref (CAMEL_OBJECT (cache_store->remote));
}
@ -152,7 +142,8 @@ cache_connect (CamelService *service, CamelException *ex)
if (!camel_service_connect (CAMEL_SERVICE (cache_store->remote), ex))
return FALSE;
if (!camel_service_connect (CAMEL_SERVICE (cache_store->local), ex)) {
camel_service_disconnect (CAMEL_SERVICE (store->remote), NULL);
camel_service_disconnect (CAMEL_SERVICE (cache_store->remote),
NULL);
return FALSE;
}
@ -186,6 +177,7 @@ get_folder (CamelStore *store, const char *folder_name,
lf = camel_store_get_folder (cache_store->local, folder_name,
TRUE, ex);
if (!lf) {
camel_object_unref (CAMEL_OBJECT (rf));
camel_exception_setv (ex, camel_exception_get_id (ex),
"Could not create cache folder:\n%s",
camel_exception_get_description (ex));

View File

@ -34,9 +34,9 @@ extern "C" {
#include <camel/camel-store.h>
#define CAMEL_CACHE_STORE_TYPE (camel_cache_store_get_type ())
#define CAMEL_CACHE_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_CACHE_STORE_TYPE, CamelCacheStore))
#define CAMEL_CACHE_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_CACHE_STORE_TYPE, CamelCacheStoreClass))
#define IS_CAMEL_CACHE_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_CACHE_STORE_TYPE))
#define CAMEL_CACHE_STORE(obj) (CAMEL_CHECK_CAST((obj), CAMEL_CACHE_STORE_TYPE, CamelCacheStore))
#define CAMEL_CACHE_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_CACHE_STORE_TYPE, CamelCacheStoreClass))
#define IS_CAMEL_CACHE_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_CACHE_STORE_TYPE))
typedef struct {
CamelStore parent_object;
@ -55,8 +55,8 @@ typedef struct {
/* support functions */
void camel_cache_store_sync (CamelCacheStore *store);
/* Standard Gtk function */
GtkType camel_cache_store_get_type (void);
/* Standard Camel function */
CamelType camel_cache_store_get_type (void);
#ifdef __cplusplus
}