SF.net SVN: mahogany: [7245] trunk/M

[email protected]
Newsgroups gmane.mail.mahogany.cvs
Message-ID <[email protected]>
Revision: 7245
          http://svn.sourceforge.net/mahogany/?rev=7245&view=rev
Author:   vadz
Date:     2007-04-26 09:06:11 -0700 (Thu, 26 Apr 2007)

Log Message:
-----------
add the possibility to treat different addresses as equivalent

Modified Paths:
--------------
    trunk/M/CHANGES
    trunk/M/doc/Manual.htex
    trunk/M/include/Address.h
    trunk/M/include/Moptions.h
    trunk/M/src/classes/Moptions.cpp
    trunk/M/src/gui/wxOptionsDlg.cpp
    trunk/M/src/mail/Address.cpp

Modified: trunk/M/CHANGES
===================================================================
--- trunk/M/CHANGES	2007-04-26 15:57:21 UTC (rev 7244)
+++ trunk/M/CHANGES	2007-04-26 16:06:11 UTC (rev 7245)
@@ -9,6 +9,7 @@
 Release 0.68 '' September xx, 2006
 ---------------------------------------
 
+2007-04-26 VZ: Add the possibility to treat different addresses as equivalent
 2007-01-10 VZ: Show the message subject in the composer window title bar
 2007-01-08 VZ: Added support for "subject" parameter of mailto: URLs
 2006-12-25 VZ: Added "Remove attachments" command

Modified: trunk/M/doc/Manual.htex
===================================================================
--- trunk/M/doc/Manual.htex	2007-04-26 15:57:21 UTC (rev 7244)
+++ trunk/M/doc/Manual.htex	2007-04-26 16:06:11 UTC (rev 7245)
@@ -71,6 +71,9 @@
    \item A much faster DSPAM storage driver is used now.
    \item Added ``Remove attachments'' command which can be used to strip the
          unwanted attachments from a message in a local or IMAP folder.
+   \item Added the possibility to treat different addresses as equivalent,
+         this is useful to avoid sending duplicate replies to the different
+         addresses of the same person, for example.
 \end{itemize}
 
 \subsubsection{0.67 against 0.66}
@@ -2524,6 +2527,13 @@
 the '@' symbol) will be used instead of the name.
 \item \textbf{Whitelist}\\
 Spam filter option "No match in whitelist" uses this address book.
+\item \textbf{Equivalent addresses}\\
+Adding a string of the form \texttt{[email protected][email protected]} here will make
+Mahogany treat these two addresses as equivalent. This for example means that
+only one of them will be left in the outgoing message so that if you have the
+first address set as the default one for the folder which the messages from
+John Doe are filtered to and you reply to the message sent from the second
+address, the two addresses won't be duplicated in the composer window.
 \end{itemize}
 
 In addition to its own built-in addressbook format, Mahogany also

Modified: trunk/M/include/Address.h
===================================================================
--- trunk/M/include/Address.h	2007-04-26 15:57:21 UTC (rev 7244)
+++ trunk/M/include/Address.h	2007-04-26 16:06:11 UTC (rev 7245)
@@ -72,6 +72,11 @@
 
    /**
       Compares two address strings, returns true if they're equal.
+
+      This method takes into account the address equivalence as defined in the
+      program options. Both address1 and address2 should contain a single
+      address only, comparing multiple addresses is not supported and will
+      return false.
     */
    static bool Compare(const String& address1, const String& address2);
 

Modified: trunk/M/include/Moptions.h
===================================================================
--- trunk/M/include/Moptions.h	2007-04-26 15:57:21 UTC (rev 7244)
+++ trunk/M/include/Moptions.h	2007-04-26 16:06:11 UTC (rev 7245)
@@ -207,6 +207,7 @@
 extern const MOption MP_COMPOSE_SHOW_FROM;
 extern const MOption MP_DEFAULT_REPLY_KIND;
 extern const MOption MP_LIST_ADDRESSES;
+extern const MOption MP_EQUIV_ADDRESSES;
 extern const MOption MP_REPLY_PREFIX;
 extern const MOption MP_FORWARD_PREFIX;
 extern const MOption MP_REPLY_COLLAPSE_PREFIX;
@@ -820,6 +821,8 @@
 #define   MP_DEFAULT_REPLY_KIND_NAME _T("ReplyDefault")
 /// the mailing list addresses
 #define   MP_LIST_ADDRESSES_NAME _T("MLAddresses")
