imap-bodystructure.c revision f2a47e52f4f0e180da8a8d93b547af7061a6ee03
/* Copyright (C) 2002 Timo Sirainen */
#include "lib.h"
#include "buffer.h"
#include "istream.h"
#include "str.h"
#include "message-parser.h"
#include "message-content-parser.h"
#include "rfc822-parser.h"
#include "imap-parser.h"
#include "imap-quote.h"
#include "imap-envelope.h"
#include "imap-bodystructure.h"
#define DEFAULT_CHARSET \
"\"charset\" \"us-ascii\""
#define EMPTY_BODYSTRUCTURE \
struct message_part_body_data {
char *content_type, *content_subtype;
char *content_type_params;
char *content_transfer_encoding;
char *content_id;
char *content_description;
char *content_disposition;
char *content_disposition_params;
char *content_md5;
char *content_language;
struct message_part_envelope_data *envelope;
unsigned int charset_found:1;
};
void *context)
{
size_t i;
for (i = 0; i < value_len; i++) {
if (value[i] == '/')
break;
}
if (i == value_len)
else {
i++;
}
}
void *context)
{
}
static void parse_content_transfer_encoding(const unsigned char *value,
{
}
static void parse_content_disposition(const unsigned char *value,
{
}
struct message_part_body_data *data)
{
struct rfc822_parser_context parser;
/* Language-Header = "Content-Language" ":" 1#Language-tag
Language-Tag = Primary-tag *( "-" Subtag )
Primary-tag = 1*8ALPHA
Subtag = 1*8ALPHA */
t_push();
(void)rfc822_skip_lwsp(&parser);
break;
(void)rfc822_skip_lwsp(&parser);
}
}
t_pop();
}
static void parse_content_header(struct message_part_body_data *d,
struct message_header_line *hdr,
{
const unsigned char *value;
return;
name += 8;
return;
}
switch (*name) {
case 'i':
case 'I':
break;
case 'm':
case 'M':
break;
case 't':
case 'T':
if (!d->charset_found &&
/* set a default charset */
}
d->content_type_params =
}
d->content_transfer_encoding == NULL) {
NULL, d);
}
break;
case 'l':
case 'L':
d->content_language == NULL)
break;
case 'd':
case 'D':
d->content_description == NULL) {
d->content_description =
}
d->content_disposition_params == NULL) {
}
break;
}
}
struct message_header_line *hdr)
{
struct message_part_body_data *part_data;
struct message_part_envelope_data *envelope;
int parent_rfc822;
/* If there was no Mime-Version, forget all the Content-stuff */
}
return;
}
return;
return;
/* initialize message part data */
}
t_push();
if (parent_rfc822) {
}
t_pop();
}
{
/* there was no content headers, use an empty structure */
}
else {
/* no parts in multipart message,
that's not allowed. write a single
}
else
if (!extended)
return;
/* BODYSTRUCTURE data */
else {
}
else {
else {
}
}
else {
}
}
{
int text;
/* there was no content headers, use an empty structure */
}
} else {
/* "content type" "subtype" */
else {
if (text)
else
}
}
/* ("content type param key" "value" ...) */
if (!text)
else
} else {
}
if (text) {
/* text/.. contains line count */
struct message_part_body_data *child_data;
struct message_part_envelope_data *env_data;
}
if (!extended)
return;
/* BODYSTRUCTURE data */
/* "md5" ("content disposition" ("disposition" "params"))
("body" "language" "params") */
else {
else {
}
}
else {
}
}
{
else
}
}
{
case IMAP_ARG_NIL:
break;
case IMAP_ARG_ATOM:
break;
case IMAP_ARG_STRING:
break;
case IMAP_ARG_LITERAL: {
break;
}
default:
return FALSE;
}
return TRUE;
}
{
/* don't do any typechecking, just write it out */
return FALSE;
return FALSE;
}
args++;
}
return TRUE;
}
{
struct imap_arg_list *list;
return FALSE;
args++;
}
if (multipart) {
/* next is subtype of Content-Type. rest is skipped. */
}
/* "content type" "subtype" */
return FALSE;
return FALSE;
return FALSE;
args += 2;
/* ("content type param key" "value" ...) | NIL */
return FALSE;
return FALSE;
subargs += 2;
break;
}
} else {
return FALSE;
}
args++;
/* "content id" "content description" "transfer encoding" size */
for (i = 0; i < 4; i++, args++) {
return FALSE;
}
if (text) {
return FALSE;
} else if (message_rfc822) {
return FALSE;
return FALSE;
return FALSE;
}
return TRUE;
}
int imap_body_parse_from_bodystructure(const char *bodystructure,
{
struct imap_parser *parser;
int ret;
(void)i_stream_read(input);
if (!ret)
return ret;
}