2 * libEtPan! -- a mail stuff library
4 * Copyright (C) 2001, 2002 - DINH Viet Hoa
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the libEtPan! project nor the names of its
16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #include "mailmbox_types.h"
49 /* *********************************************************************** */
51 int mailmbox_msg_info_update(struct mailmbox_folder * folder,
52 size_t start, size_t start_len,
53 size_t headers, size_t headers_len,
54 size_t body, size_t body_len,
55 size_t size, size_t padding,
58 struct mailmbox_msg_info * info;
64 key.data = (char *) &uid;
65 key.len = sizeof(uid);
66 r = chash_get(folder->hash, &key, &data);
70 info = mailmbox_msg_info_new(start, start_len, headers, headers_len,
71 body, body_len, size, padding, uid);
73 res = MAILMBOX_ERROR_MEMORY;
77 r = carray_add(folder->tab, info, &index);
79 mailmbox_msg_info_free(info);
80 res = MAILMBOX_ERROR_MEMORY;
88 key.data = (char *) &uid;
89 key.len = sizeof(uid);
90 data.data = (char *) info;
93 r = chash_set(folder->hash, &key, &data, NULL);
95 mailmbox_msg_info_free(info);
96 carray_delete(folder->tab, index);
97 res = MAILMBOX_ERROR_MEMORY;
105 info = (struct mailmbox_msg_info *) data.data;
108 info->start_len = start_len;
109 info->headers = headers;
110 info->headers_len = headers_len;
112 info->body_len = body_len;
114 info->padding = padding;
117 return MAILMBOX_NO_ERROR;
124 struct mailmbox_msg_info *
125 mailmbox_msg_info_new(size_t start, size_t start_len,
126 size_t headers, size_t headers_len,
127 size_t body, size_t body_len,
128 size_t size, size_t padding,
131 struct mailmbox_msg_info * info;
133 info = malloc(sizeof(* info));
140 info->written_uid = TRUE;
142 info->written_uid = FALSE;
143 info->deleted = FALSE;
146 info->start_len = start_len;
148 info->headers = headers;
149 info->headers_len = headers_len;
152 info->body_len = body_len;
156 info->padding = padding;
161 void mailmbox_msg_info_free(struct mailmbox_msg_info * info)
166 /* *********************************************************************** */
169 struct mailmbox_msg_env *
170 mailmbox_msg_env_new(uint32_t index, struct mailimf_fields * fields)
172 struct mailmbox_msg_env * msg_env;
174 msg_env = alloc(struct mailmbox_msg_env, 1);
178 msg_env->index = index;
179 msg_env->fields = fields;
184 void mailmbox_msg_env_free(struct mailmbox_msg_env * msg_env)
186 if (msg_env->fields != NULL)
187 mailimf_fields_free(msg_env->fields);
194 struct mailmbox_append_info *
195 mailmbox_append_info_new(char * message, size_t size)
197 struct mailmbox_append_info * info;
199 info = malloc(sizeof(* info));
203 info->message = message;
209 void mailmbox_append_info_free(struct mailmbox_append_info * info)
215 struct mailmbox_append_info_list *
216 mailmbox_append_info_list_new(clist * list)
218 struct mailmbox_append_info_list * info_list;
220 info_list = alloc(struct mailmbox_append_info_list, 1);
221 if (info_list == NULL)
224 info_list->list = list;
229 void mailmbox_append_info_list_free(struct mailmbox_append_info_list *
232 clist_foreach(info_list->list, (clist_func) mailmbox_append_info_free, NULL);
237 struct mailmbox_folder * mailmbox_folder_new(char * filename)
239 struct mailmbox_folder * folder;
241 folder = malloc(sizeof(* folder));
245 strncpy(folder->filename, filename, PATH_MAX);
247 folder->mtime = (time_t) -1;
250 folder->read_only = TRUE;
251 folder->no_uid = TRUE;
253 folder->changed = FALSE;
254 folder->deleted_count = 0;
256 folder->mapping = NULL;
257 folder->mapping_size = 0;
259 folder->written_uid = 0;
262 folder->hash = chash_new(CHASH_DEFAULTSIZE, CHASH_COPYKEY);
263 if (folder->hash == NULL)
266 folder->tab = carray_new(128);
267 if (folder->tab == NULL)
273 chash_free(folder->hash);
280 void mailmbox_folder_free(struct mailmbox_folder * folder)
284 for(i = 0 ; i < folder->tab->len ; i++) {
285 struct mailmbox_msg_info * info;
287 info = carray_get(folder->tab, i);
289 mailmbox_msg_info_free(info);
292 carray_free(folder->tab);
294 chash_free(folder->hash);