1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright(C) 2000 Ximian Inc.
6 * Michael Zucchi <notzed@ximian.com>
7 * Dan Winship <danw@ximian.com>
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of version 2 of the GNU Lesser General Public
11 * License as published by the Free Software Foundation.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this program; if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
35 #include "camel-file-utils.h"
37 #include "camel-imapp-summary.h"
39 #define CAMEL_IMAPP_SUMMARY_VERSION (1)
41 static int summary_header_load(CamelFolderSummary *, FILE *);
42 static int summary_header_save(CamelFolderSummary *, FILE *);
44 static CamelMessageInfo *message_info_load(CamelFolderSummary *s, FILE *in);
45 static int message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *info);
47 static void camel_imapp_summary_class_init(CamelIMAPPSummaryClass *klass);
48 static void camel_imapp_summary_init (CamelIMAPPSummary *obj);
50 static CamelFolderSummaryClass *camel_imapp_summary_parent;
53 camel_imapp_summary_get_type(void)
55 static CamelType type = CAMEL_INVALID_TYPE;
57 if (type == CAMEL_INVALID_TYPE) {
58 type = camel_type_register(
59 camel_folder_summary_get_type(), "CamelIMAPPSummary",
60 sizeof(CamelIMAPPSummary),
61 sizeof(CamelIMAPPSummaryClass),
62 (CamelObjectClassInitFunc) camel_imapp_summary_class_init,
64 (CamelObjectInitFunc) camel_imapp_summary_init,
72 camel_imapp_summary_class_init(CamelIMAPPSummaryClass *klass)
74 CamelFolderSummaryClass *cfs_class =(CamelFolderSummaryClass *) klass;
76 camel_imapp_summary_parent = CAMEL_FOLDER_SUMMARY_CLASS(camel_type_get_global_classfuncs(camel_folder_summary_get_type()));
78 cfs_class->summary_header_load = summary_header_load;
79 cfs_class->summary_header_save = summary_header_save;
80 cfs_class->message_info_load = message_info_load;
81 cfs_class->message_info_save = message_info_save;
85 camel_imapp_summary_init(CamelIMAPPSummary *obj)
87 CamelFolderSummary *s =(CamelFolderSummary *)obj;
89 /* subclasses need to set the right instance data sizes */
90 s->message_info_size = sizeof(CamelIMAPPMessageInfo);
91 s->content_info_size = sizeof(CamelMessageContentInfo);
93 /* and a unique file version */
94 s->version += CAMEL_IMAPP_SUMMARY_VERSION;
98 * camel_imapp_summary_new:
99 * @filename: the file to store the summary in.
101 * This will create a new CamelIMAPPSummary object and read in the
102 * summary data from disk, if it exists.
104 * Return value: A new CamelIMAPPSummary object.
107 camel_imapp_summary_new(void)
109 CamelFolderSummary *summary = CAMEL_FOLDER_SUMMARY(camel_object_new(camel_imapp_summary_get_type()));
116 summary_header_load(CamelFolderSummary *s, FILE *in)
118 CamelIMAPPSummary *ims = CAMEL_IMAPP_SUMMARY(s);
120 if (camel_imapp_summary_parent->summary_header_load(s, in) == -1)
124 if (s->version == 0x100c)
125 return camel_file_util_decode_uint32(in, &ims->uidvalidity);
127 if (camel_file_util_decode_fixed_int32(in, &ims->version) == -1
128 || camel_file_util_decode_fixed_int32(in, &ims->uidvalidity) == -1)
131 if (ims->version > CAMEL_IMAPP_SUMMARY_VERSION) {
132 g_warning("Unkown summary version\n");
141 summary_header_save(CamelFolderSummary *s, FILE *out)
143 CamelIMAPPSummary *ims = CAMEL_IMAPP_SUMMARY(s);
145 if (camel_imapp_summary_parent->summary_header_save(s, out) == -1)
148 if (camel_file_util_encode_fixed_int32(out, CAMEL_IMAPP_SUMMARY_VERSION) == -1
149 || camel_file_util_encode_fixed_int32(out, ims->uidvalidity) == -1)
156 static CamelMessageInfo *
157 message_info_load(CamelFolderSummary *s, FILE *in)
159 CamelMessageInfo *info;
160 CamelIMAPPMessageInfo *iinfo;
162 info = camel_imapp_summary_parent->message_info_load(s, in);
164 iinfo =(CamelIMAPPMessageInfo *)info;
166 if (camel_file_util_decode_uint32(in, &iinfo->server_flags) == -1)
172 camel_message_info_free(info);
177 message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *info)
179 CamelIMAPPMessageInfo *iinfo =(CamelIMAPPMessageInfo *)info;
181 if (camel_imapp_summary_parent->message_info_save(s, out, info) == -1)
184 return camel_file_util_encode_uint32(out, iinfo->server_flags);