[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kmail-devel
Subject:    Re: proposal for threading improvements
From:       Till Adam <till () adam-lilienthal ! de> (by way of Till Adam <till () adam-lilienthal ! d
Date:       2003-02-24 19:09:11
[Download RAW message or body]

On Monday 24 February 2003 04:25, Don Sanders wrote:
> On Monday 24 February 2003 03:18, Ingo Kl=F6cker wrote:
> > On Sunday 23 February 2003 14:32, Till Adam wrote:
> >
> > Instead of storing the In-reply-to string we only store an MD5 hash
> > of this in the index (and we thread messages according to this hash
> > value). You should do the same for the References. As you propose
> > below it should be enough to store only the last two entries in the
> > References header. Therefore I propose to only add the last but one
> > References entry (as MD5 hash) to the index. (The last entry resp.
> > the In-reply-to header, which both should be identical, is already
> > there.)

Patch attached. I've tested mboxes and implemented, but not tested, maildir
 folders. Can someone confirm that works as well, please?

> > > How about imap,
> > > what would you consider a half way clean approach to this?
> >
> > IIRC (it was mentioned a while ago by someone) one can fetch single
> > headers from the IMAP server. So the clean approach would be to
> > fetch the ENVELOPE and the References header from the IMAP server.
> > Carsten (or someone else who knows more about IMAP than me) can
> > probably give you a better answer.

I'll look into that. Don't hold your breath, though, I know next to nothing
 about imap, so some reading up is necessary, unless someone else wants to
 implement that.

> BTW I might be working on adding support for subject based threading
> soon.

Nice. Cheers,

Till





["replyToAuxID.diff" (text/x-diff)]

? .exrc
? Doxyfile
? diff
? kmail.kdevelop
? kmail.kdevses
? replyToAuxID.diff
? thread.diff
? thread2.diff
Index: kmfolderindex.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmfolderindex.cpp,v
retrieving revision 1.4
diff -u -w -r1.4 kmfolderindex.cpp
--- kmfolderindex.cpp	18 Feb 2003 19:22:21 -0000	1.4
+++ kmfolderindex.cpp	24 Feb 2003 19:08:27 -0000
@@ -15,7 +15,7 @@
 #endif
 
 // Current version of the table of contents (index) files
-#define INDEX_VERSION 1506
+#define INDEX_VERSION 1507
 
 #ifndef MAX_LINE
 #define MAX_LINE 4096
Index: kmfoldermaildir.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmfoldermaildir.cpp,v
retrieving revision 1.48
diff -u -w -r1.48 kmfoldermaildir.cpp
--- kmfoldermaildir.cpp	3 Feb 2003 07:03:57 -0000	1.48
+++ kmfoldermaildir.cpp	24 Feb 2003 19:08:31 -0000
@@ -557,7 +557,7 @@
 
   QCString dateStr, fromStr, toStr, subjStr;
   QCString xmarkStr, replyToIdStr, msgIdStr, referencesStr;
-  QCString statusStr;
+  QCString statusStr, replyToAuxIdStr;
 
   // iterate through this file until done
   while (!atEof)
@@ -573,7 +573,10 @@
       if ((replyToIdStr.isEmpty() || (replyToIdStr[0] != '<'))  &&
           !referencesStr.isEmpty() && referencesStr[0] == '<')
       {
-        replyToIdStr = referencesStr;
+	      // use the last reference, instead of missing In-Reply-To
+	      int leftAngle = referencesStr.findRev( '<' );
+	      if (leftAngle != -1)
+		      replyToIdStr = referencesStr.mid(leftAngle);
       }
 
       if (!statusStr.isEmpty())
@@ -593,8 +596,9 @@
 
       KMMsgInfo *mi = new KMMsgInfo(this);
       mi->init(subjStr, fromStr, toStr, 0, status, xmarkStr, replyToIdStr, 
-	       msgIdStr, file.local8Bit(), KMMsgEncryptionStateUnknown, 
-	       KMMsgSignatureStateUnknown, KMMsgMDNStateUnknown, f.size());
+	       replyToAuxIdStr, msgIdStr, file.local8Bit(), 
+	       KMMsgEncryptionStateUnknown, KMMsgSignatureStateUnknown, 
+	       KMMsgMDNStateUnknown, f.size());
       if (!dateStr.isEmpty())
         mi->setDate(dateStr);
       mi->setDirty(false);
@@ -657,12 +661,21 @@
       referencesStr = QCString(line+12);
 
       leftAngle = referencesStr.findRev('<');
+      leftAngle = referencesStr.findRev( '<', leftAngle-1);
       if (leftAngle != -1)
         referencesStr = referencesStr.mid(leftAngle);
+      rightAngle = referencesStr.findRev( '>' );
+      if (rightAngle != -1)
+	referencesStr.truncate( rightAngle + 1 );
 
+      // Store the second to last reference in the replyToAuxIdStr
+      // It is a good candidate for threading the message below if the
+      // message In-Reply-To points to is not kept in this folder, 
+      // but e.g. in an Outbox
+      replyToAuxIdStr = referencesStr;
       rightAngle = referencesStr.find('>');
       if (rightAngle != -1)
-        referencesStr.truncate(rightAngle + 1);
+	  replyToAuxIdStr.truncate( rightAngle + 1 );
     }
     else if (strncasecmp(line, "Message-Id:", 11) == 0 && isblank(line[11]))
     {
Index: kmfoldermbox.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmfoldermbox.cpp,v
retrieving revision 1.56
diff -u -w -r1.56 kmfoldermbox.cpp
--- kmfoldermbox.cpp	18 Feb 2003 02:13:34 -0000	1.56
+++ kmfoldermbox.cpp	24 Feb 2003 19:08:31 -0000
@@ -527,7 +527,7 @@
   char line[MAX_LINE];
   char status[8], xstatus[8];
   QCString subjStr, dateStr, fromStr, toStr, xmarkStr, *lastStr=0;
-  QCString replyToIdStr, referencesStr, msgIdStr;
+  QCString replyToIdStr, replyToAuxIdStr, referencesStr, msgIdStr;
   bool atEof = FALSE;
   bool inHeader = TRUE;
   KMMsgInfo* mi;
@@ -554,6 +554,8 @@
   *xstatus = '\0';
   xmarkStr = "";
   replyToIdStr = "";
+  replyToAuxIdStr = "";
+  referencesStr = "";
   msgIdStr = "";
   needStatus = 3;
 
@@ -583,10 +585,15 @@
 	{
 	  if ((replyToIdStr.isEmpty() || (replyToIdStr[0] != '<'))  &&
 	      !referencesStr.isEmpty() && referencesStr[0] == '<') {
-	    replyToIdStr = referencesStr;
+		  // use the last reference, instead of missing In-Reply-To
+		  int leftAngle = referencesStr.findRev( '<' );
+		  if (leftAngle != -1)
+		      replyToIdStr = referencesStr.mid(leftAngle);
 	  }
+	 
 	  mi = new KMMsgInfo(this);
-	  mi->init(subjStr, fromStr, toStr, 0, KMMsgStatusNew, xmarkStr, replyToIdStr, msgIdStr,
+	  mi->init(subjStr, fromStr, toStr, 0, KMMsgStatusNew, xmarkStr,
+			  replyToIdStr, replyToAuxIdStr, msgIdStr,
 		   KMMsgEncryptionStateUnknown, KMMsgSignatureStateUnknown, 
 		   KMMsgMDNStateUnknown, offs, size);
 	  mi->setStatus("RO","O");
@@ -599,6 +606,7 @@
 	  needStatus = 3;
 	  xmarkStr = "";
 	  replyToIdStr = "";
+	  replyToAuxIdStr = "";
 	  referencesStr = "";
 	  msgIdStr = "";
 	  dateStr = "";
@@ -658,11 +666,22 @@
       int leftAngle, rightAngle;
       referencesStr = QCString(line+12);
       leftAngle = referencesStr.findRev( '<' );
+      leftAngle = referencesStr.findRev( '<', leftAngle-1);
       if (leftAngle != -1)
 	referencesStr = referencesStr.mid( leftAngle );
-      rightAngle = referencesStr.find( '>' );
+      rightAngle = referencesStr.findRev( '>' );
       if (rightAngle != -1)
 	referencesStr.truncate( rightAngle + 1 );
+
+      // Store the second to last reference in the replyToAuxIdStr
+      // It is a good candidate for threading the message below if the
+      // message In-Reply-To points to is not kept in this folder, 
+      // but e.g. in an Outbox
+      replyToAuxIdStr = referencesStr;
+      rightAngle = referencesStr.find( '>' );
+      if (rightAngle != -1)
+	  replyToAuxIdStr.truncate( rightAngle + 1 );
+
     }
     else if (strncasecmp(line,"Message-Id:",11)==0 && isblank(line[11])) {
       int rightAngle;
Index: kmheaders.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmheaders.cpp,v
retrieving revision 1.483
diff -u -w -r1.483 kmheaders.cpp
--- kmheaders.cpp	16 Feb 2003 16:00:09 -0000	1.483
+++ kmheaders.cpp	24 Feb 2003 19:08:41 -0000
@@ -2385,13 +2385,7 @@
 	}
       }
     }
