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

List:       kde-pim
Subject:    [Kde-pim] Testers wanted for 'Pop leave on server options' patch
From:       Rich Birch <ringo () albumsnaps ! com>
Date:       2005-04-14 13:38:10
Message-ID: 425E7242.3050105 () albumsnaps ! com
[Download RAW message or body]

Hi

A call for people to test this patch that implements the pop options;

Leave messages on server for n days
Leave only x messages on server
Leave only y MBs on server

Thanks
Rich

["popLeaveOnServerOptions2.patch" (text/plain)]

Index: kmail/accountdialog.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/accountdialog.cpp,v
retrieving revision 1.162
diff -u -p -u -p -r1.162 accountdialog.cpp
--- kmail/accountdialog.cpp	2 Apr 2005 02:48:44 -0000	1.162
+++ kmail/accountdialog.cpp	11 Apr 2005 16:41:26 -0000
@@ -621,22 +621,42 @@ void AccountDialog::makePopAccountPage()
   connect( mPop.leaveOnServerCheck, SIGNAL( clicked() ),
            this, SLOT( slotLeaveOnServerClicked() ) );
   grid->addMultiCellWidget( mPop.leaveOnServerCheck, 6, 6, 0, 1 );
-  mPop.deleteAfterDaysCheck =
-    new QCheckBox( i18n("Delete messages over a certain age"), page1 );
-  grid->addMultiCellWidget( mPop.deleteAfterDaysCheck, 7, 7, 0, 1 );
-  connect( mPop.deleteAfterDaysCheck, SIGNAL( toggled(bool) ),
-           this, SLOT( slotEnableDeleteAfterDays(bool)) );
-  mPop.deleteAfterDaysLabel = new QLabel( i18n("Delete age:"), page1 );
-  grid->addWidget( mPop.deleteAfterDaysLabel, 8, 0 );
-  mPop.deleteAfterDaysSpin = new KIntNumInput( page1 );
-  mPop.deleteAfterDaysSpin->setRange( 1, 365, 1, false );
-  mPop.deleteAfterDaysSpin->setSuffix( i18n(" days") );
-  mPop.deleteAfterDaysSpin->setValue( 1 );
-  mPop.deleteAfterDaysLabel->setBuddy( mPop.deleteAfterDaysSpin );
-  grid->addWidget( mPop.deleteAfterDaysSpin, 8, 1 );
-  
+  QHBox *afterDaysBox = new QHBox( page1 );
+  afterDaysBox->setSpacing( KDialog::spacingHint() );
+  mPop.leaveOnServerDaysCheck =
+    new QCheckBox( i18n("Leave messages on the server for"), afterDaysBox );
+  connect( mPop.leaveOnServerDaysCheck, SIGNAL( toggled(bool) ),
+           this, SLOT( slotEnableLeaveOnServerDays(bool)) );
+  mPop.leaveOnServerDaysSpin = new KIntNumInput( afterDaysBox );
+  mPop.leaveOnServerDaysSpin->setRange( 1, 365, 1, false );
+  mPop.leaveOnServerDaysSpin->setSuffix( i18n(" days") );
+  mPop.leaveOnServerDaysSpin->setValue( 1 );
+  afterDaysBox->setStretchFactor( mPop.leaveOnServerDaysSpin, 1 );
+  grid->addMultiCellWidget( afterDaysBox, 7, 7, 0, 1 );
+  QHBox *leaveOnServerCountBox = new QHBox( page1 );
+  leaveOnServerCountBox->setSpacing( KDialog::spacingHint() );
+  mPop.leaveOnServerCountCheck =
+    new QCheckBox( i18n("Keep only the last"), leaveOnServerCountBox );
+  connect( mPop.leaveOnServerCountCheck, SIGNAL( toggled(bool) ),
+           this, SLOT( slotEnableLeaveOnServerCount(bool)) );
+  mPop.leaveOnServerCountSpin = new KIntNumInput( leaveOnServerCountBox );
+  mPop.leaveOnServerCountSpin->setRange( 1, 999999, 1, false );
+  mPop.leaveOnServerCountSpin->setSuffix( i18n(" messages") );
+  mPop.leaveOnServerCountSpin->setValue( 100 );
+  grid->addMultiCellWidget( leaveOnServerCountBox, 8, 8, 0, 1 );
+  QHBox *leaveOnServerSizeBox = new QHBox( page1 );
+  leaveOnServerSizeBox->setSpacing( KDialog::spacingHint() );
+  mPop.leaveOnServerSizeCheck =
+    new QCheckBox( i18n("Keep only the last"), leaveOnServerSizeBox );
+  connect( mPop.leaveOnServerSizeCheck, SIGNAL( toggled(bool) ),
+           this, SLOT( slotEnableLeaveOnServerSize(bool)) );
+  mPop.leaveOnServerSizeSpin = new KIntNumInput( leaveOnServerSizeBox );
+  mPop.leaveOnServerSizeSpin->setRange( 1, 999999, 1, false );
+  mPop.leaveOnServerSizeSpin->setSuffix( i18n(" MB") );
+  mPop.leaveOnServerSizeSpin->setValue( 10 );
+  grid->addMultiCellWidget( leaveOnServerSizeBox, 9, 9, 0, 1 );
 #if 0
