meillo@0: /* MasqMail meillo@0: Copyright (C) 1999-2001 Oliver Kurth meillo@0: meillo@0: This program is free software; you can redistribute it and/or modify meillo@0: it under the terms of the GNU General Public License as published by meillo@0: the Free Software Foundation; either version 2 of the License, or meillo@0: (at your option) any later version. meillo@0: meillo@0: This program is distributed in the hope that it will be useful, meillo@0: but WITHOUT ANY WARRANTY; without even the implied warranty of meillo@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the meillo@0: GNU General Public License for more details. meillo@0: meillo@0: You should have received a copy of the GNU General Public License meillo@0: along with this program; if not, write to the Free Software meillo@0: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. meillo@0: */ meillo@0: meillo@0: #include "masqmail.h" meillo@0: meillo@0: message *create_message() meillo@0: { meillo@0: message *msg = (message *)g_malloc(sizeof(message)); meillo@0: if(msg){ meillo@0: memset(msg, 0, sizeof(message)); meillo@0: msg->data_size = -1; meillo@0: } meillo@0: return msg; meillo@0: } meillo@0: meillo@0: gint msg_calc_size(message *msg, gboolean is_smtp) meillo@0: { meillo@0: GList *node; meillo@0: gint l_cnt = 0, c_cnt = 0; meillo@0: meillo@0: /* header size */ meillo@0: if(msg->hdr_list){ meillo@0: for(node = g_list_first(msg->hdr_list); node; node = g_list_next(node)){ meillo@0: if(node->data){ meillo@0: header *hdr = (header *)(node->data); meillo@0: if(hdr->header){ meillo@0: char *p = hdr->header; meillo@0: while(*p){ meillo@0: if(*p++ == '\n') l_cnt++; meillo@0: c_cnt++; meillo@0: } meillo@0: } meillo@0: } meillo@0: } meillo@0: } meillo@0: meillo@0: /* empty line separating headers from data: */ meillo@0: c_cnt++; meillo@0: l_cnt++; meillo@0: meillo@0: /* data size */ meillo@0: if(msg->data_list){ meillo@0: for(node = g_list_first(msg->data_list); node; node = g_list_next(node)){ meillo@0: if(node->data){ meillo@0: char *p = node->data; meillo@0: while(*p){ meillo@0: if(*p++ == '\n') l_cnt++; meillo@0: c_cnt++; meillo@0: } meillo@0: } meillo@0: } meillo@0: } meillo@0: meillo@0: return is_smtp ? c_cnt + l_cnt : c_cnt; meillo@0: } meillo@0: meillo@0: void msg_free_data(message *msg) meillo@0: { meillo@0: GList *node; meillo@0: meillo@0: if(msg->data_list){ meillo@0: for(node = g_list_first(msg->data_list); node; node = g_list_next(node)){ meillo@0: if(node->data) meillo@0: g_free(node->data); meillo@0: } meillo@0: g_list_free(msg->data_list); meillo@0: msg->data_list = NULL; meillo@0: } meillo@0: } meillo@0: meillo@0: void destroy_message(message *msg) meillo@0: { meillo@0: GList *node; meillo@0: meillo@0: if(msg->uid) g_free(msg->uid); meillo@0: if(msg->ident) g_free(msg->ident); meillo@0: if(msg->return_path) g_free(msg->return_path); meillo@0: meillo@0: if(msg->rcpt_list){ meillo@0: for(node = g_list_first(msg->rcpt_list); node; node = g_list_next(node)){ meillo@0: if(node->data) meillo@0: g_free(node->data); meillo@0: } meillo@0: g_list_free(msg->rcpt_list); meillo@0: } meillo@0: if(msg->hdr_list){ meillo@0: for(node = g_list_first(msg->hdr_list); node; node = g_list_next(node)){ meillo@0: if(node->data){ meillo@0: header *hdr = (header *)(node->data); meillo@0: if(hdr->header) meillo@0: g_free(hdr->header); meillo@0: g_free(node->data); meillo@0: } meillo@0: } meillo@0: g_list_free(msg->hdr_list); meillo@0: } meillo@0: meillo@0: if(msg->full_sender_name) meillo@0: g_free(msg->full_sender_name); meillo@0: meillo@0: msg_free_data(msg); meillo@0: meillo@0: g_free(msg); meillo@0: } meillo@0: meillo@0: void destroy_msg_list(GList *msg_list) meillo@0: { meillo@0: GList *msg_node; meillo@0: meillo@0: foreach(msg_list, msg_node){ meillo@0: message *msg = (message *)(msg_node->data); meillo@0: destroy_message(msg); meillo@0: } meillo@0: g_list_free(msg_list); meillo@0: } meillo@0: meillo@0: msg_out *create_msg_out(message *msg) meillo@0: { meillo@0: msg_out *msgout = NULL; meillo@0: meillo@0: msgout = g_malloc(sizeof(msg_out)); meillo@0: if(msgout){ meillo@0: msgout->msg = msg; meillo@0: msgout->return_path = NULL; meillo@0: msgout->rcpt_list = NULL; meillo@0: meillo@0: msgout->hdr_list = NULL; meillo@0: msgout->xtra_hdr_list = NULL; meillo@0: } meillo@0: return msgout; meillo@0: } meillo@0: meillo@0: msg_out *clone_msg_out(msg_out *msgout_orig) meillo@0: { meillo@0: if(msgout_orig){ meillo@0: msg_out *msgout = create_msg_out(msgout_orig->msg); meillo@0: if(msgout){ meillo@0: msgout->msg = msgout_orig->msg; meillo@0: if(msgout_orig->return_path) meillo@0: msgout->return_path = copy_address(msgout_orig->return_path); meillo@0: if(msgout_orig->hdr_list) meillo@0: msgout->hdr_list = g_list_copy(msgout_orig->hdr_list); meillo@0: /* FIXME: if this lives longer than the original meillo@0: and we access one of the xtra hdrs, we will segfault meillo@0: or cause some weird bugs: */ meillo@0: msgout->xtra_hdr_list = NULL; meillo@0: if(msgout_orig->rcpt_list) meillo@0: msgout->rcpt_list = g_list_copy(msgout_orig->rcpt_list); meillo@0: } meillo@0: return msgout; meillo@0: } meillo@0: return NULL; meillo@0: } meillo@0: meillo@0: GList *create_msg_out_list(GList *msg_list) meillo@0: { meillo@0: GList *msgout_list = NULL; meillo@0: GList *msg_node; meillo@0: meillo@0: foreach(msg_list, msg_node){ meillo@0: message *msg = (message *)(msg_node->data); meillo@0: msgout_list = g_list_append(msgout_list, create_msg_out(msg)); meillo@0: } meillo@0: return msgout_list; meillo@0: } meillo@0: meillo@0: void destroy_msg_out(msg_out *msgout) meillo@0: { meillo@0: if(msgout){ meillo@0: if(msgout->return_path) meillo@0: destroy_address(msgout->return_path); meillo@0: if(msgout->hdr_list) meillo@0: g_list_free(msgout->hdr_list); meillo@0: if(msgout->xtra_hdr_list){ meillo@0: GList *hdr_node; meillo@0: foreach(msgout->xtra_hdr_list, hdr_node){ meillo@0: header *hdr = (header *)(hdr_node->data); meillo@0: destroy_header(hdr); meillo@0: } meillo@0: g_list_free(msgout->xtra_hdr_list); meillo@0: } meillo@0: g_free(msgout); meillo@0: } meillo@0: } meillo@0: meillo@0: void destroy_msg_out_list(GList *msgout_list) meillo@0: { meillo@0: GList *msgout_node; meillo@0: meillo@0: foreach(msgout_list, msgout_node){ meillo@0: msg_out *msgout = (msg_out *)(msgout_node->data); meillo@0: destroy_msg_out(msgout); meillo@0: } meillo@0: g_list_free(msgout_list); meillo@0: }