/* $Id: mail.cc,v 1.8 2000/01/13 20:11:22 mac Exp $ */ /* * glbiff -- A Mesa/OpenGL-based `xbiff' substitute * Copyright (C) 2000 Maciej Kalisiak * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include #include #include #include #include #include #include #include "defs.h" #include "mail.h" #include "cfg.h" bool is_From_line( char* line ) { if( !strncmp( line, "From", 4 ) ) return true; return false; } bool is_blank_line( char* line ) { while( *line ) { if( *line != ' ' && *line != '\n' && *line != '\t' && *line != '\r' ) return false; line++; } return true; } /* * returns number of messages found in folder */ int count_messages( char* filename ) { struct stat st; if( stat( filename, &st ) ) { fprintf( stderr, "Unable to stat %s\n", filename ); return -1; } FILE* fl = fopen( filename, "r" ); if( !fl ) { fprintf( stderr, "Unable to open %s\n", filename ); return -1; } char line[1024]; int messages = 0; bool looking_for_header = true; bool in_header = false; bool last_line_blank = true; fgets( line, 1024, fl ); while( !feof( fl ) ) { if( looking_for_header && is_From_line( line ) && last_line_blank ) { in_header = true; looking_for_header = false; messages++; } else if( in_header && is_blank_line( line ) ) { in_header = false; looking_for_header = true; } last_line_blank = is_blank_line( line ); fgets( line, 1024, fl ); } fclose(fl); // here just restore the modify and access times to what they were struct utimbuf buf; buf.actime = st.st_atime; buf.modtime = st.st_mtime; utime( filename, &buf ); return messages; } /* * returns the file size of the mailbox */ ulong check_mailbox( char *filename, bool& anymail, bool& unreadmail ) { struct stat st; off_t size; if( stat( filename, &st ) ) { #ifdef DEBUG printf("!!!--Couldn't stat file %s .\n",filename); #endif anymail = false; unreadmail = false; size = 0; } else { size = st.st_size; anymail = (size>0)? true: false; unreadmail = (st.st_mtime > st.st_atime && size>0) ? true: false; #ifdef DEBUG printf( "unreadmail = %c\n", (unreadmail)?'y':'n' ); #endif } return size; } /* * returns total number of messages */ int check_all_mailboxes( bool& anymail, bool& unreadmail, bool& newmail ) { static ulong oldsize = 0; ulong newsize = 0; int messages = 0; bool a, u; anymail= false; unreadmail= false; newmail= false; // FILE* fl = fopen(cfg_file(),"r"); // if( !fl ) { // printf("error opening file %s.\nPlease verify that you have one.", // cfg_file()); // return -1; // } // #ifdef DEBUG // printf("read configuration file %s.\n",cfg_file()); // #endif // char buff[1024]; // fgets( buff, 1024, fl ); // while( !feof( fl ) ) { // if( buff[strlen(buff)-1] == '\n' ) // buff[strlen(buff)-1] = 0; // kill off the trailing '\n' // // allow some different forms of mailbox spec. lines // char* mbox_name=buff+1; // if( *mbox_name==' ' || *mbox_name=='\t' ) // mbox_name++; // #ifdef DEBUG // printf("checking mailbox: %s\n", mbox_name ); // #endif list::iterator it = mboxes.begin(); while( it != mboxes.end() ) { ulong size = check_mailbox( (*it).name, a, u ); anymail = (a)? true: anymail; unreadmail = (u)? true: unreadmail; newsize += size; if( size && (*it).adds_to_mail ) messages += count_messages( (*it).name ); ++it; } if( newsize > oldsize && unreadmail ) newmail = true; oldsize = newsize; #ifdef DEBUG printf( "Messages in mailboxes : %d (new = %c)\n", messages, (unreadmail)?'y':'n' ); #endif return messages; }