~ubuntu-branches/ubuntu/karmic/libtinymail/karmic

« back to all changes in this revision

Viewing changes to libtinymail-camel/camel-lite/camel/camel-object.h

  • Committer: Bazaar Package Importer
  • Author(s): Steve Kowalik
  • Date: 2007-10-12 11:21:12 UTC
  • Revision ID: james.westby@ubuntu.com-20071012112112-fod9fs7yrooxjr7i
Tags: upstream-0.0.2
ImportĀ upstreamĀ versionĀ 0.0.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 
2
/* camel-object.h: Base class for Camel */
 
3
/*
 
4
 * Authors:
 
5
 *  Dan Winship <danw@ximian.com>
 
6
 *  Michael Zucchi <notzed@ximian.com>
 
7
 *
 
8
 * Copyright 2000-2004 Novell, Inc. (www.novell.com)
 
9
 *
 
10
 * This program is free software; you can redistribute it and/or
 
11
 * modify it under the terms of version 2 of the GNU Lesser General Public
 
12
 * License as published by the Free Software Foundation.
 
13
 *
 
14
 * This program is distributed in the hope that it will be useful,
 
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
17
 * GNU Lesser General Public License for more details.
 
18
 *
 
19
 * You should have received a copy of the GNU Lesser General Public License
 
20
 * along with this program; if not, write to the Free Software
 
21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 
22
 * USA
 
23
 */
 
24
 
 
25
#ifndef CAMEL_OBJECT_H
 
26
#define CAMEL_OBJECT_H 1
 
27
 
 
28
#include <glib.h>
 
29
#include <stdio.h>              /* FILE */
 
30
#include <stdlib.h>             /* size_t */
 
31
#include <stdarg.h>
 
32
#include <pthread.h>
 
33
 
 
34
#include <camel/camel-arg.h>
 
35
#include <camel/camel-types.h>  /* this is a @##$@#SF stupid header */
 
36
 
 
37
G_BEGIN_DECLS
 
38
 
 
39
typedef struct _CamelObjectClass *CamelType;
 
40
 
 
41
#ifdef G_DISABLE_CHECKS
 
42
#define CAMEL_CHECK_CAST(obj, ctype, ptype)         ((ptype *) obj)
 
43
#define CAMEL_CHECK_CLASS_CAST(klass, ctype, ptype) ((ptype *) klass)
 
44
#else
 
45
#define CAMEL_CHECK_CAST(obj, ctype, ptype)         ((ptype *) camel_object_cast ((CamelObject *)(obj), (CamelType)(ctype)))
 
46
#define CAMEL_CHECK_CLASS_CAST(klass, ctype, ptype) ((ptype *) camel_object_class_cast ((CamelObjectClass *)(klass), (CamelType)(ctype) ))
 
47
#endif
 
48
#define CAMEL_CHECK_TYPE(obj, ctype)                (camel_object_is ((CamelObject *)(obj), (CamelType)(ctype) ))
 
49
#define CAMEL_CHECK_CLASS_TYPE(klass, ctype)        (camel_object_class_is ((CamelObjectClass *)(klass), (CamelType)(ctype)))
 
50
 
 
51
extern CamelType camel_object_type;
 
52
 
 
53
#define CAMEL_OBJECT_TYPE        (camel_object_type)
 
54
 
 
55
/* we can't check casts till we've got the type, use the global type variable because its cheaper */
 
56
#define CAMEL_OBJECT(obj)        (CAMEL_CHECK_CAST((obj), camel_object_type, CamelObject))
 
57
#define CAMEL_OBJECT_CLASS(k)    (CAMEL_CHECK_CLASS_CAST ((k), camel_object_type, CamelObjectClass))
 
58
#define CAMEL_IS_OBJECT(o)       (CAMEL_CHECK_TYPE((o), camel_object_type))
 
59
#define CAMEL_IS_OBJECT_CLASS(k) (CAMEL_CHECK_CLASS_TYPE((k), camel_object_type))
 
60
 
 
61
#define CAMEL_OBJECT_GET_CLASS(o) ((CamelObjectClass *)(CAMEL_OBJECT(o))->klass)
 
62
#define CAMEL_OBJECT_GET_TYPE(o)  ((CamelType)(CAMEL_OBJECT(o))->klass)
 
63
 
 
64
typedef struct _CamelObjectClass CamelObjectClass;
 
65
typedef struct _CamelObject CamelObject;
 
66
typedef unsigned int CamelObjectHookID;
 
67
typedef struct _CamelObjectMeta CamelObjectMeta;
 
68
 
 
69
extern CamelType camel_interface_type;
 
