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

kmail

  • sources
  • kde-4.14
  • kdepim
  • kmail
  • folderarchive
folderarchivemanager.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2013-2015 Montel Laurent <montel@kde.org>
3 
4  This program is free software; you can redistribute it and/or modify it
5  under the terms of the GNU General Public License, version 2, as
6  published by the Free Software Foundation.
7 
8  This program is distributed in the hope that it will be useful, but
9  WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License along
14  with this program; if not, write to the Free Software Foundation, Inc.,
15  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 #include "folderarchivemanager.h"
19 #include "folderarchiveagentjob.h"
20 #include "folderarchiveaccountinfo.h"
21 #include "folderarchivecache.h"
22 #include "folderarchiveutil.h"
23 
24 #include <Akonadi/AgentManager>
25 #include <Akonadi/ItemFetchJob>
26 #include <Akonadi/ItemFetchScope>
27 #include <Akonadi/CollectionFetchJob>
28 
29 #include <KSharedConfig>
30 #include <KGlobal>
31 #include <KNotification>
32 #include <KIcon>
33 #include <KLocale>
34 #include <KIconLoader>
35 
36 FolderArchiveManager::FolderArchiveManager(QObject *parent)
37  : QObject(parent),
38  mCurrentJob(0)
39 {
40  mFolderArchiveCache = new FolderArchiveCache(this);
41  load();
42 }
43 
44 FolderArchiveManager::~FolderArchiveManager()
45 {
46  qDeleteAll(mListAccountInfo);
47  mListAccountInfo.clear();
48  qDeleteAll(mJobQueue);
49  delete mCurrentJob;
50 }
51 
52 void FolderArchiveManager::slotCollectionRemoved(const Akonadi::Collection &collection)
53 {
54  KConfig config(FolderArchive::FolderArchiveUtil::configFileName());
55  mFolderArchiveCache->clearCacheWithContainsCollection(collection.id());
56  Q_FOREACH (FolderArchiveAccountInfo *info, mListAccountInfo) {
57  if (info->archiveTopLevel() == collection.id()) {
58  info->setArchiveTopLevel(-1);
59  KConfigGroup group = config.group(FolderArchive::FolderArchiveUtil::groupConfigPattern() + info->instanceName());
60  info->writeConfig(group);
61  }
62  }
63  load();
64 }
65 
66 FolderArchiveAccountInfo *FolderArchiveManager::infoFromInstanceName(const QString &instanceName) const
67 {
68  Q_FOREACH (FolderArchiveAccountInfo *info, mListAccountInfo) {
69  if (info->instanceName() == instanceName) {
70  return info;
71  }
72  }
73  return 0;
74 }
75 
76 void FolderArchiveManager::setArchiveItem(qlonglong itemId)
77 {
78  Akonadi::ItemFetchJob *job = new Akonadi::ItemFetchJob( Akonadi::Item(itemId), this );
79  job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
80  job->fetchScope().setFetchRemoteIdentification(true);
81  connect( job, SIGNAL(result(KJob*)), SLOT(slotFetchParentCollection(KJob*)) );
82 }
83 
84 void FolderArchiveManager::slotFetchParentCollection(KJob *job)
85 {
86  if ( job->error() ) {
87  moveFailed(i18n("Unable to fetch folder. Error reported: %1",job->errorString()));
88  kDebug()<<"Unable to fetch folder:"<<job->errorString();
89  return;
90  }
91  const Akonadi::ItemFetchJob *fetchJob = qobject_cast<Akonadi::ItemFetchJob*>( job );
92  const Akonadi::Item::List items = fetchJob->items();
93  if (items.isEmpty()) {
94  moveFailed(i18n("No folder returned."));
95  kDebug()<<"Fetch list is empty";
96  } else {
97  Akonadi::CollectionFetchJob* jobCol = new Akonadi::CollectionFetchJob( Akonadi::Collection(items.first().parentCollection().id()), Akonadi::CollectionFetchJob::Base, this );
98  jobCol->setProperty("itemId", items.first().id());
99  connect( jobCol, SIGNAL(result(KJob*)), SLOT(slotFetchCollection(KJob*)) );
100  }
101 }
102 
103 void FolderArchiveManager::slotFetchCollection(KJob *job)
104 {
105  if ( job->error() ) {
106  moveFailed(i18n("Unable to fetch parent folder. Error reported: %1", job->errorString()));
107  kDebug()<<"cannot fetch collection "<<job->errorString();
108  return;
109  }
110  Akonadi::CollectionFetchJob* jobCol = qobject_cast<Akonadi::CollectionFetchJob*>(job);
111  if (jobCol->collections().isEmpty()) {
112  moveFailed(i18n("Unable to return list of folders."));
113  kDebug()<<"List of folder is empty";
114  return;
115  }
116 
117  QList<Akonadi::Item> itemIds;
118  itemIds << Akonadi::Item(jobCol->property("itemId").toLongLong());
119  setArchiveItems(itemIds, jobCol->collections().first().resource());
120 }
121 
122 void FolderArchiveManager::setArchiveItems(const QList<Akonadi::Item> &items, const QString &instanceName)
123 {
124  FolderArchiveAccountInfo *info = infoFromInstanceName(instanceName);
125  if (info) {
126  FolderArchiveAgentJob *job = new FolderArchiveAgentJob(this, info, items);
127  if (mCurrentJob) {
128  mJobQueue.enqueue(job);
129  } else {
130  mCurrentJob = job;
131  job->start();
132  }
133  }
134 }
135 
136 void FolderArchiveManager::slotInstanceRemoved(const Akonadi::AgentInstance &instance)
137 {
138  const QString instanceName = instance.name();
139  Q_FOREACH (FolderArchiveAccountInfo *info, mListAccountInfo) {
140  if (info->instanceName() == instanceName) {
141  mListAccountInfo.removeAll(info);
142  removeInfo(instanceName);
143  break;
144  }
145  }
146 }
147 
148 void FolderArchiveManager::removeInfo(const QString &instanceName)
149 {
150  KConfig config(FolderArchive::FolderArchiveUtil::configFileName());
151  KConfigGroup group = config.group(FolderArchive::FolderArchiveUtil::groupConfigPattern() + instanceName);
152  group.deleteGroup();
153  config.sync();
154 }
155 
156 void FolderArchiveManager::load()
157 {
158  qDeleteAll(mListAccountInfo);
159  mListAccountInfo.clear();
160  //Be sure to clear cache.
161  mFolderArchiveCache->clearCache();
162 
163  KConfig config(FolderArchive::FolderArchiveUtil::configFileName());
164  const QStringList accountList = config.groupList().filter( QRegExp( FolderArchive::FolderArchiveUtil::groupConfigPattern() ) );
165  Q_FOREACH (const QString &account, accountList) {
166  KConfigGroup group = config.group(account);
167  FolderArchiveAccountInfo *info = new FolderArchiveAccountInfo(group);
168  if (info->enabled()) {
169  mListAccountInfo.append(info);
170  } else {
171  delete info;
172  }
173  }
174 }
175 
176 void FolderArchiveManager::moveDone()
177 {
178  const QPixmap pixmap = KIcon( QLatin1String("kmail") ).pixmap( KIconLoader::SizeSmall, KIconLoader::SizeSmall );
179 
180  KNotification::event( QLatin1String("folderarchivedone"),
181  i18n("Messages archived"),
182  pixmap,
183  0,
184  KNotification::CloseOnTimeout,
185  KGlobal::mainComponent());
186  nextJob();
187 }
188 
189 void FolderArchiveManager::moveFailed(const QString &msg)
190 {
191  const QPixmap pixmap = KIcon( QLatin1String("kmail") ).pixmap( KIconLoader::SizeSmall, KIconLoader::SizeSmall );
192 
193  KNotification::event( QLatin1String("folderarchiveerror"),
194  msg,
195  pixmap,
196  0,
197  KNotification::CloseOnTimeout,
198  KGlobal::mainComponent());
199  nextJob();
200 }
201 
202 void FolderArchiveManager::nextJob()
203 {
204  mCurrentJob->deleteLater();
205  if (mJobQueue.isEmpty()) {
206  mCurrentJob = 0;
207  } else {
208  mCurrentJob = mJobQueue.dequeue();
209  mCurrentJob->start();
210  }
211 }
212 
213 FolderArchiveCache *FolderArchiveManager::folderArchiveCache() const
214 {
215  return mFolderArchiveCache;
216 }
217 
218 void FolderArchiveManager::reloadConfig()
219 {
220  load();
221 }
222 
QList::clear
void clear()
FolderArchiveManager::~FolderArchiveManager
~FolderArchiveManager()
Definition: folderarchivemanager.cpp:44
FolderArchiveManager::moveFailed
void moveFailed(const QString &msg)
Definition: folderarchivemanager.cpp:189
QQueue::enqueue
void enqueue(const T &t)
folderarchivemanager.h
QQueue::dequeue
T dequeue()
FolderArchiveAccountInfo::instanceName
QString instanceName() const
Definition: folderarchiveaccountinfo.cpp:68
FolderArchiveCache::clearCache
void clearCache()
Definition: folderarchivecache.cpp:31
FolderArchiveAgentJob::start
void start()
Definition: folderarchiveagentjob.cpp:44
folderarchiveaccountinfo.h
folderarchiveutil.h
QRegExp
FolderArchiveManager::setArchiveItems
void setArchiveItems(const QList< Akonadi::Item > &items, const QString &instanceName)
Definition: folderarchivemanager.cpp:122
QList::append
void append(const T &value)
FolderArchiveAccountInfo::setArchiveTopLevel
void setArchiveTopLevel(Akonadi::Collection::Id id)
Definition: folderarchiveaccountinfo.cpp:58
FolderArchiveManager::folderArchiveCache
FolderArchiveCache * folderArchiveCache() const
Definition: folderarchivemanager.cpp:213
QObject
QList::removeAll
int removeAll(const T &value)
QObject::deleteLater
void deleteLater()
FolderArchiveAccountInfo::writeConfig
void writeConfig(KConfigGroup &config)
Definition: folderarchiveaccountinfo.cpp:107
QList::first
T & first()
QString
FolderArchiveAccountInfo::archiveTopLevel
Akonadi::Collection::Id archiveTopLevel() const
Definition: folderarchiveaccountinfo.cpp:63
QList< Akonadi::Item >
FolderArchiveAccountInfo
Definition: folderarchiveaccountinfo.h:24
FolderArchiveManager::reloadConfig
void reloadConfig()
Definition: folderarchivemanager.cpp:218
FolderArchiveAccountInfo::enabled
bool enabled() const
Definition: folderarchiveaccountinfo.cpp:83
QStringList
QPixmap
FolderArchiveManager::moveDone
void moveDone()
Definition: folderarchivemanager.cpp:176
FolderArchiveManager::FolderArchiveManager
FolderArchiveManager(QObject *parent=0)
Definition: folderarchivemanager.cpp:36
FolderArchive::FolderArchiveUtil::configFileName
QString configFileName()
Definition: folderarchiveutil.cpp:30
FolderArchiveCache::clearCacheWithContainsCollection
void clearCacheWithContainsCollection(Akonadi::Collection::Id id)
Definition: folderarchivecache.cpp:36
folderarchiveagentjob.h
QLatin1String
FolderArchive::FolderArchiveUtil::groupConfigPattern
QString groupConfigPattern()
Definition: folderarchiveutil.cpp:25
FolderArchiveManager::setArchiveItem
void setArchiveItem(qlonglong itemId)
Definition: folderarchivemanager.cpp:76
FolderArchiveManager::load
void load()
Definition: folderarchivemanager.cpp:156
QStringList::filter
QStringList filter(const QString &str, Qt::CaseSensitivity cs) const
folderarchivecache.h
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
FolderArchiveCache
Definition: folderarchivecache.h:40
FolderArchiveManager::slotCollectionRemoved
void slotCollectionRemoved(const Akonadi::Collection &collection)
Definition: folderarchivemanager.cpp:52
KJob
FolderArchiveManager::slotInstanceRemoved
void slotInstanceRemoved(const Akonadi::AgentInstance &instance)
Definition: folderarchivemanager.cpp:136
FolderArchiveAgentJob
Definition: folderarchiveagentjob.h:27
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:34:33 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kmail

Skip menu "kmail"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

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
  • pimprint

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