-  QHBox* resourceHB = new QHBox( page1 );
+  QHBox *resourceHB = new QHBox( page1 );
   resourceHB->setSpacing( 11 );
   mPop.resourceCheck =
       new QCheckBox( i18n( "Account for semiautomatic resource handling" ), \
resourceHB ); @@ -658,12 +678,12 @@ void AccountDialog::makePopAccountPage()
                    i18n( "Delete all outdated allocations for the resource \
represented by this account." ) );  connect( mPop.resourceClearPastButton, SIGNAL( \
clicked() ),  this, SLOT( slotClearPastResourceAllocations() ) );
-  grid->addMultiCellWidget( resourceHB, 9, 9, 0, 2 );
+  grid->addMultiCellWidget( resourceHB, 10, 10, 0, 2 );
 #endif
 
   mPop.includeInCheck =
     new QCheckBox( i18n("Include in man&ual mail check"), page1 );
-  grid->addMultiCellWidget( mPop.includeInCheck, 9, 9, 0, 1 );
+  grid->addMultiCellWidget( mPop.includeInCheck, 10, 10, 0, 1 );
 
   QHBox * hbox = new QHBox( page1 );
   hbox->setSpacing( KDialog::spacingHint() );
@@ -675,7 +695,7 @@ void AccountDialog::makePopAccountPage()
   mPop.filterOnServerSizeSpin->setRange( 1, 10000000, 100, FALSE );
   mPop.filterOnServerSizeSpin->setValue( 50000 );
   mPop.filterOnServerSizeSpin->setSuffix( i18n(" byte") );