70
#define CAMEL_INTERFACE_TYPE (camel_interface_type)
 
71
typedef struct _CamelInterface CamelInterface;
 
72
 
 
73
typedef void (*CamelObjectClassInitFunc) (CamelObjectClass *);
 
74
typedef void (*CamelObjectClassFinalizeFunc) (CamelObjectClass *);
 
75
typedef void (*CamelObjectInitFunc) (CamelObject *, CamelObjectClass *);
 
76
typedef void (*CamelObjectFinalizeFunc) (CamelObject *);
 
77
 
 
78
typedef gboolean (*CamelObjectEventPrepFunc) (CamelObject *, gpointer);
 
79
typedef void (*CamelObjectEventHookFunc) (CamelObject *, gpointer, gpointer);
 
80
 
 
81
#define CAMEL_INVALID_TYPE (NULL)
 
82
 
 
83
/* camel object args. */
 
84
enum {
 
85
        /* Get a description of the object. */
 
86
        CAMEL_OBJECT_ARG_DESCRIPTION = CAMEL_ARG_FIRST, /* Get a copy of the meta-data list (should be freed) */
 
87
        CAMEL_OBJECT_ARG_METADATA,
 
88
        CAMEL_OBJECT_ARG_STATE_FILE,
 
89
        CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES,
 
90
};
 
91
 
 
92
enum {
 
93
        CAMEL_OBJECT_DESCRIPTION = CAMEL_OBJECT_ARG_DESCRIPTION | CAMEL_ARG_STR,
 
94
        /* Returns a CamelObjectMeta list */
 
95
        CAMEL_OBJECT_METADATA = CAMEL_OBJECT_ARG_METADATA | CAMEL_ARG_PTR,
 
96
        /* sets where the persistent data should reside, otherwise it isn't persistent */
 
97
        CAMEL_OBJECT_STATE_FILE = CAMEL_OBJECT_ARG_STATE_FILE | CAMEL_ARG_STR,
 
98
        /* returns a GSList CamelProperties of persistent properties */
 
99
        CAMEL_OBJECT_PERSISTENT_PROPERTIES = CAMEL_OBJECT_ARG_PERSISTENT_PROPERTIES | CAMEL_ARG_PTR,
 
100
};
 
101
 
 
102
typedef enum _CamelObjectFlags {
 
103
        CAMEL_OBJECT_DESTROY = (1<<0),
 
104
        CAMEL_OBJECT_DESTROYED = (1<<1),
 
105
        CAMEL_OBJECT_REF_DEBUG = (1<<2),
 
106
} CamelObjectFlags;
 
107
 
 
108
/* returned by get::CAMEL_OBJECT_METADATA */
 
109
struct _CamelObjectMeta {
 
110
        struct _CamelObjectMeta *next;
 
111
 
 
112
        char *value;
 
113
        char name[1];           /* allocated as part of structure */
 
114
};
 
115
 
 
116
/* TODO: create a simpleobject which has no events on it, or an interface for events */
 
117
struct _CamelObject {
 
118
        struct _CamelObjectClass *klass;
 
119
 
 
120
        /* current hooks on this object */
 
121
        struct _CamelHookList *hooks;
 
122
 
 
123
        guint32 ref_count:24;
 
124
        guint32 flags:8;
 
125
};
 
126
 
 
127
struct _CamelObjectClass
 
128
{
 
129
        struct _CamelObjectClass *parent;
 
130
 
 
131
        guint32 magic;          /* in same spot for validation */
 
132
 
 
133
        struct _CamelObjectClass *next, *child; /* maintain heirarchy, just for kicks */
 
134
 
 
135
        const char *name;
 
136
 
 
137
        void *lock;             /* lock when used in threading, else just pads struct */
 
138
 
 
139
        /*unsigned short version, revision;*/
 
140
 
 
141
        /* if the object's bigger than 64K, it could use redesigning */
 
142
        unsigned short object_size/*, object_data*/;
 
143
        unsigned short klass_size/*, klass_data*/;
 
144
 
 
145
        /* available hooks for this class */
 
146
        struct _CamelHookPair *hooks;
 
147
 
 
148
        /* init class */
 
149
        void (*klass_init)(struct _CamelObjectClass *);
 
150
        void (*klass_finalise)(struct _CamelObjectClass *);
 
151
 
 
152
        /* init/finalise object */
 
153
        void (*init)(struct _CamelObject *, struct _CamelObjectClass *);
 
154
        void (*finalise)(struct _CamelObject *);
 
155
 
 
156
        /* root-class fields follow, type system above */
 
157
 
 
158
        /* get/set interface */
 
159
        int (*setv)(struct _CamelObject *, struct _CamelException *ex, CamelArgV *args);
 
160
        int (*getv)(struct _CamelObject *, struct _CamelException *ex, CamelArgGetV *args);
 
161
        /* we only free 1 at a time, and only pointer types, obviously */
 
162
        void (*free)(struct _CamelObject *, guint32 tag, void *ptr);
 
163
 
 
164
        /* get/set meta-data interface */
 
165
        char *(*meta_get)(struct _CamelObject *, const char * name);
 
166
        gboolean (*meta_set)(struct _CamelObject *, const char * name, const char *value);
 
167
 
 
168
        /* persistence stuff */
 
169
        int (*state_read)(struct _CamelObject *, FILE *fp);
 
170
        int (*state_write)(struct _CamelObject *, FILE *fp);
 
171
};
 
