/* GNU mailutils - a suite of utilities for electronic mail
   Copyright (C) 1999, 2000 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU Library General Public License as published by
   the Free Software Foundation; either version 2, 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 Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */

#ifndef _MAILBOX_H
# define _MAILBOX_H

#include <sys/types.h>

#include <url.h>
#include <message.h>
#include <attribute.h>
#include <auth.h>
#include <locker.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __P
# ifdef __STDC__
#  define __P(args) args
# else
#  define __P(args) ()
# endif
#endif /*__P */

/* forward declaration */
struct _mailbox;
typedef struct _mailbox *mailbox_t;

/* constructor/destructor and possible types */
  extern int  mailbox_init __P ((mailbox_t *, const char *, int id));
extern void mailbox_destroy __P ((mailbox_t *));

/* flags for mailbox_open () */
#define MU_MAILBOX_RDONLY ((int)1)
#define MU_MAILBOX_WRONLY (MU_MAILBOX_RDONLY << 1)
#define MU_MAILBOX_RDWR   (MU_MAILBOX_WRONLY << 1)
#define MU_MAILBOX_APPEND (MU_MAILBOX_RDWR << 1)
#define MU_MAILBOX_CREAT  (MU_MAILBOX_APPEND << 1)
#define MU_MAILBOX_NONBLOCK  (MU_MAILBOX_CREAT << 1)

extern int mailbox_open     __P ((mailbox_t, int flag));
extern int mailbox_close    __P ((mailbox_t));

/* messages */
extern int mailbox_get_message __P ((mailbox_t, size_t msgno, message_t *msg));
extern int mailbox_append_message __P ((mailbox_t, message_t msg));
extern int mailbox_messages_count __P ((mailbox_t, size_t *num));
extern int mailbox_expunge  __P ((mailbox_t));

/* Lock settings */
extern int mailbox_get_locker      __P ((mailbox_t, locker_t *locker));
extern int mailbox_set_locker      __P ((mailbox_t, locker_t locker));

/* Authentication */
extern int mailbox_get_auth      __P ((mailbox_t, auth_t *auth));
extern int mailbox_set_auth      __P ((mailbox_t, auth_t auth));

/* update and scanning*/
extern int mailbox_progress __P ((mailbox_t, int (*progress)
				       __P ((int, void *)), void *arg));
extern int mailbox_is_updated    __P ((mailbox_t));

/* mailbox size ? */
extern int mailbox_size          __P ((mailbox_t, off_t size));

extern int mailbox_get_url       __P ((mailbox_t, url_t *));

/* events */
#define MU_EVT_MBX_DESTROY      1
#define MU_EVT_MBX_CORRUPTED    2
#define MU_EVT_MBX_MSG_ADD      4
#define MU_EVT_MBX_PROGRESS     8

extern int mailbox_register __P ((mailbox_t mbox, size_t type,
				  int (*action) (size_t type, void *arg),
				  void *arg));
extern int mailbox_deregister __P ((mailbox_t mbox, void *action));

#ifdef __cplusplus
}
#endif

#endif /* _MAILBOX_H */