Commit 77b342a6 77b342a655ce7a8fa59408cac07d0a5a2f32ef39 by Sergey Poznyakoff

Moved .*_to_message stuff to mh_stream.c

1 parent 5b8f8d5a
......@@ -544,176 +544,6 @@ mh_file_copy (const char *from, const char *to)
return rc;
}
int
_mh_delim (char *str)
{
if (str[0] == '-')
{
for (; *str == '-'; str++)
;
for (; *str == ' ' || *str == '\t'; str++)
;
}
return str[0] == '\n';
}
char *
skipws (char *p, size_t off)
{
int len;
for (p += off; *p && isspace (*p); p++)
;
len = strlen (p);
if (len > 0 && p[len-1] == '\n')
p[len-1] = 0;
return p;
}
struct msg_envelope {
char *from;
char *date;
};
static int
restore_envelope (stream_t str, struct msg_envelope **pmenv)
{
size_t offset = 0;
char *from = NULL;
char *env_from = NULL;
char *env_date = NULL;
int rc;
char buffer[80];
size_t len;
while ((rc = stream_readline (str, buffer, sizeof buffer, offset, &len)) == 0
&& len > 0)
{
if (_mh_delim (buffer))
break;
buffer[len] = 0;
offset += len;
if (strncasecmp (buffer, MU_HEADER_FROM,
sizeof (MU_HEADER_FROM) - 1) == 0)
from = strdup (skipws (buffer, sizeof (MU_HEADER_FROM)));
else if (strncasecmp (buffer, MU_HEADER_ENV_SENDER,
sizeof (MU_HEADER_ENV_SENDER) - 1) == 0)
env_from = strdup (skipws (buffer, sizeof (MU_HEADER_ENV_SENDER)));
else if (strncasecmp (buffer, MU_HEADER_ENV_DATE,
sizeof (MU_HEADER_ENV_DATE) - 1) == 0)
env_date = strdup (skipws (buffer, sizeof (MU_HEADER_ENV_DATE)));
}
if (!env_from)
{
if (from)
{
address_t addr;
address_create (&addr, from);
if (!addr
|| address_aget_email (addr, 1, &env_from))
env_from = strdup ("GNU-MH");
address_destroy (&addr);
}
else
env_from = strdup ("GNU-MH");
}
if (!env_date)
{
struct tm *tm;
time_t t;
char date[80];
time(&t);
tm = gmtime(&t);
strftime (date, sizeof (date), "%a %b %e %H:%M:%S %Y", tm);
env_date = strdup (date);
}
*pmenv = xmalloc (sizeof (**pmenv)
+ strlen (env_from)
+ strlen (env_date)
+ 2);
(*pmenv)->from = (char*) (*pmenv + 1);
(*pmenv)->date = (char*) ((*pmenv)->from + strlen (env_from) + 1);
strcpy ((*pmenv)->from, env_from);
strcpy ((*pmenv)->date, env_date);
free (env_from);
free (env_date);
free (from);
return 0;
}
static int
_env_msg_date (envelope_t envelope, char *buf, size_t len, size_t *pnwrite)
{
message_t msg = envelope_get_owner (envelope);
struct msg_envelope *env = message_get_owner (msg);
if (!env || !env->date)
return EINVAL;
strncpy (buf, env->date, len);
buf[len-1] = 0;
return 0;
}
static int
_env_msg_sender (envelope_t envelope, char *buf, size_t len, size_t *pnwrite)
{
message_t msg = envelope_get_owner (envelope);
struct msg_envelope *env = message_get_owner (msg);
if (!env || !env->from)
return EINVAL;
strncpy (buf, env->from, len);
buf[len-1] = 0;
return 0;
}
message_t
mh_stream_to_message (stream_t instream)
{
struct msg_envelope *mp;
envelope_t env;
message_t msg;
stream_t draftstream;
int rc;
if ((rc = mhdraft_stream_create (&draftstream, instream, 0)))
{
mh_error(_("cannot create draft message stream: %s"),
mu_strerror (rc));
return NULL;
}
if ((rc = stream_open (draftstream)))
{
mh_error(_("cannot open draft message stream: %s"),
mu_strerror (rc));
stream_destroy (&draftstream, stream_get_owner (draftstream));
return NULL;
}
restore_envelope (instream, &mp);
if (message_create (&msg, mp))
return NULL;
message_set_stream (msg, draftstream, mp);
if (envelope_create (&env, msg))
return NULL;
envelope_set_date (env, _env_msg_date, msg);
envelope_set_sender (env, _env_msg_sender, msg);
message_set_envelope (msg, env, mp);
return msg;
}
message_t
mh_file_to_message (char *folder, char *file_name)
{
......