rev 4356 - in trunk/packages/kdepim/debian: . patches

Fathi Boudra fboudra-guest at costa.debian.org
Sat Aug 19 13:41:17 UTC 2006


Author: fboudra-guest
Date: 2006-08-19 13:41:14 +0000 (Sat, 19 Aug 2006)
New Revision: 4356

Added:
   trunk/packages/kdepim/debian/patches/01_kdepim_branch_r574183.diff
   trunk/packages/kdepim/debian/patches/15_kdepim_debug.diff
Modified:
   trunk/packages/kdepim/debian/changelog
   trunk/packages/kdepim/debian/control
   trunk/packages/kdepim/debian/patches/11_lib_link.diff
   trunk/packages/kdepim/debian/patches/13_mimelib_self_contained.diff
   trunk/packages/kdepim/debian/patches/14_kmail_filter_icons.diff
Log:
Add branch pull to r574183 and kdepim extra debug information patch, Remove autotools-dev from Build-Depends

Modified: trunk/packages/kdepim/debian/changelog
===================================================================
--- trunk/packages/kdepim/debian/changelog	2006-08-19 12:52:31 UTC (rev 4355)
+++ trunk/packages/kdepim/debian/changelog	2006-08-19 13:41:14 UTC (rev 4356)
@@ -2,10 +2,12 @@
 
   * New upstream release.
 
-  !!! TODO !!!
-    + Branch pull.
-    + Include experimental dIMAP patch?
+   +++ Changes by Fathi Boudra:
 
+  * Branch pull to revision 574183
+  * Added kdepim extra debug information from KDE bug #104956
+  * Removed autools-dev from Build-Depends, automake1.9 depends on it
+
    +++ Changes by Christopher Martin:
 
   * Packaging sync with the rest of the team KDE packages. Update

Modified: trunk/packages/kdepim/debian/control
===================================================================
--- trunk/packages/kdepim/debian/control	2006-08-19 12:52:31 UTC (rev 4355)
+++ trunk/packages/kdepim/debian/control	2006-08-19 13:41:14 UTC (rev 4356)
@@ -3,7 +3,12 @@
 Priority: optional
 Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>
 Uploaders: Daniel Schepler <schepler at debian.org>
-Build-Depends: cdbs (>= 0.4.39-0.1), debhelper (>= 5.0.31), autotools-dev, cdparanoia, gawk, gettext, kdelibs4-dev (>= 4:3.5.4), automake1.9, bison, byacc, bzip2, flex, groff-base, libbluetooth2-dev, libboost-dev (>= 1.33.1), libgnokii3-dev, libgpgme11-dev, liblockdev1-dev, libmal-dev, libpisock-dev, libreadline5-dev, libsasl2-dev, libssl-dev, libtool (>= 1.5), libxpm-dev, libxss-dev, sharutils, texinfo
+Build-Depends: cdbs (>= 0.4.39-0.1), debhelper (>= 5.0.31), automake1.9,
+ cdparanoia, gawk, gettext, kdelibs4-dev (>= 4:3.5.4), bison, byacc, bzip2,
+ flex, groff-base, libbluetooth2-dev, libboost-dev (>= 1.33.1), libgnokii3-dev,
+ libgpgme11-dev, liblockdev1-dev, libmal-dev, libpisock-dev, libreadline5-dev,
+ libsasl2-dev, libssl-dev, libtool (>= 1.5), libxpm-dev, libxss-dev, sharutils,
+ texinfo
 Build-Depends-Indep: doxygen, graphviz, gsfonts-x11, qt3-doc, kdelibs4-doc
 Build-Conflicts: libkleopatra0-dev
 Standards-Version: 3.7.2

