You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

684 lines
15 KiB

/*
* $Id: mail.c,v 1.25 2006/10/12 14:21:22 desrod Exp $
*
* mail.c: Translate Pilot mail data formats
*
* Copyright (c) 1997, Kenneth Albanowski
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This library 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 Library
* General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#include "pi-macros.h"
#include "pi-mail.h"
char *MailSortTypeNames[] = { "Date", "Type", NULL };
char *MailSyncTypeNames[] = { "All", "Send", "Filter", NULL };
/***********************************************************************
*
* Function: free_Mail
*
* Summary: frees all the Mail_t structure members
*
* Parameters: Mail_t*
*
* Returns: void
*
***********************************************************************/
void
free_Mail(Mail_t *mail)
{
if (mail->from != NULL) {
free(mail->from);
mail->from = NULL;
}
if (mail->to != NULL) {
free(mail->to);
mail->to = NULL;
}
if (mail->subject != NULL) {
free(mail->subject);
mail->to = NULL;
}
if (mail->cc != NULL) {
free(mail->cc);
mail->cc = NULL;
}
if (mail->bcc != NULL) {
free(mail->bcc);
mail->bcc = NULL;
}
if (mail->replyTo) {
free(mail->replyTo);
mail->replyTo = NULL;
}
if (mail->sentTo) {
free(mail->sentTo);
mail->sentTo = NULL;
}
if (mail->body != NULL) {
free(mail->body);
mail->body = NULL;
}
}
/***********************************************************************
*
* Function: free_MailAppInfo
*
* Summary: frees all MailAppInfo_t structure members
*
* Parameters: MailAppInfo_t*
*
* Returns: void
*
***********************************************************************/
void
free_MailAppInfo(MailAppInfo_t *appinfo)
{
/* if (appinfo->signature)
free(appinfo->signature); */
}
/***********************************************************************
*
* Function: free_MailSyncPref
*
* Summary: frees all MailSyncPref_t structure members
*
* Parameters: MailSyncPref_t*
*
* Returns: void
*
***********************************************************************/
void
free_MailSyncPref(MailSyncPref_t *pref)
{
if (pref->filterTo != NULL) {
free(pref->filterTo);
pref->filterTo = NULL;
}
if (pref->filterFrom != NULL) {
free(pref->filterFrom);
pref->filterFrom = NULL;
}
if (pref->filterSubject != NULL) {
free(pref->filterSubject);
pref->filterSubject = NULL;
}
}
/***********************************************************************
*
* Function: free_MailSignaturePref
*
* Summary: frees all MailSignaturePref_t structure members
*
* Parameters: MailSignaturePref_t*
*
* Returns: void
*
***********************************************************************/
void
free_MailSignaturePref(MailSignaturePref_t *pref)
{
if (pref->signature != NULL) {
free(pref->signature);
pref->signature = NULL;
}
}
/***********************************************************************
*
* Function: unpack_Mail
*
* Summary: unpacks Mail
*
* Parameters: Mail_t*, char* to buffer, buffer length
*
* Returns: effective buffer length
*
***********************************************************************/
int
unpack_Mail(Mail_t *mail, unsigned char *buffer, size_t len)
{
int flags;
unsigned long d;
unsigned char *start = buffer;
if (len < 6)
return 0;
d = (unsigned short int) get_short(buffer);
mail->date.tm_year = (d >> 9) + 4;
mail->date.tm_mon = ((d >> 5) & 15) - 1;
mail->date.tm_mday = d & 31;
mail->date.tm_hour = get_byte(buffer + 2);
mail->date.tm_min = get_byte(buffer + 3);
mail->date.tm_sec = 0;
mail->date.tm_isdst = -1;
mktime(&mail->date);
if (d)
mail->dated = 1;
else
mail->dated = 0;
flags = get_byte(buffer + 4);
mail->read = (flags & (1 << 7)) ? 1 : 0;
mail->signature = (flags & (1 << 6)) ? 1 : 0;
mail->confirmRead = (flags & (1 << 5)) ? 1 : 0;
mail->confirmDelivery = (flags & (1 << 4)) ? 1 : 0;
mail->priority = (flags & (3 << 2)) >> 2;
mail->addressing = (flags & 3);
buffer += 6;
len -= 6;
if (len < 1)
return 0;
if (get_byte(buffer)) {
mail->subject = strdup((char *)buffer);
buffer += strlen((char *)buffer);
len -= strlen((char *)buffer);
} else
mail->subject = 0;
buffer++;
len--;
if (len < 1)
return 0;
if (get_byte(buffer)) {
mail->from = strdup((char *)buffer);
buffer += strlen((char *)buffer);
len -= strlen((char *)buffer);
} else
mail->from = 0;
buffer++;
len--;
if (len < 1)
return 0;
if (get_byte(buffer)) {
mail->to = strdup((char *)buffer);
buffer += strlen((char *)buffer);
len -= strlen((char *)buffer);
} else
mail->to = 0;
buffer++;
len--;
if (len < 1)
return 0;
if (get_byte(buffer)) {
mail->cc = strdup((char *)buffer);
buffer += strlen((char *)buffer);
len -= strlen((char *)buffer);
} else
mail->cc = 0;
buffer++;
len--;
if (len < 1)
return 0;
if (get_byte(buffer)) {
mail->bcc = strdup((char *)buffer);
buffer += strlen((char *)buffer);
len -= strlen((char *)buffer);
} else
mail->bcc = 0;
buffer++;
len--;
if (len < 1)
return 0;
if (get_byte(buffer)) {
mail->replyTo = strdup((char *)buffer);
buffer += strlen((char *)buffer);
len -= strlen((char *)buffer);
} else
mail->replyTo = 0;
buffer++;
len--;
if (len < 1)
return 0;
if (get_byte(buffer)) {
mail->sentTo = strdup((char *)buffer);
buffer += strlen((char *)buffer);
len -= strlen((char *)buffer);
} else
mail->sentTo = 0;
buffer++;
len--;
if (len < 1)
return 0;
if (get_byte(buffer)) {
mail->body = strdup((char *)buffer);
buffer += strlen((char *)buffer);
len -= strlen((char *)buffer);
} else
mail->body = 0;
buffer++;
len--;
return (buffer - start);
}
/***********************************************************************
*
* Function: pack_Mail
*
* Summary: packs Mail
*
* Parameters: Mail_t*, char* to buffer, buffer length
*
* Returns: effective buffer length
*
***********************************************************************/
int
pack_Mail(struct Mail *mail, unsigned char *buffer, size_t len)
{
size_t destlen = 6 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
unsigned char *start = buffer;
if (mail->subject)
destlen += strlen(mail->subject);
if (mail->from)
destlen += strlen(mail->from);
if (mail->to)
destlen += strlen(mail->to);
if (mail->cc)
destlen += strlen(mail->cc);
if (mail->bcc)
destlen += strlen(mail->bcc);
if (mail->replyTo)
destlen += strlen(mail->replyTo);
if (mail->sentTo)
destlen += strlen(mail->sentTo);
if (mail->body)
destlen += strlen(mail->body);
if (!buffer)
return destlen;
if (len < destlen)
return 0;
set_short(buffer,
((mail->date.tm_year - 4) << 9) | ((mail->date.tm_mon +
1) << 5) | mail->date.
tm_mday);
set_byte(buffer + 2, mail->date.tm_hour);
set_byte(buffer + 3, mail->date.tm_min);
if (!mail->dated)
set_long(buffer, 0);
set_byte(buffer + 4, (mail->read ? (1 << 7) : 0) |
(mail->signature ? (1 << 6) : 0) | (mail->
confirmRead ? (1 << 5) :
0) | (mail->
confirmDelivery
? (1 << 4) : 0) |
((mail->priority & 3) << 2) | (mail->addressing & 3));
set_byte(buffer + 5, 0);
buffer += 6;
if (mail->subject) {
strcpy((char *)buffer, mail->subject);
buffer += strlen((char *)buffer);
} else
set_byte(buffer, 0);
buffer++;
if (mail->from) {
strcpy((char *)buffer, mail->from);
buffer += strlen((char *)buffer);
} else
set_byte(buffer, 0);
buffer++;
if (mail->to) {
strcpy((char *)buffer, mail->to);
buffer += strlen((char *)buffer);
} else
set_byte(buffer, 0);
buffer++;
if (mail->cc) {
strcpy((char *)buffer, mail->cc);
buffer += strlen((char *)buffer);
} else
set_byte(buffer, 0);
buffer++;
if (mail->bcc) {
strcpy((char *)buffer, mail->bcc);
buffer += strlen((char *)buffer);
} else
set_byte(buffer, 0);
buffer++;
if (mail->replyTo) {
strcpy((char *)buffer, mail->replyTo);
buffer += strlen((char *)buffer);
} else
set_byte(buffer, 0);
buffer++;
if (mail->sentTo) {
strcpy((char *)buffer, mail->sentTo);
buffer += strlen((char *)buffer);
} else
set_byte(buffer, 0);
buffer++;
if (mail->body) {
strcpy((char *)buffer, mail->body);
buffer += strlen((char *)buffer);
} else
set_byte(buffer, 0);
buffer++;
return (buffer - start);
}
/***********************************************************************
*
* Function: unpack_MailAppInfo
*
* Summary: unpacks MailAppInfo
*
* Parameters: MailAppInfo_t*, char* to buffer, buffer length
*
* Returns: effective buffer length
*
***********************************************************************/
int
unpack_MailAppInfo(MailAppInfo_t *appinfo, unsigned char *record, size_t len)
{
int i;
unsigned char *start = record;
i = unpack_CategoryAppInfo(&appinfo->category, record, len);
if (!i)
return i;
record += i;
len -= i;
if (len < 11)
return 0;
appinfo->dirty = get_short(record);
record += 2;
appinfo->sortOrder = get_byte(record);
record += 2;
appinfo->unsentMessage = get_long(record);
record += 4;
/* ai->signature = 0; */
/* strdup(start + get_short(record)); */
record += 3;
return (record - start);
}
/***********************************************************************
*
* Function: pack_MailAppInfo
*
* Summary: packs MailAppInfo
*
* Parameters: MailAppInfo_t*, char* to buffer, buffer length
*
* Returns: effective buffer length
*
***********************************************************************/
int
pack_MailAppInfo(struct MailAppInfo *appinfo, unsigned char *record, size_t len)
{
int i;
unsigned char *start = record;
i = pack_CategoryAppInfo(&appinfo->category, record, len);
if (!record)
return i + 11;
if (!i)
return i;
record += i;
len -= i;
if (len < 8)
return 0;
set_short(record, appinfo->dirty);
record += 2;
set_short(record, 0); /* gapfill */
set_byte(record, appinfo->sortOrder);
record += 2;
set_long(record, appinfo->unsentMessage);
record += 4;
set_short(record, (record - start + 2));
record += 2;
/* if (appinfo->signature)
strcpy(record, appinfo->signature);
else
set_byte(record, 0);
record += strlen(record); */
set_byte(record, 0);
record++;
return (record - start);
}
/***********************************************************************
*
* Function: unpack_MailSyncPref
*
* Summary: unpacks Mail
*
* Parameters: MailSyncPref_t*, char* to buffer, buffer length
*
* Returns: effective buffer length
*
***********************************************************************/
int
unpack_MailSyncPref(MailSyncPref_t *pref, unsigned char *record, size_t len)
{
unsigned char *start = record;
pref->syncType = get_byte(record);
record += 1;
pref->getHigh = get_byte(record);
record += 1;
pref->getContaining = get_byte(record);
record += 2;
pref->truncate = get_short(record);
record += 2;
if (get_byte(record)) {
pref->filterTo = strdup((char *)record);
record += strlen((char *)record);
} else
pref->filterTo = 0;
record++;
if (get_byte(record)) {
pref->filterFrom = strdup((char *)record);
record += strlen((char *)record);
} else
pref->filterFrom = 0;
record++;
if (get_byte(record)) {
pref->filterSubject = strdup((char *)record);
record += strlen((char *)record);
} else
pref->filterSubject = 0;
record++;
return (record - start);
}
/***********************************************************************
*
* Function: pack_MailSyncPref
*
* Summary: packs Mail
*
* Parameters: MailSyncPref_t*, char* to buffer, buffer length
*
* Returns: effective buffer length
*
***********************************************************************/
int
pack_MailSyncPref(MailSyncPref_t *pref, unsigned char *record, size_t len)
{
size_t destlen = 6 + 1 + 1 + 1;
unsigned char *start = record;
if (pref->filterTo)
destlen += strlen(pref->filterTo);
if (pref->filterSubject)
destlen += strlen(pref->filterSubject);
if (pref->filterFrom)
destlen += strlen(pref->filterFrom);
if (!record)
return destlen;
if (len < destlen)
return 0;
set_byte(record, pref->syncType);
record++;
set_byte(record, pref->getHigh);
record++;
set_byte(record, pref->getContaining);
record++;
set_byte(record, 0);
record++; /* gapfill */
set_short(record, pref->truncate);
record += 2;
if (pref->filterTo) {
strcpy((char *)record, pref->filterTo);
record += strlen(pref->filterTo);
}
*record++ = 0;
if (pref->filterFrom) {
strcpy((char *)record, pref->filterFrom);
record += strlen(pref->filterFrom);
}
*record++ = 0;
if (pref->filterSubject) {
strcpy((char *)record, pref->filterSubject);
record += strlen(pref->filterSubject);
}
*record++ = 0;
return (record - start);
}
/***********************************************************************
*
* Function: unpack_MailSignaturePref
*
* Summary: unpacks MailSignaturePref
*
* Parameters: MailSignaturePref_t*, char* to buffer, buffer length
*
* Returns: effective buffer length
*
***********************************************************************/
int
unpack_MailSignaturePref(MailSignaturePref_t *pref,
unsigned char *record, size_t len)
{
unsigned char *start = record;
if (len < 1)
return 0;
pref->signature = strdup((char *)record);
record += strlen(pref->signature) + 1;
return (record - start);
}
/***********************************************************************
*
* Function: pack_MailSignaturePref
*
* Summary: packs MailSignaturePref
*
* Parameters: MailSignaturePref_t*, char* to buffer, buffer length
*
* Returns: effective buffer length
*
***********************************************************************/
int
pack_MailSignaturePref(struct MailSignaturePref *pref, unsigned char *record,
size_t len)
{
size_t destlen = 1;
unsigned char *start = record;
if (pref->signature)
destlen += strlen(pref->signature);
if (!record)
return destlen;
if (len < destlen)
return 0;
if (pref->signature) {
strcpy((char *)record, pref->signature);
record += strlen(pref->signature);
}
*record = 0;
record++;
return (record - start);
}
/* vi: set ts=8 sw=4 sts=4 noexpandtab: cin */
/* ex: set tabstop=4 expandtab: */
/* Local Variables: */
/* indent-tabs-mode: t */
/* c-basic-offset: 8 */
/* End: */