-  grid->addMultiCellWidget( hbox, 10, 10, 0, 1 );
+  grid->addMultiCellWidget( hbox, 11, 11, 0, 1 );
   connect( mPop.filterOnServerCheck, SIGNAL(toggled(bool)),
 	   mPop.filterOnServerSizeSpin, SLOT(setEnabled(bool)) );
   connect( mPop.filterOnServerCheck, SIGNAL( clicked() ),
@@ -688,29 +708,29 @@ void AccountDialog::makePopAccountPage()
 
   mPop.intervalCheck =
     new QCheckBox( i18n("Enable &interval mail checking"), page1 );
-  grid->addMultiCellWidget( mPop.intervalCheck, 11, 11, 0, 1 );
+  grid->addMultiCellWidget( mPop.intervalCheck, 12, 12, 0, 1 );
   connect( mPop.intervalCheck, SIGNAL(toggled(bool)),
 	   this, SLOT(slotEnablePopInterval(bool)) );
   mPop.intervalLabel = new QLabel( i18n("Chec&k interval:"), page1 );
-  grid->addWidget( mPop.intervalLabel, 12, 0 );
+  grid->addWidget( mPop.intervalLabel, 13, 0 );
   mPop.intervalSpin = new KIntNumInput( page1 );
   mPop.intervalSpin->setRange( 1, 10000, 1, FALSE );
   mPop.intervalSpin->setSuffix( i18n(" min") );
   mPop.intervalSpin->setValue( 1 );
   mPop.intervalLabel->setBuddy( mPop.intervalSpin );
-  grid->addWidget( mPop.intervalSpin, 12, 1 );
+  grid->addWidget( mPop.intervalSpin, 13, 1 );
 
   label = new QLabel( i18n("Des&tination folder:"), page1 );
-  grid->addWidget( label, 13, 0 );
+  grid->addWidget( label, 14, 0 );
   mPop.folderCombo = new QComboBox( false, page1 );
   label->setBuddy( mPop.folderCombo );
-  grid->addWidget( mPop.folderCombo, 13, 1 );
+  grid->addWidget( mPop.folderCombo, 14, 1 );
 
   label = new QLabel( i18n("Pre-com&mand:"), page1 );
-  grid->addWidget( label, 14, 0 );
+  grid->addWidget( label, 15, 0 );
   mPop.precommand = new KLineEdit( page1 );
   label->setBuddy(mPop.precommand);
-  grid->addWidget( mPop.precommand, 14, 1 );
+  grid->addWidget( mPop.precommand, 15, 1 );
 
   QWidget *page2 = new QWidget( tabWidget );
   tabWidget->addTab( page2, i18n("&Extras") );
@@ -1081,9 +1101,18 @@ void AccountDialog::setupSettings()
     mPop.usePipeliningCheck->setChecked( ap.usePipelining() );
     mPop.storePasswordCheck->setChecked( ap.storePasswd() );
     mPop.leaveOnServerCheck->setChecked( ap.leaveOnServer() );
-    mPop.deleteAfterDaysCheck->setEnabled( ap.leaveOnServer() );
-    mPop.deleteAfterDaysCheck->setChecked( ap.deleteAfterDays() >= 1 );
-    mPop.deleteAfterDaysSpin->setValue( QMAX(1, ap.deleteAfterDays()) );
+    mPop.leaveOnServerDaysCheck->setEnabled( ap.leaveOnServer() );
+    mPop.leaveOnServerDaysCheck->setChecked( ap.leaveOnServerDays() >= 1 );
+    mPop.leaveOnServerDaysSpin->setValue( ap.leaveOnServerDays() >= 1 ?
+                                            ap.leaveOnServerDays() : 7 );
+    mPop.leaveOnServerCountCheck->setEnabled( ap.leaveOnServer() );
+    mPop.leaveOnServerCountCheck->setChecked( ap.leaveOnServerCount() >= 1 );
+    mPop.leaveOnServerCountSpin->setValue( ap.leaveOnServerCount() >= 1 ?
+                                            ap.leaveOnServerCount() : 100 );
+    mPop.leaveOnServerSizeCheck->setEnabled( ap.leaveOnServer() );
+    mPop.leaveOnServerSizeCheck->setChecked( ap.leaveOnServerSize() >= 1 );
+    mPop.leaveOnServerSizeSpin->setValue( ap.leaveOnServerSize() >= 1 ?
+                                            ap.leaveOnServerSize() : 10 );
     mPop.filterOnServerCheck->setChecked( ap.filterOnServer() );
     mPop.filterOnServerSizeSpin->setValue( ap.filterOnServerCheckSize() );
     mPop.intervalCheck->setChecked( interval >= 1 );
@@ -1114,8 +1143,12 @@ void AccountDialog::setupSettings()
       mPop.authAPOP->setChecked( TRUE );
     else mPop.authUser->setChecked( TRUE );
 
-    slotEnableDeleteAfterDays( mPop.deleteAfterDaysCheck->isEnabled() ?
-                                ap.deleteAfterDays() >= 1 : 0);
+    slotEnableLeaveOnServerDays( mPop.leaveOnServerDaysCheck->isEnabled() ?
+                                   ap.leaveOnServerDays() >= 1 : 0);
+    slotEnableLeaveOnServerCount( mPop.leaveOnServerCountCheck->isEnabled() ?
+                                    ap.leaveOnServerCount() >= 1 : 0);
+    slotEnableLeaveOnServerSize( mPop.leaveOnServerSizeCheck->isEnabled() ?
+                                    ap.leaveOnServerSize() >= 1 : 0);
     slotEnablePopInterval( interval >= 1 );
     folderCombo = mPop.folderCombo;
   }