-    KMMsgBase *kmb;
-    while(KMHeaderItem *i = items.pop()) {
-      kmb = mFolder->getMsgBase( i->mMsgId );
 
-      QString replymd5 = kmb->replyToIdMD5();
-      int parent_id = -2; //no parent, top level
-      if(!replymd5.isEmpty()) {
 	if(mIdTree.isEmpty()) {
 	  QString md5;
 	  for(int x = 0; x < mFolder->count(); x++) {
@@ -2405,12 +2399,33 @@
 	    }
 	  }
 	}
-	KMHeaderItem *p = mIdTree[replymd5];
+
+    KMMsgBase *kmb;
+    while(KMHeaderItem *i = items.pop()) {
+      kmb = mFolder->getMsgBase( i->mMsgId );
+
+      QString replymd5 = kmb->replyToIdMD5();
+      int parent_id = -2; //no parent, top level
+      KMHeaderItem *p = NULL;
+      if(!replymd5.isEmpty())
+	  p = mIdTree[replymd5];
+
+      if (!p) {
+	  // If we dont have a replyToId, or if we have one and the
+	  // corresponding message is not in this folder, as happens
+	  // if you keep your outgoing messages in an OUTBOX, for
+	  // example, try the list of references, because the second
+	  // to last will likely be in this folder. replyToAuxIdMD5 ontains
+	  // the second to last one.
+	  QString  ref = kmb->replyToAuxIdMD5();
+	  if (!ref.isEmpty())
+	      p = mIdTree[ref];
+      }
 	if(p)
 	  parent_id = p->mMsgId;
 	else
 	  parent_id = -1;
-      }
+
       internalWriteItem(sortStream, mFolder, i->mMsgId, parent_id,
 			i->key(mSortCol, !mSortDescending), FALSE);
       //double check for magic headers
@@ -2440,7 +2455,6 @@
   return TRUE;
 }
 