+/// array of equivalent address pairs
+#define   MP_EQUIV_ADDRESSES_NAME _T("EquivAddresses")
 /// prefix for subject in replies
 #define   MP_REPLY_PREFIX_NAME         _T("ReplyPrefix")
 /// prefix for subject in forwards
@@ -1670,6 +1673,8 @@
 #define   MP_DEFAULT_REPLY_KIND_DEFVAL 0l  // MailFolder::REPLY_SENDER
 /// the mailing list addresses
 #define   MP_LIST_ADDRESSES_DEFVAL wxEmptyString
+/// array of equivalent address pairs
+#define   MP_EQUIV_ADDRESSES_DEFVAL wxEmptyString
 /// prefix for subject in replies
 #define   MP_REPLY_PREFIX_DEFVAL      _T("Re: ")
 /// prefix for subject in forwards

Modified: trunk/M/src/classes/Moptions.cpp
===================================================================
--- trunk/M/src/classes/Moptions.cpp	2007-04-26 15:57:21 UTC (rev 7244)
+++ trunk/M/src/classes/Moptions.cpp	2007-04-26 16:06:11 UTC (rev 7245)
@@ -267,6 +267,7 @@
 const MOption MP_COMPOSE_BCC;
 const MOption MP_COMPOSE_SHOW_FROM;
 const MOption MP_LIST_ADDRESSES;
+const MOption MP_EQUIV_ADDRESSES;
 const MOption MP_DEFAULT_REPLY_KIND;
 const MOption MP_REPLY_PREFIX;
 const MOption MP_FORWARD_PREFIX;
@@ -683,6 +684,7 @@
     DEFINE_OPTION(MP_COMPOSE_BCC),
     DEFINE_OPTION(MP_COMPOSE_SHOW_FROM),
     DEFINE_OPTION(MP_LIST_ADDRESSES),
+    DEFINE_OPTION(MP_EQUIV_ADDRESSES),
     DEFINE_OPTION(MP_DEFAULT_REPLY_KIND),
     DEFINE_OPTION(MP_REPLY_PREFIX),
     DEFINE_OPTION(MP_FORWARD_PREFIX),

Modified: trunk/M/src/gui/wxOptionsDlg.cpp
===================================================================
--- trunk/M/src/gui/wxOptionsDlg.cpp	2007-04-26 15:57:21 UTC (rev 7244)
+++ trunk/M/src/gui/wxOptionsDlg.cpp	2007-04-26 16:06:11 UTC (rev 7245)
@@ -488,6 +488,8 @@
    ConfigField_AutoCollectNameless,
    ConfigField_WhiteListHelp,
    ConfigField_WhiteList,
+   ConfigField_EquivAddressesHelp,
+   ConfigField_EquivAddresses,
 #ifdef USE_BBDB
    ConfigField_Bbdb_HelpText,
    ConfigField_Bbdb_IgnoreAnonymous,
@@ -496,7 +498,7 @@
    ConfigField_Bbdb_SaveOnExit,
    ConfigField_AdbLast = ConfigField_Bbdb_SaveOnExit,
 #else // !USE_BBDB
-   ConfigField_AdbLast = ConfigField_WhiteList,
+   ConfigField_AdbLast = ConfigField_EquivAddresses,
 #endif // USE_BBDB/!USE_BBDB
 
    // helper programs
@@ -1669,6 +1671,15 @@
                   "through the built-in spam filter."),
                                                     Field_Message, -1 },
    { gettext_noop("Addresses in &white list"),      Field_List, -1 },
