Mercurial > masqmail
diff src/message.c @ 0:08114f7dcc23 0.2.21
this is masqmail-0.2.21 from oliver kurth
author | meillo@marmaro.de |
---|---|
date | Fri, 26 Sep 2008 17:05:23 +0200 |
parents | |
children | 26e34ae9a3e3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/message.c Fri Sep 26 17:05:23 2008 +0200 @@ -0,0 +1,210 @@ +/* MasqMail + Copyright (C) 1999-2001 Oliver Kurth + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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. +*/ + +#include "masqmail.h" + +message *create_message() +{ + message *msg = (message *)g_malloc(sizeof(message)); + if(msg){ + memset(msg, 0, sizeof(message)); + msg->data_size = -1; + } + return msg; +} + +gint msg_calc_size(message *msg, gboolean is_smtp) +{ + GList *node; + gint l_cnt = 0, c_cnt = 0; + + /* header size */ + if(msg->hdr_list){ + for(node = g_list_first(msg->hdr_list); node; node = g_list_next(node)){ + if(node->data){ + header *hdr = (header *)(node->data); + if(hdr->header){ + char *p = hdr->header; + while(*p){ + if(*p++ == '\n') l_cnt++; + c_cnt++; + } + } + } + } + } + + /* empty line separating headers from data: */ + c_cnt++; + l_cnt++; + + /* data size */ + if(msg->data_list){ + for(node = g_list_first(msg->data_list); node; node = g_list_next(node)){ + if(node->data){ + char *p = node->data; + while(*p){ + if(*p++ == '\n') l_cnt++; + c_cnt++; + } + } + } + } + + return is_smtp ? c_cnt + l_cnt : c_cnt; +} + +void msg_free_data(message *msg) +{ + GList *node; + + if(msg->data_list){ + for(node = g_list_first(msg->data_list); node; node = g_list_next(node)){ + if(node->data) + g_free(node->data); + } + g_list_free(msg->data_list); + msg->data_list = NULL; + } +} + +void destroy_message(message *msg) +{ + GList *node; + + if(msg->uid) g_free(msg->uid); + if(msg->ident) g_free(msg->ident); + if(msg->return_path) g_free(msg->return_path); + + if(msg->rcpt_list){ + for(node = g_list_first(msg->rcpt_list); node; node = g_list_next(node)){ + if(node->data) + g_free(node->data); + } + g_list_free(msg->rcpt_list); + } + if(msg->hdr_list){ + for(node = g_list_first(msg->hdr_list); node; node = g_list_next(node)){ + if(node->data){ + header *hdr = (header *)(node->data); + if(hdr->header) + g_free(hdr->header); + g_free(node->data); + } + } + g_list_free(msg->hdr_list); + } + + if(msg->full_sender_name) + g_free(msg->full_sender_name); + + msg_free_data(msg); + + g_free(msg); +} + +void destroy_msg_list(GList *msg_list) +{ + GList *msg_node; + + foreach(msg_list, msg_node){ + message *msg = (message *)(msg_node->data); + destroy_message(msg); + } + g_list_free(msg_list); +} + +msg_out *create_msg_out(message *msg) +{ + msg_out *msgout = NULL; + + msgout = g_malloc(sizeof(msg_out)); + if(msgout){ + msgout->msg = msg; + msgout->return_path = NULL; + msgout->rcpt_list = NULL; + + msgout->hdr_list = NULL; + msgout->xtra_hdr_list = NULL; + } + return msgout; +} + +msg_out *clone_msg_out(msg_out *msgout_orig) +{ + if(msgout_orig){ + msg_out *msgout = create_msg_out(msgout_orig->msg); + if(msgout){ + msgout->msg = msgout_orig->msg; + if(msgout_orig->return_path) + msgout->return_path = copy_address(msgout_orig->return_path); + if(msgout_orig->hdr_list) + msgout->hdr_list = g_list_copy(msgout_orig->hdr_list); + /* FIXME: if this lives longer than the original + and we access one of the xtra hdrs, we will segfault + or cause some weird bugs: */ + msgout->xtra_hdr_list = NULL; + if(msgout_orig->rcpt_list) + msgout->rcpt_list = g_list_copy(msgout_orig->rcpt_list); + } + return msgout; + } + return NULL; +} + +GList *create_msg_out_list(GList *msg_list) +{ + GList *msgout_list = NULL; + GList *msg_node; + + foreach(msg_list, msg_node){ + message *msg = (message *)(msg_node->data); + msgout_list = g_list_append(msgout_list, create_msg_out(msg)); + } + return msgout_list; +} + +void destroy_msg_out(msg_out *msgout) +{ + if(msgout){ + if(msgout->return_path) + destroy_address(msgout->return_path); + if(msgout->hdr_list) + g_list_free(msgout->hdr_list); + if(msgout->xtra_hdr_list){ + GList *hdr_node; + foreach(msgout->xtra_hdr_list, hdr_node){ + header *hdr = (header *)(hdr_node->data); + destroy_header(hdr); + } + g_list_free(msgout->xtra_hdr_list); + } + g_free(msgout); + } +} + +void destroy_msg_out_list(GList *msgout_list) +{ + GList *msgout_node; + + foreach(msgout_list, msgout_node){ + msg_out *msgout = (msg_out *)(msgout_node->data); + destroy_msg_out(msgout); + } + g_list_free(msgout_list); +}