Logo Search packages:      
Sourcecode: mailsync version File versions  Download package

msgstring.c

/* Message string driver for message stringstructs */
/* by Mark Crispin */
/* changes by Tomas Pospisek */

#include <stdio.h>      // required by c-client.h
#include "c-client-header.h"
#include "msgstring.h"

STRINGDRIVER msg_string = {
  msg_string_init,            /* initialize string structure */
  msg_string_next,            /* get next byte in string structure */
  msg_string_setpos           /* set position in string structure */
};

void msg_string_init (STRING *s,void *data,unsigned long size)
{
  MSGDATA *md = (MSGDATA *) data;
  s->data = data;       /* note stream/msgno and header length */
  mail_fetchheader_full (md->stream,md->msgno,NIL,&s->data1,FT_PREFETCHTEXT);
#if 0
  s->size = size;       /* message size */
#else /* This kludge is necessary because of broken IMAP servers (sigh!) */
  mail_fetchtext_full (md->stream,md->msgno,&s->size,FT_PEEK);
                                /* FT_PEEK - we don't want to modify read
                                 * messages in _any_ way */
  s->size += s->data1;        /* header + body size */
#endif
  SETPOS (s,0);
}

char msg_string_next (STRING *s)
{
  char c = *s->curpos++;      /* get next byte */
  SETPOS (s,GETPOS (s));      /* move to next chunk */
  return c;             /* return the byte */
}

void msg_string_setpos (STRING *s,unsigned long i)
{
  MSGDATA *md = (MSGDATA *) s->data;
  if (i < s->data1) {         /* want header? */
    s->chunk = mail_fetchheader (md->stream,md->msgno);
    s->chunksize = s->data1;  /* header length */
    s->offset = 0;            /* offset is start of message */
  }
  else if (i < s->size) {     /* want body */
    s->chunk = mail_fetchtext_full (md->stream,md->msgno,NIL,FT_PEEK);
                                /* FT_PEEK - see above */
    //s->chunk = mail_fetchtext (md->stream,md->msgno);
    s->chunksize = s->size - s->data1;
    s->offset = s->data1;     /* offset is end of header */
  }
  else {                /* off end of message */
    s->chunk = NIL;           /* make sure that we crack on this then */
    s->chunksize = 1;         /* make sure SNX cracks the right way... */
    s->offset = i;
  }
                        /* initial position and size */
  s->curpos = s->chunk + (i -= s->offset);
  s->cursize = s->chunksize - i;
}



Generated by  Doxygen 1.6.0   Back to index