• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

knode

  • sources
  • kde-4.12
  • kdepim
  • knode
kncleanup.cpp
Go to the documentation of this file.
1 /*
2  KNode, the KDE newsreader
3  Copyright (c) 1999-2005 the KNode authors.
4  See file AUTHORS for details
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  You should have received a copy of the GNU General Public License
11  along with this program; if not, write to the Free Software Foundation,
12  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
13 */
14 
15 
16 #include <QDir>
17 #include <QFile>
18 #include <QLabel>
19 #include <QProgressBar>
20 #include <QVBoxLayout>
21 #include <QApplication>
22 #include <QFrame>
23 #include <QTextStream>
24 #include <QCloseEvent>
25 
26 #include <klocale.h>
27 #include <kmessagebox.h>
28 #include <kseparator.h>
29 #include <kdebug.h>
30 
31 #include "knfolder.h"
32 #include "knglobals.h"
33 #include "kncleanup.h"
34 #include "knconfig.h"
35 #include "knfoldermanager.h"
36 #include "kngroupmanager.h"
37 #include "knarticlemanager.h"
38 #include "knnntpaccount.h"
39 
40 
41 KNCleanUp::KNCleanUp() : d_lg(0)
42 {
43 }
44 
45 
46 KNCleanUp::~KNCleanUp()
47 {
48  delete d_lg;
49 }
50 
51 
52 void KNCleanUp::start()
53 {
54  if ( mColList.isEmpty() )
55  return;
56 
57  d_lg = new ProgressDialog( mColList.count() );
58  d_lg->show();
59 
60  for ( KNArticleCollection::List::Iterator it = mColList.begin(); it != mColList.end(); ++it ) {
61  if ( (*it)->type() == KNCollection::CTgroup ) {
62  d_lg->showMessage( i18n( "Deleting expired articles in <b>%1</b>", (*it)->name() ) ); // krazy:exclude=qmethods
63  qApp->processEvents();
64  expireGroup( boost::static_pointer_cast<KNGroup>( (*it) ) );
65  d_lg->doProgress();
66  }
67  else if ( (*it)->type() == KNCollection::CTfolder ) {
68  d_lg->showMessage( i18n("Compacting folder <b>%1</b>", (*it)->name() ) ); // krazy:exclude=qmethods
69  qApp->processEvents();
70  compactFolder( boost::static_pointer_cast<KNFolder>( (*it) ) );
71  d_lg->doProgress();
72  }
73  }
74 
75  delete d_lg;
76  d_lg=0;
77 }
78 
79 
80 void KNCleanUp::reset()
81 {
82  mColList.clear();
83  delete d_lg;
84  d_lg=0;
85 }
86 
87 
88 void KNCleanUp::expireGroup( KNGroup::Ptr g, bool showResult )
89 {
90  int expDays=0, idRef=0, foundId=-1, delCnt=0, leftCnt=0, newCnt=0, firstArtNr=g->firstNr(), firstNew=-1;
91  bool unavailable=false;
92  KNRemoteArticle::Ptr art, ref;
93 
94  KNode::Cleanup *conf = g->activeCleanupConfig();
95 
96  g->setNotUnloadable(true);
97 
98  if (!g->isLoaded() && !knGlobals.groupManager()->loadHeaders(g)) {
99  g->setNotUnloadable(false);
100  return;
101  }
102 
103  //find all expired
104  for(int i=0; i<g->length(); ++i) {
105  art=g->at(i);
106  if(art->isRead())
107  expDays = conf->maxAgeForRead();
108  else
109  expDays = conf->maxAgeForUnread();
110 
111  unavailable = false;
112  if ((art->articleNumber() != -1) && conf->removeUnavailable())
113  unavailable = (art->articleNumber() < firstArtNr);
114 
115  art->setExpired( (art->date()->ageInDays() >= expDays) || unavailable );
116  }
117 
118  //save threads
119  if (conf->preserveThreads()) {
120  for(int i=0; i<g->length(); ++i) {
121  art=g->at(i);
122  if(!art->isExpired()) {
123  idRef=art->idRef();
124  while(idRef!=0) {
125  ref=g->byId(idRef);
126  ref->setExpired(false);
127  idRef=ref->idRef();
128  }
129  }
130  }
131  }
132 
133  //restore threading
134  for(int i=0; i<g->length(); ++i) {
135  art=g->at(i);
136  if(!art->isExpired()) {
137  idRef=art->idRef();
138  foundId=0;
139  while(foundId==0 && idRef!=0) {
140  ref=g->byId(idRef);
141  if(!ref->isExpired()) foundId=ref->id();
142  idRef=ref->idRef();
143  }
144  art->setIdRef(foundId);
145  }
146  }
147 
148  //delete expired
149  for(int i=0; i<g->length(); ++i) {
150  art=g->at(i);
151  if(art->isExpired()) {
152  if(art->isRead())
153  g->decReadCount();
154  delCnt++;
155  if (art->hasContent())
156  knGlobals.articleManager()->unloadArticle(art, true);
157  }
158  else if(art->isNew() && !art->isRead()) {
159  if(firstNew==-1)
160  firstNew=i;
161  newCnt++;
162  }
163  }
164 
165  g->setNotUnloadable(false);
166 
167  if(delCnt>0) {
168  g->saveStaticData(g->length(), true);
169  g->saveDynamicData(g->length(), true);
170  g->decCount(delCnt);
171  g->setNewCount(newCnt);
172  g->setFirstNewIndex(firstNew);
173  g->writeConfig();
174  knGlobals.groupManager()->unloadHeaders(g, true);
175  }
176  else
177  g->syncDynamicData();
178 
179  conf->setLastExpireDate();
180  g->writeConfig();
181  leftCnt=g->count();
182 
183  kDebug(5003) <<"KNCleanUp::expireGroup() :" << g->groupname() <<":"
184  << delCnt << "deleted ," << leftCnt << "left";
185 
186  if(showResult)
187  KMessageBox::information(knGlobals.topWidget,
188  i18n("<b>%1</b><br />expired: %2<br />left: %3", g->groupname(), delCnt, leftCnt));
189 }
190 
191 
192 void KNCleanUp::compactFolder( KNFolder::Ptr f )
193 {
194  KNLocalArticle::Ptr art;
195 
196  if (!f)
197  return;
198 
199  QDir dir(f->path());
200 
201  if(!dir.exists())
202  return;
203 
204  f->setNotUnloadable(true);
205 
206  if (!f->isLoaded() && !knGlobals.folderManager()->loadHeaders(f)) {
207  f->setNotUnloadable(false);
208  return;
209  }
210 
211  f->closeFiles();
212  QFileInfo info(f->m_boxFile);
213  QString oldName=info.fileName();
214  QString newName=oldName+".new";
215  QFile newMBoxFile( info.absolutePath() + '/' + newName );
216 
217  if( (f->m_boxFile.open(QIODevice::ReadOnly)) && (newMBoxFile.open(QIODevice::WriteOnly)) ) {
218  QTextStream ts(&newMBoxFile);
219  ts.setCodec( "ISO 8859-1" );
220  for(int idx=0; idx<f->length(); idx++) {
221  art=f->at(idx);
222  if ( f->m_boxFile.seek( art->startOffset() ) ) {
223  ts << "From aaa@aaa Mon Jan 01 00:00:00 1997\n";
224  ts.flush();
225  art->setStartOffset( newMBoxFile.pos() );
226  while ( f->m_boxFile.pos() < (uint)art->endOffset() && !f->m_boxFile.atEnd() )
227  ts << f->m_boxFile.readLine();
228  ts.flush();
229  art->setEndOffset( newMBoxFile.pos() );
230  newMBoxFile.putChar('\n');
231  }
232  }
233 
234  f->syncIndex(true);
235  newMBoxFile.close();
236  f->closeFiles();
237 
238  dir.remove(oldName);
239  dir.rename(newName, oldName);
240  }
241 
242  f->setNotUnloadable(false);
243 }
244 
245 
246 //===============================================================================================
247 
248 
249 KNCleanUp::ProgressDialog::ProgressDialog( int steps, QWidget *parent ) :
250  KDialog( parent )
251 {
252  const int w=400,
253  h=160;
254 
255  setCaption(i18n("Cleaning Up"));
256  setButtons( KDialog::None );
257 
258  setFixedSize(w,h);
259  QFrame *top = new QFrame( this );
260  top->setGeometry(0,0, w,h);
261 
262  QVBoxLayout *topL=new QVBoxLayout(top);
263  topL->setSpacing(10);
264 
265  QLabel *l=new QLabel(i18n("Cleaning up. Please wait..."),top);
266  topL->addWidget(l);
267 
268  KSeparator *sep=new KSeparator(top);
269  topL->addWidget(sep);
270 
271  m_sg=new QLabel(top);
272  topL->addWidget(m_sg);
273 
274  mProgressBar = new QProgressBar( top );
275  topL->addWidget( mProgressBar );
276  mProgressBar->setRange( 0, steps );
277  mProgressBar->setValue( 0 );
278 
279 
280  if(knGlobals.topWidget->isVisible()) {
281  int x, y;
282  x=(knGlobals.topWidget->width()-w)/2;
283  y=(knGlobals.topWidget->height()-h)/2;
284  if(x<0 || y<0) {
285  x=0;
286  y=0;
287  }
288  x+=knGlobals.topWidget->x();
289  y+=knGlobals.topWidget->y();
290  move(x,y);
291  }
292 }
293 
294 
295 KNCleanUp::ProgressDialog::~ProgressDialog()
296 {
297 }
298 
299 
300 void KNCleanUp::ProgressDialog::showMessage(const QString &s)
301 {
302  m_sg->setText(s);
303 }
304 
305 
306 void KNCleanUp::ProgressDialog::doProgress()
307 {
308  mProgressBar->setValue( mProgressBar->value() + 1 );
309 }
310 
311 
312 void KNCleanUp::ProgressDialog::closeEvent(QCloseEvent *)
313 {
314  // do nothing => prevent that the user closes the window
315 }
KNCleanUp::~KNCleanUp
~KNCleanUp()
Definition: kncleanup.cpp:46
KNLocalArticle::Ptr
boost::shared_ptr< KNLocalArticle > Ptr
Shared pointer to a KNLocalArticle. To be used instead of raw KNLocalArticle*.
Definition: knarticle.h:214
KNCleanUp::expireGroup
void expireGroup(KNGroup::Ptr g, bool showResult=false)
Definition: kncleanup.cpp:88
knfolder.h
KNode::Cleanup::maxAgeForRead
int maxAgeForRead() const
Definition: knconfig.h:146
KNCleanUp::mColList
KNArticleCollection::List mColList
Definition: kncleanup.h:85
KNCleanUp::KNCleanUp
KNCleanUp()
Definition: kncleanup.cpp:41
QWidget
KNCleanUp::ProgressDialog::mProgressBar
QProgressBar * mProgressBar
Definition: kncleanup.h:81
KNCleanUp::compactFolder
void compactFolder(KNFolder::Ptr f)
Compacts the given folder, ie.
Definition: kncleanup.cpp:192
KNCleanUp::reset
void reset()
Definition: kncleanup.cpp:80
KDialog
kngroupmanager.h
KNode::Cleanup
Expirery/cleaup settings (globally or per account/group/folder).
Definition: knconfig.h:132
KNCleanUp::ProgressDialog::m_sg
QLabel * m_sg
Definition: kncleanup.h:80
knarticlemanager.h
KNFolder::Ptr
boost::shared_ptr< KNFolder > Ptr
Shared pointer to a KNFolder.
Definition: knfolder.h:38
KNCleanUp::ProgressDialog::doProgress
void doProgress()
Increments the progress counter by one.
Definition: kncleanup.cpp:306
knnntpaccount.h
KNode::Cleanup::maxAgeForUnread
int maxAgeForUnread() const
Definition: knconfig.h:147
KNode::Cleanup::setLastExpireDate
void setLastExpireDate()
Definition: knconfig.cpp:300
KNCleanUp::ProgressDialog
Cleanup progress dialog.
Definition: kncleanup.h:60
KNode::Cleanup::preserveThreads
bool preserveThreads() const
Definition: knconfig.h:149
KNCleanUp::ProgressDialog::closeEvent
void closeEvent(QCloseEvent *e)
Definition: kncleanup.cpp:312
KNode::Cleanup::removeUnavailable
bool removeUnavailable() const
Definition: knconfig.h:148
KNCleanUp::start
void start()
Definition: kncleanup.cpp:52
KNCollection::CTgroup
Definition: kncollection.h:33
knglobals.h
KNCleanUp::d_lg
ProgressDialog * d_lg
Definition: kncleanup.h:84
KNRemoteArticle::Ptr
boost::shared_ptr< KNRemoteArticle > Ptr
Shared pointer to a KNRemoteArticle. To be used instead of raw KNRemoteArticle*.
Definition: knarticle.h:107
knfoldermanager.h
KNCleanUp::ProgressDialog::showMessage
void showMessage(const QString &s)
Shows a message in the progress dialog.
Definition: kncleanup.cpp:300
QLabel
KNCollection::CTfolder
Definition: kncollection.h:34
kncleanup.h
knconfig.h
KNCleanUp::ProgressDialog::ProgressDialog
ProgressDialog(int steps, QWidget *parent=0)
Creates a new progress dialog.
Definition: kncleanup.cpp:249
KNCleanUp::ProgressDialog::~ProgressDialog
~ProgressDialog()
Definition: kncleanup.cpp:295
knGlobals
#define knGlobals
Keep compatibility with the old way.
Definition: knglobals.h:28
QFrame
KNGroup::Ptr
boost::shared_ptr< KNGroup > Ptr
Shared pointer to a KNGroup.
Definition: kngroup.h:47
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:58:36 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

knode

Skip menu "knode"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal