• 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
knfoldermanager.cpp
Go to the documentation of this file.
1 /*
2  KNode, the KDE newsreader
3  Copyright (c) 1999-2006 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 #include "knfoldermanager.h"
16 
17 #include "knglobals.h"
18 #include "knconfigmanager.h"
19 #include "knfolder.h"
20 #include "utilities.h"
21 #include "knarticlemanager.h"
22 #include "kncleanup.h"
23 #include "knmemorymanager.h"
24 #include "knmainwidget.h"
25 #include "utils/scoped_cursor_override.h"
26 
27 #include <KDebug>
28 #include <KMessageBox>
29 #include <KStandardDirs>
30 #include <QDir>
31 
32 using namespace KNode::Utilities;
33 
34 
35 KNFolderManager::KNFolderManager(KNArticleManager *a) : a_rtManager(a)
36 {
37  //standard folders
38  QString dir( KStandardDirs::locateLocal( "data", "knode/folders/" ) );
39  if (dir.isNull()) {
40  KNHelper::displayInternalFileError();
41  return;
42  }
43 
44  KNFolder::Ptr f;
45 
46  f = KNFolder::Ptr( new KNFolder( 0, i18n( "Local Folders" ), "root" ) );
47  mFolderList.append( f );
48  f->readInfo();
49 
50  f = KNFolder::Ptr( new KNFolder( 1, i18n( "Drafts" ), "drafts", root() ) );
51  mFolderList.append( f );
52  f->readInfo();
53 
54  f = KNFolder::Ptr( new KNFolder( 2, i18n( "Outbox" ), "outbox", root() ) );
55  mFolderList.append( f );
56  f->readInfo();
57 
58  f = KNFolder::Ptr( new KNFolder( 3, i18n( "Sent" ), "sent", root() ) );
59  mFolderList.append( f );
60  f->readInfo();
61 
62  l_astId=3;
63 
64  //custom folders
65  loadCustomFolders();
66 
67  setCurrentFolder( KNFolder::Ptr() );
68 }
69 
70 
71 KNFolderManager::~KNFolderManager()
72 {
73  mFolderList.clear();
74 }
75 
76 
77 void KNFolderManager::setCurrentFolder( KNFolder::Ptr f )
78 {
79  c_urrentFolder=f;
80  a_rtManager->setFolder(f);
81 
82  kDebug(5003) <<"KNFolderManager::setCurrentFolder() : folder changed";
83 
84  if(f && !f->isRootFolder()) {
85  if( loadHeaders(f) )
86  a_rtManager->showHdrs();
87  else
88  KMessageBox::error(knGlobals.topWidget, i18n("Cannot load index-file."));
89  }
90 }
91 
92 
93 bool KNFolderManager::loadHeaders( KNFolder::Ptr f )
94 {
95  if( !f || f->isRootFolder() )
96  return false;
97 
98  if (f->isLoaded())
99  return true;
100 
101  // we want to delete old stuff first => reduce vm fragmentation
102  knGlobals.memoryManager()->prepareLoad(f);
103 
104  if (f->loadHdrs()) {
105  knGlobals.memoryManager()->updateCacheEntry( boost::static_pointer_cast<KNArticleCollection>( f ) );
106  return true;
107  }
108 
109  return false;
110 }
111 
112 
113 bool KNFolderManager::unloadHeaders( KNFolder::Ptr f, bool force )
114 {
115  if(!f || !f->isLoaded())
116  return false;
117 
118  if (!force && (c_urrentFolder == f))
119  return false;
120 
121  if (f->unloadHdrs(force))
122  knGlobals.memoryManager()->removeCacheEntry( boost::static_pointer_cast<KNArticleCollection>( f ) );
123  else
124  return false;
125 
126  return true;
127 }
128 
129 
130 KNFolder::Ptr KNFolderManager::folder( int id )
131 {
132  for ( KNFolder::List::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it )
133  if ( (*it)->id() == id )
134  return (*it);
135  return KNFolder::Ptr();
136 }
137 
138 
139 KNFolder::Ptr KNFolderManager::newFolder( KNFolder::Ptr p )
140 {
141  if (!p)
142  p = root();
143  KNFolder::Ptr f = KNFolder::Ptr( new KNFolder( ++l_astId, i18n( "New folder" ), p ) );
144  mFolderList.append( f );
145  emit folderAdded(f);
146  return f;
147 }
148 
149 
150 bool KNFolderManager::deleteFolder( KNFolder::Ptr f )
151 {
152  if(!f || f->isRootFolder() || f->isStandardFolder() || f->lockedArticles()>0)
153  return false;
154 
155  KNFolder::List del;
156  KNCollection::Ptr p;
157 
158  // find all subfolders of the folder we want to delete
159  for ( KNFolder::List::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it ) {
160  p = (*it)->parent();
161  while ( p ) {
162  if ( p == f ) {
163  if ( (*it)->lockedArticles() > 0 )
164  return false;
165  del.append( (*it) );
166  break;
167  }
168  p = p->parent();
169  }
170  }
171 
172  emit folderRemoved(f);
173 
174  del.append(f);
175  for ( KNFolder::List::Iterator it = del.begin(); it != del.end(); ++it ) {
176  if ( c_urrentFolder == (*it) )
177  c_urrentFolder = KNFolder::Ptr();
178 
179  if ( unloadHeaders( (*it), true ) ) {
180  (*it)->deleteFiles();
181  mFolderList.removeAll( (*it) );
182  } else
183  return false;
184  }
185 
186  return true;
187 }
188 
189 
190 void KNFolderManager::emptyFolder( KNFolder::Ptr f )
191 {
192  if(!f || f->isRootFolder())
193  return;
194  knGlobals.memoryManager()->removeCacheEntry( boost::static_pointer_cast<KNArticleCollection>( f ) );
195  f->deleteAll();
196 }
197 
198 
199 bool KNFolderManager::canMoveFolder( KNFolder::Ptr f, KNFolder::Ptr p )
200 {
201  if(!f || p==f->parent()) // nothing to be done
202  return true;
203 
204  // Moving a folder on itself
205  if ( f == p ) {
206  return false;
207  }
208 
209  // is "p" a child of "f" ?
210  KNCollection::Ptr p2 = p ? p->parent() : KNCollection::Ptr();
211  while(p2) {
212  if(p2==f)
213  break;
214  p2=p2->parent();
215  }
216 
217  if( (p2 && p2==f) || f==p || f->isStandardFolder() || f->isRootFolder()) // no way ;-)
218  return false;
219 
220  return true;
221 }
222 
223 bool KNFolderManager::moveFolder( KNFolder::Ptr f, KNFolder::Ptr p )
224 {
225  if ( !f || p==f->parent() ) { // nothing to be done
226  return true;
227  }
228 
229  if ( !canMoveFolder( f, p ) ) {
230  return false;
231  }
232 
233  emit folderRemoved(f);
234 
235  // reparent
236  f->setParent(p);
237  f->writeConfig();
238 
239  emit folderAdded(f);
240 
241  if(c_urrentFolder==f)
242  emit folderActivated(f);
243 
244  return true;
245 }
246 
247 
248 int KNFolderManager::unsentForAccount(int accId)
249 {
250  int cnt=0;
251 
252  for ( KNFolder::List::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it ) {
253  for ( int idx = 0; idx < (*it)->length(); ++idx ) {
254  KNLocalArticle::Ptr a = (*it)->at( idx );
255  if ( a->serverId() == accId && a->doPost() && !a->posted() )
256  cnt++;
257  }
258  }
259 
260  return cnt;
261 }
262 
263 
264 void KNFolderManager::compactFolder( KNFolder::Ptr f )
265 {
266  if(!f || f->isRootFolder())
267  return;
268 
269  KNCleanUp cup;
270  cup.compactFolder(f);
271 }
272 
273 
274 void KNFolderManager::compactAll(KNCleanUp *cup)
275 {
276  for ( KNFolder::List::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it )
277  if ( !(*it)->isRootFolder() && (*it)->lockedArticles() == 0 )
278  cup->appendCollection( (*it) );
279 }
280 
281 
282 void KNFolderManager::compactAll()
283 {
284  KNCleanUp *cup = new KNCleanUp();
285  compactAll( cup );
286  cup->start();
287 
288  knGlobals.configManager()->cleanup()->setLastCompactDate();
289  delete cup;
290 }
291 
292 
293 void KNFolderManager::importFromMBox( KNFolder::Ptr f )
294 {
295  if(!f || f->isRootFolder())
296  return;
297 
298  f->setNotUnloadable(true);
299 
300  if (!f->isLoaded() && !loadHeaders(f)) {
301  f->setNotUnloadable(false);
302  return;
303  }
304 
305  KNLoadHelper helper(knGlobals.topWidget);
306  QFile *file = helper.getFile(i18n("Import MBox Folder"));
307  KNLocalArticle::List list;
308  KNLocalArticle::Ptr art;
309  QByteArray str;
310  int artStart=0, artEnd=0;
311  bool done=true;
312 
313  if (file) {
314  ScopedCursorOverride cursor( Qt::WaitCursor );
315  knGlobals.setStatusMsg(i18n(" Importing articles..."));
316  knGlobals.top->secureProcessEvents();
317 
318  if (!file->atEnd()) { // search for the first article...
319  str = file->readLine();
320  if ( str.left( 5 ) == "From " ) {
321  artStart = file->pos();
322  done = false;
323  } else {
324  artStart = KNHelper::findStringInFile( file, "\n\nFrom " );
325  if (artStart != -1) {
326  file->seek( artStart + 1 );
327  str = file->readLine();
328  artStart = file->pos();
329  done = false;
330  }
331  }
332  }
333 
334  knGlobals.top->secureProcessEvents();
335 
336  if (!done) {
337  while (!file->atEnd()) {
338  artEnd = KNHelper::findStringInFile( file, "\n\nFrom " );
339 
340  if (artEnd != -1) {
341  file->seek( artStart ); // seek the first character of the article
342  int size=artEnd-artStart;
343  QByteArray buffer;
344  buffer = file->read( size);
345 
346  if ( !buffer.isEmpty() ) {
347  art = KNLocalArticle::Ptr( new KNLocalArticle( KNArticleCollection::Ptr() ) );
348  art->setEditDisabled(true);
349  art->setContent( buffer );
350  art->parse();
351  list.append(art);
352  }
353 
354  file->seek( artEnd + 1 );
355  str = file->readLine();
356  artStart = file->pos();
357  } else {
358  if ((int)file->size() > artStart) {
359  file->seek( artStart ); // seek the first character of the article
360  int size=file->size()-artStart;
361  QByteArray buffer;
362  buffer = file->read( size );
363 
364  if ( !buffer.isEmpty() ) {
365  art = KNLocalArticle::Ptr( new KNLocalArticle( KNArticleCollection::Ptr() ) );
366  art->setEditDisabled(true);
367  art->setContent( buffer );
368  art->parse();
369  list.append(art);
370  }
371  }
372  }
373 
374  if (list.count()%75 == 0)
375  knGlobals.top->secureProcessEvents();
376  }
377  }
378 
379  knGlobals.setStatusMsg(i18n(" Storing articles..."));
380  knGlobals.top->secureProcessEvents();
381 
382  if (!list.isEmpty())
383  knGlobals.articleManager()->moveIntoFolder(list, f);
384 
385  knGlobals.setStatusMsg( QString() );
386  cursor.restore();
387  }
388 
389  f->setNotUnloadable(false);
390 }
391 
392 
393 void KNFolderManager::exportToMBox( KNFolder::Ptr f )
394 {
395  if(!f || f->isRootFolder())
396  return;
397 
398  f->setNotUnloadable(true);
399 
400  if (!f->isLoaded() && !loadHeaders(f)) {
401  f->setNotUnloadable(false);
402  return;
403  }
404 
405  KNSaveHelper helper(f->name()+".mbox", knGlobals.topWidget);
406  QFile *file = helper.getFile(i18n("Export Folder"));
407 
408  if (file) {
409  ScopedCursorOverride cursor( Qt::WaitCursor );
410  knGlobals.setStatusMsg(i18n(" Exporting articles..."));
411  knGlobals.top->secureProcessEvents();
412 
413  QTextStream ts(file);
414  ts.setCodec( "ISO 8859-1" );
415  KNLocalArticle::Ptr a;
416 
417  for(int idx=0; idx<f->length(); idx++) {
418  a=f->at(idx);
419 
420  a->setNotUnloadable(true);
421 
422  if (a->hasContent() || knGlobals.articleManager()->loadArticle(a)) {
423  ts << "From aaa@aaa Mon Jan 01 00:00:00 1997\n";
424  a->toStream(ts, true);
425  ts << "\n";
426  }
427 
428  a->setNotUnloadable(false);
429 
430  if (idx%75 == 0)
431  knGlobals.top->secureProcessEvents();
432  }
433 
434  knGlobals.setStatusMsg( QString() );
435  }
436 }
437 
438 
439 void KNFolderManager::syncFolders()
440 {
441  QString dir( KStandardDirs::locateLocal( "data", "knode/folders/" ) );
442  if (dir.isNull()) {
443  KNHelper::displayInternalFileError();
444  return;
445  }
446 
447  //sync
448  for ( KNFolder::List::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it ) {
449  if ( !(*it)->isRootFolder() )
450  (*it)->syncIndex();
451  (*it)->writeConfig();
452  }
453 }
454 
455 
456 int KNFolderManager::loadCustomFolders()
457 {
458  int cnt=0;
459  QString dir( KStandardDirs::locateLocal( "data", "knode/folders/" ) );
460  KNFolder::Ptr f;
461 
462  if (dir.isNull()) {
463  KNHelper::displayInternalFileError();
464  return 0;
465  }
466 
467  QDir d(dir);
468  QStringList entries(d.entryList(QStringList("custom_*.info"))); // ignore info files of standard folders
469  for(QStringList::Iterator it=entries.begin(); it != entries.end(); ++it) {
470  f = KNFolder::Ptr( new KNFolder() );
471  if(f->readInfo(d.absoluteFilePath(*it))) {
472  if(f->id()>l_astId)
473  l_astId=f->id();
474  mFolderList.append( f );
475  cnt++;
476  }
477  }
478 
479  // set parents
480  if(cnt>0) {
481  for ( KNFolder::List::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it ) {
482  if ( !(*it)->isRootFolder() ) { // the root folder has no parent
483  KNFolder::Ptr par = folder( (*it)->parentId() );
484  if ( !par )
485  par = root();
486  (*it)->setParent( par );
487  }
488  }
489  }
490 
491  return cnt;
492 }
493 
494 
495 #include "knfoldermanager.moc"
KNFolderManager::KNFolderManager
KNFolderManager(KNArticleManager *a)
Definition: knfoldermanager.cpp:35
KNSaveHelper::getFile
QFile * getFile(const QString &dialogTitle)
returns a file open for writing
Definition: utilities.cpp:58
KNHelper::findStringInFile
static int findStringInFile(QFile *file, const char *str)
Searches for the string from the current file position.
Definition: utilities.cpp:369
KNFolderManager::c_urrentFolder
KNFolder::Ptr c_urrentFolder
Definition: knfoldermanager.h:105
KNLocalArticle::Ptr
boost::shared_ptr< KNLocalArticle > Ptr
Shared pointer to a KNLocalArticle. To be used instead of raw KNLocalArticle*.
Definition: knarticle.h:214
KNFolderManager::loadHeaders
bool loadHeaders(KNFolder::Ptr f)
Definition: knfoldermanager.cpp:93
knmemorymanager.h
utilities.h
knfolder.h
KNFolderManager::~KNFolderManager
~KNFolderManager()
Definition: knfoldermanager.cpp:71
KNFolderManager::exportToMBox
void exportToMBox(KNFolder::Ptr f)
Definition: knfoldermanager.cpp:393
KNFolderManager::unsentForAccount
int unsentForAccount(int accId)
Definition: knfoldermanager.cpp:248
KNCleanUp::compactFolder
void compactFolder(KNFolder::Ptr f)
Compacts the given folder, ie.
Definition: kncleanup.cpp:192
KNFolderManager::syncFolders
void syncFolders()
Definition: knfoldermanager.cpp:439
knarticlemanager.h
KNFolder::Ptr
boost::shared_ptr< KNFolder > Ptr
Shared pointer to a KNFolder.
Definition: knfolder.h:38
KNFolderManager::setCurrentFolder
void setCurrentFolder(KNFolder::Ptr f)
Definition: knfoldermanager.cpp:77
KNode::Utilities::ScopedCursorOverride::restore
void restore()
Restore the previous cursor shape.
Definition: scoped_cursor_override.h:59
KNLoadHelper
File open helper (includes file open dialog and network download).
Definition: utilities.h:55
KNFolderManager::mFolderList
KNFolder::List mFolderList
Definition: knfoldermanager.h:106
KNCleanUp
This class handles group expiration and folder compaction.
Definition: kncleanup.h:36
scoped_cursor_override.h
KNLocalArticle
This class encapsulates an article, that is stored locally in an MBOX-file.
Definition: knarticle.h:210
KNHelper::displayInternalFileError
static void displayInternalFileError(QWidget *w=0)
use this for all internal files
Definition: utilities.cpp:344
KNFolderManager::l_astId
int l_astId
Definition: knfoldermanager.h:107
KNFolderManager::compactFolder
void compactFolder(KNFolder::Ptr f)
Definition: knfoldermanager.cpp:264
KNFolderManager::folderRemoved
void folderRemoved(KNFolder::Ptr f)
Emitted when a folder is removed.
KNLoadHelper::getFile
QFile * getFile(const QString &dialogTitle)
opens a file dialog and returns a file open for reading
Definition: utilities.cpp:113
KNFolderManager::emptyFolder
void emptyFolder(KNFolder::Ptr f)
Definition: knfoldermanager.cpp:190
KNFolderManager::folderActivated
void folderActivated(KNFolder::Ptr f)
knmainwidget.h
KNCleanUp::appendCollection
void appendCollection(KNArticleCollection::Ptr c)
Add a collection to handle.
Definition: kncleanup.h:45
KNArticleManager::setFolder
void setFolder(KNFolder::Ptr f)
Definition: knarticlemanager.cpp:414
KNFolderManager::newFolder
KNFolder::Ptr newFolder(KNFolder::Ptr p)
Definition: knfoldermanager.cpp:139
KNCleanUp::start
void start()
Definition: kncleanup.cpp:52
KNFolderManager::a_rtManager
KNArticleManager * a_rtManager
Definition: knfoldermanager.h:108
KNFolderManager::moveFolder
bool moveFolder(KNFolder::Ptr f, KNFolder::Ptr p)
Move the folder f to a new parent p.
Definition: knfoldermanager.cpp:223
KNFolderManager::canMoveFolder
bool canMoveFolder(KNFolder::Ptr f, KNFolder::Ptr p)
Returns true if the folder f can be moved under a new parent p.
Definition: knfoldermanager.cpp:199
knglobals.h
KNCollection::Ptr
boost::shared_ptr< KNCollection > Ptr
Shared pointer to a KNCollection.
Definition: kncollection.h:40
knfoldermanager.h
KNArticleManager
Article manager.
Definition: knarticlemanager.h:38
KNFolderManager::loadCustomFolders
int loadCustomFolders()
Definition: knfoldermanager.cpp:456
KNFolderManager::unloadHeaders
bool unloadHeaders(KNFolder::Ptr f, bool force=true)
Definition: knfoldermanager.cpp:113
KNFolderManager::importFromMBox
void importFromMBox(KNFolder::Ptr f)
Definition: knfoldermanager.cpp:293
KNFolderManager::folderAdded
void folderAdded(KNFolder::Ptr f)
Emitted when a folder is added.
kncleanup.h
KNFolderManager::root
KNFolder::Ptr root() const
Returns the root folder.
Definition: knfoldermanager.h:44
KNArticleCollection::Ptr
boost::shared_ptr< KNArticleCollection > Ptr
Shared pointer to a KNArticle.
Definition: knarticlecollection.h:82
knconfigmanager.h
KNFolder
Representation of a folder.
Definition: knfolder.h:30
KNode::Utilities::ScopedCursorOverride
This object change the application cursor to a given type and then restore the previous cursor when i...
Definition: scoped_cursor_override.h:36
KNSaveHelper
File save helper (includes file save dialog and network upload).
Definition: utilities.h:29
KNArticleManager::showHdrs
void showHdrs(bool clear=true)
Definition: knarticlemanager.cpp:181
KNFolderManager::compactAll
void compactAll()
Definition: knfoldermanager.cpp:282
knGlobals
#define knGlobals
Keep compatibility with the old way.
Definition: knglobals.h:28
KNFolderManager::deleteFolder
bool deleteFolder(KNFolder::Ptr f)
Definition: knfoldermanager.cpp:150
KNFolderManager::folder
KNFolder::Ptr folder(int id)
Definition: knfoldermanager.cpp:130
QList< KNFolder::Ptr >
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