/* Author : Louis-Benoit JOURDAIN (lb@jourdain.org)
 * based on the original work by Scott Holden ( scotth@thezone.net )
 *
 * multi Pop3 Email checker.
 *
 * Last Updated : Feb 7th, 2002
 *
 */


#ifndef POP3CLIENT
#define POP3CLIENT

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/poll.h>

#define	MAIL_BUFLEN	64
#define	CONF_BUFLEN	256

#define	RSET_COLOR	color = 0
#define	SWAP_COLOR	color = 1 - color
#define	CH_COLOR(a)	(color) ? a + 24 : a

#define WMPOP3_VERSION "2.4.2"

#define CHAR_WIDTH 5
#define CHAR_HEIGHT 5
#define	TOP_MARGIN 5
#define	LEFT_MARGIN 4
#define	NUMBERS	93
#define	LETTERS	85
#define SMALL_NUM 77
#define	SN_CHAR_W 3
#define	NB_DISP	8
#define	EXTRA	1
#define	NB_LINE	7
#define SEC_IN_MIN 60
#define YES 1
#define NO 0
#define SELECTONLY 1
#define NOSELECTONLY 0

/* get mail progress bar */
#define	PROGRESSBAR_LEN	48
#define	PROGRESSBAR_HEI	6
#define PROGRESSBAR_HPOS	10
#define	PROGRESSBAR_VPOS	((6*6) + TOP_MARGIN)

#define	ORIG_PB_TX	72
#define	ORIG_PB_TY	65

#define	ORIG_PB_BARX	73
#define	ORIG_PB_BARY	71

#define SCROLL_LX	4	/* left X coordinate */
#define SCROLL_RX	6	/* right X coordinate */
#define SCROLL_TY	4	/* top Y coordinate */
#define SCROLL_BY	45	/* botton Y coordinate */
#define SCROLL_W	3
#define SCROLL_H	38	/* this is without SCROLL_EXT at each end */
#define	SCROLL_EXT	2

#define	TMPPREFIX	"Pop3tmp"
#define TMPPREFIXLEN	7
#define	TXT_MESSAGETOOBIG	"From: %s\n\
Subject: %s\n\n\
\
The size of this email (%d) is above the configured maxdlsize value (%d) and\
 was not downloaded\n"

#define	TXT_ERROR		"From: %s\n\
Subject: %s\n\n\
\
There was an error (%s) while getting this email from the server\n"

#define TXT_SEPARATOR "--------------------------------------------------------------------\n"

typedef struct s_scrollbar
{
  int		top;
  int		bottom;
  int		orig_y;
  int		orig_index_vert;
  int		allowedspace;
}		t_scrollbar;

typedef struct	s_mail
{
  char		from[MAIL_BUFLEN];
  char		subject[MAIL_BUFLEN];
  char		todelete;
  long		cksum;	/* checksum of the header */
  int		new;	/* mail is new */
}		t_mail;

struct pop3_struct{
  struct sockaddr_in	server;
  struct hostent	*hp;
  enum   {CONNECTED, NOT_CONNECTED} connected;
  char			**mailclient;		/* argv[] type of command */
  char			**newmailcommand;	/* argv[] type of command */
  char			**selectedmesgcommand;	/* argv[] type of command */
  char			username[256];
  char			popserver[128];
  char			password[256];
  char			mailseparator[256];
  char			inBuf[4096];
  char			outBuf[1024];
  char			alias[4];
  char			delstatus[9];
  int			s;			/* socket */
  int			serverport;
  int			localPort;
  int			numOfMessages;
  int			numOfUnreadMessages;
  int			countunreadonly;
  int			sizeOfAllMessages;
  int			sizechanged;
  int			mailCheckDelay;
  int			forcedCheck;
  int			status;
  int			maxdlsize;
  long			nextCheckTime;
  t_mail		*mails;
};
typedef struct pop3_struct *Pop3;


Pop3 pop3Create(int nb_conf);
int  pop3MakeConnection( Pop3 pc, char *serverName, int port);
int  pop3IsConnected(Pop3 pc);
int  pop3Login(Pop3 pc, char *name, char *pass);
int  pop3Quit(Pop3 pc);
int  pop3CheckMail(Pop3 pc);
int  pop3GetTotalNumberOfMessages( Pop3 pc );
int  pop3GetNumberOfUnreadMessages( Pop3 pc );
int  pop3WriteOneMail(int nb, int dest_fd, Pop3 pc);
#endif