/* * 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_BLOCK_FILE_H #define CAMEL_BLOCK_FILE_H #include #include #include /* Standard GObject macros */ #define CAMEL_TYPE_BLOCK_FILE \ (camel_block_file_get_type ()) #define CAMEL_BLOCK_FILE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST \ ((obj), CAMEL_TYPE_BLOCK_FILE, CamelBlockFile)) #define CAMEL_BLOCK_FILE_CLASS(cls) \ (G_TYPE_CHECK_CLASS_CAST \ ((cls), CAMEL_TYPE_BLOCK_FILE, CamelBlockFileClass)) #define CAMEL_IS_BLOCK_FILE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE \ ((obj), CAMEL_TYPE_BLOCK_FILE)) #define CAMEL_IS_BLOCK_FILE_CLASS(cls) \ (G_TYPE_CHECK_CLASS_TYPE \ ((cls), CAMEL_TYPE_BLOCK_FILE)) #define CAMEL_BLOCK_FILE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS \ ((obj), CAMEL_TYPE_BLOCK_FILE, CamelBlockFileClass)) #define CAMEL_TYPE_KEY_FILE \ (camel_key_file_get_type ()) #define CAMEL_KEY_FILE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST \ ((obj), CAMEL_TYPE_KEY_FILE, CamelKeyFile)) #define CAMEL_KEY_FILE_CLASS(cls) \ (G_TYPE_CHECK_CLASS_CAST \ ((cls), CAMEL_TYPE_KEY_FILE, CamelKeyFileClass)) #define CAMEL_IS_KEY_FILE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE \ ((obj), CAMEL_TYPE_KEY_FILE)) #define CAMEL_IS_KEY_FILE_CLASS(cls) \ (G_TYPE_CHECK_CLASS_TYPE \ ((cls), CAMEL_TYPE_KEY_FILE)) #define CAMEL_KEY_FILE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS \ ((obj), CAMEL_TYPE_KEY_FILE, CamelKeyFileClass)) G_BEGIN_DECLS typedef guint32 camel_block_t; /* block offset, absolute, bottom BLOCK_SIZE_BITS always 0 */ typedef guint32 camel_key_t; /* this is a bitfield of (block offset:BLOCK_SIZE_BITS) */ typedef struct _CamelBlockRoot CamelBlockRoot; typedef struct _CamelBlock CamelBlock; typedef struct _CamelBlockFile CamelBlockFile; typedef struct _CamelBlockFileClass CamelBlockFileClass; typedef struct _CamelBlockFilePrivate CamelBlockFilePrivate; typedef enum { CAMEL_BLOCK_FILE_SYNC = 1 << 0 } CamelBlockFileFlags; #define CAMEL_BLOCK_SIZE (1024) #define CAMEL_BLOCK_SIZE_BITS (10) /* # bits to contain block_size bytes */ typedef enum { CAMEL_BLOCK_DIRTY = 1 << 0, CAMEL_BLOCK_DETACHED = 1 << 1 } CamelBlockFlags; struct _CamelBlockRoot { gchar version[8]; /* version number */ guint32 flags; /* flags for file */ guint32 block_size; /* block size of this file */ camel_block_t free; /* free block list */ camel_block_t last; /* pointer to end of blocks */ /* subclasses tack on, but no more than CAMEL_BLOCK_SIZE! */ }; /* LRU cache of blocks */ struct _CamelBlock { camel_block_t id; CamelBlockFlags flags; guint32 refcount; guint32 align00; guchar data[CAMEL_BLOCK_SIZE]; }; struct _CamelBlockFile { GObject parent; CamelBlockFilePrivate *priv; gchar version[8]; gchar *path; CamelBlockFileFlags flags; gint fd; gsize block_size; CamelBlockRoot *root; CamelBlock *root_block; /* make private? */ gint block_cache_limit; gint block_cache_count; GQueue block_cache; GHashTable *blocks; }; struct _CamelBlockFileClass { GObjectClass parent_class; gint (*validate_root)(CamelBlockFile *); gint (*init_root)(CamelBlockFile *); }; GType camel_block_file_get_type (void); CamelBlockFile *camel_block_file_new (const gchar *path, gint flags, const gchar version[8], gsize block_size); gint camel_block_file_rename (CamelBlockFile *bs, const gchar *path); gint camel_block_file_delete (CamelBlockFile *kf); CamelBlock * camel_block_file_new_block (CamelBlockFile *bs); gint camel_block_file_free_block (CamelBlockFile *bs, camel_block_t id); CamelBlock * camel_block_file_get_block (CamelBlockFile *bs, camel_block_t id); void camel_block_file_detach_block (CamelBlockFile *bs, CamelBlock *bl); void camel_block_file_attach_block (CamelBlockFile *bs, CamelBlock *bl); void camel_block_file_touch_block (CamelBlockFile *bs, CamelBlock *bl); void camel_block_file_unref_block (CamelBlockFile *bs, CamelBlock *bl); gint camel_block_file_sync_block (CamelBlockFile *bs, CamelBlock *bl); gint camel_block_file_sync (CamelBlockFile *bs); /* ********************************************************************** */ typedef struct _CamelKeyFile CamelKeyFile; typedef struct _CamelKeyFileClass CamelKeyFileClass; typedef struct _CamelKeyFilePrivate CamelKeyFilePrivate; struct _CamelKeyFile { GObject parent; CamelKeyFilePrivate *priv; FILE *fp; gchar *path; gint flags; goffset last; }; struct _CamelKeyFileClass { GObjectClass parent_class; }; GType camel_key_file_get_type (void); CamelKeyFile * camel_key_file_new (const gchar *path, gint flags, const gchar version[8]); gint camel_key_file_rename (CamelKeyFile *kf, const gchar *path); gint camel_key_file_delete (CamelKeyFile *kf); gint camel_key_file_write (CamelKeyFile *kf, camel_block_t *parent, gsize len, camel_key_t *records); gint camel_key_file_read (CamelKeyFile *kf, camel_block_t *start, gsize *len, camel_key_t **records); G_END_DECLS #endif /* CAMEL_BLOCK_FILE_H */