Pass write for closed mails
authorAndre Heinecke <aheinecke@intevation.de>
Fri, 9 Nov 2018 14:44:21 +0000 (15:44 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Fri, 9 Nov 2018 14:44:21 +0000 (15:44 +0100)
* src/folder-events.cpp (Invoke): Set is now implicit in close.
* src/mail.cpp: Change isAboutToBeMoved to passWrite.
(decryptVerify_o): Stop passing write when processing.
* src/mailitem-events.cpp (Write): Pass it when a mail was closed
by us.

--
After closing with discard changes it should be ok to write
as long as we are not decrypted again. This can be helpful
after an external close was triggered and is basically
the same as what we do for a move.

GnuPG-Bug-Id: T4241

src/folder-events.cpp
src/mail.cpp
src/mail.h
src/mailitem-events.cpp

index d9e7c13..a970afa 100644 (file)
@@ -115,7 +115,6 @@ EVENT_SINK_INVOKE(FolderEvents)
               log_debug ("%s:%s: Detected move of crypto mail. %p Closing",
                           SRCNAME, __func__, mail);
 
-              mail->setIsAboutToBeMoved (true);
               if (Mail::close (mail))
                 {
                   log_error ("%s:%s: Failed to close.",
index eafa3ef..a75225f 100644 (file)
@@ -106,7 +106,7 @@ Mail::Mail (LPDISPATCH mailitem) :
     m_manual_crypto_opts(false),
     m_first_autosecure_check(true),
     m_locate_count(0),
-    m_is_about_to_be_moved(false),
+    m_pass_write(false),
     m_locate_in_progress(false),
     m_is_junk(false)
 {
@@ -1096,6 +1096,7 @@ Mail::decryptVerify_o ()
 
   setUUID_o ();
   m_processed = true;
+  m_pass_write = false;
 
   /* Insert placeholder */
   char *placeholder_buf = nullptr;
@@ -2045,6 +2046,12 @@ Mail::close (Mail *mail)
   int rc = invoke_oom_method_with_parms (mail->item(), "Close",
                                        NULL, &dispparams);
 
+  if (!rc)
+    {
+      log_debug ("%s:%s: Close successful. Next write may pass.",
+                 SRCNAME, __func__);
+      mail->setPassWrite (true);
+    }
   log_oom ("%s:%s: returned from close",
                  SRCNAME, __func__);
   TRETURN rc;
index 170770c..9a10cbf 100644 (file)
@@ -590,8 +590,8 @@ public:
   void installFolderEventHandler_o ();
 
   /* Marker for a "Move" of this mail */
-  bool isAboutToBeMoved () { return m_is_about_to_be_moved; }
-  void setIsAboutToBeMoved (bool value) { m_is_about_to_be_moved = value; }
+  bool passWrite () { return m_pass_write; }
+  void setPassWrite(bool value) { m_pass_write = value; }
 
   /* Releases the current item ref obtained in update oom data */
   void releaseCurrentItem ();
@@ -650,7 +650,7 @@ private:
   bool m_manual_crypto_opts; /* Crypto options (sign/encrypt) have been set manually. */
   bool m_first_autosecure_check; /* This is the first autoresolve check */
   int m_locate_count; /* The number of key locates pending for this mail. */
-  bool m_is_about_to_be_moved;
+  bool m_pass_write; /* Danger the next write will be passed. This is for closed mails */
   bool m_locate_in_progress; /* Simplified state variable for locate */
   std::string m_store_id; /* Store id for categories */
   std::string m_verify_category; /* The category string for the verify result */
index 84bd887..485d6f6 100644 (file)
@@ -576,9 +576,9 @@ EVENT_SINK_INVOKE(MailItemEvents)
              TBREAK;
            }
 
-          if (m_mail->isAboutToBeMoved())
+          if (m_mail->passWrite())
             {
-              log_debug ("%s:%s: Mail is about to be moved. Passing write for %p",
+              log_debug ("%s:%s: Passing write because passNextWrite was set for %p",
                          SRCNAME, __func__, m_mail);
               TBREAK;
             }