diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2002-11-14 07:10:15 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2002-11-14 07:10:15 +0000 |
commit | 892eea7ea1e3d508f406ac0e11f6b926a022ce32 (patch) | |
tree | 6d1265bb9c325d07c038e648779edd1b9a89c9b5 | |
parent | 0a4c2ccb02e18fc6218bdc975173ac52a7bc6c11 (diff) | |
download | mailutils-892eea7ea1e3d508f406ac0e11f6b926a022ce32.tar.gz mailutils-892eea7ea1e3d508f406ac0e11f6b926a022ce32.tar.bz2 |
(mh_scan0): Implemented EVT_MESSAGE_ADD notification.
-rw-r--r-- | mailbox/mbx_mh.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/mailbox/mbx_mh.c b/mailbox/mbx_mh.c index 1b3ae24a7..29a657814 100644 --- a/mailbox/mbx_mh.c +++ b/mailbox/mbx_mh.c @@ -58,7 +58,7 @@ #include <mailutils/property.h> #include <mailutils/stream.h> #include <mailutils/url.h> - +#include <mailutils/observer.h> #include <mailbox0.h> #include <registrar0.h> @@ -67,6 +67,24 @@ #define MH_ENV_SENDER_HEADER "X-Envelope-Sender" #define MH_ENV_DATE_HEADER "X-Envelope-Date" +/* Notifications ADD_MESG. */ +#define DISPATCH_ADD_MSG(mbox,mhd) \ +do \ +{ \ + int bailing = 0; \ + monitor_unlock (mbox->monitor); \ + if (mbox->observable) \ + bailing = observable_notify (mbox->observable, MU_EVT_MESSAGE_ADD); \ + if (bailing != 0) \ + { \ + if (pcount) \ + *pcount = (mhd)->msg_count; \ + locker_unlock (mbox->locker); \ + return EINTR; \ + } \ + monitor_wrlock (mbox->monitor); \ +} while (0); + /* Note: In this particular implementation the message sequence number serves also as its UID. This allows to avoid many problems related to keeping the uids in the headers of the messages. */ @@ -128,7 +146,8 @@ static int mh_save_attributes __P ((mailbox_t)); static int mh_uidvalidity __P ((mailbox_t, unsigned long *)); static int mh_uidnext __P ((mailbox_t, size_t *)); static int mh_scan __P ((mailbox_t, size_t, size_t *)); -static int mh_scan0 __P ((mailbox_t mailbox, size_t msgno, size_t *pcount)); +static int mh_scan0 __P ((mailbox_t mailbox, size_t msgno, size_t *pcount, + int do_notify)); static int mh_is_updated __P ((mailbox_t)); static int mh_get_size __P ((mailbox_t, off_t *)); @@ -441,7 +460,7 @@ mh_get_message (mailbox_t mailbox, size_t msgno, message_t *pmsg) /* If we did not start a scanning yet do it now. */ if (mhd->msg_count == 0) { - status = mh_scan0 (mailbox, 1, NULL); + status = mh_scan0 (mailbox, 1, NULL, 0); if (status != 0) return status; } @@ -609,7 +628,7 @@ mh_append_message (mailbox_t mailbox, message_t msg) /* If we did not start a scanning yet do it now. */ if (mhd->msg_count == 0) { - status = mh_scan0 (mailbox, 1, NULL); + status = mh_scan0 (mailbox, 1, NULL, 0); if (status != 0) return status; } @@ -633,7 +652,7 @@ mh_messages_count (mailbox_t mailbox, size_t *pcount) return EINVAL; if (!mh_is_updated (mailbox)) - return mh_scan0 (mailbox, mhd->msg_count, pcount); + return mh_scan0 (mailbox, mhd->msg_count, pcount, 0); if (pcount) *pcount = mhd->msg_count; @@ -654,7 +673,7 @@ mh_messages_recent (mailbox_t mailbox, size_t *pcount) /* If we did not start a scanning yet do it now. */ if (mhd->msg_count == 0) { - int status = mh_scan0 (mailbox, 1, NULL); + int status = mh_scan0 (mailbox, 1, NULL, 0); if (status != 0) return status; } @@ -679,7 +698,7 @@ mh_message_unseen (mailbox_t mailbox, size_t *pmsgno) /* If we did not start a scanning yet do it now. */ if (mhd->msg_count == 0) { - int status = mh_scan0 (mailbox, 1, NULL); + int status = mh_scan0 (mailbox, 1, NULL, 0); if (status != 0) return status; } @@ -767,7 +786,7 @@ mh_uidvalidity (mailbox_t mailbox, unsigned long *puidvalidity) /* If we did not start a scanning yet do it now. */ if (mhd->msg_count == 0) { - status = mh_scan0 (mailbox, 1, NULL); + status = mh_scan0 (mailbox, 1, NULL, 0); if (status != 0) return status; } @@ -786,7 +805,7 @@ mh_uidnext (mailbox_t mailbox, size_t *puidnext) /* If we did not start a scanning yet do it now. */ if (mhd->msg_count == 0) { - status = mh_scan0 (mailbox, 1, NULL); + status = mh_scan0 (mailbox, 1, NULL, 0); if (status != 0) return status; } @@ -933,7 +952,7 @@ mh_scan_message (struct _mh_message *mhm) /* Scan the mailbox */ static int -mh_scan0 (mailbox_t mailbox, size_t msgno, size_t *pcount) +mh_scan0 (mailbox_t mailbox, size_t msgno, size_t *pcount, int do_notify) { struct _mh_data *mhd = mailbox->data; DIR *dir; @@ -1005,6 +1024,10 @@ mh_scan0 (mailbox_t mailbox, size_t msgno, size_t *pcount) /* This scans the message */ mh_message_stream_open (msg); mh_message_stream_close (msg); + + /* Notify */ + if (do_notify) + DISPATCH_ADD_MSG(mailbox, mhd); } else { @@ -1049,7 +1072,7 @@ mh_scan (mailbox_t mailbox, size_t msgno, size_t *pcount) struct _mh_data *mhd = mailbox->data; if (! mh_is_updated (mailbox)) - return mh_scan0 (mailbox, msgno, pcount); + return mh_scan0 (mailbox, msgno, pcount, 1); if (pcount) *pcount = mhd->msg_count; |