Added external program hooks.
[mmh] / sbr / folder_addmsg.c
index 16f4cc5..b3bc891 100644 (file)
 
 int
 folder_addmsg (struct msgs **mpp, char *msgfile, int selected,
-               int unseen, int preserve)
+               int unseen, int preserve, int deleting)
 {
     int infd, outfd, linkerr, first_time, msgnum;
     char *nmsg, newmsg[BUFSIZ];
+    char oldmsg[BUFSIZ];
+    struct msgs *op;
     struct msgs *mp;
     struct stat st1, st2;
 
@@ -132,9 +134,23 @@ folder_addmsg (struct msgs **mpp, char *msgfile, int selected,
        snprintf (newmsg, sizeof(newmsg), "%s/%s", mp->foldpath, nmsg);
 
        /*
-        * Now try to link message into folder
+        * Now try to link message into folder.
+        * Then run the external hook on the message if one was specified in the context.
+        * Run the refile hook if we're moving the message from one place to another.
+        * We have to construct the from path name for this because it's not there.
+        * Run the add hook if the message is getting copied or lined somewhere else.
         */
        if (link (msgfile, newmsg) != -1) {
+
+           if (deleting) {
+               op = folder_read(getfolder(1));
+               (void)snprintf(oldmsg, sizeof (oldmsg), "%s/%s", op->foldpath, msgfile);
+               folder_free(op);
+               (void)ext_hook("ref-hook", oldmsg, newmsg);
+           }
+           else
+               (void)ext_hook("add-hook", newmsg, (char *)0);
+
            return msgnum;
        } else {
            linkerr = errno;
@@ -183,6 +199,12 @@ folder_addmsg (struct msgs **mpp, char *msgfile, int selected,
                    cpydata (infd, outfd, msgfile, newmsg);
                    close (infd);
                    close (outfd);
+
+                   if (deleting)
+                       (void)ext_hook("ref-hook", newmsg, msgfile);
+                   else
+                       (void)ext_hook("add-hook", newmsg, (char *)0);
+
                    return msgnum;
                }
            }