/*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
* This library is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
* Authors: Michael Zucchi
*/
#if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
#error "Only can be included directly."
#endif
#ifndef CAMEL_PARTITION_TABLE_H
#define CAMEL_PARTITION_TABLE_H
#include
/* Standard GObject macros */
#define CAMEL_TYPE_PARTITION_TABLE \
(camel_partition_table_get_type ())
#define CAMEL_PARTITION_TABLE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST \
((obj), CAMEL_TYPE_PARTITION_TABLE, CamelPartitionTable))
#define CAMEL_PARTITION_TABLE_CLASS(cls) \
(G_TYPE_CHECK_CLASS_CAST \
((cls), CAMEL_TYPE_PARTITION_TABLE, CamelPartitionTableClass))
#define CAMEL_IS_PARTITION_TABLE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE \
((obj), CAMEL_TYPE_PARTITION_TABLE))
#define CAMEL_IS_PARTITION_TABLE_CLASS(cls) \
(G_TYPE_CHECK_CLASS_TYPE \
((cls), CAMEL_TYPE_PARTITION_TABLE))
#define CAMEL_PARTITION_TABLE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS \
((obj), CAMEL_TYPE_PARTITION_TABLE, CamelPartitionTableClass))
#define CAMEL_TYPE_KEY_TABLE \
(camel_key_table_get_type ())
#define CAMEL_KEY_TABLE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST \
((obj), CAMEL_TYPE_KEY_TABLE, CamelKeyTable))
#define CAMEL_KEY_TABLE_CLASS(cls) \
(G_TYPE_CHECK_CLASS_CAST \
((cls), CAMEL_TYPE_KEY_TABLE, CamelKeyTableClass))
#define CAMEL_IS_KEY_TABLE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE \
((obj), CAMEL_TYPE_KEY_TABLE))
#define CAMEL_IS_KEY_TABLE_CLASS(cls) \
(G_TYPE_CHECK_CLASS_TYPE \
((cls), CAMEL_TYPE_KEY_TABLE))
#define CAMEL_KEY_TABLE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS \
((obj), CAMEL_TYPE_KEY_TABLE, CamelKeyTableClass))
G_BEGIN_DECLS
/* ********************************************************************** */
/* CamelPartitionTable - index of key to keyid */
typedef guint32 camel_hash_t; /* a hashed key */
typedef struct _CamelPartitionKey CamelPartitionKey;
typedef struct _CamelPartitionKeyBlock CamelPartitionKeyBlock;
typedef struct _CamelPartitionMap CamelPartitionMap;
typedef struct _CamelPartitionMapBlock CamelPartitionMapBlock;
typedef struct _CamelPartitionTable CamelPartitionTable;
typedef struct _CamelPartitionTableClass CamelPartitionTableClass;
typedef struct _CamelPartitionTablePrivate CamelPartitionTablePrivate;
struct _CamelPartitionKey {
camel_hash_t hashid;
camel_key_t keyid;
};
struct _CamelPartitionKeyBlock {
guint32 used;
struct _CamelPartitionKey keys[(CAMEL_BLOCK_SIZE - 4) / sizeof (struct _CamelPartitionKey)];
};
struct _CamelPartitionMap {
camel_hash_t hashid;
camel_block_t blockid;
};
struct _CamelPartitionMapBlock {
camel_block_t next;
guint32 used;
struct _CamelPartitionMap partition[(CAMEL_BLOCK_SIZE - 8) / sizeof (struct _CamelPartitionMap)];
};
struct _CamelPartitionTable {
GObject parent;
CamelPartitionTablePrivate *priv;
CamelBlockFile *blocks;
camel_block_t rootid;
gint (*is_key)(CamelPartitionTable *cpi, const gchar *key, camel_key_t keyid, gpointer data);
gpointer is_key_data;
/* we keep a list of partition blocks active at all times */
GQueue partition;
};
struct _CamelPartitionTableClass {
GObjectClass parent;
};
GType camel_partition_table_get_type (void);
CamelPartitionTable *
camel_partition_table_new (struct _CamelBlockFile *bs,
camel_block_t root);
gint camel_partition_table_sync (CamelPartitionTable *cpi);
gint camel_partition_table_add (CamelPartitionTable *cpi,
const gchar *key,
camel_key_t keyid);
camel_key_t camel_partition_table_lookup (CamelPartitionTable *cpi,
const gchar *key);
gboolean camel_partition_table_remove (CamelPartitionTable *cpi,
const gchar *key);
/* ********************************************************************** */
/* CamelKeyTable - index of keyid to key and flag and data mapping */
typedef struct _CamelKeyBlock CamelKeyBlock;
typedef struct _CamelKeyRootBlock CamelKeyRootBlock;
typedef struct _CamelKeyTable CamelKeyTable;
typedef struct _CamelKeyTableClass CamelKeyTableClass;
typedef struct _CamelKeyTablePrivate CamelKeyTablePrivate;
struct _CamelKeyRootBlock {
camel_block_t first;
camel_block_t last;
camel_key_t free; /* free list */
};
struct _CamelKeyKey {
camel_block_t data;
guint offset : 10;
guint flags : 22;
};
struct _CamelKeyBlock {
camel_block_t next;
guint32 used;
union {
struct _CamelKeyKey keys[(CAMEL_BLOCK_SIZE - 8) / sizeof (struct _CamelKeyKey)];
gchar keydata[CAMEL_BLOCK_SIZE - 8];
} u;
};
#define CAMEL_KEY_TABLE_MAX_KEY (128) /* max size of any key */
struct _CamelKeyTable {
GObject parent;
CamelKeyTablePrivate *priv;
CamelBlockFile *blocks;
camel_block_t rootid;
CamelKeyRootBlock *root;
CamelBlock *root_block;
};
struct _CamelKeyTableClass {
GObjectClass parent;
};
GType camel_key_table_get_type (void);
CamelKeyTable * camel_key_table_new (CamelBlockFile *bs,
camel_block_t root);
gint camel_key_table_sync (CamelKeyTable *ki);
camel_key_t camel_key_table_add (CamelKeyTable *ki,
const gchar *key,
camel_block_t data,
guint flags);
gboolean camel_key_table_set_data (CamelKeyTable *ki,
camel_key_t keyid,
camel_block_t data);
gboolean camel_key_table_set_flags (CamelKeyTable *ki,
camel_key_t keyid,
guint flags,
guint set);
camel_block_t camel_key_table_lookup (CamelKeyTable *ki,
camel_key_t keyid,
gchar **key,
guint *flags);
camel_key_t camel_key_table_next (CamelKeyTable *ki,
camel_key_t next,
gchar **keyp,
guint *flagsp,
camel_block_t *datap);
G_END_DECLS
#endif /* CAMEL_PARTITION_TABLE_H */