172
 
 
173
/* an interface is just a class with no instance data */
 
174
struct _CamelInterface {
 
175
        struct _CamelObjectClass type;
 
176
};
 
177
 
 
178
/* The type system .... it's pretty simple..... */
 
179
void camel_type_init (void);
 
180
CamelType camel_type_register(CamelType parent, const char * name, /*unsigned int ver, unsigned int rev,*/
 
181
                              size_t instance_size,
 
182
                              size_t classfuncs_size,
 
183
                              CamelObjectClassInitFunc class_init,
 
184
                              CamelObjectClassFinalizeFunc  class_finalize,
 
185
                              CamelObjectInitFunc instance_init,
 
186
                              CamelObjectFinalizeFunc instance_finalize);
 
187
 
 
188
CamelType camel_interface_register(CamelType parent, const char *name,
 
189
                                   size_t classfuncs_size,
 
190
                                   CamelObjectClassInitFunc class_init,
 
191
                                   CamelObjectClassFinalizeFunc class_finalize);
 
192
 
 
193
/* deprecated interface */
 
194
#define camel_type_get_global_classfuncs(x) ((CamelObjectClass *)(x))
 
195
 
 
196
/* object class methods (types == classes now) */
 
197
const char *camel_type_to_name (CamelType type);
 
198
CamelType camel_name_to_type (const char *name);
 
199
void camel_object_class_add_event (CamelObjectClass *klass, const char *name, CamelObjectEventPrepFunc prep);
 
200
void camel_object_class_add_interface(CamelObjectClass *klass, CamelType itype);
 
201
 
 
202
void camel_object_class_dump_tree (CamelType root);
 
203
 
 
204
/* casting */
 
205
CamelObject *camel_object_cast(CamelObject *obj, CamelType ctype);
 
206
gboolean camel_object_is(CamelObject *obj, CamelType ctype);
 
207
 
 
208
CamelObjectClass *camel_object_class_cast (CamelObjectClass *klass, CamelType ctype);
 
209
gboolean camel_object_class_is (CamelObjectClass *klass, CamelType ctype);
 
210
 
 
211
CamelObjectClass *camel_interface_cast(CamelObjectClass *klass, CamelType ctype);
 
212
gboolean camel_interface_is(CamelObjectClass *k, CamelType ctype);
 
213
 
 
214
CamelType camel_object_get_type (void);
 
215
 
 
216
CamelObject *camel_object_new (CamelType type);
 
217
CamelObject *camel_object_new_name (const char *name);
 
218
 
 
219
void camel_object_ref(void *);
 
220
void camel_object_unref(void *);
 
221
 
 
222
#ifdef CAMEL_DEBUG
 
223
#define camel_object_ref(o) (printf("%s (%s:%d):ref (%p)\n", __FUNCTION__, __FILE__, __LINE__, o), camel_object_ref(o))
 
224
#define camel_object_unref(o) (printf("%s (%s:%d):unref (%p)\n", __FUNCTION__, __FILE__, __LINE__, o), camel_object_unref (o))
 
225
#endif
 
226
 
 
227
/* hooks */
 
228
CamelObjectHookID camel_object_hook_event(void *obj, const char *name, CamelObjectEventHookFunc hook, void *data);
 
229
void camel_object_remove_event(void *obj, CamelObjectHookID id);
 
230
void camel_object_unhook_event(void *obj, const char *name, CamelObjectEventHookFunc hook, void *data);
 
231
void camel_object_trigger_event(void *obj, const char *name, void *event_data);
 
232
 
 
233
/* interfaces */
 
234
void *camel_object_get_interface(void *vo, CamelType itype);
 
235
 
 
236
/* get/set methods */
 
237
int camel_object_set(void *obj, struct _CamelException *ex, ...);
 
238
int camel_object_setv(void *obj, struct _CamelException *ex, CamelArgV *);
 