+
+   { gettext_noop("\nYou can add strings of the form \"<address1>=<address2>\" "
+                  "here to indicate that\n"
+                  "Mahogany should treat these addresses as being equivalent.\n"
+                  "For example, you can make a work address equivalent to the "
+                  "home one to\n"
+                  "avoid sending replies to both addresses at once."),           Field_Message | Field_AppWide, -1 },
+   { gettext_noop("E&quivalent addresses"),        Field_List | Field_AppWide, -1 },
+
 #ifdef USE_BBDB
    { gettext_noop("The following settings configure the support of the Big Brother\n"
                   "addressbook (BBDB) format. This is supported only for compatibility\n"
@@ -2186,6 +2197,8 @@
    CONFIG_ENTRY(MP_AUTOCOLLECT_NAMED),
    CONFIG_NONE(),
    CONFIG_ENTRY(MP_WHITE_LIST),
+   CONFIG_NONE(),
+   CONFIG_ENTRY(MP_EQUIV_ADDRESSES),
 #ifdef USE_BBDB
    CONFIG_NONE(),
    CONFIG_ENTRY(MP_BBDB_IGNOREANONYMOUS),
@@ -4049,7 +4062,14 @@
    lboxDataWhiteList->m_lboxDlgPers = _T("LastWhiteList");
    lboxDataWhiteList->m_next = lboxDataMLAddr;
 
-   m_lboxData = lboxDataWhiteList;
+   LboxData *lboxDataEquivList = new LboxData;
+   lboxDataEquivList->m_idListbox = ConfigField_EquivAddresses;
+   lboxDataEquivList->m_lboxDlgTitle = _("Equivalent addresses");
+   lboxDataEquivList->m_lboxDlgPrompt = _("Pair of equivalent addresses");
+   lboxDataEquivList->m_lboxDlgPers = _T("LastEquivList");
+   lboxDataEquivList->m_next = lboxDataWhiteList;
+
+   m_lboxData = lboxDataEquivList;
 }
 
 bool wxOptionsPageAdb::TransferDataToWindow()

Modified: trunk/M/src/mail/Address.cpp
===================================================================
--- trunk/M/src/mail/Address.cpp	2007-04-26 15:57:21 UTC (rev 7244)
+++ trunk/M/src/mail/Address.cpp	2007-04-26 16:06:11 UTC (rev 7245)
@@ -31,12 +31,19 @@
    #include "Mdefaults.h"
 #endif // USE_PCH
 
+#include <wx/hashmap.h>
+
 #include "Address.h"
 
+// hash type associates the list of the address equivalent to the given one
+// (used as the key)
+WX_DECLARE_STRING_HASH_MAP(wxArrayString, AddressHash);
+
 // ----------------------------------------------------------------------------
 // options we use here
 // ----------------------------------------------------------------------------
 
+extern const MOption MP_EQUIV_ADDRESSES;
 extern const MOption MP_FROM_REPLACE_ADDRESSES;
 extern const MOption MP_FROM_ADDRESS;
 extern const MOption MP_HOSTNAME;
@@ -47,6 +54,41 @@
 // ============================================================================
 
 // ----------------------------------------------------------------------------
+// handling of address equivalence hash table
+// ----------------------------------------------------------------------------
+
+static const AddressHash& GetAddressHash()
+{
+   static AddressHash s_hash;
+
+   static bool s_hashInitDone = false;
+   if ( !s_hashInitDone )
+   {
+      s_hashInitDone = true;
+
+      const wxArrayString
+         equivPairs = strutil_restore_array(READ_APPCONFIG(MP_EQUIV_ADDRESSES));
+
+      const size_t count = equivPairs.size();
+      for ( size_t n = 0; n < count; n++ )
+      {
+         wxArrayString equiv = strutil_restore_array(equivPairs[n], '=');
+         if ( equiv.size() != 2 )
+         {
+            wxLogWarning(_("Invalid address equivalence option \"%s\""),
+                         equivPairs[n].c_str());
+            continue;
+         }
+
+         s_hash[equiv[0]].push_back(equiv[1]);
+         s_hash[equiv[1]].push_back(equiv[0]);
+      }
+   }
+
+   return s_hash;
+}
+
+// ----------------------------------------------------------------------------
 // Address
 // ----------------------------------------------------------------------------
 
@@ -63,10 +105,37 @@
 /* static */
 bool Address::Compare(const String& address1, const String& address2)
 {
-   AddressList_obj addrList(address1);
-   Address *addr = addrList->GetFirst();
+   AddressList_obj addrList1(address1),
+                   addrList2(address2);
+   const Address * const addr1 = addrList1->GetFirst(),
+                 * const addr2 = addrList2->GetFirst();
 
-   return addr && !addrList->HasNext(addr) && *addr == address2;
+   if ( !addr1 || !addr2 )
+      return false;
+
+   // currently multiple addresses always compare differently because address2
+   // is always a single address
+   if ( addrList1->HasNext(addr1) || addrList2->HasNext(addr2) )
+      return false;
+
+   if ( *addr1 == *addr2 )
+      return true;
+
+   // check also for equivalent addresses
+   const AddressHash& hash = GetAddressHash();
+   AddressHash::const_iterator it = hash.find(addr2->GetEMail());
+   if ( it != hash.end() )
+   {
+      const wxArrayString& equivAddresses = it->second;
+      const size_t count = equivAddresses.size();
+      for ( size_t n = 0; n < count; n++ )
+      {
+         if ( *addr1 == equivAddresses[n] )
+            return true;
+      }
+   }
+
+   return false;
 }
 
 Address::~Address()


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.