-
 void KMHeaders::appendUnsortedItem(KMHeaderItem *khi)
 {
   QString sortFile = KMAIL_SORT_FILE(mFolder);
@@ -2565,6 +2579,8 @@
     return ret;
 }
 
+
+
 bool KMHeaders::readSortOrder(bool set_selection)
 {
     //all cases
@@ -2768,7 +2784,6 @@
     if (appended && threaded && !unparented.isEmpty()) {
 	CREATE_TIMER(reparent);
 	START_TIMER(reparent);
-	KMSortCacheItem *i;
 	QDict<KMSortCacheItem> msgs(mFolder->count() * 2);
 	for(int x = 0; x < mFolder->count(); x++) {
 	    QString md5 = mFolder->getMsgBase(x)->msgIdMD5();
@@ -2776,12 +2791,28 @@
 	    msgs.insert(md5, sortCache[x]);
 	}
 	for(QPtrListIterator<KMSortCacheItem> it(unparented); it.current(); ++it) {
-	    replyToIdMD5 = mFolder->getMsgBase((*it)->id())->replyToIdMD5();
-	    if(!replyToIdMD5.isEmpty() && (i = msgs[replyToIdMD5])) {
-		i->addUnsortedChild((*it));
+	    KMSortCacheItem *parent=NULL;
+	    KMMsgBase *msg =  mFolder->getMsgBase((*it)->id());
+	    QString replyToIdMD5 = msg->replyToIdMD5();
+	    if(!replyToIdMD5.isEmpty())
+		parent = msgs[replyToIdMD5];
+	    if (!parent) {
+		// If we dont have a replyToId, or if we have one and the
+		// corresponding message is not in this folder, as happens
+		// if you keep your outgoing messages in an OUTBOX, for
+		// example, try the list of references, because the second
+		// to last will likely be in this folder. replyToAuxIdMD5 
+		// contains the second to last one.
+		QString  ref = msg->replyToAuxIdMD5();
+		if (!ref.isEmpty())
+		    parent = msgs[ref];
+	    }
+	    if ( parent ) {
+		parent->addUnsortedChild((*it));
 		if(sortStream)
 		    (*it)->updateSortFile(sortStream, mFolder);
-	    } else { //oh well we tried, to the root with you!
+	    } else {
+		//oh well we tried, to the root with you!
 		root.addUnsortedChild((*it));
 	    }
 	}
@@ -2911,6 +2942,7 @@
 	fclose(sortStream);
     return TRUE;
 }
+
 
 
 //-----------------------------------------------------------------------------
Index: kmmessage.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmessage.cpp,v
retrieving revision 1.375
diff -u -w -r1.375 kmmessage.cpp
--- kmmessage.cpp	23 Feb 2003 19:12:09 -0000	1.375
+++ kmmessage.cpp	24 Feb 2003 19:08:56 -0000
@@ -2136,6 +2136,40 @@
   return result;
 }
 
+//-----------------------------------------------------------------------------
+QString KMMessage::references(void) const
+{
+    int leftAngle, rightAngle;
+    QString  references = headerField("References");
+   
+    // keep the last two entries for threading
+    leftAngle = references.findRev( '<' );
+    leftAngle = references.findRev( '<', leftAngle-1 );
+    if (leftAngle != -1)
+	references = references.mid( leftAngle );
+    rightAngle = references.findRev( '>' );
+    if (rightAngle != -1)
+	references.truncate( rightAngle + 1 );
+
+    if (!references.isEmpty() && references[0] == '<')
+	return references;
+    else
+	return "";
+}
+
+//-----------------------------------------------------------------------------
+QString KMMessage::replyToAuxIdMD5(void) const
+{
+    int rightAngle;
+    QString  result = references();
+    // references contains two items, use the first one 
+    // (the second to last reference)
+    rightAngle = result.find( '>' );
+    if (rightAngle != -1)
+	result.truncate (rightAngle+1);
+    
+    return KMMessagePart::encodeBase64( result );
+}
 
 //-----------------------------------------------------------------------------
 void KMMessage::setReplyToId(const QString& aStr)
Index: kmmessage.h
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmessage.h,v
retrieving revision 1.128
diff -u -w -r1.128 kmmessage.h
--- kmmessage.h	23 Feb 2003 19:12:09 -0000	1.128
+++ kmmessage.h	24 Feb 2003 19:08:58 -0000
@@ -352,7 +352,7 @@
       is found, @p newPrefix + ' ' is prepended to the subject and the
       resulting string is returned. If @p replace is true, any
       sequence of whitespace-delimited prefixes at the beginning of
-      @ref #subject() is replaced by @p newPrefix.
+      @ref #subject() is replaced by @p newPrefix
   **/
   QString cleanSubject(const QStringList& prefixRegExps, bool replace,
 		       const QString& newPrefix) const;
@@ -376,12 +376,29 @@
   virtual void setReplyToId(const QString& aStr);
   virtual QString replyToIdMD5(void) const;
 
+  /** Get the second to last id from the References header
+      field. If outgoing messages are not kept in the same 
+      folder as incoming ones, this will be a good place to 
+      thread the message beneath.
+      bob               <- second to last reference points to this
+       |_kmailuser      <- not in our folder, but Outbox
+           |_bob        <- In-Reply-To points to our mail above
+
+      Thread like this:
+      bob
+       |_bob 
+       
+      using replyToAuxIdMD5
+    */
+  virtual QString replyToAuxIdMD5(void) const;
+
   /** Get or set the 'Message-Id' header field */
   virtual QString msgId(void) const;
   virtual void setMsgId(const QString& aStr);
   virtual QString msgIdMD5(void) const;
 
-  /** Set the references for this message */
+  /** Get or set the references for this message */
+  virtual QString references(void) const;
   virtual void setReferences(const QCString& aStr);
 
   /** Returns the message ID, useful for followups */
Index: kmmsgbase.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmsgbase.cpp,v
retrieving revision 1.137
diff -u -w -r1.137 kmmsgbase.cpp
--- kmmsgbase.cpp	18 Feb 2003 03:26:17 -0000	1.137
+++ kmmsgbase.cpp	24 Feb 2003 19:09:00 -0000
@@ -1033,6 +1033,8 @@
   STORE_DATA_LEN(MsgToPart, tmp_str.unicode(), tmp_str.length() * 2, true);
   tmp_str = replyToIdMD5().stripWhiteSpace();
   STORE_DATA_LEN(MsgReplyToIdMD5Part, tmp_str.unicode(), tmp_str.length() * 2, true);
+  tmp_str = replyToAuxIdMD5().stripWhiteSpace();
+  STORE_DATA_LEN(MsgReplyToAuxIdMD5Part, tmp_str.unicode(), tmp_str.length() * 2, true);
   tmp_str = xmark().stripWhiteSpace();
   STORE_DATA_LEN(MsgXMarkPart, tmp_str.unicode(), tmp_str.length() * 2, true);
   tmp_str = fileName().stripWhiteSpace();
Index: kmmsgbase.h
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmsgbase.h,v
retrieving revision 1.52
diff -u -w -r1.52 kmmsgbase.h
--- kmmsgbase.h	26 Dec 2002 10:18:15 -0000	1.52
+++ kmmsgbase.h	24 Feb 2003 19:09:01 -0000
@@ -148,6 +148,7 @@
   virtual QString toStrip(void) const = 0;
   virtual QString replyToIdMD5(void) const = 0;
   virtual QString msgIdMD5(void) const = 0;
+  virtual QString replyToAuxIdMD5(void) const = 0;
   virtual time_t date(void) const = 0;
   virtual QString dateStr(void) const;
   virtual QString xmark(void) const = 0;
@@ -275,16 +276,17 @@
     MsgSubjectPart = 2,
     MsgToPart = 3,
     MsgReplyToIdMD5Part = 4,
-    MsgIdMD5Part = 5,
-    MsgXMarkPart = 6,
+    MsgReplyToAuxIdMD5Part = 5,
+    MsgIdMD5Part = 6,
+    MsgXMarkPart = 7,
     //unsigned long
-    MsgOffsetPart = 7,
-    MsgStatusPart = 8,
-    MsgSizePart = 9,
-    MsgDatePart = 10,
-    MsgFilePart = 11,
-    MsgCryptoStatePart = 12,
-    MsgMDNSentPart = 13
+    MsgOffsetPart = 8,
+    MsgStatusPart = 9,
+    MsgSizePart = 10,
+    MsgDatePart = 11,
+    MsgFilePart = 12,
+    MsgCryptoStatePart = 13,
+    MsgMDNSentPart = 14
   };
   /** access to long msgparts */
   off_t getLongPart(MsgPartType) const;