@@ -1293,15 +1326,25 @@ void AccountDialog::setupSettings()
 
 void AccountDialog::slotLeaveOnServerClicked()
 {
-  bool enabled = mPop.leaveOnServerCheck->isChecked();
-  mPop.deleteAfterDaysCheck->setEnabled( enabled );
-  if ( !enabled ) {
-    mPop.deleteAfterDaysSpin->setEnabled( false );
-    mPop.deleteAfterDaysLabel->setEnabled( false );
-  } else if ( mPop.deleteAfterDaysCheck->isChecked() ) {
-    mPop.deleteAfterDaysSpin->setEnabled( true );
-    mPop.deleteAfterDaysLabel->setEnabled( true );
-  } 
+  bool state = mPop.leaveOnServerCheck->isChecked();
+  mPop.leaveOnServerDaysCheck->setEnabled( state );
+  mPop.leaveOnServerCountCheck->setEnabled( state );
+  mPop.leaveOnServerSizeCheck->setEnabled( state );
+  if ( state ) {
+    if ( mPop.leaveOnServerDaysCheck->isChecked() ) {
+      slotEnableLeaveOnServerDays( state );
+    }
+    if ( mPop.leaveOnServerCountCheck->isChecked() ) {
+      slotEnableLeaveOnServerCount( state );
+    }
+    if ( mPop.leaveOnServerSizeCheck->isChecked() ) {
+      slotEnableLeaveOnServerSize( state );
+    }
+  } else {
+    slotEnableLeaveOnServerDays( state );
+    slotEnableLeaveOnServerCount( state );
+    slotEnableLeaveOnServerSize( state );
+  }
   if ( !( mCurCapa & UIDL ) && mPop.leaveOnServerCheck->isChecked() ) {
     KMessageBox::information( topLevelWidget(),
                               i18n("The server does not seem to support unique "
@@ -1671,8 +1714,15 @@ void AccountDialog::saveSettings()
     epa.setStorePasswd( mPop.storePasswordCheck->isChecked() );
     epa.setPasswd( mPop.passwordEdit->text(), epa.storePasswd() );
     epa.setLeaveOnServer( mPop.leaveOnServerCheck->isChecked() );
-    epa.setDeleteAfterDays( mPop.deleteAfterDaysCheck->isChecked() ?
-                             mPop.deleteAfterDaysSpin->value() : 0 );
+    epa.setLeaveOnServerDays( mPop.leaveOnServerCheck->isChecked() ?
+                              ( mPop.leaveOnServerDaysCheck->isChecked() ?
+                                mPop.leaveOnServerDaysSpin->value() : -1 ) : 0);
+    epa.setLeaveOnServerCount( mPop.leaveOnServerCheck->isChecked() ?
+                               ( mPop.leaveOnServerCountCheck->isChecked() ?
+                                 mPop.leaveOnServerCountSpin->value() : -1 ) : 0 );
+    epa.setLeaveOnServerSize( mPop.leaveOnServerCheck->isChecked() ?
+                              ( mPop.leaveOnServerSizeCheck->isChecked() ?
+                                mPop.leaveOnServerSizeSpin->value() : -1 ) : 0 );
     epa.setFilterOnServer( mPop.filterOnServerCheck->isChecked() );
     epa.setFilterOnServerCheckSize (mPop.filterOnServerSizeSpin->value() );
     epa.setPrecommand( mPop.precommand->text() );
@@ -1897,11 +1947,24 @@ void AccountDialog::slotMaildirChooser()
   directory = dir;
 }
 
-void AccountDialog::slotEnableDeleteAfterDays( bool state )
+void AccountDialog::slotEnableLeaveOnServerDays( bool state )
+{
+  if ( state && !mPop.leaveOnServerDaysCheck->isEnabled()) return;
+  mPop.leaveOnServerDaysSpin->setEnabled( state );
+}
+
+void AccountDialog::slotEnableLeaveOnServerCount( bool state )
+{
+  if ( state && !mPop.leaveOnServerCountCheck->isEnabled()) return;
+  mPop.leaveOnServerCountSpin->setEnabled( state );
+  return;
+}
+
+void AccountDialog::slotEnableLeaveOnServerSize( bool state )
 {
-  if ( state && !mPop.deleteAfterDaysCheck->isEnabled()) return;
-  mPop.deleteAfterDaysSpin->setEnabled( state );
-  mPop.deleteAfterDaysLabel->setEnabled( state );
+  if ( state && !mPop.leaveOnServerSizeCheck->isEnabled()) return;
+  mPop.leaveOnServerSizeSpin->setEnabled( state );
+  return;
 }
 
 void AccountDialog::slotEnablePopInterval( bool state )
Index: kmail/accountdialog.h
===================================================================
RCS file: /home/kde/kdepim/kmail/accountdialog.h,v
retrieving revision 1.50
diff -u -p -u -p -r1.50 accountdialog.h
--- kmail/accountdialog.h	2 Apr 2005 02:48:44 -0000	1.50
+++ kmail/accountdialog.h	11 Apr 2005 16:41:26 -0000
@@ -123,9 +123,12 @@ class AccountDialog : public KDialogBase
       QCheckBox    *usePipeliningCheck;
       QCheckBox    *storePasswordCheck;
       QCheckBox    *leaveOnServerCheck;
-      QCheckBox    *deleteAfterDaysCheck;
-      QLabel       *deleteAfterDaysLabel;
-      KIntNumInput *deleteAfterDaysSpin;
+      QCheckBox    *leaveOnServerDaysCheck;
+      KIntNumInput *leaveOnServerDaysSpin;
+      QCheckBox    *leaveOnServerCountCheck;
+      KIntNumInput *leaveOnServerCountSpin;
+      QCheckBox    *leaveOnServerSizeCheck;
+      KIntNumInput *leaveOnServerSizeSpin;
 #if 0
       QCheckBox    *resourceCheck;
       QPushButton  *resourceClearButton;
@@ -193,7 +196,9 @@ class AccountDialog : public KDialogBase
     void slotEnableMaildirInterval( bool state );
     void slotFontChanged();
     void slotLeaveOnServerClicked();
-    void slotEnableDeleteAfterDays( bool state );
+    void slotEnableLeaveOnServerDays( bool state );
+    void slotEnableLeaveOnServerCount( bool state );
+    void slotEnableLeaveOnServerSize( bool state );
     void slotFilterOnServerClicked();
     void slotPipeliningClicked();
     void slotPopEncryptionChanged(int);
Index: kmail/kmacctexppop.cpp
===================================================================
RCS file: /home/kde/kdepim/kmail/kmacctexppop.cpp,v
retrieving revision 1.180
diff -u -p -u -p -r1.180 kmacctexppop.cpp
--- kmail/kmacctexppop.cpp	5 Apr 2005 11:31:09 -0000	1.180
+++ kmail/kmacctexppop.cpp	11 Apr 2005 16:41:26 -0000
@@ -111,7 +111,9 @@ void KMAcctExpPop::init(void)
 
   mUsePipelining = FALSE;
   mLeaveOnServer = FALSE;
-  mDeleteAfterDays = -1;
+  mLeaveOnServerDays = -1;
+  mLeaveOnServerCount = -1;
+  mLeaveOnServerSize = -1;
   mFilterOnServer = FALSE;
   //tz todo
   mFilterOnServerCheckSize = 50000;
@@ -127,7 +129,9 @@ void KMAcctExpPop::pseudoAssign( const K
 
   setUsePipelining( p->usePipelining() );
   setLeaveOnServer( p->leaveOnServer() );
-  setDeleteAfterDays( p->deleteAfterDays() );
+  setLeaveOnServerDays( p->leaveOnServerDays() );
+  setLeaveOnServerCount( p->leaveOnServerCount() );
+  setLeaveOnServerSize( p->leaveOnServerSize() );
   setFilterOnServer( p->filterOnServer() );
   setFilterOnServerCheckSize( p->filterOnServerCheckSize() );
 }
@@ -186,6 +190,7 @@ void KMAcctExpPop::processNewMail(bool _
     }
     mUidsOfNextSeenMsgsDict.clear();
     mTimeOfNextSeenMsgsMap.clear();
+    mSizeOfNextSeenMsgsDict.clear();
 
     interactive = _interactive;
     mUidlFinished = FALSE;
@@ -205,7 +210,9 @@ void KMAcctExpPop::readConfig(KConfig& c
 
   mUsePipelining = config.readNumEntry("pipelining", FALSE);
   mLeaveOnServer = config.readNumEntry("leave-on-server", FALSE);
-  mDeleteAfterDays = config.readNumEntry("delete-after-days", -1);
+  mLeaveOnServerDays = config.readNumEntry("leave-on-server-days", -1);
+  mLeaveOnServerCount = config.readNumEntry("leave-on-server-count", -1);
+  mLeaveOnServerSize = config.readNumEntry("leave-on-server-size", -1);
   mFilterOnServer = config.readNumEntry("filter-on-server", FALSE);
   mFilterOnServerCheckSize = config.readUnsignedNumEntry("filter-os-check-size", \
50000);  }
@@ -218,7 +225,9 @@ void KMAcctExpPop::writeConfig(KConfig& 
 
   config.writeEntry("pipelining", mUsePipelining);
   config.writeEntry("leave-on-server", mLeaveOnServer);
-  config.writeEntry("delete-after-days", mDeleteAfterDays);
+  config.writeEntry("leave-on-server-days", mLeaveOnServerDays);
+  config.writeEntry("leave-on-server-count", mLeaveOnServerCount);
+  config.writeEntry("leave-on-server-size", mLeaveOnServerSize);
   config.writeEntry("filter-on-server", mFilterOnServer);
   config.writeEntry("filter-os-check-size", mFilterOnServerCheckSize);
 }
@@ -237,12 +246,21 @@ void KMAcctExpPop::setLeaveOnServer(bool
 }
 
 //-----------------------------------------------------------------------------
-void KMAcctExpPop::setDeleteAfterDays(int days)
+void KMAcctExpPop::setLeaveOnServerDays(int days)
 {
-  if ( days <= 0 )
-    mDeleteAfterDays = 0;
-  else
-    mDeleteAfterDays = days;
+  mLeaveOnServerDays = days;
+}
+
+//-----------------------------------------------------------------------------
+void KMAcctExpPop::setLeaveOnServerCount(int count)
+{
+  mLeaveOnServerCount = count;
+}
+
+//-----------------------------------------------------------------------------
+void KMAcctExpPop::setLeaveOnServerSize(int size)
+{
+  mLeaveOnServerSize = size;
 }
 
 //---------------------------------------------------------------------------
@@ -309,8 +327,7 @@ void KMAcctExpPop::slotProcessPendingMsg
     else {
       idsOfMsgsToDelete.append( *curId );
       mUidsOfNextSeenMsgsDict.insert( *curUid, (const int *)1 );
-      mTimeOfNextSeenMsgsMap.insert( *curUid,
-        QDateTime::currentDateTime().toTime_t() );
+      mTimeOfNextSeenMsgsMap.insert( *curUid, time(0) );
     }
     ++cur;
     ++curId;
@@ -482,9 +499,9 @@ void KMAcctExpPop::slotJobFinished() {
           //check for mails bigger mFilterOnServerCheckSize
           if ( (unsigned int)hids.data() >= mFilterOnServerCheckSize ) {
             kdDebug(5006) << "bigger than " << mFilterOnServerCheckSize << endl;
-              headersOnServer.append(new KMPopHeaders( hids.key(),
-                                                       mUidForIdMap[hids.key()],
-                                                       Later));//TODO
+            headersOnServer.append(new KMPopHeaders( hids.key(),
+                                                     mUidForIdMap[hids.key()],
+                                                     Later));//TODO
             //set Action if already known
             if( mHeaderDeleteUids.contains( headersOnServer.current()->uid() ) ) {
               headersOnServer.current()->setAction(Delete);
@@ -605,7 +622,7 @@ void KMAcctExpPop::slotJobFinished() {
                                           (const int *)1 );
           idsOfMsgsToDelete.append(headersOnServer.current()->id());
           mTimeOfNextSeenMsgsMap.insert( headersOnServer.current()->uid(),
-                                     QDateTime::currentDateTime().toTime_t() );
+                                          time(0) );
         }
         else {
           mHeaderLaterUids.insert(headersOnServer.current()->uid(), true);
@@ -643,43 +660,72 @@ void KMAcctExpPop::slotJobFinished() {
     kmkernel->folderMgr()->syncAllFolders();
 
     KURL url = getUrl();
-    if (mLeaveOnServer && mDeleteAfterDays > 0 && !idsOfMsgsToDelete.isEmpty()) {
-      // Remove from idsOfMsgsToDelete entries which are newer than the limit
-      QDateTime timeLimit = QDateTime::currentDateTime();
-      timeLimit = timeLimit.addDays( -mDeleteAfterDays );
-      QStringList::Iterator cur = idsOfMsgsToDelete.begin();
-      while (cur != idsOfMsgsToDelete.end()) {
-        QDateTime msgTime;
-        if ( !mTimeOfNextSeenMsgsMap[mUidForIdMap[*cur]] ) {
-          cur = idsOfMsgsToDelete.remove( cur );
-        }
-        else {
-          msgTime.setTime_t( mTimeOfNextSeenMsgsMap[mUidForIdMap[*cur]] );
-          kdDebug() << "uid: "
-                    << mUidForIdMap[*cur]
-                    << " msgTime: " << msgTime
-                    << ", timeLimit: " << timeLimit << endl;
-          if (msgTime >= timeLimit) {
-            cur = idsOfMsgsToDelete.remove( cur );
+    QMap< QPair<time_t, QString>, int > idsToSave;
+    idsToSave.clear();
+    // Check if we want to keep any messages
+    if ( !idsOfMsgsToDelete.isEmpty() ) {
+      // Keep all messages on server
+      if ( mLeaveOnServerDays == -1 && mLeaveOnServerCount <= 0 &&
+           mLeaveOnServerSize <= 0)
+        idsOfMsgsToDelete.clear();
+      // Delete old messages
+      else if ( mLeaveOnServerDays > 0 && !mTimeOfNextSeenMsgsMap.isEmpty() ) {
+        time_t timeLimit = time(0) - (86400 * mLeaveOnServerDays);
+        kdDebug() << "timeLimit is " << timeLimit << endl;
+        QStringList::Iterator cur = idsOfMsgsToDelete.begin();
+        for ( ; cur != idsOfMsgsToDelete.end(); ++cur) {
+          time_t msgTime = mTimeOfNextSeenMsgsMap[mUidForIdMap[*cur]];
+          kdDebug() << "id: " << *cur << " msgTime: " << msgTime << endl;
+          if (msgTime >= timeLimit ||
+                !mTimeOfNextSeenMsgsMap[mUidForIdMap[*cur]]) {
+            kdDebug() << "Saving msg id " << *cur << endl;
+            QPair<time_t, QString> msg(msgTime, *cur);
+            idsToSave.insert( msg, 1 );
           }
-          else {
-            ++cur;
+        }
+      }
+      // Delete more old messages if there are more than mLeaveOnServerCount
+      if ( mLeaveOnServerCount > 0 ) {
+        int numToDelete = idsToSave.count() - mLeaveOnServerCount;
+        kdDebug() << "numToDelete is " << numToDelete << endl;
+        if ( numToDelete > 0 && numToDelete < idsToSave.count() ) {
+          QMap< QPair<time_t, QString>, int >::Iterator cur = idsToSave.begin();
+          for ( int deleted = 0; deleted < numToDelete && cur != idsToSave.end()
+                ; deleted++, cur++ ) {
+            kdDebug() << "deleting msg id " << cur.key().second << endl;
+            idsToSave.remove( cur );
           }
         }
+        else if ( numToDelete > 0 && numToDelete >= idsToSave.count() )
+          idsToSave.clear();
+      }
+      // Delete more old messages until we're under mLeaveOnServerSize MBs
+      if ( mLeaveOnServerSize > 0 ) {
+        double sizeOnServer = 0;
+        QMap< QPair<time_t, QString>, int >::Iterator cur = idsToSave.begin();
+        for ( ; cur != idsToSave.end(); cur++ ) {
+          sizeOnServer +=
+            *mSizeOfNextSeenMsgsDict[ mUidForIdMap[ cur.key().second ] ];
+        }
+        kdDebug() << "sizeOnServer is " << sizeOnServer/(1024*1024) << "MB" << endl;
+        long limitInBytes = mLeaveOnServerSize * ( 1024 * 1024 );
+        for ( cur = idsToSave.begin(); cur != idsToSave.end()
+                && sizeOnServer > limitInBytes; cur++ ) {
+          sizeOnServer -=
+            *mSizeOfNextSeenMsgsDict[ mUidForIdMap[ cur.key().second ] ];
+          idsToSave.remove( cur );
+        }
+      }
+      // Save msgs from deletion
+      QMap< QPair<time_t, QString>, int >::Iterator it = idsToSave.begin();
+      kdDebug() << "Going to save " << idsToSave.count() << endl;
+      for ( ; it != idsToSave.end(); ++it ) {
+        kdDebug() << "saving msg id " << it.key().second << endl;
+        idsOfMsgsToDelete.remove( it.key().second );
       }
     }
- 
-    if ((mLeaveOnServer && mDeleteAfterDays <= 0) || idsOfMsgsToDelete.isEmpty()) {
-      stage = Quit;
-      mMailCheckProgressItem->setStatus(
-        i18n( "Fetched 1 message from %1. Terminating transmission...",
-              "Fetched %n messages from %1. Terminating transmission...",
-              numMsgs )
-        .arg( mHost ) );
-      url.setPath(QString("/commit"));
-      job = KIO::get(url, false, false );
-    }
-    else {
+    // If there are messages to delete then delete them
+    if ( !idsOfMsgsToDelete.isEmpty() ) {
       stage = Dele;
       mMailCheckProgressItem->setStatus(
         i18n( "Fetched 1 message from %1. Deleting messages from server...",
@@ -688,8 +734,17 @@ void KMAcctExpPop::slotJobFinished() {
         .arg( mHost ) );
       url.setPath("/remove/" + idsOfMsgsToDelete.join(","));
       kdDebug(5006) << "url: " << url.prettyURL() << endl;
-      job = KIO::get( url, false, false );
+    } else {
+      stage = Quit;
+      mMailCheckProgressItem->setStatus(
+        i18n( "Fetched 1 message from %1. Terminating transmission...",
+              "Fetched %n messages from %1. Terminating transmission...",
+              numMsgs )
+        .arg( mHost ) );
+      url.setPath(QString("/commit"));
+      kdDebug(5006) << "url: " << url.prettyURL() << endl;
     }
+    job = KIO::get( url, false, false );
     connectJob();
   }
   else if (stage == Dele) {
@@ -860,7 +915,11 @@ void KMAcctExpPop::slotData( KIO::Job* j
     else { // stage == Uidl
       const QString id = qdata.left(spc);
       const QString uid = qdata.mid(spc + 1);
+      int *size = new int; //malloc(size_of(int));
+      *size = mMsgsPendingDownload[id];
+      mSizeOfNextSeenMsgsDict.insert( uid, size );
       if ( mUidsOfSeenMsgsDict.find( uid ) != 0 ) {
+        
         if ( mMsgsPendingDownload.contains( id ) ) {
           mMsgsPendingDownload.remove( id );
         }
@@ -868,11 +927,13 @@ void KMAcctExpPop::slotData( KIO::Job* j
           kdDebug(5006) << "KMAcctExpPop::slotData synchronization failure." << \
endl;  idsOfMsgsToDelete.append( id );
         mUidsOfNextSeenMsgsDict.insert( uid, (const int *)1 );
-        if ( mTimeOfSeenMsgsVector.empty() )
+        if ( mTimeOfSeenMsgsVector.empty() ) {
           mTimeOfNextSeenMsgsMap.insert( uid, time(0) );
-        else
+        }
+        else {
           mTimeOfNextSeenMsgsMap.insert( uid,
             mTimeOfSeenMsgsVector[(int)mUidsOfSeenMsgsDict[uid] - 1] );
+        }
       }
       mUidForIdMap.insert( id, uid );
     }
Index: kmail/kmacctexppop.h
===================================================================
RCS file: /home/kde/kdepim/kmail/kmacctexppop.h,v
retrieving revision 1.48
diff -u -p -u -p -r1.48 kmacctexppop.h
--- kmail/kmacctexppop.h	5 Apr 2005 00:50:40 -0000	1.48
+++ kmail/kmacctexppop.h	11 Apr 2005 16:41:26 -0000
@@ -44,12 +44,6 @@ public:
    */
   bool usePipelining(void) const { return mUsePipelining; }
   virtual void setUsePipelining(bool);
-
-  /**
-   * If value is positive, delete mail from server after that many days.
-   */
-  int deleteAfterDays(void) const { return mDeleteAfterDays; }
-  virtual void setDeleteAfterDays(int);
  
   /**
    * Shall messages be left on the server upon retreival (TRUE)
@@ -59,6 +53,24 @@ public:
   virtual void setLeaveOnServer(bool);
 
   /**
+   * If value is positive, leave mail on the server for so many days.
+   */
+  int leaveOnServerDays(void) const { return mLeaveOnServerDays; }
+  virtual void setLeaveOnServerDays(int);
+
+  /**
+   * If value is positive, leave so many messages on the server.
+   */
+  int leaveOnServerCount(void) const { return mLeaveOnServerCount; }
+  virtual void setLeaveOnServerCount(int);
+
+  /**
+   * If value is positive, leave so many MBs on the server.
+   */
+  int leaveOnServerSize(void) const { return mLeaveOnServerSize; }
+  virtual void setLeaveOnServerSize(int);
+
+  /**
    * Shall messages be filter on the server (TRUE)
    * or not (FALSE).
    */
@@ -110,7 +122,9 @@ protected:
 
   bool    mUsePipelining;
   bool    mLeaveOnServer;
-  int     mDeleteAfterDays;
+  int     mLeaveOnServerDays;
+  int     mLeaveOnServerCount;
+  int     mLeaveOnServerSize;
   bool    gotMsgs;
   bool    mFilterOnServer;
   unsigned int mFilterOnServerCheckSize;
@@ -127,14 +141,14 @@ protected:
   QMap<QString, bool> mHeaderDownUids;
   QMap<QString, bool> mHeaderLaterUids;
 
-
   QStringList idsOfMsgs; //used for ids and for count
   QValueList<int> lensOfMsgs;
   QMap<QString, QString> mUidForIdMap; // maps message ID (i.e. index on the server) \
to UID  QDict<int> mUidsOfSeenMsgsDict; // set of UIDs of previously seen messages \
                (for fast lookup)
-  QValueVector<int> mTimeOfSeenMsgsVector; // list of times of previously seen \
messages  QDict<int> mUidsOfNextSeenMsgsDict; // set of UIDs of seen messages (for \
the next check) +  QValueVector<int> mTimeOfSeenMsgsVector; // list of times of \
previously seen messages  QMap<QString, int> mTimeOfNextSeenMsgsMap; // map of uid to \
times of seen messages +  QDict<int> mSizeOfNextSeenMsgsDict;
   QStringList idsOfMsgsToDelete;
   int indexOfCurrentMsg;
 



_______________________________________________
kde-pim mailing list
kde-pim@kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
kde-pim home page at http://pim.kde.org/

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

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