diff options
Diffstat (limited to 'camel/providers/imapp/camel-imapp-summary.c')
-rw-r--r-- | camel/providers/imapp/camel-imapp-summary.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/camel/providers/imapp/camel-imapp-summary.c b/camel/providers/imapp/camel-imapp-summary.c new file mode 100644 index 0000000000..a0df21bcb0 --- /dev/null +++ b/camel/providers/imapp/camel-imapp-summary.c @@ -0,0 +1,166 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Copyright(C) 2000 Ximian Inc. + * + * Authors: + * Michael Zucchi <notzed@ximian.com> + * Dan Winship <danw@ximian.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <sys/stat.h> +#include <sys/uio.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> + +#include "camel-imapp-summary.h" +#include <camel/camel-file-utils.h> + +#define CAMEL_IMAPP_SUMMARY_VERSION (0x1000) + +static int summary_header_load(CamelFolderSummary *, FILE *); +static int summary_header_save(CamelFolderSummary *, FILE *); + +static CamelMessageInfo *message_info_load(CamelFolderSummary *s, FILE *in); +static int message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *info); + +static void camel_imapp_summary_class_init(CamelIMAPPSummaryClass *klass); +static void camel_imapp_summary_init (CamelIMAPPSummary *obj); + +static CamelFolderSummaryClass *camel_imapp_summary_parent; + +CamelType +camel_imapp_summary_get_type(void) +{ + static CamelType type = CAMEL_INVALID_TYPE; + + if (type == CAMEL_INVALID_TYPE) { + type = camel_type_register( + camel_folder_summary_get_type(), "CamelIMAPPSummary", + sizeof(CamelIMAPPSummary), + sizeof(CamelIMAPPSummaryClass), + (CamelObjectClassInitFunc) camel_imapp_summary_class_init, + NULL, + (CamelObjectInitFunc) camel_imapp_summary_init, + NULL); + } + + return type; +} + +static void +camel_imapp_summary_class_init(CamelIMAPPSummaryClass *klass) +{ + CamelFolderSummaryClass *cfs_class =(CamelFolderSummaryClass *) klass; + + camel_imapp_summary_parent = CAMEL_FOLDER_SUMMARY_CLASS(camel_type_get_global_classfuncs(camel_folder_summary_get_type())); + + cfs_class->summary_header_load = summary_header_load; + cfs_class->summary_header_save = summary_header_save; + cfs_class->message_info_load = message_info_load; + cfs_class->message_info_save = message_info_save; +} + +static void +camel_imapp_summary_init(CamelIMAPPSummary *obj) +{ + CamelFolderSummary *s =(CamelFolderSummary *)obj; + + /* subclasses need to set the right instance data sizes */ + s->message_info_size = sizeof(CamelIMAPPMessageInfo); + s->content_info_size = sizeof(CamelMessageContentInfo); + + /* and a unique file version */ + s->version += CAMEL_IMAPP_SUMMARY_VERSION; +} + +/** + * camel_imapp_summary_new: + * @filename: the file to store the summary in. + * + * This will create a new CamelIMAPPSummary object and read in the + * summary data from disk, if it exists. + * + * Return value: A new CamelIMAPPSummary object. + **/ +CamelFolderSummary * +camel_imapp_summary_new(void) +{ + CamelFolderSummary *summary = CAMEL_FOLDER_SUMMARY(camel_object_new(camel_imapp_summary_get_type())); + + return summary; +} + + +static int +summary_header_load(CamelFolderSummary *s, FILE *in) +{ + CamelIMAPPSummary *ims = CAMEL_IMAPP_SUMMARY(s); + + if (camel_imapp_summary_parent->summary_header_load(s, in) == -1) + return -1; + + return camel_file_util_decode_uint32(in, &ims->uidvalidity); +} + +static int +summary_header_save(CamelFolderSummary *s, FILE *out) +{ + CamelIMAPPSummary *ims = CAMEL_IMAPP_SUMMARY(s); + + if (camel_imapp_summary_parent->summary_header_save(s, out) == -1) + return -1; + + return camel_file_util_encode_uint32(out, ims->uidvalidity); +} + + +static CamelMessageInfo * +message_info_load(CamelFolderSummary *s, FILE *in) +{ + CamelMessageInfo *info; + CamelIMAPPMessageInfo *iinfo; + + info = camel_imapp_summary_parent->message_info_load(s, in); + if (info) { + iinfo =(CamelIMAPPMessageInfo *)info; + + if (camel_file_util_decode_uint32(in, &iinfo->server_flags) == -1) + goto error; + } + + return info; +error: + camel_folder_summary_info_free(s, info); + return NULL; +} + +static int +message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *info) +{ + CamelIMAPPMessageInfo *iinfo =(CamelIMAPPMessageInfo *)info; + + if (camel_imapp_summary_parent->message_info_save(s, out, info) == -1) + return -1; + + return camel_file_util_encode_uint32(out, iinfo->server_flags); +} |