239
int camel_object_get(void *obj, struct _CamelException *ex, ...);
 
240
int camel_object_getv(void *obj, struct _CamelException *ex, CamelArgGetV *);
 
241
 
 
242
/* not very efficient one-time calls */
 
243
void *camel_object_get_ptr(void *vo, CamelException *ex, int tag);
 
244
int camel_object_get_int(void *vo, CamelException *ex, int tag);
 
245
 
 
246
/* meta-data for user-specific data */
 
247
char *camel_object_meta_get(void *vo, const char * name);
 
248
gboolean camel_object_meta_set(void *vo, const char * name, const char *value);
 
249
 
 
250
/* reads/writes the state from/to the CAMEL_OBJECT_STATE_FILE */
 
251
int camel_object_state_read(void *vo);
 
252
int camel_object_state_write(void *vo);
 
253
 
 
254
/* free a retrieved object.  May be a noop for static data. */
 
255
void camel_object_free(void *vo, guint32 tag, void *value);
 
256
 
 
257
/* for managing bags of weakly-ref'd 'child' objects */
 
258
typedef struct _CamelObjectBag CamelObjectBag;
 
259
typedef void *(*CamelCopyFunc)(const void *vo);
 
260
 
 
261
CamelObjectBag *camel_object_bag_new(GHashFunc hash, GEqualFunc equal, CamelCopyFunc keycopy, GFreeFunc keyfree);
 
262
void *camel_object_bag_get(CamelObjectBag *bag, const void *key);
 
263
void *camel_object_bag_peek(CamelObjectBag *bag, const void *key);
 
264
void *camel_object_bag_reserve(CamelObjectBag *bag, const void *key);
 
265
void camel_object_bag_add(CamelObjectBag *bag, const void *key, void *o);
 
266
void camel_object_bag_abort(CamelObjectBag *bag, const void *key);
 
267
void camel_object_bag_rekey(CamelObjectBag *bag, void *o, const void *newkey);
 
268
GPtrArray *camel_object_bag_list(CamelObjectBag *bag);
 
269
void camel_object_bag_remove(CamelObjectBag *bag, void *o);
 
270
void camel_object_bag_destroy(CamelObjectBag *bag);
 
271
 
 
272
#define CAMEL_MAKE_CLASS(type, tname, parent, pname)                            \
 
273
static CamelType type##_type;                                                   \
 
274
static pname##Class * type##_parent_class;                                      \
 
275
                                                                                \
 
276
CamelType                                                                       \
 
277
type##_get_type(void)                                                           \
 
278
{                                                                               \
 
279
        if (type##_type == 0) {                                                 \
 
280
                type##_parent_class = (pname##Class *)parent##_get_type();      \
 
281
                type##_type = camel_type_register(                              \
 
282
                        type##_parent_class, #tname "Class",                    \
 
283
                        sizeof(tname),                                          \
 
284
                        sizeof(tname ## Class),                                 \
 
285
                        (CamelObjectClassInitFunc) type##_class_init,           \
 
286
                        NULL,                                                   \
 
287
                        (CamelObjectInitFunc) type##_init,                      \
 
288
                        (CamelObjectFinalizeFunc) type##_finalise);             \
 
289
        }                                                                       \
 
290
                                                                                \
 
291
        return type##_type;                                                     \
 
292
}
 
293
 
 
294
/* Utility functions, not object specific, but too small to separate */
 
295
typedef struct _CamelIteratorVTable CamelIteratorVTable;
 
296
typedef struct _CamelIterator CamelIterator;
 
297
 
 
298
struct _CamelIteratorVTable {
 
299
        /* free fields, dont free base object */
 
300
        void (*free)(void *it);
 
301
        /* go to the next messageinfo */
 
302
        const void *(*next)(void *it, CamelException *ex);
 
303
        /* go back to the start */
 
304
        void (*reset)(void *it);
 
305
        /* *ESTIMATE* how many results are in the iterator */
 
306
        int (*length)(void *it);
 
307
};
 
308
 
 
309
struct _CamelIterator {
 
310
        CamelIteratorVTable *klass;
 
311
 
 
312
        /* subclasses adds new fields afterwards */
 
313
};
 
314
 
 
315
void *camel_iterator_new(CamelIteratorVTable *klass, size_t size);
 
316
void camel_iterator_free(void *it);
 
317
const void *camel_iterator_next(void *it, CamelException *ex);
 
318
void camel_iterator_reset(void *it);
 
319
int camel_iterator_length(void *it);
 
320
 
 
321
G_END_DECLS
 
322
 
 
323
#endif /* CAMEL_OBJECT_H */