Index: kmmsginfo.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmsginfo.cpp,v
retrieving revision 1.43
diff -u -w -r1.43 kmmsginfo.cpp
--- kmmsginfo.cpp	26 Dec 2002 10:18:15 -0000	1.43
+++ kmmsginfo.cpp	24 Feb 2003 19:09:02 -0000
@@ -17,12 +17,12 @@
 	SUBJECT_SET = 0x01, TO_SET = 0x02, REPLYTO_SET = 0x04, MSGID_SET=0x08,
 	DATE_SET = 0x10, OFFSET_SET = 0x20, SIZE_SET = 0x40,
 	XMARK_SET=0x100, FROM_SET=0x200, FILE_SET=0x400, ENCRYPTION_SET=0x800,
-	SIGNATURE_SET=0x1000, MDN_SET=0x2000,
+	SIGNATURE_SET=0x1000, MDN_SET=0x2000, REPLYTOAUX_SET = 0x4000,
 
 	ALL_SET = 0xFFFF, NONE_SET = 0x0000
     };
-    ushort modifiers;
-    QString subject, from, to, replyToIdMD5, msgIdMD5, xmark, file;
+    uint modifiers;
+    QString subject, from, to, replyToIdMD5, replyToAuxIdMD5, msgIdMD5, xmark, file;
     off_t folderOffset;
     size_t msgSize;
     time_t date;
