void ms_init (STRING *s,void *data,unsigned long size) { APPENDPACKAGE *md = (APPENDPACKAGE *) data; s->data = data; /* note stream/msgno and header length */ mail_fetch_header (md->stream,md->msgno,NIL,NIL,&s->data1, FT_PREFETCHTEXT|FT_PEEK); #if 0 s->size = size; /* message size */ #else /* This kludge is necessary because of broken IMAP servers (sigh!) */ mail_fetch_text (md->stream,md->msgno,NIL,&s->size,FT_PEEK); s->size += s->data1; /* header + body size */ #endif SETPOS (s,0); }
void ms_setpos (STRING *s,unsigned long i) { APPENDPACKAGE *md = (APPENDPACKAGE *) s->data; if (i < s->data1) { /* want header? */ s->chunk = mail_fetch_header (md->stream,md->msgno,NIL,NIL,NIL,FT_PEEK); s->chunksize = s->data1; /* header length */ s->offset = 0; /* offset is start of message */ } else if (i < s->size) { /* want body */ s->chunk = mail_fetch_text (md->stream,md->msgno,NIL,NIL,FT_PEEK); 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; }
int raw_pipe_getc(unsigned char *c) { static char *free_this = NULL; /* * What is this if doing? * * If((just_starting && unsuccessful_fetch_header) * || (no_chars_available && haven't_fetched_body * && (not_supposed_to_fetch * || (supposed_to_fetch_all && unsuccessful_fetch_text) * || (supposed_to_partial_fetch && unsuccessful_partial_fetch)) * || (no_chars_available)) * return(0); * * otherwise, fall through and return next character */ if((!raw_pipe.cur && !(raw_pipe.cur = mail_fetch_header(raw_pipe.stream, raw_pipe.msgno, NULL, NULL, &raw_pipe.len, raw_pipe.flags))) || ((raw_pipe.len <= 0L) && !raw_pipe.body && (raw_pipe.char_limit == 0L || (raw_pipe.char_limit < 0L && !(raw_pipe.cur = raw_pipe.body = pine_mail_fetch_text(raw_pipe.stream, raw_pipe.msgno, NULL, &raw_pipe.len, raw_pipe.flags))) || (raw_pipe.char_limit > 0L && !(raw_pipe.cur = raw_pipe.body = pine_mail_partial_fetch_wrapper(raw_pipe.stream, raw_pipe.msgno, NULL, &raw_pipe.len, raw_pipe.flags, (unsigned long) raw_pipe.char_limit, &free_this, 1))))) || (raw_pipe.len <= 0L)){ if(free_this) fs_give((void **) &free_this); return(0); } if(raw_pipe.char_limit > 0L && raw_pipe.body && raw_pipe.len > raw_pipe.char_limit) raw_pipe.len = raw_pipe.char_limit; if(raw_pipe.len > 0L){ *c = (unsigned char) *raw_pipe.cur++; raw_pipe.len--; return(1); } else return(0); }