Added: trunk/packages/kdepim/debian/patches/01_kdepim_branch_r574183.diff
===================================================================
--- trunk/packages/kdepim/debian/patches/01_kdepim_branch_r574183.diff	2006-08-19 12:52:31 UTC (rev 4355)
+++ trunk/packages/kdepim/debian/patches/01_kdepim_branch_r574183.diff	2006-08-19 13:41:14 UTC (rev 4356)
@@ -0,0 +1,2558 @@
+#DPATCHLEVEL=0
+--- akregator/src/akregator.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ akregator/src/akregator.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -58,7 +58,6 @@
+ Comment[fi]=RSS-syötelukija
+ Comment[fr]=Un lecteur de flux RSS pour KDE
+ Comment[ga]=Comhbhailitheoir RSS le haghaidh KDE
+-Comment[he]==קורא חדשות (RSS) עבור KDE
+ Comment[hu]=KDE-s hírolvasó RSS hírcsatornákhoz
+ Comment[is]=RSS fréttaforrit fyrir KDE
+ Comment[it]=Un concentratore KDE per RSS
+--- akregator/src/akregator_view.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ akregator/src/akregator_view.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -1394,7 +1394,10 @@
+     }
+     else
+     {
+-        // TODO: read selected page viewer
++        QString selectedText = static_cast<PageViewer *>(m_currentFrame->part())->selectedText();
++        
++        if (!selectedText.isEmpty())
++            SpeechClient::self()->slotSpeak(selectedText, "en");
+     }
+ }
+ 
+--- kresources/egroupware/xmlrpciface.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kresources/egroupware/xmlrpciface.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -200,7 +200,14 @@
+   {
+       case QVariant::String:
+       case QVariant::CString:
+-      return "<value><string>" + arg.toString() + "</string></value>\r\n";
++        {
++        QString result = arg.toString();
++        result = result.replace( "&", "&amp;" );
++        result = result.replace( "\"", "&quot;" );
++        result = result.replace( "<", "&lt;" );
++        result = result.replace( ">", "&gt;" );
++        return "<value><string>" + result + "</string></value>\r\n";
++        }
+       case QVariant::Int:
+       return "<value><int>" + QString::number( arg.toInt() ) + "</int></value>\r\n";
+       case QVariant::Double:
+--- kresources/groupwise/soap/types.xsd	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kresources/groupwise/soap/types.xsd	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -524,7 +524,7 @@
+ 					<xs:element name="officialVersion" type="xs:unsignedInt" minOccurs="0"/>
+ 					<xs:element name="currentVersion" type="xs:unsignedInt" minOccurs="0"/>
+ 					<xs:element name="versionNumber" type="xs:unsignedInt" minOccurs="0"/>
+-					<xs:element name="versionDescription" minOccurs="0"/>
++					<xs:element name="versionDescription" type="xs:string" minOccurs="0"/>
+ 					<xs:element name="fileSize" type="xs:unsignedInt" minOccurs="0"/>
+ 					<xs:element name="acl" type="tns:AccessControlList" minOccurs="0"/>
+ 				</xs:sequence>
+--- kmail/kmfoldersearch.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmfoldersearch.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -71,6 +71,7 @@
+   bool running() const { return mRunning; }
+   void stop();
+   int foundCount() const { return mFoundCount; }
++  int searchCount() const { return mSearchCount; }
+   QString currentFolder() const { return mLastFolder; }
+ 
+ public slots:
+@@ -101,6 +102,7 @@
+   SerNumList mSerNums;
+   QString mLastFolder;
+   int mFoundCount;
++  int mSearchCount;
+   QTimer *mProcessNextBatchTimer;
+ };
+ 
+@@ -162,7 +164,7 @@
+   virtual int updateIndex();
+ 
+   // Examine the message
+-  void slotSearchExamineMsgDone( KMFolder*, Q_UINT32 serNum, 
++  void slotSearchExamineMsgDone( KMFolder*, Q_UINT32 serNum,
+                                  const KMSearchPattern*, bool );
+ 
+ public:
+--- kmail/kmreadermainwin.rc	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmreadermainwin.rc	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -1,5 +1,5 @@
+ <!DOCTYPE kpartgui>
+-<kpartgui version="4" name="kmreadermainwin" >
++<kpartgui version="5" name="kmreadermainwin" >
+  <MenuBar>
+   <Menu noMerge="1" name="file" >
+    <text>&amp;File</text>
+@@ -33,6 +33,7 @@
+      <text>&amp;Forward</text>
+      <Action name="message_forward_as_attachment" />
+      <Action name="message_forward_inline" />
++     <Action name="message_forward_as_digest" />
+      <Action name="message_forward_redirect" />
+    </Menu>
+   </Menu>
+--- kmail/searchwindow.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/searchwindow.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -86,13 +86,13 @@
+    * @param curFolder The folder to use as the new base for searches.
+    */
+   void activateFolder( KMFolder* curFolder );
+-  
++
+   /**
+    * Provides access to the list of currently selected message in the listview.
+    * @return The list of currenty selected search result messages.
+    */
+   KMMessageList selectedMessages();
+-  
++
+   /**
+    * Provides access to the currently selected message.
+    * @return the currently selected message.
+@@ -115,13 +115,15 @@
+   virtual void slotContextMenuRequested( QListViewItem*, const QPoint &, int );
+   virtual void copySelectedToFolder( int menuId );
+   virtual void moveSelectedToFolder( int menuId );
+-  virtual void slotFolderActivated( KMFolder* );
++  virtual void slotFolderActivated();
+   void slotClearSelection();
+   void slotReplyToMsg();
+   void slotReplyAllToMsg();
+   void slotReplyListToMsg();
+-  void slotForwardMsg();
++  void slotForwardInlineMsg();
+   void slotForwardAttachedMsg();
++  void slotForwardDigestMsg();
++  void slotRedirectMsg();
+   void slotSaveMsg();
+   void slotSaveAttachments();
+   void slotPrintMsg();
+@@ -167,8 +169,8 @@
+   QWidget* mLastFocus; // to remember the position of the focus
+   QMap<int,KMFolder*> mMenuToFolder;
+   KAction *mReplyAction, *mReplyAllAction, *mReplyListAction, *mSaveAsAction,
+-    *mForwardAction, *mForwardAttachedAction, *mPrintAction, *mClearAction,
+-    *mSaveAtchAction;
++    *mForwardInlineAction, *mForwardAttachedAction, *mForwardDigestAction,
++    *mRedirectAction, *mPrintAction, *mClearAction, *mSaveAtchAction;
+   KActionMenu *mForwardActionMenu;
+   QValueList<QGuardedPtr<KMFolder> > mFolders;
+ 
+--- kmail/kmfilterdlg.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmfilterdlg.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -69,6 +69,12 @@
+ 	   "it is deleted, but you can always leave the "
+ 	   "dialog by clicking <em>Cancel</em> to discard the "
+ 	   "changes made.</p></qt>" );
++const char * _wt_filterlist_top =
++I18N_NOOP( "<qt><p>Click this button to move the currently-"
++	   "selected filter to the <em>top</em> of the list above.</p>"
++	   "<p>This is useful since the order of the filters in the list "
++	   "determines the order in which they are tried on messages: "
++	   "The topmost filter gets tried first.</p></qt>" );
+ const char * _wt_filterlist_up =
+ I18N_NOOP( "<qt><p>Click this button to move the currently-"
+ 	   "selected filter <em>up</em> one in the list above.</p>"
+@@ -85,6 +91,12 @@
+ 	   "The topmost filter gets tried first.</p>"
+ 	   "<p>If you have clicked this button accidentally, you can undo this "
+ 	   "by clicking on the <em>Up</em> button.</p></qt>" );
++const char * _wt_filterlist_bot =
++I18N_NOOP( "<qt><p>Click this button to move the currently-"
++	   "selected filter to the <em>bottom</em> of the list above.</p>"
++	   "<p>This is useful since the order of the filters in the list "
++	   "determines the order in which they are tried on messages: "
++	   "The topmost filter gets tried first.</p></qt>" );
+ const char * _wt_filterlist_rename =
+ I18N_NOOP( "<qt><p>Click this button to rename the currently-selected filter.</p>"
+ 	   "<p>Filters are named automatically, as long as they start with "
+@@ -268,7 +280,7 @@
+   	     this, SLOT(slotApplicableAccountsChanged()) );
+     connect( mAccountList, SIGNAL(spacePressed(QListViewItem*)),
+   	     this, SLOT(slotApplicableAccountsChanged()) );
+-    
++
+     // transfer changes from the 'stop processing here'
+     // check box to the filter
+     connect( mStopProcessingHere, SIGNAL(toggled(bool)),
+@@ -434,7 +446,7 @@
+       mFilter->setApplicability( KMFilter::ButImap );
+     else if ( mApplyOnForChecked->isChecked() )
+       mFilter->setApplicability( KMFilter::Checked );
+-      
++
+     mApplyOnForAll->setEnabled( mApplyOnIn->isChecked() );
+     mApplyOnForTraditional->setEnabled(  mApplyOnIn->isChecked() );
+     mApplyOnForChecked->setEnabled( mApplyOnIn->isChecked() );
+@@ -566,6 +578,10 @@
+   //----------- the first row of buttons
+   QHBox *hb = new QHBox(this);
+   hb->setSpacing(4);
++  mBtnTop = new KPushButton( QString::null, hb );
++  mBtnTop->setAutoRepeat( true );
++  mBtnTop->setIconSet( BarIconSet( "top", KIcon::SizeSmall ) );
++  mBtnTop->setMinimumSize( mBtnTop->sizeHint() * 1.2 );
+   mBtnUp = new KPushButton( QString::null, hb );
+   mBtnUp->setAutoRepeat( true );
+   mBtnUp->setIconSet( BarIconSet( "up", KIcon::SizeSmall ) );
+@@ -574,10 +590,18 @@
+   mBtnDown->setAutoRepeat( true );
+   mBtnDown->setIconSet( BarIconSet( "down", KIcon::SizeSmall ) );
+   mBtnDown->setMinimumSize( mBtnDown->sizeHint() * 1.2 );
++  mBtnBot = new KPushButton( QString::null, hb );
++  mBtnBot->setAutoRepeat( true );
++  mBtnBot->setIconSet( BarIconSet( "bottom", KIcon::SizeSmall ) );
++  mBtnBot->setMinimumSize( mBtnBot->sizeHint() * 1.2 );
++  QToolTip::add( mBtnTop, i18n("Top") );
+   QToolTip::add( mBtnUp, i18n("Up") );
+   QToolTip::add( mBtnDown, i18n("Down") );
++  QToolTip::add( mBtnBot, i18n("Bottom") );
++  QWhatsThis::add( mBtnTop, i18n(_wt_filterlist_top) );
+   QWhatsThis::add( mBtnUp, i18n(_wt_filterlist_up) );
+   QWhatsThis::add( mBtnDown, i18n(_wt_filterlist_down) );
++  QWhatsThis::add( mBtnBot, i18n(_wt_filterlist_bot) );
+ 
+   //----------- the second row of buttons
+   hb = new QHBox(this);
+@@ -606,10 +630,14 @@
+ 	   this, SLOT(slotSelected(int)) );
+   connect( mListBox, SIGNAL( doubleClicked ( QListBoxItem * )),
+            this, SLOT( slotRename()) );
++  connect( mBtnTop, SIGNAL(clicked()),
++	   this, SLOT(slotTop()) );
+   connect( mBtnUp, SIGNAL(clicked()),
+ 	   this, SLOT(slotUp()) );
+   connect( mBtnDown, SIGNAL(clicked()),
+ 	   this, SLOT(slotDown()) );
++  connect( mBtnBot, SIGNAL(clicked()),
++	   this, SLOT(slotBottom()) );
+   connect( mBtnNew, SIGNAL(clicked()),
+ 	   this, SLOT(slotNew()) );
+   connect( mBtnCopy, SIGNAL(clicked()),
+@@ -720,7 +748,7 @@
+ 		       "IMAP account. Such filters will only be applied "
+ 		       "when manually filtering and when filtering "
+ 		       "incoming online IMAP mail.");
+-    KMessageBox::information( this, str, QString::null, 
++    KMessageBox::information( this, str, QString::null,
+ 			      "filterDlgOnlineImapCheck" );
+   }
+   // allow usage of the filters again.
+@@ -811,6 +839,21 @@
+   enableControls();
+ }
+ 
++void KMFilterListBox::slotTop()
++{
++  if ( mIdxSelItem < 0 ) {
++    kdDebug(5006) << "KMFilterListBox::slotTop called while no filter is selected, ignoring." << endl;
++    return;
++  }
++  if ( mIdxSelItem == 0 ) {
++    kdDebug(5006) << "KMFilterListBox::slotTop called while the _topmost_ filter is selected, ignoring." << endl;
++    return;
++  }
++
++  swapFilters( mIdxSelItem, 0 );
++  enableControls();
++}
++
+ void KMFilterListBox::slotUp()
+ {
+   if ( mIdxSelItem < 0 ) {
+@@ -841,6 +884,21 @@
+   enableControls();
+ }
+ 
++void KMFilterListBox::slotBottom()
++{
++  if ( mIdxSelItem < 0 ) {
++    kdDebug(5006) << "KMFilterListBox::slotBottom called while no filter is selected, ignoring." << endl;
++    return;
++  }
++  if ( mIdxSelItem == (int)mListBox->count() - 1 ) {
++    kdDebug(5006) << "KMFilterListBox::slotBottom called while the _last_ filter is selected, ignoring." << endl;
++    return;
++  }
++
++  swapFilters( mIdxSelItem, mListBox->count()-1 );
++  enableControls();
++}
++
+ void KMFilterListBox::slotRename()
+ {
+   if ( mIdxSelItem < 0 ) {
+@@ -888,8 +946,10 @@
+   bool theLast = ( mIdxSelItem >= (int)mFilterList.count() - 1 );
+   bool aFilterIsSelected = ( mIdxSelItem >= 0 );
+ 
++  mBtnTop->setEnabled( aFilterIsSelected && !theFirst );
+   mBtnUp->setEnabled( aFilterIsSelected && !theFirst );
+   mBtnDown->setEnabled( aFilterIsSelected && !theLast );
++  mBtnBot->setEnabled( aFilterIsSelected && !theLast );
+   mBtnCopy->setEnabled( aFilterIsSelected );
+   mBtnDelete->setEnabled( aFilterIsSelected );
+   mBtnRename->setEnabled( aFilterIsSelected );
+@@ -983,7 +1043,20 @@
+   mIdxSelItem += movedOne - untouchedOne;
+ }
+ 
++void KMFilterListBox::swapFilters( int from, int to )
++{
++  QListBoxItem *item = mListBox->item( from );
++  mListBox->takeItem( item );
++  mListBox->insertItem( item, to );
+ 
++  KMFilter* filter = mFilterList.take( from );
++  mFilterList.insert( to, filter );
++
++  mIdxSelItem = to;
++  mListBox->setCurrentItem( mIdxSelItem );
++  mListBox->setSelected( mIdxSelItem, true );
++}
++
+ //=============================================================================
+ //
+ // class KMFilterActionWidget
+--- kmail/kmmainwin.rc	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmmainwin.rc	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -2,7 +2,7 @@
+      the same menu entries at the same place in KMail and Kontact  -->
+ 
+ <!DOCTYPE kpartgui>
+-<kpartgui version="88" name="kmmainwin" >
++<kpartgui version="89" name="kmmainwin" >
+  <MenuBar>
+   <Menu noMerge="1" name="file" >
+    <text>&amp;File</text>
+@@ -120,6 +120,7 @@
+      <text>&amp;Forward</text>
+      <Action name="message_forward_as_attachment" />
+      <Action name="message_forward_inline" />
++     <Action name="message_forward_as_digest" />
+      <Action name="message_forward_redirect" />
+    </Menu>
+    <Action name="send_again" />
+--- kmail/imapaccountbase.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/imapaccountbase.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -1144,14 +1144,16 @@
+      ImapAccountBase::JobIterator it = findJob(job);
+      if ( it == jobsEnd() ) return;
+      int errorCode = job->error();
++     KMFolder * const parent = (*it).parent;
++     const QString path = (*it).path;
+      if (errorCode && errorCode != KIO::ERR_CANNOT_OPEN_FOR_WRITING)
+      {
+        bool cont = handleJobError( job, i18n( "Error while uploading status of messages to server: " ) + '\n' );
+-       emit imapStatusChanged( (*it).parent, (*it).path, cont );
++       emit imapStatusChanged( parent, path, cont );
+      }
+      else
+      {
+-       emit imapStatusChanged( (*it).parent, (*it).path, true );
++       emit imapStatusChanged( parent, path, true );
+        removeJob(it);
+      }
+   }
+--- kmail/kmedit.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmedit.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -248,8 +248,6 @@
+                                                 col1, col2, col3, col4,
+                                                 mSpellConfig );
+ 
+-  connect( mSpellChecker, SIGNAL(activeChanged(const QString &)),
+-           mComposer, SLOT(slotStatusMessage(const QString &)));
+   connect( mSpellChecker, SIGNAL(newSuggestions(const QString&, const QStringList&, unsigned int)),
+            this, SLOT(addSuggestion(const QString&, const QStringList&, unsigned int)) );
+ }
+--- kmail/kmmessage.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmmessage.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -33,7 +33,7 @@
+ class KMMessagePart;
+ class KMMsgInfo;
+ class KMHeaders;
+-class KMForwardCommand;
++class KMForwardDigestCommand;
+ 
+ namespace KMime {
+   class CharFreq;
+@@ -66,7 +66,7 @@
+ /** This is a Mime Message. */
+ class KMMessage: public KMMsgBase, public KMail::ISubject
+ {
+-  friend class ::KMForwardCommand;    // needed for MIME Digest forward
++  friend class ::KMForwardDigestCommand; // needed for MIME Digest forward
+ 
+ public:
+   // promote some of KMMsgBase's methods to public:
+@@ -811,7 +811,7 @@
+   bool transferInProgress() const;
+   /** Set that the message shall not be deleted because it is still required */
+   void setTransferInProgress(bool value, bool force = false);
+-  
++
+   /** Returns an mbox message separator line for this message, i.e. a
+       string of the form
+       "From local at domain.invalid Sat Jun 12 14:00:00 2004\n".
+--- kmail/kmreadermainwin.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmreadermainwin.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -164,14 +164,14 @@
+ }
+ 
+ //-----------------------------------------------------------------------------
+-void KMReaderMainWin::slotForwardMsg()
++void KMReaderMainWin::slotForwardInlineMsg()
+ {
+    KMCommand *command = 0;
+    if ( mReaderWin->message() && mReaderWin->message()->parent() ) {
+-    command = new KMForwardCommand( this, mReaderWin->message(),
++    command = new KMForwardInlineCommand( this, mReaderWin->message(),
+         mReaderWin->message()->parent()->identity() );
+    } else {
+-    command = new KMForwardCommand( this, mReaderWin->message() );
++    command = new KMForwardInlineCommand( this, mReaderWin->message() );
+    }
+    command->start();
+ }
+@@ -190,6 +190,19 @@
+ }
+ 
+ //-----------------------------------------------------------------------------
++void KMReaderMainWin::slotForwardDigestMsg()
++{
++   KMCommand *command = 0;
++   if ( mReaderWin->message() && mReaderWin->message()->parent() ) {
++     command = new KMForwardDigestCommand( this, mReaderWin->message(),
++        mReaderWin->message()->parent()->identity() );
++   } else {
++     command = new KMForwardDigestCommand( this, mReaderWin->message() );
++   }
++   command->start();
++}
++
++//-----------------------------------------------------------------------------
+ void KMReaderMainWin::slotRedirectMsg()
+ {
+   KMCommand *command = new KMRedirectCommand( this, mReaderWin->message() );
+@@ -247,20 +260,32 @@
+   connect( mForwardActionMenu, SIGNAL( activated() ), this,
+            SLOT( slotForwardMsg() ) );
+ 
+-  mForwardAction = new KAction( i18n("&Inline..."), "mail_forward",
+-				SHIFT+Key_F, this, SLOT(slotForwardMsg()),
+-				actionCollection(), "message_forward_inline" );
+-  mForwardActionMenu->insert( mForwardAction );
+-
+   mForwardAttachedAction = new KAction( i18n("Message->Forward->","As &Attachment..."),
+-				       "mail_forward", Key_F, this,
+-					SLOT(slotForwardAttachedMsg()), actionCollection(),
++                                        "mail_forward", Key_F, this,
++					SLOT(slotForwardAttachedMsg()),
++                                        actionCollection(),
+ 					"message_forward_as_attachment" );
+   mForwardActionMenu->insert( mForwardAttachedAction );
+ 
++  mForwardInlineAction = new KAction( i18n("&Inline..."),
++                                      "mail_forward", SHIFT+Key_F, this,
++                                      SLOT(slotForwardInlineMsg()),
++                                      actionCollection(),
++                                      "message_forward_inline" );
++  mForwardActionMenu->insert( mForwardInlineAction );
++
++  mForwardDigestAction = new KAction( i18n("Message->Forward->","As Di&gest..."),
++                                      "mail_forward", 0, this,
++                                      SLOT(slotForwardDigestMsg()),
++                                      actionCollection(),
++                                      "message_forward_as_digest" );
++  mForwardActionMenu->insert( mForwardDigestAction );
++
+   mRedirectAction = new KAction( i18n("Message->Forward->","&Redirect..."),
+-				 Key_E, this, SLOT(slotRedirectMsg()),
+-				 actionCollection(), "message_forward_redirect" );
++				 "mail_forward", Key_E, this,
++                                 SLOT(slotRedirectMsg()),
++				 actionCollection(),
++                                 "message_forward_redirect" );
+   mForwardActionMenu->insert( mRedirectAction );
+ 
+   mReplyActionMenu = new KActionMenu( i18n("Message->","&Reply"),
+@@ -355,7 +380,9 @@
+       return;
+     }
+ 
+-    if( !aMsg.parent()->isSent() && !aMsg.parent()->isDrafts() ) {
++    if ( ! ( aMsg.parent() && ( aMsg.parent()->isSent() || aMsg.parent()->isDrafts() ) ) ) {
++      // add the reply and forward actions only if we are not in a sent-mail or drafts
++      // folder
+       mReplyActionMenu->plug( menu );
+       mForwardActionMenu->plug( menu );
+       menu->insertSeparator();
+--- kmail/searchwindow.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/searchwindow.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -270,15 +270,26 @@
+                                         "search_message_forward" );
+   connect( mForwardActionMenu, SIGNAL(activated()), this,
+            SLOT(slotForwardMsg()) );
+-  mForwardAction = new KAction( i18n("&Inline..."), "mail_forward",
+-                                0, this, SLOT(slotForwardMsg()),
+-                                ac, "search_message_forward_inline" );
+-  mForwardActionMenu->insert( mForwardAction );
+   mForwardAttachedAction = new KAction( i18n("Message->Forward->","As &Attachment..."),
+-                                       "mail_forward", 0, this,
++                                        "mail_forward", 0, this,
+                                         SLOT(slotForwardAttachedMsg()), ac,
+                                         "search_message_forward_as_attachment" );
+   mForwardActionMenu->insert( mForwardAttachedAction );
++  mForwardInlineAction = new KAction( i18n("&Inline..."),
++                                      "mail_forward", 0, this,
++                                      SLOT(slotForwardMsg()), ac,
++                                      "search_message_forward_inline" );
++  mForwardActionMenu->insert( mForwardInlineAction );
++  mForwardDigestAction = new KAction( i18n("Message->Forward->","As Di&gest..."),
++                                      "mail_forward", 0, this,
++                                      SLOT(slotForwardDigestMsg()), ac,
++                                      "search_message_forward_as_digest" );
++  mForwardActionMenu->insert( mForwardDigestAction );
++  mRedirectAction = new KAction( i18n("Message->Forward->","&Redirect..."),
++                                      "mail_forward", 0, this,
++                                      SLOT(slotRedirectMsg()), ac,
++                                      "search_message_forward_redirect" );
++  mForwardActionMenu->insert( mRedirectAction );
+   mSaveAsAction = KStdAction::saveAs( this, SLOT(slotSaveMsg()), ac, "search_file_save_as" );
+   mSaveAtchAction = new KAction( i18n("Save Attachments..."), "attach", 0,
+                                  this, SLOT(slotSaveAttachments()), ac, "search_save_attachments" );
+@@ -291,7 +302,7 @@
+           this, SLOT(folderInvalidated(KMFolder*)));
+ 
+   connect(mCbxFolders, SIGNAL(folderChanged(KMFolder*)),
+-          this, SLOT(slotFolderActivated(KMFolder*)));
++          this, SLOT(slotFolderActivated()));
+ 
+ }
+ 
+@@ -328,33 +339,33 @@
+ //-----------------------------------------------------------------------------
+ void SearchWindow::updStatus(void)
+ {
+-    QString genMsg, detailMsg;
+-    int numMatches = 0, count = 0;
++    QString genMsg, detailMsg, procMsg;
++    int numMatches = 0, numProcessed = 0;
+     KMSearch const *search = (mFolder) ? (mFolder->search()) : 0;
+     QString folderName;
+     if (search) {
+         numMatches = search->foundCount();
++        numProcessed = search->searchCount();
+         folderName = search->currentFolder();
+     }
+ 
+     if (mFolder && mFolder->search() && !mFolder->search()->running()) {
++        procMsg = i18n("%n message searched", "%n messages searched",
++                       numProcessed);
+         if(!mStopped) {
+-            genMsg = i18n("Done");
+-            detailMsg = i18n("%n match (%1)", "%n matches (%1)", numMatches)
+-                        .arg(i18n("%n message processed",
+-                                  "%n messages processed", count));
++            genMsg = i18n("Done.");
++            detailMsg = i18n("%n match in %1", "%n matches in %1",
++                             numMatches).arg(procMsg);
+         } else {
+-            genMsg = i18n("Search canceled");
+-            detailMsg = i18n("%n match so far (%1)",
+-                             "%n matches so far (%1)", numMatches)
+-                        .arg(i18n("%n message processed",
+-                                  "%n messages processed", count));
++            genMsg = i18n("Search canceled.");
++            detailMsg = i18n("%n match so far in %1", "%n matches so far in %1",
++                             numMatches).arg(procMsg);
+         }
+     } else {
++        procMsg = i18n("%n message", "%n messages", numProcessed);
+         genMsg = i18n("%n match", "%n matches", numMatches);
+-        detailMsg = i18n("Searching in %1 (message %2)")
+-                    .arg(folderName)
+-                    .arg(count);
++        detailMsg = i18n("Searching in %1. %2 searched so far")
++                    .arg(folderName).arg(procMsg);
+     }
+ 
+     mStatusBar->changeItem(genMsg, 0);
+@@ -377,10 +388,9 @@
+ 
+ 
+ //-----------------------------------------------------------------------------
+-void SearchWindow::slotFolderActivated( KMFolder* folder )
++void SearchWindow::slotFolderActivated()
+ {
+     mChkbxSpecificFolders->setChecked(true);
+-    mBtnSearch->setEnabled(folder);
+ }
+ 
+ //-----------------------------------------------------------------------------
+@@ -705,6 +715,8 @@
+     mReplyAllAction->setEnabled( single_actions );
+     mReplyListAction->setEnabled( single_actions );
+     mPrintAction->setEnabled( single_actions );
++    mForwardDigestAction->setEnabled( !single_actions );
++    mRedirectAction->setEnabled( single_actions );
+ }
+ 
+ //-----------------------------------------------------------------------------
+@@ -773,9 +785,9 @@
+ }
+ 
+ //-----------------------------------------------------------------------------
+-void SearchWindow::slotForwardMsg()
++void SearchWindow::slotForwardInlineMsg()
+ {
+-    KMCommand *command = new KMForwardCommand(this, selectedMessages());
++    KMCommand *command = new KMForwardInlineCommand(this, selectedMessages());
+     command->start();
+ }
+ 
+@@ -787,6 +799,20 @@
+ }
+ 
+ //-----------------------------------------------------------------------------
++void SearchWindow::slotForwardDigestMsg()
++{
++    KMCommand *command = new KMForwardDigestCommand(this, selectedMessages());
++    command->start();
++}
++
++//-----------------------------------------------------------------------------
++void SearchWindow::slotRedirectMsg()
++{
++    KMCommand *command = new KMRedirectCommand(this, message());
++    command->start();
++}
++
++//-----------------------------------------------------------------------------
+ void SearchWindow::slotSaveMsg()
+ {
+     KMSaveMsgCommand *saveCommand = new KMSaveMsgCommand(this,
+--- kmail/kmreaderwin.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmreaderwin.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -1103,6 +1103,13 @@
+           break;
+         }
+       }
++      if ( i == encodings.size() ) {
++        // the value of encoding is unknown => use Auto
++        kdWarning(5006) << "Unknown override character encoding \"" << encoding
++                        << "\". Using Auto instead." << endl;
++        mSelectEncodingAction->setCurrentItem( 0 );
++        mOverrideEncoding = QString::null;
++      }
+     }
+   }
+   update( true );
+--- kmail/kmmessage.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmmessage.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -86,7 +86,8 @@
+ 
+ //-----------------------------------------------------------------------------
+ KMMessage::KMMessage(DwMessage* aMsg)
+-  : mMsg(aMsg),
++  : KMMsgBase(),
++    mMsg(aMsg),
+     mNeedsAssembly(true),
+     mDecodeHTML(false),
+     mOverrideCodec(0),
+@@ -706,6 +707,8 @@
+                                            const QTextCodec*& codec,
+                                            bool& isHTML ) const
+ {
++  if ( !root ) return;
++
+   isHTML = false;
+   // initialy parse the complete message to decrypt any encrypted parts
+   {
+@@ -736,6 +739,7 @@
+   const QTextCodec * codec = 0;
+ 
+   partNode * root = partNode::fromMessage( this );
++  if ( !root ) return QString::null;
+   parseTextStringFromDwPart( root, parsedString, codec, isHTML );
+   delete root;
+ 
+@@ -3819,7 +3823,7 @@
+ //-----------------------------------------------------------------------------
+ QCString KMMessage::charset() const
+ {
+-  if ( mMsg->Headers().HasContentType() ) {  
++  if ( mMsg->Headers().HasContentType() ) {
+     DwMediaType &mType=mMsg->Headers().ContentType();
+     mType.Parse();
+     DwParameter *param=mType.FirstParameter();
+--- kmail/kmaccount.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmaccount.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -377,7 +377,12 @@
+ {
+   if (mTimer)
+     mTimer->stop();
+-  kmkernel->acctMgr()->singleCheckMail(this, false);
++
++  if ( kmkernel ) {
++    AccountManager *acctmgr = kmkernel->acctMgr();
++    if ( acctmgr )
++      acctmgr->singleCheckMail(this, false);
++  }
+ }
+ 
+ //-----------------------------------------------------------------------------
+--- kmail/kmcommands.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmcommands.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -847,7 +847,7 @@
+   if ( msg ) {
+     QCString str( msg->mboxMessageSeparator() );
+     str += KMFolderMbox::escapeFrom( msg->asString() );
+-    str += "\n";
++    str += '\n';
+     msg->setTransferInProgress(false);
+ 
+     mData = str;
+@@ -1124,143 +1124,72 @@
+ }
+ 
+ 
+-KMForwardCommand::KMForwardCommand( QWidget *parent,
++KMForwardInlineCommand::KMForwardInlineCommand( QWidget *parent,
+   const QPtrList<KMMsgBase> &msgList, uint identity )
+   : KMCommand( parent, msgList ),
+     mIdentity( identity )
+ {
+ }
+ 
+-KMForwardCommand::KMForwardCommand( QWidget *parent, KMMessage *msg,
+-                                    uint identity )
++KMForwardInlineCommand::KMForwardInlineCommand( QWidget *parent,
++  KMMessage *msg, uint identity )
+   : KMCommand( parent, msg ),
+     mIdentity( identity )
+ {
+ }
+ 
+-KMCommand::Result KMForwardCommand::execute()
++KMCommand::Result KMForwardInlineCommand::execute()
+ {
+   QPtrList<KMMessage> msgList = retrievedMsgs();
+ 
+-  if (msgList.count() >= 2) {
+-    // ask if they want a mime digest forward
++  if (msgList.count() >= 2) { // Multiple forward
+ 
+-    if (KMessageBox::questionYesNo( parentWidget(),
+-                                    i18n("Forward selected messages as "
+-                                         "a MIME digest?"), QString::null, i18n("Send Digest"), i18n("Send") )
+-        == KMessageBox::Yes) {
+-      uint id = 0;
+-      KMMessage *fwdMsg = new KMMessage;
+-      KMMessagePart *msgPart = new KMMessagePart;
+-      QString msgPartText;
+-      int msgCnt = 0; // incase there are some we can't forward for some reason
++    uint id = 0;
++    QCString msgText = "";
++    QPtrList<KMMessage> linklist;
++    for ( KMMessage *msg = msgList.first(); msg; msg = msgList.next() ) {
++      // set the identity
++      if (id == 0)
++        id = msg->headerField( "X-KMail-Identity" ).stripWhiteSpace().toUInt();
+ 
+-      // dummy header initialization; initialization with the correct identity
+-      // is done below
+-      fwdMsg->initHeader(id);
+-      fwdMsg->setAutomaticFields(true);
+-      fwdMsg->mMsg->Headers().ContentType().CreateBoundary(1);
+-      QCString boundary( fwdMsg->mMsg->Headers().ContentType().Boundary().c_str() );
+-      msgPartText = i18n("\nThis is a MIME digest forward. The content of the"
+-                         " message is contained in the attachment(s).\n\n\n");
+-      // iterate through all the messages to be forwarded
+-      for (KMMessage *msg = msgList.first(); msg; msg = msgList.next()) {
+-        // set the identity
+-        if (id == 0)
+-          id = msg->headerField("X-KMail-Identity").stripWhiteSpace().toUInt();
+-        // set the part header
+-        msgPartText += "--";
+-        msgPartText += QString::fromLatin1( boundary );
+-        msgPartText += "\nContent-Type: MESSAGE/RFC822";
+-        msgPartText += QString("; CHARSET=%1").arg(msg->charset());
+-        msgPartText += "\n";
+-        DwHeaders dwh;
+-        dwh.MessageId().CreateDefault();
+-        msgPartText += QString("Content-ID: %1\n").arg(dwh.MessageId().AsString().c_str());
+-        msgPartText += QString("Content-Description: %1").arg(msg->subject());
+-        if (!msg->subject().contains("(fwd)"))
+-          msgPartText += " (fwd)";
+-        msgPartText += "\n\n";
+-        // remove headers that shouldn't be forwarded
+-        msg->removePrivateHeaderFields();
+-        msg->removeHeaderField("BCC");
+-        // set the part
+-        msgPartText += msg->headerAsString();
+-        msgPartText += "\n";
+-        msgPartText += msg->body();
+-        msgPartText += "\n";     // eot
+-        msgCnt++;
+-        fwdMsg->link(msg, KMMsgStatusForwarded);
+-      }
+-      if ( id == 0 )
+-        id = mIdentity; // use folder identity if no message had an id set
+-      fwdMsg->initHeader(id);
+-      msgPartText += "--";
+-      msgPartText += QString::fromLatin1( boundary );
+-      msgPartText += "--\n";
+-      QCString tmp;
+-      msgPart->setTypeStr("MULTIPART");
+-      tmp.sprintf( "Digest; boundary=\"%s\"", boundary.data() );
+-      msgPart->setSubtypeStr( tmp );
+-      msgPart->setName("unnamed");
+-      msgPart->setCte(DwMime::kCte7bit);   // does it have to be 7bit?
+-      msgPart->setContentDescription(QString("Digest of %1 messages.").arg(msgCnt));
+-      // THIS HAS TO BE AFTER setCte()!!!!
+-      msgPart->setBodyEncoded(QCString(msgPartText.ascii()));
+-      KCursorSaver busy(KBusyPtr::busy());
+-      KMail::Composer * win = KMail::makeComposer( fwdMsg, id );
+-      win->addAttach(msgPart);
+-      win->show();
+-      return OK;
+-    } else {            // NO MIME DIGEST, Multiple forward
+-      uint id = 0;
+-      QCString msgText = "";
+-      QPtrList<KMMessage> linklist;
+-      for (KMMessage *msg = msgList.first(); msg; msg = msgList.next()) {
+-        // set the identity
+-        if (id == 0)
+-          id = msg->headerField("X-KMail-Identity").stripWhiteSpace().toUInt();
++      msgText += msg->createForwardBody();
++      linklist.append( msg );
++    }
++    if ( id == 0 )
++      id = mIdentity; // use folder identity if no message had an id set
++    KMMessage *fwdMsg = new KMMessage;
++    fwdMsg->initHeader( id );
++    fwdMsg->setAutomaticFields( true );
++    fwdMsg->setCharset( "utf-8" );
++    fwdMsg->setBody( msgText );
+ 
+-        msgText += msg->createForwardBody();
+-        linklist.append(msg);
+-      }
+-      if ( id == 0 )
+-        id = mIdentity; // use folder identity if no message had an id set
+-      KMMessage *fwdMsg = new KMMessage;
+-      fwdMsg->initHeader(id);
+-      fwdMsg->setAutomaticFields(true);
+-      fwdMsg->setCharset("utf-8");
+-      fwdMsg->setBody(msgText);
++    for ( KMMessage *msg = linklist.first(); msg; msg = linklist.next() )
++      fwdMsg->link( msg, KMMsgStatusForwarded );
+ 
+-      for (KMMessage *msg = linklist.first(); msg; msg = linklist.next())
+-        fwdMsg->link(msg, KMMsgStatusForwarded);
++    KCursorSaver busy( KBusyPtr::busy() );
++    KMail::Composer * win = KMail::makeComposer( fwdMsg, id );
++    win->setCharset("");
++    win->show();
+ 
+-      KCursorSaver busy(KBusyPtr::busy());
++  } else { // forward a single message at most
++
++    KMMessage *msg = msgList.getFirst();
++    if ( !msg || !msg->codec() )
++      return Failed;
++
++    KCursorSaver busy( KBusyPtr::busy() );
++    KMMessage *fwdMsg = msg->createForward();
++
++    uint id = msg->headerField( "X-KMail-Identity" ).stripWhiteSpace().toUInt();
++    if ( id == 0 )
++      id = mIdentity;
++    {
+       KMail::Composer * win = KMail::makeComposer( fwdMsg, id );
+-      win->setCharset("");
++      win->setCharset( fwdMsg->codec()->mimeName(), true );
++      win->setBody( QString::fromUtf8( msg->createForwardBody() ) );
+       win->show();
+-      return OK;
+     }
+   }
+-
+-  // forward a single message at most.
+-  KMMessage *msg = msgList.getFirst();
+-  if ( !msg || !msg->codec() )
+-    return Failed;
+-
+-  KCursorSaver busy(KBusyPtr::busy());
+-  KMMessage *fwdMsg = msg->createForward();
+-
+-  uint id = msg->headerField("X-KMail-Identity").stripWhiteSpace().toUInt();
+-  if ( id == 0 )
+-    id = mIdentity;
+-  {
+-    KMail::Composer * win = KMail::makeComposer( fwdMsg, id );
+-    win->setCharset( fwdMsg->codec()->mimeName(), true );
+-    win->setBody( QString::fromUtf8( msg->createForwardBody() ) );
+-    win->show();
+-  }
+-
+   return OK;
+ }
+ 
+@@ -1329,8 +1258,95 @@
+ }
+ 
+ 
++KMForwardDigestCommand::KMForwardDigestCommand( QWidget *parent,
++           const QPtrList<KMMsgBase> &msgList, uint identity, KMail::Composer *win )
++  : KMCommand( parent, msgList ), mIdentity( identity ),
++    mWin( QGuardedPtr<KMail::Composer>( win ))
++{
++}
++
++KMForwardDigestCommand::KMForwardDigestCommand( QWidget *parent,
++           KMMessage * msg, uint identity, KMail::Composer *win )
++  : KMCommand( parent, msg ), mIdentity( identity ),
++    mWin( QGuardedPtr< KMail::Composer >( win ))
++{
++}
++
++KMCommand::Result KMForwardDigestCommand::execute()
++{
++  QPtrList<KMMessage> msgList = retrievedMsgs();
++
++  if ( msgList.count() < 2 )
++    return Undefined; // must have more than 1 for a digest
++
++  uint id = 0;
++  KMMessage *fwdMsg = new KMMessage;
++  KMMessagePart *msgPart = new KMMessagePart;
++  QString msgPartText;
++  int msgCnt = 0; // incase there are some we can't forward for some reason
++
++  // dummy header initialization; initialization with the correct identity
++  // is done below
++  fwdMsg->initHeader( id );
++  fwdMsg->setAutomaticFields( true );
++  fwdMsg->mMsg->Headers().ContentType().CreateBoundary( 1 );
++  QCString boundary( fwdMsg->mMsg->Headers().ContentType().Boundary().c_str() );
++  msgPartText = i18n("\nThis is a MIME digest forward. The content of the"
++                     " message is contained in the attachment(s).\n\n\n");
++  // iterate through all the messages to be forwarded
++  for ( KMMessage *msg = msgList.first(); msg; msg = msgList.next() ) {
++    // set the identity
++    if ( id == 0 )
++      id = msg->headerField( "X-KMail-Identity" ).stripWhiteSpace().toUInt();
++    // set the part header
++    msgPartText += "--";
++    msgPartText += QString::fromLatin1( boundary );
++    msgPartText += "\nContent-Type: MESSAGE/RFC822";
++    msgPartText += QString( "; CHARSET=%1" ).arg( msg->charset() );
++    msgPartText += '\n';
++    DwHeaders dwh;
++    dwh.MessageId().CreateDefault();
++    msgPartText += QString( "Content-ID: %1\n" ).arg( dwh.MessageId().AsString().c_str() );
++    msgPartText += QString( "Content-Description: %1" ).arg( msg->subject() );
++    if ( !msg->subject().contains( "(fwd)" ) )
++      msgPartText += " (fwd)";
++    msgPartText += "\n\n";
++    // remove headers that shouldn't be forwarded
++    msg->removePrivateHeaderFields();
++    msg->removeHeaderField( "BCC" );
++    // set the part
++    msgPartText += msg->headerAsString();
++    msgPartText += '\n';
++    msgPartText += msg->body();
++    msgPartText += '\n';     // eot
++    msgCnt++;
++    fwdMsg->link( msg, KMMsgStatusForwarded );
++  }
++
++  if ( id == 0 )
++    id = mIdentity; // use folder identity if no message had an id set
++  fwdMsg->initHeader( id );
++  msgPartText += "--";
++  msgPartText += QString::fromLatin1( boundary );
++  msgPartText += "--\n";
++  QCString tmp;
++  msgPart->setTypeStr( "MULTIPART" );
++  tmp.sprintf( "Digest; boundary=\"%s\"", boundary.data() );
++  msgPart->setSubtypeStr( tmp );
++  msgPart->setName( "unnamed" );
++  msgPart->setCte( DwMime::kCte7bit );   // does it have to be 7bit?
++  msgPart->setContentDescription( QString( "Digest of %1 messages." ).arg( msgCnt ) );
++  // THIS HAS TO BE AFTER setCte()!!!!
++  msgPart->setBodyEncoded( QCString( msgPartText.ascii() ) );
++  KCursorSaver busy( KBusyPtr::busy() );
++  KMail::Composer * win = KMail::makeComposer( fwdMsg, id );
++  win->addAttach( msgPart );
++  win->show();
++  return OK;
++}
++
+ KMRedirectCommand::KMRedirectCommand( QWidget *parent,
+-  KMMessage *msg )
++                                      KMMessage *msg )
+   : KMCommand( parent, msg )
+ {
+ }
+--- kmail/messagecomposer.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/messagecomposer.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -2155,9 +2155,11 @@
+   }
+ 
+   mSignature = signature;
+-  Q_ASSERT( !mSignature.isNull() ); // if you hit this, check gpg-agent is running, then blame gpgme.
+-  if ( mSignature.isNull() ) {
+-    KMessageBox::error( mComposeWin, i18n( "The signing operation failed for an unknown reason." ) );
++  if ( mSignature.isEmpty() ) {
++    KMessageBox::sorry( mComposeWin,
++                        i18n( "The signing operation failed. "
++                              "Please make sure that the gpg-agent program "
++                              "is running." ) );
+   }
+ }
+ 
+--- kmail/kmfoldercachedimap.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmfoldercachedimap.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -1208,6 +1208,10 @@
+ 
+ void KMFolderCachedImap::slotImapStatusChanged(KMFolder* folder, const QString&, bool cont)
+ {
++  if ( mSyncState == SYNC_STATE_INITIAL ){
++      kdDebug(5006) << "IMAP status changed but reset " << endl;
++      return; // we were reset
++  }
+   if ( folder->storage() == this ) {
+     --mStatusFlagsJobs;
+     if ( mStatusFlagsJobs == 0 || !cont ) // done or aborting
+@@ -2010,6 +2014,7 @@
+ // called by KMAcctCachedImap::killAllJobs
+ void KMFolderCachedImap::resetSyncState()
+ {
++  if ( mSyncState == SYNC_STATE_INITIAL ) return;
+   mSubfoldersForSync.clear();
+   mSyncState = SYNC_STATE_INITIAL;
+   close();
+--- kmail/kmail_part.rc	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmail_part.rc	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -2,7 +2,7 @@
+      the same menu entries at the same place in KMail and Kontact  -->
+ 
+ <!DOCTYPE kpartgui>
+-<kpartgui version="6" name="kmail_part" >
++<kpartgui version="7" name="kmail_part" >
+  <MenuBar>
+   <Menu noMerge="1" name="file" >
+    <text>&amp;File</text>
+@@ -117,6 +117,7 @@
+      <text>&amp;Forward</text>
+      <Action name="message_forward_as_attachment" />
+      <Action name="message_forward_inline" />
++     <Action name="message_forward_as_digest" />
+      <Action name="message_forward_redirect" />
+    </Menu>
+    <Action name="send_again" />
+--- kmail/kmmainwidget.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmmainwidget.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -1276,14 +1276,16 @@
+ 
+ 
+ //-----------------------------------------------------------------------------
+-void KMMainWidget::slotForwardMsg()
++void KMMainWidget::slotForwardInlineMsg()
+ {
+   KMMessageList* selected = mHeaders->selectedMsgs();
+   KMCommand *command = 0L;
+   if(selected && !selected->isEmpty()) {
+-    command = new KMForwardCommand( this, *selected, mFolder->identity() );
++    command = new KMForwardInlineCommand( this, *selected,
++                                          mFolder->identity() );
+   } else {
+-    command = new KMForwardCommand( this, mHeaders->currentMsg(), mFolder->identity() );
++    command = new KMForwardInlineCommand( this, mHeaders->currentMsg(),
++                                          mFolder->identity() );
+   }
+ 
+   command->start();
+@@ -1304,7 +1306,20 @@
+   command->start();
+ }
+ 
++//-----------------------------------------------------------------------------
++void KMMainWidget::slotForwardDigestMsg()
++{
++  KMMessageList* selected = mHeaders->selectedMsgs();
++  KMCommand *command = 0L;
++  if(selected && !selected->isEmpty()) {
++    command = new KMForwardDigestCommand( this, *selected, mFolder->identity() );
++  } else {
++    command = new KMForwardDigestCommand( this, mHeaders->currentMsg(), mFolder->identity() );
++  }
+ 
++  command->start();
++}
++
+ //-----------------------------------------------------------------------------
+ void KMMainWidget::slotEditMsg()
+ {
+@@ -2463,15 +2478,31 @@
+ 
+   mForwardAttachedAction = new KAction( i18n("Message->Forward->","As &Attachment..."),
+ 				       "mail_forward", Key_F, this,
+-					SLOT(slotForwardAttachedMsg()), actionCollection(),
++					SLOT(slotForwardAttachedMsg()),
++                                        actionCollection(),
+ 					"message_forward_as_attachment" );
+   mForwardActionMenu->insert( forwardAttachedAction() );
+-  mForwardAction = new KAction( i18n("&Inline..."), "mail_forward",
+-				SHIFT+Key_F, this, SLOT(slotForwardMsg()),
+-				actionCollection(), "message_forward_inline" );
++  mForwardInlineAction = new KAction( i18n("&Inline..."), "mail_forward",
++                                      SHIFT+Key_F, this,
++                                      SLOT(slotForwardInlineMsg()),
++                                      actionCollection(),
++                                      "message_forward_inline" );
+ 
+-  mForwardActionMenu->insert( forwardAction() );
++  mForwardActionMenu->insert( forwardInlineAction() );
++  mForwardDigestAction = new KAction( i18n("Message->Forward->","As Di&gest..."),
++                                      "mail_forward", 0, this,
++                                      SLOT(slotForwardDigestMsg()),
++                                      actionCollection(),
++                                      "message_forward_as_digest" );
++  mForwardActionMenu->insert( forwardDigestAction() );
++  mRedirectAction = new KAction( i18n("Message->Forward->","&Redirect..."),
++                                 "mail_forward", Key_E, this,
++                                 SLOT(slotRedirectMsg()),
++				 actionCollection(),
++                                 "message_forward_redirect" );
++  mForwardActionMenu->insert( redirectAction() );
+ 
++
+   mSendAgainAction = new KAction( i18n("Send A&gain..."), 0, this,
+ 		      SLOT(slotResendMsg()), actionCollection(), "send_again" );
+ 
+@@ -2502,12 +2533,6 @@
+ 				  "reply_list" );
+   mReplyActionMenu->insert( mReplyListAction );
+ 
+-  mRedirectAction = new KAction( i18n("Message->Forward->","&Redirect..."),
+-                                 "mail_forward",
+-				 Key_E, this, SLOT(slotRedirectMsg()),
+-				 actionCollection(), "message_forward_redirect" );
+-  mForwardActionMenu->insert( redirectAction() );
+-
+   mNoQuoteReplyAction = new KAction( i18n("Reply Without &Quote..."), SHIFT+Key_R,
+     this, SLOT(slotNoQuoteReplyToMsg()), actionCollection(), "noquotereply" );
+ 
+@@ -2572,13 +2597,13 @@
+   mToggleTodoAction = new KToggleAction(i18n("Mark Message as &To-do"), "mail_todo",
+                                  0, this, SLOT(slotSetMsgStatusTodo()),
+                                  actionCollection(), "status_todo");
+-  mToggleTodoAction->setCheckedState( i18n("Mark Message as Not &To-do") );
++  mToggleTodoAction->setCheckedState( i18n("Remove &To-do Message Mark") );
+   mStatusMenu->insert( mToggleTodoAction );
+ 
+   mToggleSentAction = new KToggleAction(i18n("Mark Message as &Sent"), "kmmsgsent",
+                                  0, this, SLOT(slotSetMsgStatusSent()),
+                                  actionCollection(), "status_sent");
+-  mToggleSentAction->setCheckedState( i18n("Mark Message as Not &Sent") );
++  mToggleSentAction->setCheckedState( i18n("Remove &Sent Mark") );
+ 
+ 
+   //----- "Mark Thread" submenu
+@@ -2615,7 +2640,7 @@
+   mToggleThreadTodoAction = new KToggleAction(i18n("Mark Thread as &To-do"), "mail_todo",
+                                        0, this, SLOT(slotSetThreadStatusTodo()),
+                                        actionCollection(), "thread_todo");
+-  mToggleThreadTodoAction->setCheckedState( i18n("Mark Thread as Not &To-do") );
++  mToggleThreadTodoAction->setCheckedState( i18n("Remove &To-do Thread Mark") );
+   mThreadStatusMenu->insert( mToggleThreadTodoAction );
+ 
+   //------- "Watch and ignore thread" actions
+@@ -2876,7 +2901,7 @@
+ void KMMainWidget::slotShowMsgSrc()
+ {
+   if ( mMsgView )
+-    mMsgView->setUpdateAttachment( false );  
++    mMsgView->setUpdateAttachment( false );
+   KMMessage *msg = mHeaders->currentMsg();
+   if ( !msg )
+     return;
+@@ -2959,6 +2984,10 @@
+       allSelectedInCommonThread = true;
+     }
+ 
++    QListViewItem *curItemParent = mHeaders->currentItem();
++    bool parent_thread = 0;
++    if ( curItemParent && curItemParent->firstChild() != 0 ) parent_thread = 1;
++
+     bool mass_actions = count >= 1;
+     bool thread_actions = mass_actions && allSelectedInCommonThread &&
+                           mHeaders->isThreaded();
+@@ -2993,8 +3022,9 @@
+     mTrashAction->setEnabled( mass_actions && !mFolder->isReadOnly() );
+     mDeleteAction->setEnabled( mass_actions && !mFolder->isReadOnly() );
+     mFindInMessageAction->setEnabled( mass_actions );
+-    mForwardAction->setEnabled( mass_actions );
++    mForwardInlineAction->setEnabled( mass_actions );
+     mForwardAttachedAction->setEnabled( mass_actions );
++    mForwardDigestAction->setEnabled( count > 1 || parent_thread );
+ 
+     forwardMenu()->setEnabled( mass_actions );
+ 
+@@ -3014,7 +3044,7 @@
+ 
+     mSendAgainAction->setEnabled( single_actions &&
+              ( mHeaders->currentMsg() && mHeaders->currentMsg()->isSent() )
+-          || ( mFolder && mHeaders->currentMsg() && 
++          || ( mFolder && mHeaders->currentMsg() &&
+               ( kmkernel->folderIsDraftOrOutbox( mFolder )
+              || kmkernel->folderIsSentMailFolder( mFolder ) ) ) );
+     mSaveAsAction->setEnabled( mass_actions );
+--- kmail/kmcommands.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmcommands.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -460,15 +460,15 @@
+   QString mSelection;
+ };
+ 
+-class KDE_EXPORT KMForwardCommand : public KMCommand
++class KDE_EXPORT KMForwardInlineCommand : public KMCommand
+ {
+   Q_OBJECT
+ 
+ public:
+-  KMForwardCommand( QWidget *parent, const QPtrList<KMMsgBase> &msgList,
+-                    uint identity = 0 );
+-  KMForwardCommand( QWidget *parent, KMMessage * msg,
+-                    uint identity = 0 );
++  KMForwardInlineCommand( QWidget *parent, const QPtrList<KMMsgBase> &msgList,
++                          uint identity = 0 );
++  KMForwardInlineCommand( QWidget *parent, KMMessage * msg,
++                          uint identity = 0 );
+ 
+ private:
+   virtual Result execute();
+@@ -494,6 +494,23 @@
+   QGuardedPtr<KMail::Composer> mWin;
+ };
+ 
++class KDE_EXPORT KMForwardDigestCommand : public KMCommand
++{
++  Q_OBJECT
++
++public:
++  KMForwardDigestCommand( QWidget *parent, const QPtrList<KMMsgBase> &msgList,
++			    uint identity = 0, KMail::Composer *win = 0 );
++  KMForwardDigestCommand( QWidget *parent, KMMessage * msg,
++			    uint identity = 0, KMail::Composer *win = 0 );
++
++private:
++  virtual Result execute();
++
++  uint mIdentity;
++  QGuardedPtr<KMail::Composer> mWin;
++};
++
+ class KDE_EXPORT KMRedirectCommand : public KMCommand
+ {
+   Q_OBJECT
+--- kmail/kmcomposewin.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmcomposewin.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -1466,8 +1466,9 @@
+   statusBar()->insertItem("", 0, 1);
+   statusBar()->setItemAlignment(0, AlignLeft | AlignVCenter);
+ 
+-  statusBar()->insertItem(i18n(" Column: %1 ").arg("     "),2,0,true);
+-  statusBar()->insertItem(i18n(" Line: %1 ").arg("     "),1,0,true);
++  statusBar()->insertItem(i18n( " Spellcheck: %1 ").arg( "   " ), 3, 0, true );
++  statusBar()->insertItem(i18n( " Column: %1 ").arg("     "), 2, 0, true);
++  statusBar()->insertItem(i18n( " Line: %1 ").arg("     "), 1, 0, true);
+ }
+ 
+ 
+@@ -4125,8 +4126,16 @@
+ //-----------------------------------------------------------------------------
+ void KMComposeWin::slotAutoSpellCheckingToggled( bool on )
+ {
+-  if ( mEditor->autoSpellChecking(on) == -1 )
++  if ( mEditor->autoSpellChecking(on) == -1 ) {
+     mAutoSpellCheckingAction->setChecked(false); // set it to false again
++  }
++
++  QString temp;
++  if ( on )
++    temp = i18n( "Spellcheck: on" );
++  else
++    temp = i18n( "Spellcheck: off" );
++  statusBar()->changeItem( temp, 3 );
+ }
+ //-----------------------------------------------------------------------------
+ void KMComposeWin::slotSpellcheck()
+@@ -4298,24 +4307,30 @@
+   }
+ 
+   QString edtText = mEditor->text();
+-  bool appendNewSig = true;
++
++  if ( mOldSigText.isEmpty() ) {
++    const KPIM::Identity &id =
++      kmkernel->
++      identityManager()->
++      identityForUoidOrDefault( mMsg->headerField( "X-KMail-Identity" ).
++                                stripWhiteSpace().toUInt() );
++    mOldSigText = id.signatureText();
++  }
++
+   // try to truncate the old sig
+-  if( !mOldSigText.isEmpty() )
+-  {
+-    if( edtText.endsWith( mOldSigText ) )
+-      edtText.truncate( edtText.length() - mOldSigText.length() );
+-    else
+-      appendNewSig = false;
++  QString sigStr = mOldSigText + "\\s*$";  // because extra spaces are appended
++  QRegExp rx( sigStr );                    // to the signature in some cases.
++  if ( edtText.contains( rx ) ) {          // hey, that rhymes!
++    edtText.remove( rx );
+   }
++
+   // now append the new sig
+   mOldSigText = ident.signatureText();
+-  if( appendNewSig )
+-  {
+-    if( (!mOldSigText.isEmpty()) &&
+-                   (GlobalSettings::self()->autoTextSignature()=="auto") )
+-      edtText.append( mOldSigText );
+-    mEditor->setText( edtText );
++  if( ( !mOldSigText.isEmpty() ) &&
++      ( GlobalSettings::self()->autoTextSignature() == "auto" ) ) {
++    edtText.append( mOldSigText );
+   }
++  mEditor->setText( edtText );
+ 
+   // disable certain actions if there is no PGP user identity set
+   // for this profile
+@@ -4599,27 +4614,29 @@
+ 
+ void KMComposeWin::fontChanged( const QFont &f )
+ {
+-  QFontDatabase *fontdb = new QFontDatabase();
++  QFont fontTemp = f;
++  fontTemp.setBold( true );
++  fontTemp.setItalic( true );
++  QFontInfo fontInfo( fontTemp );
+ 
+-  if ( fontdb->bold(f.family(), "Bold") ) {
+-    textBoldAction->setChecked( f.bold() ); // if the user has the default font with bold, then show it in the buttonstate
+-    textBoldAction->setEnabled(true);
++  if ( fontInfo.bold() ) {
++    textBoldAction->setChecked( f.bold() );
++    textBoldAction->setEnabled( true ) ;
++  } else {
++    textBoldAction->setEnabled( false );
+   }
+-  else
+-    textBoldAction->setEnabled(false);
+ 
+-  if ( fontdb->italic(f.family(), "Italic") ) {
++  if ( fontInfo.italic() ) {
+     textItalicAction->setChecked( f.italic() );
+-    textItalicAction->setEnabled(true);
++    textItalicAction->setEnabled( true ) ;
++  } else {
++    textItalicAction->setEnabled( false );
+   }
+-  else
+-    textItalicAction->setEnabled(false);
+ 
+   textUnderAction->setChecked( f.underline() );
+ 
+   fontAction->setFont( f.family() );
+   fontSizeAction->setFontSize( f.pointSize() );
+-  delete fontdb;
+ }
+ 
+ void KMComposeWin::alignmentChanged( int a )
+--- kmail/configuredialog.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/configuredialog.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -2309,6 +2309,13 @@
+     }
+     i++;
+   }
++  if ( i == encodings.size() ) {
++    // the current value of overrideCharacterEncoding is an unknown encoding => reset to Auto
++    kdWarning(5006) << "Unknown override character encoding \"" << currentOverrideEncoding
++                    << "\". Resetting to Auto." << endl;
++    mOverrideCharsetCombo->setCurrentItem( 0 );
++    GlobalSettings::self()->setOverrideCharacterEncoding( QString::null );
++  }
+ }
+ 
+ void AppearancePage::ReaderTab::doLoadFromGlobalSettings()
+--- kmail/kmfolderimap.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmfolderimap.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -112,7 +112,7 @@
+   if (mOpenCount > 0) mOpenCount--;
+   if (mOpenCount > 0 && !aForced) return;
+   if (isSelected() && !aForced) {
+-      kdWarning(5006) << "Trying to close the selected folder " << label() << 
++      kdWarning(5006) << "Trying to close the selected folder " << label() <<
+           " - ignoring!" << endl;
+       return;
+   }
+@@ -320,7 +320,7 @@
+   if ( !mAccount->hasCapability("uidplus") ) {
+     // Remember the status with the MD5 as key
+     // so it can be transfered to the new message
+-    mMetaDataMap.insert( aMsg->msgIdMD5(), 
++    mMetaDataMap.insert( aMsg->msgIdMD5(),
+         new KMMsgMetaData(aMsg->status(), serNum) );
+   }
+ 
+@@ -349,7 +349,7 @@
+     if ( !uidplus ) {
+       // Remember the status with the MD5 as key
+       // so it can be transfered to the new message
+-      mMetaDataMap.insert( msg->msgIdMD5(), 
++      mMetaDataMap.insert( msg->msgIdMD5(),
+           new KMMsgMetaData(msg->status(), msg->getMsgSerNum()) );
+     }
+     msg->setTransferInProgress( false );
+@@ -367,7 +367,7 @@
+ //-----------------------------------------------------------------------------
+ int KMFolderImap::addMsg(KMMessage* aMsg, int* aIndex_ret)
+ {
+-  QPtrList<KMMessage> list; 
++  QPtrList<KMMessage> list;
+   list.append(aMsg);
+   QValueList<int> index;
+   int ret = addMsg(list, index);
+@@ -458,7 +458,7 @@
+     // transfer from local folders or other accounts
+     QPtrListIterator<KMMessage> it( msgList );
+     KMMessage* msg;
+-    while ( ( msg = it.current() ) != 0 ) 
++    while ( ( msg = it.current() ) != 0 )
+     {
+       ++it;
+       if ( !msg->transferInProgress() )
+@@ -505,7 +505,7 @@
+       mMetaDataMap.insert( msg->msgIdMD5(), new KMMsgMetaData(msg->status()) );
+     }
+   }
+-  
++
+   QValueList<ulong> uids;
+   getUids(msgList, uids);
+   QStringList sets = makeSets(uids, false);
+@@ -611,7 +611,7 @@
+   // start personal namespace listing and send it directly to slotListResult
+   for ( QStringList::Iterator it = personal.begin(); it != personal.end(); ++it )
+   {
+-    KMail::ListJob* job = new KMail::ListJob( mAccount, type, this, 
++    KMail::ListJob* job = new KMail::ListJob( mAccount, type, this,
+ 	mAccount->addPathToNamespace( *it ) );
+     job->setNamespace( *it );
+     connect( job, SIGNAL(receivedFolders(const QStringList&, const QStringList&,
+@@ -632,7 +632,7 @@
+         this, SLOT(slotCheckNamespace(const QStringList&, const QStringList&,
+             const QStringList&, const QStringList&, const ImapAccountBase::jobData&)));
+     job->start();
+-  }  
++  }
+ }
+ 
+ //-----------------------------------------------------------------------------
+@@ -644,13 +644,13 @@
+ {
+   kdDebug(5006) << "slotCheckNamespace - " << subfolderNames.join(",") << endl;
+ 
+-  // get a correct foldername: 
++  // get a correct foldername:
+   // strip / and make sure it does not contain the delimiter
+   QString name = jobData.path.mid( 1, jobData.path.length()-2 );
+   name.remove( mAccount->delimiterForNamespace( name ) );
+   if ( name.isEmpty() ) {
+     // happens when an empty namespace is defined
+-    slotListResult( subfolderNames, subfolderPaths, 
++    slotListResult( subfolderNames, subfolderPaths,
+         subfolderMimeTypes, subfolderAttributes, jobData );
+     return;
+   }
+@@ -658,9 +658,9 @@
+   folder()->createChildFolder();
+   KMFolderNode *node = 0;
+   for ( node = folder()->child()->first(); node;
+-        node = folder()->child()->next()) 
++        node = folder()->child()->next())
+   {
+-    if ( !node->isDir() && node->name() == name ) 
++    if ( !node->isDir() && node->name() == name )
+       break;
+   }
+   if ( subfolderNames.isEmpty() )
+@@ -680,9 +680,9 @@
+       kdDebug(5006) << "found namespace folder " << name << endl;
+       if ( !mAccount->listOnlyOpenFolders() )
+       {
+-        KMFolderImap* nsFolder = 
++        KMFolderImap* nsFolder =
+           static_cast<KMFolderImap*>(static_cast<KMFolder*>(node)->storage());
+-        nsFolder->slotListResult( subfolderNames, subfolderPaths, 
++        nsFolder->slotListResult( subfolderNames, subfolderPaths,
+             subfolderMimeTypes, subfolderAttributes, jobData );
+       }
+     } else
+@@ -692,17 +692,17 @@
+       KMFolder *fld = folder()->child()->createFolder( name );
+       if ( fld ) {
+         KMFolderImap* f = static_cast<KMFolderImap*> ( fld->storage() );
+-        f->initializeFrom( this, mAccount->addPathToNamespace( name ), 
++        f->initializeFrom( this, mAccount->addPathToNamespace( name ),
+             "inode/directory" );
+         f->close();
+         if ( !mAccount->listOnlyOpenFolders() )
+         {
+-          f->slotListResult( subfolderNames, subfolderPaths, 
++          f->slotListResult( subfolderNames, subfolderPaths,
+               subfolderMimeTypes, subfolderAttributes, jobData );
+         }
+       }
+       kmkernel->imapFolderMgr()->contentsChanged();
+-    }  
++    }
+   }
+ }
+ 
+@@ -748,8 +748,8 @@
+                                    const ImapAccountBase::jobData& jobData )
+ {
+   mSubfolderState = imapFinished;
+-  //kdDebug(5006) << label() << ": folderNames=" << subfolderNames << " folderPaths=" 
+-  //<< subfolderPaths << " mimeTypes=" << subfolderMimeTypes << endl;  
++  //kdDebug(5006) << label() << ": folderNames=" << subfolderNames << " folderPaths="
++  //<< subfolderPaths << " mimeTypes=" << subfolderMimeTypes << endl;
+ 
+   // don't react on changes
+   kmkernel->imapFolderMgr()->quiet(true);
+@@ -770,9 +770,9 @@
+     KMFolderImap* parent = findParent( subfolderPaths.first(), subfolderNames.first() );
+     if ( parent )
+     {
+-      kdDebug(5006) << "KMFolderImap::slotListResult - pass listing to " 
++      kdDebug(5006) << "KMFolderImap::slotListResult - pass listing to "
+         << parent->label() << endl;
+-      parent->slotListResult( subfolderNames, subfolderPaths, 
++      parent->slotListResult( subfolderNames, subfolderPaths,
+           subfolderMimeTypes, subfolderAttributes, jobData );
+       // cleanup
+       QStringList list;
+@@ -798,13 +798,13 @@
+     // create folders if necessary
+     for ( node = folder()->child()->first(); node;
+           node = folder()->child()->next() ) {
+-      if ( !node->isDir() && node->name() == subfolderNames[i] ) 
++      if ( !node->isDir() && node->name() == subfolderNames[i] )
+         break;
+     }
+     if ( node ) {
+       f = static_cast<KMFolderImap*>(static_cast<KMFolder*>(node)->storage());
+-    } 
+-    else if ( subfolderPaths[i].upper() != "/INBOX/" ) 
++    }
++    else if ( subfolderPaths[i].upper() != "/INBOX/" )
+     {
+       kdDebug(5006) << "create folder " << subfolderNames[i] << endl;
+       KMFolder *fld = folder()->child()->createFolder(subfolderNames[i]);
+@@ -829,12 +829,12 @@
+ 
+       f->initializeFrom( this, subfolderPaths[i], subfolderMimeTypes[i] );
+       f->setChildrenState( subfolderAttributes[i] );
+-      if ( mAccount->listOnlyOpenFolders() && 
+-           f->hasChildren() != FolderStorage::ChildrenUnknown ) 
++      if ( mAccount->listOnlyOpenFolders() &&
++           f->hasChildren() != FolderStorage::ChildrenUnknown )
+       {
+         settingsChanged = true;
+       }
+-      
++
+       if ( settingsChanged )
+       {
+         // tell the tree our information changed
+@@ -915,7 +915,7 @@
+ }
+ 
+ //-----------------------------------------------------------------------------
+-void KMFolderImap::checkFolders( const QStringList& subfolderNames, 
++void KMFolderImap::checkFolders( const QStringList& subfolderNames,
+     const QString& myNamespace )
+ {
+   QPtrList<KMFolder> toRemove;
+@@ -928,14 +928,14 @@
+       KMFolderImap* imapFld = static_cast<KMFolderImap*>( fld->storage() );
+       // as more than one namespace can be listed in the root folder we need to make sure
+       // that the folder is within the current namespace
+-      bool isInNamespace = ( myNamespace.isEmpty() || 
++      bool isInNamespace = ( myNamespace.isEmpty() ||
+           myNamespace == mAccount->namespaceForFolder( imapFld ) );
+-      kdDebug(5006) << node->name() << " in namespace " << myNamespace << ":" << 
++      kdDebug(5006) << node->name() << " in namespace " << myNamespace << ":" <<
+         isInNamespace << endl;
+       // ignore some cases
+       QString name = node->name();
+-      bool ignore = ( ( this == mAccount->rootFolder() ) && 
+-          ( imapFld->imapPath() == "/INBOX/" || 
++      bool ignore = ( ( this == mAccount->rootFolder() ) &&
++          ( imapFld->imapPath() == "/INBOX/" ||
+             mAccount->isNamespaceFolder( name ) ||
+ 	    !isInNamespace ) );
+       // additional sanity check for broken folders
+@@ -960,7 +960,7 @@
+ }
+ 
+ //-----------------------------------------------------------------------------
+-void KMFolderImap::initializeFrom( KMFolderImap* parent, QString folderPath, 
++void KMFolderImap::initializeFrom( KMFolderImap* parent, QString folderPath,
+                                    QString mimeType )
+ {
+   setAccount( parent->account() );
+@@ -1060,7 +1060,7 @@
+ //-----------------------------------------------------------------------------
+ ulong KMFolderImap::lastUid()
+ {
+-  if ( mLastUid > 0 ) 
++  if ( mLastUid > 0 )
+       return mLastUid;
+   open();
+   if (count() > 0)
+@@ -1083,7 +1083,7 @@
+   if (job->error()) {
+     if ( job->error() != KIO::ERR_ACCESS_DENIED ) {
+       // we suppress access denied messages because they are normally a result of
+-      // explicitely set ACLs. Do not save this information (e.g. setNoContent) so that 
++      // explicitely set ACLs. Do not save this information (e.g. setNoContent) so that
+       // we notice when this changes
+       mAccount->handleJobError( job, i18n("Error while querying the server status.") );
+     }
+@@ -1095,19 +1095,19 @@
+     int a = cstr.find("X-uidValidity: ");
+     int b = cstr.find("\r\n", a);
+     QString uidv;
+-    if ( (b - a - 15) >= 0 ) 
++    if ( (b - a - 15) >= 0 )
+         uidv = cstr.mid(a + 15, b - a - 15);
+     a = cstr.find("X-Access: ");
+     b = cstr.find("\r\n", a);
+     QString access;
+-    if ( (b - a - 10) >= 0 ) 
++    if ( (b - a - 10) >= 0 )
+         access = cstr.mid(a + 10, b - a - 10);
+     mReadOnly = access == "Read only";
+     a = cstr.find("X-Count: ");
+     b = cstr.find("\r\n", a);
+     int exists = -1;
+     bool ok = false;
+-    if ( (b - a - 9) >= 0 ) 
++    if ( (b - a - 9) >= 0 )
+         exists = cstr.mid(a + 9, b - a - 9).toInt(&ok);
+     if ( !ok ) exists = -1;
+     QString startUid;
+@@ -1275,7 +1275,7 @@
+         uid = (*it).items.remove(uid);
+         if ( msgBase->getMsgSerNum() > 0 ) {
+           saveMsgMetaData( static_cast<KMMessage*>(msgBase) );
+-        }        
++        }
+       }
+       else break;  // happens only, if deleted mails reappear on the server
+     }
+@@ -1382,6 +1382,8 @@
+ //-----------------------------------------------------------------------------
+ void KMFolderImap::flagsToStatus(KMMsgBase *msg, int flags, bool newMsg)
+ {
++  if ( !msg ) return;
++
+   const KMMsgStatus oldStatus = msg->status();
+   // Set flags if they are new
+   if ( (flags & 4) && (oldStatus & KMMsgStatusFlag) == 0 )
+@@ -1455,7 +1457,7 @@
+   (*it).cdata += QCString(data, data.size() + 1);
+   int pos = (*it).cdata.find("\r\n--IMAPDIGEST");
+   if ( pos == -1 ) {
+-    // if we do not find the pattern in the complete string we will not find 
++    // if we do not find the pattern in the complete string we will not find
+     // it in a substring.
+     return;
+   }
+@@ -1552,7 +1554,7 @@
+         if ( folder()->isSystemFolder() && imapPath() == "/INBOX/"
+             && kmkernel->filterMgr()->atLeastOneIncomingFilterAppliesTo( mAccount->id() ) )
+             mAccount->execFilters( msg->getMsgSerNum() );
+-        
++
+         if ( count() > 1 ) {
+           unGetMsg(count() - 1);
+         }
+@@ -2120,7 +2122,7 @@
+   // set the deleted flag for all messages in the folder
+   KURL url = mAccount->getUrl();
+   url.setPath( imapPath() + ";UID=1:*");
+-  if ( mAccount->makeConnection() == ImapAccountBase::Connected ) 
++  if ( mAccount->makeConnection() == ImapAccountBase::Connected )
+   {
+     KIO::SimpleJob *job = KIO::file_delete(url, FALSE);
+     KIO::Scheduler::assignJobToSlave(mAccount->slave(), job);
+@@ -2216,7 +2218,7 @@
+       createFolder( *it );
+     }
+   }
+-  mFoldersPendingCreation.clear();  
++  mFoldersPendingCreation.clear();
+ }
+ 
+ //-----------------------------------------------------------------------------
+@@ -2268,10 +2270,10 @@
+ //-----------------------------------------------------------------------------
+ bool KMFolderImap::isMoveable() const
+ {
+-  return ( hasChildren() == HasNoChildren && 
++  return ( hasChildren() == HasNoChildren &&
+       !folder()->isSystemFolder() ) ? true : false;
+ }
+- 
++
+ //-----------------------------------------------------------------------------
+ const ulong KMFolderImap::serNumForUID( ulong uid )
+ {
+--- kmail/configure.in.in	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/configure.in.in	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -6,8 +6,9 @@
+ 
+ missing_indexlib=ignore
+ AC_ARG_ENABLE(indexlib,
+-	AC_HELP_STRING([--enable-indexlib],[Enable full-text indexing in KMail.]),
+-	AC_DEFINE(HAVE_INDEXLIB,1,[Define if you want full-text indexing in KMail])
++	AC_HELP_STRING([--enable-indexlib],[Enable EXPERIMENTAL full-text indexing in KMail.
++ Use are your own risk!]),
++	AC_DEFINE(HAVE_INDEXLIB,1,[Define if you want EXPERIMENTAL full-text indexing in KMail])
+ 	missing_indexlib=no
+ 	)
+ 
+--- kmail/kmfoldersearch.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmfoldersearch.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -78,6 +78,7 @@
+     mRoot = 0;
+     mSearchPattern = 0;
+     mFoundCount = 0;
++    mSearchCount = 0;
+ 
+     mProcessNextBatchTimer = new QTimer();
+     connect(mProcessNextBatchTimer, SIGNAL(timeout()), this, SLOT(slotProcessNextBatch()));
+@@ -154,6 +155,7 @@
+     }
+ 
+     mFoundCount = 0;
++    mSearchCount = 0;
+     mRunning = true;
+     mRunByIndex = false;
+     // check if this query can be done with the index
+@@ -217,6 +219,7 @@
+                 account->ignoreJobsForFolder( folder );
+             }
+             folder->storage()->search( 0 );
++            mSearchCount += folder->count();
+             folder->close();
+         }
+     }
+@@ -282,6 +285,7 @@
+           SLOT( slotSearchFolderResult( KMFolder*, QValueList<Q_UINT32>,
+                                         const KMSearchPattern*, bool ) ) );
+       --mRemainingFolders;
++      mSearchCount += folder->count();
+       folder->close();
+       mOpenedFolders.remove( folder );
+       if ( mRemainingFolders <= 0 )
+@@ -940,18 +944,18 @@
+       unsigned int count = mFoldersCurrentlyBeingSearched[folder];
+       mFoldersCurrentlyBeingSearched.replace( folder, count+1 );
+     } else {
+-      connect( folder->storage(), 
++      connect( folder->storage(),
+               SIGNAL( searchDone( KMFolder*, Q_UINT32, const KMSearchPattern*, bool ) ),
+               this,
+-              SLOT( slotSearchExamineMsgDone( KMFolder*, Q_UINT32, 
++              SLOT( slotSearchExamineMsgDone( KMFolder*, Q_UINT32,
+                       const KMSearchPattern*, bool ) ) );
+       mFoldersCurrentlyBeingSearched.insert( folder, 1 );
+     }
+     folder->storage()->search( search()->searchPattern(), serNum );
+ }
+ 
+-void KMFolderSearch::slotSearchExamineMsgDone( KMFolder* folder, 
+-                                               Q_UINT32 serNum, 
++void KMFolderSearch::slotSearchExamineMsgDone( KMFolder* folder,
++                                               Q_UINT32 serNum,
+                                                const KMSearchPattern* pattern,
+                                                bool matches )
+ {
+@@ -1103,10 +1107,10 @@
+       unsigned int count = mFoldersCurrentlyBeingSearched[aFolder];
+       mFoldersCurrentlyBeingSearched.replace( aFolder, count+1 );
+     } else {
+-      connect( aFolder->storage(), 
++      connect( aFolder->storage(),
+               SIGNAL( searchDone( KMFolder*, Q_UINT32, const KMSearchPattern*, bool ) ),
+               this,
+-              SLOT( slotSearchExamineMsgDone( KMFolder*, Q_UINT32, 
++              SLOT( slotSearchExamineMsgDone( KMFolder*, Q_UINT32,
+                       const KMSearchPattern*, bool ) ) );
+       mFoldersCurrentlyBeingSearched.insert( aFolder, 1 );
+     }
+--- kmail/kmfilterdlg.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmfilterdlg.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -124,12 +124,18 @@
+   /** Called when the user clicks the 'Delete' button. Deletes the
+       current filter. */
+   void slotDelete();
++  /** Called when the user clicks the 'Top' button. Moves the current
++      filter to the top line. */
++  void slotTop();
+   /** Called when the user clicks the 'Up' button. Moves the current
+       filter up one line. */
+   void slotUp();
+   /** Called when the user clicks the 'Down' button. Moves the current
+       filter down one line. */
+   void slotDown();
++  /** Called when the user clicks the 'Bottom' button. Moves the current
++      filter to the bottom line. */
++  void slotBottom();
+   /** Called when the user clicks the 'Rename' button. Pops up a
+       dialog prompting to enter the new name. */
+   void slotRename();
+@@ -140,14 +146,16 @@
+   /** The listbox displaying the filter list. */
+   QListBox *mListBox;
+   /** The various action buttons. */
+-  QPushButton *mBtnNew, *mBtnCopy, *mBtnDelete, *mBtnUp, *mBtnDown, *mBtnRename;
++  QPushButton *mBtnNew, *mBtnCopy, *mBtnDelete, *mBtnRename;
++  QPushButton *mBtnTop, *mBtnUp, *mBtnDown, *mBtnBot;
+   /** The index of the currently selected item. */
+   int mIdxSelItem;
+   bool mShowLater;
+ private:
+   void enableControls();
+   void insertFilter( KMFilter* aFilter );
+-  void swapNeighbouringFilters( int untouchedOne, int movedOne);
++  void swapFilters( int from, int to );
++  void swapNeighbouringFilters( int untouchedOne, int movedOne );
+   bool bPopFilter;
+ };
+ 
+--- kmail/kmmainwidget.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmmainwidget.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -112,8 +112,9 @@
+   KAction *replyListAction() const { return mReplyListAction; }
+   KActionMenu * replyMenu() const { return mReplyActionMenu; }
+   KActionMenu *forwardMenu() const { return mForwardActionMenu; }
+-  KAction *forwardAction() const { return mForwardAction; }
++  KAction *forwardInlineAction() const { return mForwardInlineAction; }
+   KAction *forwardAttachedAction() const { return mForwardAttachedAction; }
++  KAction *forwardDigestAction() const { return mForwardDigestAction; }
+   KAction *redirectAction() const { return mRedirectAction; }
+   KAction *noQuoteReplyAction() const { return mNoQuoteReplyAction; }
+   KActionMenu *filterMenu() const { return mFilterMenu; }
+@@ -373,8 +374,9 @@
+   void slotReplyAuthorToMsg();
+   void slotReplyListToMsg();
+   void slotReplyAllToMsg();
+-  void slotForwardMsg();
++  void slotForwardInlineMsg();
+   void slotForwardAttachedMsg();
++  void slotForwardDigestMsg();
+   void slotRedirectMsg();
+   void slotNoQuoteReplyToMsg();
+   void slotSubjectFilter();
+@@ -407,9 +409,10 @@
+     *mSaveAttachmentsAction, *mOpenAction, *mViewSourceAction;
+   // Composition actions
+   KAction *mPrintAction, *mReplyAction, *mReplyAllAction, *mReplyAuthorAction,
+-      *mReplyListAction,
+-      *mForwardAction, *mForwardAttachedAction, *mRedirectAction,
+-      *mNoQuoteReplyAction;
++    *mReplyListAction,
++    *mForwardInlineAction, *mForwardAttachedAction, *mForwardDigestAction,
++    *mRedirectAction,
++    *mNoQuoteReplyAction;
+   KActionMenu *mReplyActionMenu;
+   KActionMenu *mForwardActionMenu;
+   // Filter actions
+--- kmail/networkaccount.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/networkaccount.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -25,6 +25,8 @@
+ #ifndef __KMAIL_NETWORKACCOUNT_H__
+ #define __KMAIL_NETWORKACCOUNT_H__
+ 
++#include <qguardedptr.h>
++
+ #include "kmaccount.h"
+ 
+ #include "sieveconfig.h"
+@@ -125,7 +127,7 @@
+ 
+   protected:
+     KMail::SieveConfig mSieveConfig;
+-    KIO::Slave * mSlave;
++    QGuardedPtr<KIO::Slave> mSlave;
+     QString mLogin, mPasswd, mAuth, mHost;
+     unsigned short int mPort;
+     bool mStorePasswd : 1;
+--- kmail/kmreadermainwin.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmreadermainwin.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -43,8 +43,9 @@
+   void slotReplyAllToMsg();
+   void slotReplyAuthorToMsg();
+   void slotReplyListToMsg();
+-  void slotForwardMsg();
++  void slotForwardInlineMsg();
+   void slotForwardAttachedMsg();
++  void slotForwardDigestMsg();
+   void slotRedirectMsg();
+   void slotShowMsgSrc();
+ 
+@@ -60,8 +61,8 @@
+   QMap<int,KMFolder*> mMenuToFolder;
+   // a few actions duplicated from kmmainwidget
+   KAction *mPrintAction, *mReplyAction, *mReplyAllAction, *mReplyAuthorAction,
+-          *mReplyListAction, *mForwardAction,
+-          *mForwardAttachedAction, *mRedirectAction,
++          *mReplyListAction, *mForwardInlineAction,
++          *mForwardAttachedAction, *mForwardDigestAction, *mRedirectAction,
+           *mViewSourceAction;
+   KActionMenu *mReplyActionMenu;
+   KActionMenu *mForwardActionMenu;
+--- kmail/kmsender.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kmail/kmsender.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -173,7 +173,7 @@
+   }
+ 
+   //Ensure the message is correctly and fully parsed
+-  
++
+   /* The above was added by Marc and seems to be necessary to ensure
+    * the mail is in a sane state before sending. The unGet makes the
+    * attached unencrypted version of the mail (if there is one ) disappear.
+@@ -331,10 +331,10 @@
+         imapSentFolder =
+           kmkernel->imapFolderMgr()->findIdString( mCurrentMsg->fcc() );
+     }
+-    // No, or no usable sentFolder, and no, or no usable imapSentFolder, 
++    // No, or no usable sentFolder, and no, or no usable imapSentFolder,
+     // let's try the on in the identity
+     if ( ( sentFolder == 0 || sentFolder->isReadOnly() )
+-      && ( imapSentFolder == 0 || imapSentFolder->isReadOnly() ) 
++      && ( imapSentFolder == 0 || imapSentFolder->isReadOnly() )
+       && !id.fcc().isEmpty() )
+     {
+       sentFolder = kmkernel->folderMgr()->findIdString( id.fcc() );
+@@ -600,7 +600,7 @@
+   QStringList to, cc, bcc;
+   QString sender;
+   extractSenderToCCAndBcc( mCurrentMsg, &sender, &to, &cc, &bcc );
+-  
++
+   // MDNs are required to have an empty envelope from as per RFC2298.
+   if ( messageIsDispositionNotificationReport( mCurrentMsg ) && GlobalSettings::self()->sendMDNsWithEmptySender() )
+     sender = "<>";
+@@ -1052,13 +1052,15 @@
+   QString query = "headers=0&from=";
+   query += KURL::encode_string( sender );
+ 
+-  if ( !to.empty() )
+-    query += "&to=" + to.join( "&to=" );
+-  if ( !cc.empty() )
+-    query += "&cc=" + cc.join( "&cc=" );
+-  if ( !bcc.empty() )
+-    query += "&bcc=" + bcc.join( "&bcc=" );
++  QStringList::ConstIterator it;
+ 
++  for ( it = to.begin(); it != to.end(); ++it )
++    query += "&to=" + KURL::encode_string(*it);
++  for ( it = cc.begin(); it != cc.end(); ++it )
++    query += "&cc=" + KURL::encode_string(*it);
++  for ( it = bcc.begin(); it != bcc.end(); ++it )
++    query += "&bcc=" + KURL::encode_string(*it);
++
+   KMTransportInfo * ti = mSender->transportInfo();
+ 
+   if ( ti->specifyHostname )
+--- doc/kmail/menus.docbook	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ doc/kmail/menus.docbook	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -926,16 +926,24 @@
+ </menuchoice>
+ </term>
+ <listitem>
+-<para>Forwards the message to a new recipient. Using <guimenuitem>Inline</guimenuitem>,
+-the message's text and some important header fields will be copied to the body of the new message
+-with a text marking the forwarded part. Attachments will be forwarded
+-as attachments of the new message. Using <guimenuitem>As Attachment</guimenuitem>
+-the message and its attachments will become an attachment of the new message. The original message
+-headers will be included in the forwarded message, too.
+-<guimenuitem>Redirect</guimenuitem> works like forward, except that the message stays the same (even
+-the <guilabel>From:</guilabel> field). The user who redirected the message is added in special
+-header fields (<literal>Redirect-From</literal>, <literal>Redirect-Date</literal>, <literal>Redirect-To</literal>,
+-&etc;).</para>
++<para>Forwards the message to a new recipient.
++Using <guimenuitem>As Attachment</guimenuitem> the message and its attachments
++will become an attachment of the new message. The original message headers will
++be included in the forwarded message, too.
++
++Using <guimenuitem>Inline</guimenuitem>, the message's text and some important
++header fields will be copied to the body of the new message with a text marking
++the forwarded part. Attachments will be forwarded as attachments of the new
++message.
++
++<guimenuitem>As Digest</guimenuitem> concatenates the messages together as a
++MIME digest attachment.
++
++<guimenuitem>Redirect</guimenuitem> works like forward, except that the message
++stays the same (even the <guilabel>From:</guilabel> field). The user who
++redirected the message is added in special header fields (<literal>Redirect-From</literal>,
++<literal>Redirect-Date</literal>, <literal>Redirect-To</literal>, &etc;).
++</para>
+ </listitem>
+ </varlistentry>
+ 
+--- kaddressbook/xxport/kde2_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/kde2_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -65,7 +65,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល​សៀវភៅ​អាសយដ្ឋាន KDE 2 ចាស់ៗ
+ Comment[lt]=Priedas senosios KDE 2 adresų knygelės importui
+ Comment[ms]=Plug masuk untuk import buku alamat lama KDE 2
+-Comment[nb]=Tilleggsprogram for å importere adressebok fra KDE2
++Comment[nb]=Programtillegg for å importere adressebok fra KDE2
+ Comment[nds]=Moduul för't Importeren vun KDE2-Adressböker
+ Comment[nl]=Plugin voor het importeren van het oude KDE 2-adresboek
+ Comment[nn]=Programtillegg for å importera den gamle KDE 2 adresseboka
+--- kaddressbook/xxport/csv_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/csv_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -64,7 +64,7 @@
+ Comment[km]=កម្មវិធី ជំនួយ​ដើម្បី​នាំចូល និង នាំចេញ​ទំនាក់ទំនង​ក្នុង​ទ្រង់ទ្រាយ​ជា CSV ។
+ Comment[lt]=Priedas, skirtas kontaktų eksportui ir importui CSV formatu
+ Comment[ms]=Plug masuk untuk import dan eksport alamat perhubungan di dalam format CSV
+-Comment[nb]=Tilleggsprogram for import/eksport av kontakter i CSV-format
++Comment[nb]=Programtillegg for import/eksport av kontakter i CSV-format
+ Comment[nds]=Moduul för't Im- un Exporteren vun Kontakten in't CSV-Formaat
+ Comment[nl]=Plugin voor het importeren en exporteren van contactpersonen in CSV-formaat
+ Comment[nn]=Programtillegg for å importera og eksportera kontaktar i CSV-format
+--- kaddressbook/xxport/vcard_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/vcard_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -67,7 +67,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល និង នាំចេញ​ទំនាក់ទំនង​ក្នុង​ទ្រង់ទ្រាយ​ជា vCard
+ Comment[lt]=Įskiepis kontaktų importavimui ir eksportavimui vCard formatu
+ Comment[ms]=Plugin untuk mengimpot dan mengekspot orang hubungan dalam format vCard 
+-Comment[nb]=Tilleggsprogram for import og eksport av kontakter i vCard-format
++Comment[nb]=Programtillegg for import og eksport av kontakter i vCard-format
+ Comment[nds]=Moduul för't Im-/Exporteren vun Kontakten in't vCard-Formaat
+ Comment[nl]=Plugin voor het importeren en exporteren van contactpersonen in vCard-formaat
+ Comment[nn]=Programtillegg for å importera og eksportera kontaktar i vCard-format
+--- kaddressbook/xxport/pab_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/pab_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -22,7 +22,7 @@
+ Name[km]=កម្មវិធី​ជំនួយ KAB MS Exchange Personal Addressbook XXPort
+ Name[lt]=KAB MS Exchange asmeninės adresų knygelės XXPort priedas
+ Name[ms]=Plugin Buku Alamat Peribadi KAB MS Exchange  XXPort Plugin
+-Name[nb]=KAB-tilleggsprogram for import fra MS Exchange
++Name[nb]=KAB-programtillegg for import fra MS Exchange
+ Name[nds]=MSExchange-Importmoduul för KAdressbook
+ Name[nl]=KAB MS Exchange Personal Addressbook XXPort-plugin
+ Name[nn]=KAB MS Exchange personleg adressebok XXPort programtillegg
+@@ -64,7 +64,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល​សៀវភៅ​អាសយដ្ឋាន​ផ្ទាល់​ខ្លួន​របស់ MS Exchange
+ Comment[lt]=Priedas leidžiantis importuoti MS Exchange asmenines adresų knygeles
+ Comment[ms]=Plugin untuk mengimpot Buku Alamat Peribadi MS Exchange 
+-Comment[nb]=Tilleggsprogram for import av personlige adressebøker fra MS Exchange
++Comment[nb]=Programtillegg for import av personlige adressebøker fra MS Exchange
+ Comment[nds]=Moduul för't Importeren vun persöönliche Adressböker ut MS Exchange
+ Comment[nl]=Plugin voor het importeren van MS Exchange-adresboeken
+ Comment[nn]=Programtillegg for å imortera MS Exchange personleg adressebok
+--- kaddressbook/xxport/opera_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/opera_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -65,7 +65,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល​ទំនាក់ទំនង​របស់ Opera
+ Comment[lt]=Priedas Opera kontaktų importui
+ Comment[ms]=Plug masuk untuk import alamat perhubungan Opera
+-Comment[nb]=Tilleggsprogram for å importere Opera-kontakter
++Comment[nb]=Programtillegg for å importere Opera-kontakter
+ Comment[nds]=Modul för't Importeren vun Opera-Kontakten
+ Comment[nl]=Plugin voor het importeren an Opera's contactpersonen
+ Comment[nn]=Programtillegg for å imortera Opera-kontaktar
+--- kaddressbook/xxport/gnokii_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/gnokii_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -23,7 +23,7 @@
+ Name[km]=កម្មវិធី​ជំនួយ KAB Mobile Phone XXPort
+ Name[lt]=KAB mobilaus telefono XXPort priedas
+ Name[ms]=Plug masuk KAB Fon Mudah Alih XXPort
+-Name[nb]=KAB-tilleggsprogram for mobiltelefon
++Name[nb]=KAB-programtillegg for mobiltelefon
+ Name[nds]=Mobiltelefoon-Im-/Exportmoduul för KAdressbook
+ Name[nl]=KAB Mobiele Telefoon XXPort-plugin
+ Name[nn]=KAB Mobiltelefon XXPort programtillegg
+@@ -64,7 +64,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ទូរស័ព្ទ​ចល័ត​ដើម្បី​នាំចូល និង នាំចេញ​ធាតុ​សៀវភៅ​អាសយដ្ឋាន
+ Comment[lt]=Priedas skirtas importuoti ir eksportuoti adresų knygelės įrašus į mobiliuosius telefonus
+ Comment[ms]=Plug masuk Fon Mudah Alih untuk Import dan Eksport Input Buku Alamat
+-Comment[nb]=Tilleggsprogram for import/eksport av adressebok fra/til mobiltelefon
++Comment[nb]=Programtillegg for import/eksport av adressebok fra/til mobiltelefon
+ Comment[nds]=Mobiltelefoon-Moduul för't Im- un Exporteren vun KAdressbook-Indrääg
+ Comment[nl]=Mobiele-telefoon-plugin voor het importeren en exporteren van adresboekitems
+ Comment[nn]=Programtillegg for å importera og eksportera adressebokoppføringar i mobiltelefon
+--- kaddressbook/xxport/bookmark_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/bookmark_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -64,7 +64,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចេញ​អាសយដ្ឋាន​បណ្ដាញ​របស់​ទំនាក់ទំនង ជា​ចំណាំ
+ Comment[lt]=Priedas skirtas žiniatinklio adresų kontaktuose eksportavimui į žymeles
+ Comment[ms]= Plug masuk untuk eksport alamat web untuk perhubungan sebagai tanda laman
+-Comment[nb]=Tilleggsprogram som eksporterer kontaktenes nett-addresser som bokmerker
++Comment[nb]=Programtillegg som eksporterer kontaktenes nett-addresser som bokmerker
+ Comment[nds]=Moduul för't Exporteren vun Kontakt-Nettadressen as Leestekens
+ Comment[nl]=Plugin voor het exporteren van de webadressen van de contactpersonen als bladwijzers
+ Comment[nn]=Programtillegg for å eksportera nettadresser av kontaktar som bokmerker
+--- kaddressbook/xxport/ldif_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/ldif_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -66,7 +66,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល និង នាំចេញ​ទំនាក់ទំនង​ក្នុង​ទ្រង់ទ្រាយ​ជា Netscape និង Mozilla LDIF
+ Comment[lt]=Priedas, skirtas kontaktų importavimui ir eksportavimui Netscape ir Mozilla LDIFF formatu
+ Comment[ms]=Plug masuk untuk import dan eksport alamat perhubungan di dalam format LDIF Netscape dan Mozilla
+-Comment[nb]=Tilleggsprogram for import/eksport av kontakter i Netscape og Mozillas LDIF-format
++Comment[nb]=Programtillegg for import/eksport av kontakter i Netscape og Mozillas LDIF-format
+ Comment[nds]=Moduul för't Im- un Exporteren vun Kontakten in't LDIF-Formaat vun Netscape und Mozilla
+ Comment[nl]=Plugin voor het importeren en exporteren van contactpersonen in Netscape's en Mozilla's LDIF-formaat
+ Comment[nn]=Programtillegg for å importera og eksportera kontaktar i Netscape og Mozilla LDIF-format
+--- kaddressbook/xxport/eudora_xxport.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/xxport/eudora_xxport.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -65,7 +65,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល និង នាំចេញ​ទំនាក់ទំនង​របស់ Eudora
+ Comment[lt]=Priedas Eudora kontaktų importui ir eksportui
+ Comment[ms]=Plug masuk untuk import dan eksport alamat perhubungan Eudora
+-Comment[nb]=Tilleggsprogram for import/eksport av Eudora-kontakter
++Comment[nb]=Programtillegg for import/eksport av Eudora-kontakter
+ Comment[nds]=Moduul för't Im- un Exporteren vun Eudora-Kontakten
+ Comment[nl]=Plugin voor het importeren en exporteren van Eudora-contactpersonen
+ Comment[nn]=Programtillegg for å importera og eksportera Eudora-kontaktar
+--- kaddressbook/features/distributionlist.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/features/distributionlist.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -26,7 +26,7 @@
+ Name[km]=កម្មវិធី​ជំនួយ​បញ្ជី​ចែកចាយ​របស់ KAB
+ Name[lt]=KAB platinimo sąrašo priedas
+ Name[ms]=Plugin Senarai Agihan KAB 
+-Name[nb]=KAB tilleggsprogram for distribusjonslister
++Name[nb]=KAB programtillegg for distribusjonslister
+ Name[nds]=Verdeellist-Moduul för KAdressbook
+ Name[nl]=KAB Distributielijst-plugin
+ Name[nn]=Programtillegg for KAB distribusjonsliste
+@@ -72,7 +72,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​គ្រប់គ្រង​បញ្ជី​ចែកចាយ
+ Comment[lt]=Priedas platinimo sąrašų tvarkymui
+ Comment[ms]=Plug masuk untuk pengurusan senarai edaran
+-Comment[nb]=Tilleggsprogram for å håndtere distribusjonslister
++Comment[nb]=Programtillegg for å håndtere distribusjonslister
+ Comment[nds]=Moduul för't Plegen vun Verdeellisten
+ Comment[nl]=Plugin voor het beheren van distributielijsten
+ Comment[nn]=Programtillegg for handtering av distibusjonsliste
+--- kaddressbook/features/resourceselection.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/features/resourceselection.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -68,7 +68,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​គ្រប់គ្រង​សៀវភៅ​អាសយដ្ឋាន
+ Comment[lt]=Priedas adresų knygelių tvarkymui
+ Comment[ms]=Plugin untuk pengurusan buku alamat
+-Comment[nb]=Tilleggsprogram for å håndtere adressebøker
++Comment[nb]=Programtillegg for å håndtere adressebøker
+ Comment[nds]=Moduul för't Plegen vun Adressböker
+ Comment[nl]=Plugin voor het beheren van adresboeken
+ Comment[nn]=Programtillegg for handtering av adressebøker
+--- kaddressbook/features/resourceselection.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kaddressbook/features/resourceselection.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -191,6 +191,7 @@
+   }
+ 
+   resource->setResourceName( i18n( "%1 address book" ).arg( type ) );
++  resource->setAddressBook(core()->addressBook());
+ 
+   KRES::ConfigDialog dlg( this, QString( "contact" ), resource );
+ 
+--- Makefile.am.in	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ Makefile.am.in	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -38,7 +38,7 @@
+ COMPILE_BEFORE_knotes = libkdepim
+ COMPILE_BEFORE_konsolekalendar = libkdepim
+ 
+-AUTOMAKE_OPTIONS = foreign 1.5
++AUTOMAKE_OPTIONS = foreign 1.6.1
+ DISTCLEANFILES = inst-apps
+ 
+ MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 SUBDIRS
+--- kitchensync/multisynk/konnectorpair.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kitchensync/multisynk/konnectorpair.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -29,6 +29,7 @@
+   : mManager( new KonnectorManager ), mConfig( 0 )
+ {
+   mUid = KApplication::randomString( 10 );
++  mStrategy = ResolveManually;
+ }
+ 
+ KonnectorPair::~KonnectorPair()
+--- libkcal/resourcecachedconfig.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ libkcal/resourcecachedconfig.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -52,7 +52,7 @@
+            SLOT( slotIntervalStateChanged( int ) ) );
+   QHBox *intervalBox = new QHBox( mGroup );
+   new QLabel( i18n("Interval in minutes"), intervalBox );
+-  mIntervalSpin = new QSpinBox( intervalBox );
++  mIntervalSpin = new QSpinBox( 1,900, 1,intervalBox );
+   mIntervalSpin->setEnabled( false );
+ }
+ 
+@@ -92,7 +92,7 @@
+            SLOT( slotIntervalStateChanged( int ) ) );
+   QHBox *intervalBox = new QHBox( mGroup );
+   new QLabel( i18n("Interval in minutes"), intervalBox );
+-  mIntervalSpin = new QSpinBox( intervalBox );
++  mIntervalSpin = new QSpinBox( 1,900, 1,intervalBox );
+   mIntervalSpin->setEnabled( false );
+ 
+   new QRadioButton( i18n("Delayed after changes"), mGroup );
+--- libkcal/libical/zoneinfo/America/Argentina/Jujuy.ics	(.../tags/KDE/3.5.4/kdepim)	(révision 0)
++++ libkcal/libical/zoneinfo/America/Argentina/Jujuy.ics	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -0,0 +1,14 @@
++BEGIN:VCALENDAR
++PRODID:-//Ximian//NONSGML Evolution Olson-VTIMEZONE Converter//EN
++VERSION:2.0
++BEGIN:VTIMEZONE
++TZID:/softwarestudio.org/Olson_20011030_5/America/Argentina/Jujuy
++X-LIC-LOCATION:America/Argentina/Jujuy
++BEGIN:STANDARD
++TZOFFSETFROM:-0300
++TZOFFSETTO:-0300
++TZNAME:ART
++DTSTART:19700101T000000
++END:STANDARD
++END:VTIMEZONE
++END:VCALENDAR
+--- libkcal/libical/zoneinfo/America/Argentina/Cordoba.ics	(.../tags/KDE/3.5.4/kdepim)	(révision 0)
++++ libkcal/libical/zoneinfo/America/Argentina/Cordoba.ics	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -0,0 +1,14 @@
++BEGIN:VCALENDAR
++PRODID:-//Ximian//NONSGML Evolution Olson-VTIMEZONE Converter//EN
++VERSION:2.0
++BEGIN:VTIMEZONE
++TZID:/softwarestudio.org/Olson_20011030_5/America/Argentina/Cordoba
++X-LIC-LOCATION:America/Argentina/Cordoba
++BEGIN:STANDARD
++TZOFFSETFROM:-0300
++TZOFFSETTO:-0300
++TZNAME:ART
++DTSTART:19700101T000000
++END:STANDARD
++END:VTIMEZONE
++END:VCALENDAR
+--- libkcal/libical/zoneinfo/America/Argentina/Catamarca.ics	(.../tags/KDE/3.5.4/kdepim)	(révision 0)
++++ libkcal/libical/zoneinfo/America/Argentina/Catamarca.ics	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -0,0 +1,14 @@
++BEGIN:VCALENDAR
++PRODID:-//Ximian//NONSGML Evolution Olson-VTIMEZONE Converter//EN
++VERSION:2.0
++BEGIN:VTIMEZONE
++TZID:/softwarestudio.org/Olson_20011030_5/America/Argentina/Catamarca
++X-LIC-LOCATION:America/Argentina/Catamarca
++BEGIN:STANDARD
++TZOFFSETFROM:-0300
++TZOFFSETTO:-0300
++TZNAME:ART
++DTSTART:19700101T000000
++END:STANDARD
++END:VTIMEZONE
++END:VCALENDAR
+--- libkcal/libical/zoneinfo/America/Argentina/Mendoza.ics	(.../tags/KDE/3.5.4/kdepim)	(révision 0)
++++ libkcal/libical/zoneinfo/America/Argentina/Mendoza.ics	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -0,0 +1,14 @@
++BEGIN:VCALENDAR
++PRODID:-//Ximian//NONSGML Evolution Olson-VTIMEZONE Converter//EN
++VERSION:2.0
++BEGIN:VTIMEZONE
++TZID:/softwarestudio.org/Olson_20011030_5/America/Argentina/Mendoza
++X-LIC-LOCATION:America/Argentina/Mendoza
++BEGIN:STANDARD
++TZOFFSETFROM:-0300
++TZOFFSETTO:-0300
++TZNAME:ART
++DTSTART:19700101T000000
++END:STANDARD
++END:VTIMEZONE
++END:VCALENDAR
+--- libkcal/libical/zoneinfo/America/Argentina/Buenos_Aires.ics	(.../tags/KDE/3.5.4/kdepim)	(révision 0)
++++ libkcal/libical/zoneinfo/America/Argentina/Buenos_Aires.ics	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -0,0 +1,14 @@
++BEGIN:VCALENDAR
++PRODID:-//Ximian//NONSGML Evolution Olson-VTIMEZONE Converter//EN
++VERSION:2.0
++BEGIN:VTIMEZONE
++TZID:/softwarestudio.org/Olson_20011030_5/America/Argentina/Buenos_Aires
++X-LIC-LOCATION:America/Argentina/Buenos_Aires
++BEGIN:STANDARD
++TZOFFSETFROM:-0300
++TZOFFSETTO:-0300
++TZNAME:ART
++DTSTART:19700101T000000
++END:STANDARD
++END:VTIMEZONE
++END:VCALENDAR
+--- libkcal/libical/zoneinfo/zones.tab	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ libkcal/libical/zoneinfo/zones.tab	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -55,6 +55,11 @@
+ +0181200 -0630400 America/Anguilla
+ +0170300 -0614800 America/Antigua
+ -0071200 -0481200 America/Araguaina
++-0343600 -0582700 America/Argentina/Buenos_Aires
++-0282800 -0654700 America/Argentina/Catamarca
++-0312400 -0641100 America/Argentina/Cordoba
++-0241100 -0651800 America/Argentina/Jujuy
++-0325300 -0684900 America/Argentina/Mendoza
+ +0123000 -0685800 America/Aruba
+ -0251600 -0574000 America/Asuncion
+ +0130600 -0593700 America/Barbados
+@@ -220,19 +225,17 @@
+ +0013300 +1102000 Asia/Kuching
+ +0292000 +0475900 Asia/Kuwait
+ +0221400 +1133500 Asia/Macao
+++0221400 +1133500 Asia/Macau
+ +0593400 +1504800 Asia/Magadan
+--0050700 +1192400 Asia/Makassar
+ +0143500 +1210000 Asia/Manila
+ +0233600 +0583500 Asia/Muscat
+ +0351000 +0332200 Asia/Nicosia
+ +0550200 +0825500 Asia/Novosibirsk
+ +0550000 +0732400 Asia/Omsk
+-+0511300 +0512100 Asia/Oral
+ +0113300 +1045500 Asia/Phnom_Penh
+ +0000200 +1092000 Asia/Pontianak
+ +0390100 +1254500 Asia/Pyongyang
+ +0251700 +0513200 Asia/Qatar
+-+0444800 +0652800 Asia/Qyzylorda
+ +0164700 +0961000 Asia/Rangoon
+ +0243800 +0464300 Asia/Riyadh
+ +0104500 +1064000 Asia/Saigon
+--- libkcal/libical/zoneinfo/Asia/Macau.ics	(.../tags/KDE/3.5.4/kdepim)	(révision 0)
++++ libkcal/libical/zoneinfo/Asia/Macau.ics	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -0,0 +1,14 @@
++BEGIN:VCALENDAR
++PRODID:-//Ximian//NONSGML Evolution Olson-VTIMEZONE Converter//EN
++VERSION:2.0
++BEGIN:VTIMEZONE
++TZID:/softwarestudio.org/Olson_20011030_5/Asia/Macau
++X-LIC-LOCATION:Asia/Macau
++BEGIN:STANDARD
++TZOFFSETFROM:+0800
++TZOFFSETTO:+0800
++TZNAME:CST
++DTSTART:19700101T000000
++END:STANDARD
++END:VTIMEZONE
++END:VCALENDAR
+--- libkcal/resourcecached.h	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ libkcal/resourcecached.h	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -121,19 +121,11 @@
+     int saveInterval() const;
+ 
+     /**
+-      Set time of last load.
+-    */
+-    void setLastLoad( const QDateTime & );
+-    /**
+       Return time of last load.
+     */
+     QDateTime lastLoad() const;
+ 
+     /**
+-      Set time of last save.
+-    */
+-    void setLastSave( const QDateTime & );
+-    /**
+       Return time of last save.
+     */
+     QDateTime lastSave() const;
+--- kpilot/conduits/vcalconduit/todo-conduit.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kpilot/conduits/vcalconduit/todo-conduit.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -69,7 +69,7 @@
+ Name[nds]=Opgaven (KOrganizer)
+ Name[nl]=Taken (KOrganizer)
+ Name[nn]=Oppgåveliste (KOrganizer)
+-Name[pl]=Do zrobienia (Organizator)
++Name[pl]=Do zrobienia (Korganizer)
+ Name[pt]=Por Fazer (KOrganizer)
+ Name[pt_BR]=Tarefas (KOrganizer)
+ Name[ru]=Задачи (KOrganizer)
+--- kpilot/conduits/vcalconduit/vcal-conduit.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kpilot/conduits/vcalconduit/vcal-conduit.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -29,7 +29,7 @@
+ Name[nds]=Kalenner (KOrganizer)
+ Name[nl]=Agenda (KOrganizer)
+ Name[nn]=Kalender (KOrganizer)
+-Name[pl]=Kalendarz (Organizator)
++Name[pl]=Kalendarz (Korganizer)
+ Name[pt]=Calendário (KOrganizer)
+ Name[pt_BR]=Calendário (KOrganizer)
+ Name[ru]=Календарь (KOrganizer)
+--- kontact/plugins/newsticker/kcmkontactknt.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ kontact/plugins/newsticker/kcmkontactknt.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -79,7 +79,7 @@
+ 
+   mTitle->setText( title );
+   mURL->setText( url );
+-
++  mTitle->setFocus();
+   connect( mTitle, SIGNAL( textChanged( const QString& ) ),
+            this, SLOT( modified() ) );
+   connect( mURL, SIGNAL( textChanged( const QString& ) ),
+--- korganizer/kogroupwareprefspage.ui	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/kogroupwareprefspage.ui	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -84,6 +84,9 @@
+                                 <property name="name">
+                                     <cstring>publishDelay</cstring>
+                                 </property>
++                                <property name="minValue">
++                                    <number>1</number>
++                                </property>
+                                 <property name="whatsThis" stdset="0">
+                                     <string>Configure minimum the interval of time in minutes between each upload here. This configuration is only effective in case you choose to publish your information automatically.</string>
+                                 </property>
+@@ -591,6 +594,22 @@
+         <slot>slotChanged()</slot>
+     </connection>
+ </connections>
++<tabstops>
++    <tabstop>groupwareTab</tabstop>
++    <tabstop>publishEnable</tabstop>
++    <tabstop>publishDelay</tabstop>
++    <tabstop>publishDays</tabstop>
++    <tabstop>publishUrl</tabstop>
++    <tabstop>publishUser</tabstop>
++    <tabstop>publishPassword</tabstop>
++    <tabstop>publishSavePassword</tabstop>
++    <tabstop>retrieveEnable</tabstop>
++    <tabstop>fullDomainRetrieval</tabstop>
++    <tabstop>retrieveUrl</tabstop>
++    <tabstop>retrieveUser</tabstop>
++    <tabstop>retrievePassword</tabstop>
++    <tabstop>retrieveSavePassword</tabstop>
++</tabstops>
+ <includes>
+     <include location="global" impldecl="in declaration">kdepimmacros.h</include>
+     <include location="local" impldecl="in implementation">kogroupwareprefspage.ui.h</include>
+--- korganizer/plugins/projectview/projectview.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/plugins/projectview/projectview.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -77,7 +77,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​នេះ​ផ្ដល់​នូវ​ទិដ្ឋភាព​រៀបចំ​គម្រោង​សម្រាប់ korganizer (ដូចជា ទិដ្ឋភាព​ការងារ​ត្រូវ​ធ្វើ ឬ ទិដ្ឋភាព​ខែ​ជាដើម) ។ បើ​អ្នក​ធ្វើ​ឲ្យ​កម្មវិធី​ជំនួយ​នេះ​ប្រើ​បាន អ្នក​នឹង​អាច​ប្ដូរ​ទិដ្ឋភាព​គម្រោង ហើយ​មើល​ព្រឹត្តិការណ៍​របស់​អ្នក​ដូចជា​នៅ​ក្នុងកម្មវិធី​រៀបចំ​គម្រោង​អញ្ចឹង​ដែរ ។
+ Comment[lt]=Šis priedas pateikia KOrganizaer projekto planavimo vaizdą (panašiai kaip darbų ar mėnesio vaizdai). Jei įjungsite šį įskiepį, galėsite peršokti į projekto vaizdą ir peržiūrėti savo darbų sąrašą kaip projektą.
+ Comment[ms]=Plugin ini menyediakan paparan perancangan projek untuk KOrganizer (seperti tugasan atau paparan bulan). Jika plugin ini diaktifkan, anda boleh beralih ke paparan projek dan paparkan senarai tugasan seperti dalam perancang projek. 
+-Comment[nb]=Dette tilleggsprogrammet lager en prosjektplan-visning for KOrganizer (som i gjørelister og månedsvisninger). Slår du på dette tilleggsprogrammet kan du bytte til prosjektvisning og se på gjørelista som i en prosjektplan.
++Comment[nb]=Dette programtilleggmet lager en prosjektplan-visning for KOrganizer (som i gjørelister og månedsvisninger). Slår du på dette programtilleggmet kan du bytte til prosjektvisning og se på gjørelista som i en prosjektplan.
+ Comment[nds]=Mit dit Moduul kannst Du in KOrganizer en Projektplaan-Ansicht opropen (jüst as de Opgaven- oder Maandansichten). Wenn Du dit Moduul aktiveerst, kannst Du na de Projektansicht wesseln un Dien Opgavenlist as mit en Projektplaner ankieken.
+ Comment[nl]=Deze plugin biedt een projectweergave voor KOrganizer (net zoals een takenlijst of maandweergave). Wanneer u deze plugin aanzet, kunt u deze weergave aanzetten om uw takenlijst te bekijken als een projectplanner.
+ Comment[nn]=Dette programtillegget lagar ei prosjektplanvising for KOrganizer (slik som oppgåve- eller månadsvisingane). Dersom du brukar dette programtillegget, kan du visa oppgåvelista som i ein prosjektplanleggjar.
+--- korganizer/plugins/printing/whatsnext/whatsnextprint.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/plugins/printing/whatsnext/whatsnextprint.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -56,7 +56,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​នេះ​អនុញ្ញាត​ឲ្យ​អ្នក​បោះពុម្ព​បញ្ជី​នៃ​ព្រឹត្តិការណ៍ និង ការងារ​ត្រូវ​ធ្វើ​បន្តបន្ទាប់
+ Comment[lt]=Šis priedas leidžia spausdinti sąrašą visų artėjančių įvykių ir darbų.
+ Comment[ms]=Plugin ini membenarkan anda mencetak senarai semua peristiwa dan tugasan mendatang. 
+-Comment[nb]=Med dette tilleggsprogrammet kan du skrive ut en liste over kommende hendelser og ting som skal gjøres.
++Comment[nb]=Med dette programtilleggmet kan du skrive ut en liste over kommende hendelser og ting som skal gjøres.
+ Comment[nds]=Mit dit Moduul kann en List vun de direktemang nakamen Begeefnissen un Opgaven utdruckt warrn.
+ Comment[nl]=Deze plugin maakt het mogelijk om een lijst van alle komende evenementen en taken uit te printen.
+ Comment[nn]=Dette programtillegget lèt deg skriva ut ei liste over alle dei komande hendingane og oppføringane i hugselista.
+--- korganizer/plugins/printing/journal/journalprint.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/plugins/printing/journal/journalprint.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -56,7 +56,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​នេះ​អនុញ្ញាត​ឲ្យ​អ្នក​បោះពុម្ព​ធាតុ​ទិនានុប្បវត្តិ (ធាតុ​កំណត់ហេតុ​ប្រចាំ​ថ្ងៃ) ។
+ Comment[lt]=Šis priedas leidžia spausdinti dienyno įrašus.
+ Comment[ms]=Plugin ini membenarkan anda mencetak entri jurnal  (entri diari).
+-Comment[nb]=Med dette tilleggsprogrammet kan du skrive ut oppføringer i dagboka.
++Comment[nb]=Med dette programtilleggmet kan du skrive ut oppføringer i dagboka.
+ Comment[nds]=Mit dit Moduul köönt Daagbook-Indrääg utdruckt warrn.
+ Comment[nl]=Deze plugin maakt het mogelijk om journalen uit te printen (dagboekitems).
+ Comment[nn]=Dette programtillegget lèt deg skriva ut dagboksoppføringar.
+--- korganizer/plugins/printing/list/listprint.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/plugins/printing/list/listprint.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -56,7 +56,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​នេះ​អនុញ្ញាត​ឲ្យ​អ្នក​បោះពុម្ព​ព្រឹត្តិការណ៍ និង ការងារ​ត្រូវ​ធ្វើក្នុង​ទម្រង់​ជា​បញ្ជី ។
+ Comment[lt]=Šis priedas leidžia spausdinti įvykius ir darbus sąrašo forma.
+ Comment[ms]=Plugin ini membenarkan anda mencetak peristiwa dan tugasan dalam borang senarai.
+-Comment[nb]=Med dette tilleggsprogrammet kan du skrive ut hendelser og gjørelister på liste-form.
++Comment[nb]=Med dette programtilleggmet kan du skrive ut hendelser og gjørelister på liste-form.
+ Comment[nds]=Mit dit Moduul köönt Begeefnissen un Opgaven as Listen utdruckt warrn.
+ Comment[nl]=Deze plugin maakt het mogelijk om evenementen en taken in lijstvorm uit te printen.
+ Comment[nn]=Dette programtillegget lèt deg skriva ut hendingar og hugselister på listeform.
+--- korganizer/plugins/timespanview/timespanview.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/plugins/timespanview/timespanview.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -56,7 +56,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ​នេះ​ផ្ដល់​នូវ​ទិដ្ឋភាព​រយៈពេល​សម្រាប់ korganizer (ដូចជា ទិដ្ឋភាព​ការងារ​ត្រូវ​ធ្វើ ឬ ទិដ្ឋភាព​ខែ​ជាដើម) ។ បើ​អ្នក​ធ្វើ​ឲ្យ​កម្មវិធី​ជំនួយ​នេះ​ប្រើ​បាន អ្នក​នឹង​អាច​ប្ដូរ​ទិដ្ឋភាព​រយៈពេល ហើយ​មើល​ព្រឹត្តិការណ៍​របស់​អ្នក​ដូចជា​នៅ​ក្នុងដ្យាក្រាម Gantt អញ្ចឹង​ដែរ ។
+ Comment[lt]=Šis priedas korganizer programoje sudaro galimybę apžvelgti laiko tarpą (pvz., darbų arba mėnesio peržiūra). Įgalinus šį priedą galėsite persijungti į laiko tarpo peržiūrą ir žiūrėti įvykius tarsi Gantt diagramoje.
+ Comment[ms]=Plugin ini menyediakan paparan kitar waktu  untuk korganizer (seperti tugasan atau paparan bulan). Jika plugin ini diaktifkan,anda boleh beralih ke paparan kitar masa dan paparkan peristiwa seperti dalam diagram Gantt. 
+-Comment[nb]=Dette tilleggsprogrammet lager en periodevisning for korganizer (slik som gjøreliste og månedsvisning). Hvis du slår på dette tilleggsprogrammet kan du bytte til periodevisning og se hendelser som i et Gantt-diagram.
++Comment[nb]=Dette programtilleggmet lager en periodevisning for korganizer (slik som gjøreliste og månedsvisning). Hvis du slår på dette programtilleggmet kan du bytte til periodevisning og se hendelser som i et Gantt-diagram.
+ Comment[nds]=Mit dit Moduul kannst Du in KOrganizer en Tietbruuk-Ansicht opropen (jüst as de Opgaven- oder Maandansichten). Wenn Du dit Moduul aktiveerst, kannst Du na de Tietbruukansicht wesseln un Dien Begeefnissen as Ganntt-Diagramm ankieken.
+ Comment[nl]=Deze plugin biedt een weergave voor KOrganizer (zoals de takenlijst en de maandweergave). Wanneer u deze plugin inschakelt kunt u kiezen voor een weergave waarin u uw evenementen in een Gantt-diagram kunt bekijken.
+ Comment[pl]=Ta wtyczka tworzy widok zakresu czasu w KOrganizerze (tak jak widok zadań do zrobienia lub widok miesiąca). Po włączeniu tej wtyczki możliwe jest przełączenie się na widok zakresu czasu i przeglądanie zdarzeń jak na diagramie Gantta.
+--- korganizer/plugins/hebrew/configdialog.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/plugins/hebrew/configdialog.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -26,7 +26,7 @@
+ #include <kstandarddirs.h>
+ #include <ksimpleconfig.h>
+ 
+-ConfigDialog::ConfigDialog(QWidget * parent):KDialogBase(Plain, i18n("Configure Holidays"), Ok, Ok,
++ConfigDialog::ConfigDialog(QWidget * parent):KDialogBase(Plain, i18n("Configure Holidays"), Ok|Cancel, Ok,
+             parent)
+ {
+   QFrame *topFrame = plainPage();
+--- korganizer/korganizer_configfreebusy.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/korganizer_configfreebusy.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -39,7 +39,7 @@
+ Name[nds]=Free/Bunnen
+ Name[nl]=Vrij/bezet
+ Name[nn]=Ledig/opptatt
+-Name[pl]=Wolny/Zajęty
++Name[pl]=Wolny/zajęty
+ Name[pt]=Livre/Ocupado
+ Name[pt_BR]=Livre/Ocupado
+ Name[ru]=Занятое время
+--- korganizer/korganizer.desktop	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/korganizer.desktop	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -35,7 +35,7 @@
+ Comment[nb]=Et kalender- og tidsplanleggingsprogram
+ Comment[nds]=Kalenner un Tietplaner
+ Comment[nl]=Agenda- en afsprakenprogramma
+-Comment[nn]=Kalender- og planleggjingsprogram
++Comment[nn]=Kalender- og planleggingsprogram
+ Comment[nso]=Lenaneo la Peakanyo ya Tshupamabaka
+ Comment[pl]=Kalendarz i terminarz
+ Comment[pt]=Calendário e Programa de Escalonamento
+--- korganizer/resourceview.cpp	(.../tags/KDE/3.5.4/kdepim)	(révision 574183)
++++ korganizer/resourceview.cpp	(.../branches/KDE/3.5/kdepim)	(révision 574183)
+@@ -452,7 +452,7 @@
+ void ResourceView::editResource()
+ {
+   ResourceItem *item = currentItem();
+-
++  if (!item) return;
+   ResourceCalendar *resource = item->resource();
+ 
+   KRES::ConfigDialog dlg( this, QString("calendar"), resource,

Modified: trunk/packages/kdepim/debian/patches/11_lib_link.diff
===================================================================
--- trunk/packages/kdepim/debian/patches/11_lib_link.diff	2006-08-19 12:52:31 UTC (rev 4355)
+++ trunk/packages/kdepim/debian/patches/11_lib_link.diff	2006-08-19 13:41:14 UTC (rev 4356)
@@ -1,7 +1,3 @@
-Index: kalarm/kalarmd/Makefile.am
-===================================================================
-RCS file: /home/kde/kdepim/kalarm/kalarmd/Makefile.am,v
-retrieving revision 1.52
 diff -u -r1.52 Makefile.am
 --- kalarm/kalarmd/Makefile.am	20 Feb 2005 20:24:55 -0000	1.52
 +++ kalarm/kalarmd/Makefile.am	6 Mar 2005 06:55:31 -0000

Modified: trunk/packages/kdepim/debian/patches/13_mimelib_self_contained.diff
===================================================================
--- trunk/packages/kdepim/debian/patches/13_mimelib_self_contained.diff	2006-08-19 12:52:31 UTC (rev 4355)
+++ trunk/packages/kdepim/debian/patches/13_mimelib_self_contained.diff	2006-08-19 13:41:14 UTC (rev 4356)
@@ -1,6 +1,6 @@
-diff -urN kdepim-3.4.3.old/mimelib/Makefile.am kdepim-3.4.3/mimelib/Makefile.am
---- kdepim-3.4.3.old/mimelib/Makefile.am	2005-12-01 20:44:15.000000000 +0100
-+++ kdepim-3.4.3/mimelib/Makefile.am	2005-12-01 20:01:45.000000000 +0100
+diff -Nur kdepim-3.5.4/mimelib/Makefile.am kdepim-3.5.4.new/mimelib/Makefile.am
+--- kdepim-3.5.4/mimelib/Makefile.am	2005-09-10 10:24:49.000000000 +0200
++++ kdepim-3.5.4.new/mimelib/Makefile.am	2006-08-18 15:31:28.000000000 +0200
 @@ -57,7 +57,7 @@
      uuencode.cpp \
      binhex.cpp
@@ -10,9 +10,9 @@
  
  check_PROGRAMS = test_boyermor
  
-diff -urN kdepim-3.4.3.old/mimelib/mimelib/config.h kdepim-3.4.3/mimelib/mimelib/config.h
---- kdepim-3.4.3.old/mimelib/mimelib/config.h	2005-10-05 15:37:00.000000000 +0200
-+++ kdepim-3.4.3/mimelib/mimelib/config.h	2005-12-01 20:46:32.000000000 +0100
+diff -Nur kdepim-3.5.4/mimelib/mimelib/config.h kdepim-3.5.4.new/mimelib/mimelib/config.h
+--- kdepim-3.5.4/mimelib/mimelib/config.h	2005-09-10 10:24:49.000000000 +0200
++++ kdepim-3.5.4.new/mimelib/mimelib/config.h	2006-08-18 15:32:05.000000000 +0200
 @@ -125,8 +125,7 @@
  #      define DW_EXPORT __declspec(dllimport)
  #   endif

Modified: trunk/packages/kdepim/debian/patches/14_kmail_filter_icons.diff
===================================================================
--- trunk/packages/kdepim/debian/patches/14_kmail_filter_icons.diff	2006-08-19 12:52:31 UTC (rev 4355)
+++ trunk/packages/kdepim/debian/patches/14_kmail_filter_icons.diff	2006-08-19 13:41:14 UTC (rev 4356)
@@ -1,6 +1,6 @@
-diff -urN kdepim-3.5.3.old/kmail/kmail-3.5-filter-icons.pl kdepim-3.5.3/kmail/kmail-3.5-filter-icons.pl
---- kdepim-3.5.3.old/kmail/kmail-3.5-filter-icons.pl	1969-12-31 19:00:00.000000000 -0500
-+++ kdepim-3.5.3/kmail/kmail-3.5-filter-icons.pl	2006-06-28 11:53:16.000000000 -0400
+diff -Nur kdepim-3.5.4/kmail/kmail-3.5-filter-icons.pl kdepim-3.5.4.new/kmail/kmail-3.5-filter-icons.pl
+--- kdepim-3.5.4/kmail/kmail-3.5-filter-icons.pl	1970-01-01 01:00:00.000000000 +0100
++++ kdepim-3.5.4.new/kmail/kmail-3.5-filter-icons.pl	2006-08-18 15:46:03.000000000 +0200
 @@ -0,0 +1,22 @@
 +#!/usr/bin/perl -w
 +
@@ -24,9 +24,9 @@
 +    print "# DELETE $currentGroup$key\n${currentGroup}\nIcon=mail_ham\n" if $value eq "mark_as_ham";
 +  }
 +}
-diff -urN kdepim-3.5.3.old/kmail/kmail.upd kdepim-3.5.3/kmail/kmail.upd
---- kdepim-3.5.3.old/kmail/kmail.upd	2006-06-28 11:44:36.000000000 -0400
-+++ kdepim-3.5.3/kmail/kmail.upd	2006-06-28 11:54:13.000000000 -0400
+diff -Nur kdepim-3.5.4/kmail/kmail.upd kdepim-3.5.4.new/kmail/kmail.upd
+--- kdepim-3.5.4/kmail/kmail.upd	2006-07-22 10:14:16.000000000 +0200
++++ kdepim-3.5.4.new/kmail/kmail.upd	2006-08-18 15:47:36.000000000 +0200
 @@ -158,6 +158,10 @@
  Id=3.4.1
  File=kmailrc
@@ -38,9 +38,9 @@
  # Remove the stored size so that we get a reasonable default now that we have 2 columns in the folder selection dialog
  Id=3.5.4
  File=kmailrc
-diff -urN kdepim-3.5.3.old/kmail/kmstartup.cpp kdepim-3.5.3/kmail/kmstartup.cpp
---- kdepim-3.5.3.old/kmail/kmstartup.cpp	2006-06-28 11:44:36.000000000 -0400
-+++ kdepim-3.5.3/kmail/kmstartup.cpp	2006-06-28 11:54:44.000000000 -0400
+diff -Nur kdepim-3.5.4/kmail/kmstartup.cpp kdepim-3.5.4.new/kmail/kmstartup.cpp
+--- kdepim-3.5.4/kmail/kmstartup.cpp	2006-07-22 10:14:16.000000000 +0200
++++ kdepim-3.5.4.new/kmail/kmstartup.cpp	2006-08-18 15:48:04.000000000 +0200
 @@ -114,6 +114,7 @@
      "3.4a",
      "3.4b",
@@ -49,15 +49,15 @@
      "3.5.4"
    };
    static const int numUpdates = sizeof updates / sizeof *updates;
-diff -urN kdepim-3.5.3.old/kmail/Makefile.am kdepim-3.5.3/kmail/Makefile.am
---- kdepim-3.5.3.old/kmail/Makefile.am	2006-06-28 11:44:37.000000000 -0400
-+++ kdepim-3.5.3/kmail/Makefile.am	2006-06-28 11:55:21.000000000 -0400
+diff -Nur kdepim-3.5.4/kmail/Makefile.am kdepim-3.5.4.new/kmail/Makefile.am
+--- kdepim-3.5.4/kmail/Makefile.am	2006-08-18 15:39:43.000000000 +0200
++++ kdepim-3.5.4.new/kmail/Makefile.am	2006-08-18 15:49:08.000000000 +0200
 @@ -175,7 +175,8 @@
                  kmail-3.3-misc.pl \
                  kmail-3.3b1-misc.pl \
                  kmail-3.4-misc.pl \
 -                kmail-3.4.1-update-status-filters.pl
-+                kmail-3.4.1-update-status-filters.pl \
++		kmail-3.4.1-update-status-filters.pl \
 +                kmail-3.5-filter-icons.pl
  
  confdir = $(kde_confdir)

Added: trunk/packages/kdepim/debian/patches/15_kdepim_debug.diff
===================================================================
--- trunk/packages/kdepim/debian/patches/15_kdepim_debug.diff	2006-08-19 12:52:31 UTC (rev 4355)
+++ trunk/packages/kdepim/debian/patches/15_kdepim_debug.diff	2006-08-19 13:41:14 UTC (rev 4356)
@@ -0,0 +1,209 @@
+diff -Nur kdepim-3.5.4/kmail/kmfoldercachedimap.cpp kdepim-3.5.4.new/kmail/kmfoldercachedimap.cpp
+--- kdepim-3.5.4/kmail/kmfoldercachedimap.cpp	2006-08-18 16:00:56.000000000 +0200
++++ kdepim-3.5.4.new/kmail/kmfoldercachedimap.cpp	2006-08-18 16:35:10.000000000 +0200
+@@ -75,6 +75,7 @@
+ #include <globalsettings.h>
+ 
+ #define UIDCACHE_VERSION 1
++#define MAIL_LOSS_DEBUGGING 1
+ 
+ static QString incidencesForToString( KMFolderCachedImap::IncidencesFor r ) {
+   switch (r) {
+@@ -150,10 +151,22 @@
+     mFolderRemoved( false ),
+     /*mHoldSyncs( false ),*/ mRecurse( true ),
+     mStatusChangedLocally( false ), mAnnotationFolderTypeChanged( false ),
+-    mIncidencesForChanged( false ), mPersonalNamespacesCheckDone( true )
++    mIncidencesForChanged( false ), mPersonalNamespacesCheckDone( true ),
++    mFoundAnIMAPDigest( false )
+ {
+   setUidValidity("");
+-  readUidCache();
++  // if we fail to read a uid file but there is one, nuke it
++  if ( readUidCache() == -1 ) {
++    if ( QFile::exists( uidCacheLocation() ) ) {
++        KMessageBox::error( 0,
++        i18n( "The UID cache file for folder %1 could not be read. There "
++              "could be a problem with file system permission, or it is corrupted."
++              ).arg( folder->prettyURL() ) );
++        // try to unlink it, in case it was corruped. If it couldn't be read 
++        // because of permissions, this will fail, which is fine
++        unlink( QFile::encodeName( uidCacheLocation() ) );
++    }
++  }
+ 
+   mProgress = 0;
+ }
+@@ -306,7 +319,7 @@
+   if( uidValidity().isEmpty() || uidValidity() == "INVALID" ) {
+     // No info from the server yet, remove the file.
+     if( QFile::exists( uidCacheLocation() ) )
+-      unlink( QFile::encodeName( uidCacheLocation() ) );
++      return unlink( QFile::encodeName( uidCacheLocation() ) );
+     return 0;
+   }
+ 
+@@ -317,12 +330,18 @@
+     str << uidValidity() << endl;
+     str << lastUid() << endl;
+     uidcache.flush();
+-    fsync( uidcache.handle() ); /* this is probably overkill */
+-    uidcache.close();
+-    return 0;
+-  } else {
+-    return errno; /* does QFile set errno? */
++    if ( uidcache.status() == IO_Ok ) {
++      fsync( uidcache.handle() ); /* this is probably overkill */
++      uidcache.close();
++      if ( uidcache.status() == IO_Ok )
++        return 0;
++    }
+   }
++  KMessageBox::error( 0,
++        i18n( "The UID cache file for folder %1 could not be written. There "
++              "could be a problem with file system permission." ).arg( folder()->prettyURL() ) );
++
++  return -1;
+ }
+ 
+ void KMFolderCachedImap::reloadUidMap()
+@@ -448,7 +467,8 @@
+ {
+   killTimer( uidWriteTimer );
+   uidWriteTimer = -1;
+-  writeUidCache();
++  if ( writeUidCache() == -1 )
++    unlink( QFile::encodeName( uidCacheLocation() ) );
+ }
+ 
+ ulong KMFolderCachedImap::lastUid()
+@@ -467,8 +487,16 @@
+   QMap<ulong,int>::Iterator it = uidMap.find( uid );
+   if( it != uidMap.end() ) {
+     KMMsgBase *msg = getMsgBase( *it );
++    kdDebug(5006) << "UID " << uid << " is supposed to be in the map" << endl;
++    kdDebug(5006) << "UID's index is to be " << *it << endl;
++    kdDebug(5006) << "There is a message there? " << (msg != 0) << endl;
++    if ( msg ) {
++      kdDebug(5006) << "Its UID is: " << msg->UID() << endl;
++    }
++
+     if( msg && msg->UID() == uid )
+       return msg;
++    kdDebug(5006) << "########## Didn't find uid: " << uid << "in cache athough it's supposed to be there!" << endl;
+   } else {
+     kdDebug(5006) << "Didn't find uid: " << uid << "in cache!" << endl;
+   }
+@@ -841,9 +869,14 @@
+            to be deleted on the server has been deleted, adjust our local notion of the
+            highes uid seen thus far. */
+         slotUpdateLastUid();
+-        if( mLastUid == 0 && uidWriteTimer == -1 )
++	if( mLastUid == 0 && uidWriteTimer == -1 ) {
+           // This is probably a new and empty folder. Write the UID cache
+-          writeUidCache();
++          if ( writeUidCache() == -1 ) {
++            resetSyncState();
++            emit folderComplete( this, false );
++            return;
++          }
++        }
+       }
+     }
+ 
+@@ -1212,6 +1245,7 @@
+       kdDebug(5006) << "IMAP status changed but reset " << endl;
+       return; // we were reset
+   }
++  kdDebug(5006) << "IMAP status changed for folder: " << folder->prettyURL() << endl;
+   if ( folder->storage() == this ) {
+     --mStatusFlagsJobs;
+     if ( mStatusFlagsJobs == 0 || !cont ) // done or aborting
+@@ -1220,6 +1254,7 @@
+     if ( mStatusFlagsJobs == 0 && cont ) {
+       mProgress += 5;
+       serverSyncInternal();
++      kdDebug(5006) << "Proceeding with mailcheck." << endl;
+     }
+   }
+ }
+@@ -1288,14 +1323,23 @@
+   // them one by one because the index list can get resized under
+   // us. So use msg pointers instead
+ 
++  QStringList uids;
+   QMap<ulong,int>::const_iterator it = uidMap.constBegin();
+   for( ; it != uidMap.end(); it++ ) {
+     ulong uid ( it.key() );
+-    if( uid!=0 && !uidsOnServer.find( uid ) )
++    if( uid!=0 && !uidsOnServer.find( uid ) ) {
++      uids << QString::number( uid );
+       msgsForDeletion.append( getMsg( *it ) );
++    }
+   }
+ 
+   if( !msgsForDeletion.isEmpty() ) {
++#ifdef MAIL_LOSS_DEBUGGING
++    if ( KMessageBox::warningYesNo(
++      0, i18n( "<qt><p>Mails on the server in folder <b>%1</b> were deleted. "
++      "Do you want to delete them locally?<br>UIDs: %2</p></qt>" )
++      .arg( folder()->prettyURL() ).arg( uids.join(",") ) ) == KMessageBox::Yes )
++#endif
+     removeMsg( msgsForDeletion );
+   }
+ 
+@@ -1370,6 +1414,8 @@
+   uidsForDeletionOnServer.clear();
+   mMsgsForDownload.clear();
+   mUidsForDownload.clear();
++  // listing is only considered successful if saw a syntactically correct imapdigest
++  mFoundAnIMAPDigest = false;
+ 
+   CachedImapJob* job = new CachedImapJob( FolderJob::tListMessages, this );
+   connect( job, SIGNAL( result(KMail::FolderJob *) ),
+@@ -1415,6 +1461,7 @@
+       setReadOnly( access == "Read only" );
+     }
+     (*it).cdata.remove(0, pos);
++    mFoundAnIMAPDigest = true;
+   }
+   pos = (*it).cdata.find("\r\n--IMAPDIGEST", 1);
+   // Start with something largish when rebuilding the cache
+@@ -1451,7 +1498,7 @@
+         KMMsgBase *existingMessage = findByUID(uid);
+         if( !existingMessage ) {
+           if ( mUserRights <= 0 || ( mUserRights & KMail::ACLJobs::Delete ) ) {
+-            // kdDebug(5006) << "message with uid " << uid << " is gone from local cache. Must be deleted on server!!!" << endl;
++            kdDebug(5006) << "message with uid " << uid << " is gone from local cache. Must be deleted on server!!!" << endl;
+             uidsForDeletionOnServer << uid;
+           } else {
+             redownload = true;
+@@ -1490,6 +1537,13 @@
+ void KMFolderCachedImap::getMessagesResult( KMail::FolderJob *job, bool lastSet )
+ {
+   mProgress += 10;
++  if ( !job->error() && !mFoundAnIMAPDigest ) {
++    kdWarning(5006) << "######## Folderlisting did not complete, but there was no error! "
++    "Aborting sync of folder: " << folder()->prettyURL() << endl;
++#ifdef MAIL_LOSS_DEBUGGING
++    kmkernel->emergencyExit( i18n("Folder listing failed in interesting ways." ) );
++#endif
++  }
+   if( job->error() ) { // error listing messages but the user chose to continue
+     mContentState = imapNoInformation;
+     mSyncState = SYNC_STATE_HANDLE_INBOX; // be sure not to continue in this folder
+diff -Nur kdepim-3.5.4/kmail/kmfoldercachedimap.h kdepim-3.5.4.new/kmail/kmfoldercachedimap.h
+--- kdepim-3.5.4/kmail/kmfoldercachedimap.h	2005-10-10 17:02:11.000000000 +0200
++++ kdepim-3.5.4.new/kmail/kmfoldercachedimap.h	2006-08-18 16:36:12.000000000 +0200
+@@ -445,6 +445,11 @@
+       mLastUid. See above for details. */
+   ulong mTentativeHighestUid;
+ 
++  /** Used to determine whether listing messages yielded a sensible result.
++   * Only then is the deletion o messages (which relies on succesful
++   * listing) attempted, during the sync.  */
++  bool mFoundAnIMAPDigest;
++
+   int mUserRights;
+   ACLList mACLList;
+ 




More information about the pkg-kde-commits mailing list