@@ -53,6 +53,11 @@
 	    modifiers |= REPLYTO_SET;
 	    replyToIdMD5 = other.replyToIdMD5;
 	}
+	if (other.modifiers & REPLYTOAUX_SET) {
+	    modifiers |= REPLYTOAUX_SET;
+	    replyToAuxIdMD5 = other.replyToAuxIdMD5;
+	}
+
 	if(other.modifiers & MSGID_SET) {
 	    modifiers |= MSGID_SET;
 	    msgIdMD5 = other.msgIdMD5;
@@ -143,6 +148,7 @@
     kd->from = msg.fromStrip();
     kd->to = msg.toStrip();
     kd->replyToIdMD5 = msg.replyToIdMD5();
+    kd->replyToAuxIdMD5 = msg.replyToAuxIdMD5();
     kd->msgIdMD5 = msg.msgIdMD5();
     kd->xmark = msg.xmark();
     mStatus = msg.status();
@@ -161,7 +167,8 @@
 void KMMsgInfo::init(const QCString& aSubject, const QCString& aFrom,
                      const QCString& aTo, time_t aDate,
 		     KMMsgStatus aStatus, const QCString& aXMark,
-		     const QCString& replyToId, const QCString& msgId,
+		     const QCString& replyToId, const QCString& replyToAuxId,
+		     const QCString& msgId,
 		     KMMsgEncryptionState encryptionState,
 		     KMMsgSignatureState signatureState,
 		     KMMsgMDNSentState mdnSentState,
@@ -176,6 +183,7 @@
     kd->from = KMMessage::stripEmailAddr( decodeRFC2047String(aFrom) );
     kd->to = KMMessage::stripEmailAddr( decodeRFC2047String(aTo) );
     kd->replyToIdMD5 = KMMessagePart::encodeBase64( replyToId );
+    kd->replyToAuxIdMD5 = KMMessagePart::encodeBase64( replyToAuxId );
     kd->msgIdMD5 = KMMessagePart::encodeBase64( msgId );
     kd->xmark = aXMark;
     kd->folderOffset = aFolderOffset;
@@ -192,7 +200,8 @@
 void KMMsgInfo::init(const QCString& aSubject, const QCString& aFrom,
                      const QCString& aTo, time_t aDate,
 		     KMMsgStatus aStatus, const QCString& aXMark,
-		     const QCString& replyToId, const QCString& msgId,
+		     const QCString& replyToId, const QCString& replyToAuxId, 
+		     const QCString& msgId,
 		     const QCString& aFileName,
 		     KMMsgEncryptionState encryptionState,
 		     KMMsgSignatureState signatureState,
@@ -200,8 +209,9 @@
 		     unsigned long aMsgSize)
 {
   // use the "normal" init for most stuff
-  init(aSubject, aFrom, aTo, aDate, aStatus, aXMark, replyToId, msgId,
-       encryptionState, signatureState, mdnSentState, (unsigned long)0, aMsgSize);
+  init(aSubject, aFrom, aTo, aDate, aStatus, aXMark, replyToId, replyToAuxId,
+		  msgId, encryptionState, signatureState, mdnSentState, 
+		  (unsigned long)0, aMsgSize);
   kd->file = aFileName;
 }
 
@@ -257,6 +267,14 @@
     return getStringPart(MsgReplyToIdMD5Part);
 }
 
+//-----------------------------------------------------------------------------
+QString KMMsgInfo::replyToAuxIdMD5(void) const
+{
+    if (kd && kd->modifiers & KMMsgInfoPrivate::REPLYTOAUX_SET)
+	return kd->replyToAuxIdMD5;
+    return getStringPart(MsgReplyToAuxIdMD5Part);
+}
+
 
 //-----------------------------------------------------------------------------
 QString KMMsgInfo::msgIdMD5(void) const
@@ -307,6 +325,20 @@
     kd->replyToIdMD5 = aReplyToIdMD5;
     mDirty = TRUE;
 }
+
+//-----------------------------------------------------------------------------
+void KMMsgInfo::setReplyToAuxIdMD5(const QString& aReplyToAuxIdMD5)
+{
+    if (aReplyToAuxIdMD5 == replyToAuxIdMD5())
+	return;
+
+    if (!kd)
+	kd = new KMMsgInfoPrivate;
+    kd->modifiers |= KMMsgInfoPrivate::REPLYTOAUX_SET;
+    kd->replyToAuxIdMD5 = aReplyToAuxIdMD5;
+    mDirty = TRUE;
+}
+
 
 
 //-----------------------------------------------------------------------------
Index: kmmsginfo.h
===================================================================
RCS file: /home/kde/kdepim/kmail/kmmsginfo.h,v
retrieving revision 1.30
diff -u -w -r1.30 kmmsginfo.h
--- kmmsginfo.h	26 Dec 2002 10:18:15 -0000	1.30
+++ kmmsginfo.h	24 Feb 2003 19:09:03 -0000
@@ -27,7 +27,9 @@
   virtual void init(const QCString& subject, const QCString& from,
                     const QCString& to, time_t date,
 		    KMMsgStatus status, const QCString& xmark,
-		    const QCString& replyToId, const QCString& msgId,
+		    const QCString& replyToId, 
+		    const QCString& replyToAuxId,
+		    const QCString& msgId,
 		    KMMsgEncryptionState encryptionState,
 		    KMMsgSignatureState signatureState,
 		    KMMsgMDNSentState mdnSentState,
@@ -37,7 +39,9 @@
   virtual void init(const QCString& subject, const QCString& from,
                     const QCString& to, time_t date,
 		    KMMsgStatus status, const QCString& xmark,
-		    const QCString& replyToId, const QCString& msgId,
+		    const QCString& replyToId,
+		    const QCString& replyToAuxId,
+		    const QCString& msgId,
 		    const QCString& fileName,
 		    KMMsgEncryptionState encryptionState,
 		    KMMsgSignatureState signatureState,
@@ -50,6 +54,7 @@
   virtual QString toStrip(void) const;
   virtual QString xmark(void) const;
   virtual QString replyToIdMD5(void) const;
+  virtual QString replyToAuxIdMD5(void) const; 
   virtual QString msgIdMD5(void) const;
   virtual QString fileName(void) const;
   virtual KMMsgStatus status(void) const;
@@ -67,6 +72,7 @@
   virtual void setSubject(const QString&);
   virtual void setXMark(const QString&);
   virtual void setReplyToIdMD5(const QString&);
+  virtual void setReplyToAuxIdMD5(const QString&);
   virtual void setMsgIdMD5(const QString&);
   virtual void setEncryptionState( const KMMsgEncryptionState, int idx = -1 );
   virtual void setSignatureState( const KMMsgSignatureState, int idx = -1 );

_______________________________________________
KMail Developers mailing list
kmail@mail.kde.org
http://mail.kde.org/mailman/listinfo/kmail

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic