Disable clipboardsharing in view only mode.
[kdenetwork.git] / kget / core / transferhistorystore.cpp
blob16e2da320fa8721b365cc5dc2e3200623bab97f5
1 /* This file is part of the KDE project
3 Copyright (C) 2007 by Lukas Appelhans <l.appelhans@gmx.de>
4 Copyright (C) 2008 by Javier Goday <jgoday@gmail.com>
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
11 #include "core/transferhistorystore.h"
12 #include "core/transferhistorystore_xml_p.h"
13 #include "core/transfer.h"
14 #include "settings.h"
16 #include <QDateTime>
17 #include <QDomDocument>
18 #include <QFile>
19 #include <QList>
20 #include <QThread>
21 #include <QTimer>
23 #ifdef HAVE_SQLITE
24 #include "core/transferhistorystore_sqlite_p.h"
25 #include <QSqlDatabase>
26 #include <QSqlError>
27 #include <QSqlQuery>
28 #include <QSqlRecord>
29 #endif
31 #include <KDebug>
32 #include <kio/global.h>
33 #include <KLocale>
34 #include <KMessageBox>
35 #include <KStandardDirs>
37 TransferHistoryItem::TransferHistoryItem() : QObject()
40 TransferHistoryItem::TransferHistoryItem(const Transfer &transfer) : QObject()
42 setDest(transfer.dest().url());
43 setSource(transfer.source().url());
44 setSize(transfer.totalSize());
45 setDateTime(QDateTime::currentDateTime());
47 setState(transfer.status());
50 TransferHistoryItem::TransferHistoryItem(const TransferHistoryItem &item) : QObject()
52 setDest(item.dest());
53 setSource(item.source());
54 setState(item.state());
55 setSize(item.size());
56 setDateTime(item.dateTime());
59 void TransferHistoryItem::setDest(const QString &dest)
61 m_dest = dest;
64 void TransferHistoryItem::setSource(const QString &source)
66 m_source = source;
69 void TransferHistoryItem::setState(int state)
71 m_state = state;
74 void TransferHistoryItem::setSize(int size)
76 m_size = size;
79 void TransferHistoryItem::setDateTime(const QDateTime &dateTime)
81 m_dateTime = dateTime;
84 QString TransferHistoryItem::dest() const
86 return m_dest;
89 QString TransferHistoryItem::source() const
91 return m_source;
94 int TransferHistoryItem::state() const
96 return m_state;
99 int TransferHistoryItem::size() const
101 return m_size;
104 QDateTime TransferHistoryItem::dateTime() const
106 return m_dateTime;
109 TransferHistoryItem& TransferHistoryItem::operator=(const TransferHistoryItem &item)
111 setDest(item.dest());
112 setSource(item.source());
113 setState(item.state());
114 setSize(item.size());
115 setDateTime(item.dateTime());
117 return *this;
120 bool TransferHistoryItem::operator==(const TransferHistoryItem& item)
122 return dest() == item.dest() && source() == item.source();
125 TransferHistoryStore::TransferHistoryStore() : QObject(),
126 m_items()
130 TransferHistoryStore::~TransferHistoryStore()
134 QList <TransferHistoryItem> TransferHistoryStore::items() const
136 return m_items;
139 TransferHistoryStore *TransferHistoryStore::getStore()
141 switch(Settings::historyBackend())
143 case TransferHistoryStore::SQLite:
144 #ifdef HAVE_SQLITE
145 return new SQLiteStore(KStandardDirs::locateLocal("appdata", "transferhistory.db"));
146 break;
147 #endif
148 case TransferHistoryStore::Xml:
149 default:
150 return new XmlStore(KStandardDirs::locateLocal("appdata", "transferhistory.kgt"));
154 XmlStore::SaveThread::SaveThread(QObject *parent, const QString &url, const QList<TransferHistoryItem> &list) : QThread(parent),
155 m_url(url),
156 m_items(list),
157 m_item()
161 XmlStore::SaveThread::SaveThread(QObject *parent, const QString &url, const TransferHistoryItem &item) : QThread(parent),
162 m_url(url),
163 m_items(),
164 m_item(item)
168 void XmlStore::SaveThread::run()
170 QFile file(m_url);
171 QDomDocument *doc;
172 QDomElement root;
174 if (!file.exists())
176 doc = new QDomDocument("Transfers");
177 root = doc->createElement("Transfers");
178 doc->appendChild(root);
180 else
182 doc = new QDomDocument();
183 doc->setContent(&file);
184 file.close();
185 root = doc->documentElement();
186 doc->appendChild(root);
189 QDomElement e = doc->createElement("Transfer");
190 root.appendChild(e);
192 e.setAttribute("Source", m_item.source());
193 e.setAttribute("Dest", m_item.dest());
194 e.setAttribute("Time", QDateTime::currentDateTime().toTime_t());
195 e.setAttribute("Size", QString::number(m_item.size()));
196 e.setAttribute("State", QString::number(m_item.state()));
198 if (file.open(QFile::WriteOnly | QFile::Truncate)) {
199 QTextStream stream( &file );
200 doc->save( stream, 0 );
201 file.close();
203 delete doc;
206 XmlStore::DeleteThread::DeleteThread(QObject *parent, const QString &url, const TransferHistoryItem &item) : QThread(parent),
207 m_url(url),
208 m_item(item),
209 m_items()
213 void XmlStore::DeleteThread::run()
215 QDomDocument doc("tempHistory");
216 QFile file(m_url);
218 QString error;
219 int line;
220 int column;
221 int total;
223 if (!doc.setContent(&file, &error, &line, &column))
225 kDebug(5001) << "Error1" << error << line << column;
226 return;
228 file.close();
230 QDomElement root = doc.documentElement();
231 total = root.childNodes().size();
233 QDomNodeList list = root.elementsByTagName("Transfer");
235 int nItems = list.length();
237 for (int i = 0 ; i < nItems ; i++) {
238 QDomElement element = list.item(i).toElement();
240 if(QString::compare(element.attribute("Source"), m_item.source()) == 0) {
241 root.removeChild(element);
243 else {
244 TransferHistoryItem item;
245 item.setDest(element.attribute("Dest"));
246 item.setSource(element.attribute("Source"));
247 item.setSize(element.attribute("Size").toInt());
248 item.setDateTime(QDateTime::fromTime_t(element.attribute("Time").toUInt()));
249 item.setState(element.attribute("State").toInt());
250 m_items << item;
254 if (file.open(QFile::WriteOnly | QFile::Truncate)) {
255 QTextStream stream( &file );
256 doc.save(stream, 0);
257 file.close();
258 doc.clear();
262 XmlStore::LoadThread::LoadThread(QObject *parent, const QString &url) : QThread(parent),
263 m_url(url)
267 void XmlStore::LoadThread::run()
269 qRegisterMetaType<TransferHistoryItem>("TransferHistoryItem");
270 QDomDocument doc("tempHistory");
271 QFile file(m_url);
273 QString error;
274 int line;
275 int column;
276 int total;
278 if (!doc.setContent(&file, &error, &line, &column))
280 kDebug(5001) << "Error1" << error << line << column;
281 file.close();
282 return;
285 QDomElement root = doc.documentElement();
286 total = root.childNodes().size();
288 QDomNodeList list = root.elementsByTagName("Transfer");
290 int nItems = list.length();
292 for (int i = 0 ; i < nItems ; i++)
294 QDomElement dom = list.item(i).toElement();
295 TransferHistoryItem item;
296 item.setDest(dom.attribute("Dest"));
297 item.setSource(dom.attribute("Source"));
298 item.setSize(dom.attribute("Size").toInt());
299 item.setDateTime(QDateTime::fromTime_t(dom.attribute("Time").toUInt()));
300 item.setState(dom.attribute("State").toInt());
302 emit elementLoaded(i, total, item);
304 doc.clear();
305 file.close();
306 TransferHistoryItem item;
308 emit elementLoaded(total, total, item);
309 kDebug(5001) << "Load file" << m_url;
312 XmlStore::XmlStore(const QString &url) : TransferHistoryStore(),
313 m_storeUrl(url),
314 m_loadThread(0),
315 m_saveThread(0),
316 m_deleteThread(0)
320 XmlStore::~XmlStore()
322 if(m_loadThread && m_loadThread->isRunning()) {
323 m_loadThread->terminate();
326 if(m_saveThread && m_saveThread->isRunning()) {
327 m_saveThread->terminate();
330 if(m_deleteThread && m_deleteThread->isRunning()) {
331 m_deleteThread->terminate();
334 delete m_loadThread;
335 delete m_saveThread;
336 delete m_deleteThread;
339 void XmlStore::load()
341 m_items.clear();
342 // TODO: only load if necessary
343 m_loadThread = new XmlStore::LoadThread(this, m_storeUrl);
345 connect(m_loadThread, SIGNAL(finished()), SIGNAL(loadFinished()));
346 connect(m_loadThread, SIGNAL(elementLoaded(int, int, const TransferHistoryItem &)),
347 SIGNAL(elementLoaded(int, int, const TransferHistoryItem &)));
348 connect(m_loadThread, SIGNAL(elementLoaded(int, int, const TransferHistoryItem &)),
349 SLOT(slotLoadElement(int, int, const TransferHistoryItem &)));
350 m_loadThread->start();
353 void XmlStore::clear()
355 QFile::remove(m_storeUrl);
358 void XmlStore::saveItem(const TransferHistoryItem &item)
360 m_saveThread = new XmlStore::SaveThread(this, m_storeUrl, item);
362 connect(m_saveThread, SIGNAL(finished()), SIGNAL(saveFinished()));
363 connect(m_saveThread, SIGNAL(elementLoaded(int, int, const TransferHistoryItem &)),
364 SIGNAL(elementLoaded(int, int, const TransferHistoryItem &)));
365 m_saveThread->start();
368 void XmlStore::deleteItem(const TransferHistoryItem &item)
370 Q_UNUSED(item)
372 m_deleteThread = new XmlStore::DeleteThread(this, m_storeUrl, item);
374 connect(m_deleteThread, SIGNAL(finished()), SLOT(slotDeleteElement()));
376 m_deleteThread->start();
379 void XmlStore::slotLoadElement(int number, int total, const TransferHistoryItem &item)
381 Q_UNUSED(number)
382 Q_UNUSED(total)
383 m_items.append(item);
386 void XmlStore::slotDeleteElement()
388 m_items.clear();
389 m_items << m_deleteThread->items();
391 emit loadFinished();
394 #ifdef HAVE_SQLITE
395 SQLiteStore::SQLiteStore(const QString &database) : TransferHistoryStore(),
396 m_dbName(database),
397 m_sql()
401 SQLiteStore::~SQLiteStore()
403 if (m_sql.isOpen()) {
404 m_sql.close();
408 void SQLiteStore::load()
410 m_items.clear();
411 if (sql().open()) {
412 if (!sql().tables().contains("transfer_history_item")) {
413 createTables();
416 QSqlQuery query = sql().exec("SELECT * FROM transfer_history_item");
418 if (query.lastError().isValid()) {
419 kDebug() << query.lastError().text();
421 else {
422 QSqlRecord rec = query.record();
424 while (query.next()) {
425 TransferHistoryItem item;
426 item.setDest(query.value(rec.indexOf("dest")).toString());
427 item.setSource(query.value(rec.indexOf("source")).toString());
428 item.setState(query.value(rec.indexOf("state")).toInt());
429 item.setDateTime(QDateTime::fromTime_t(query.value(rec.indexOf("time")).toUInt()));
430 item.setSize(query.value(rec.indexOf("size")).toInt());
432 m_items << item;
433 emit elementLoaded(query.at(), query.size(), item);
438 sql().close();
440 emit loadFinished();
443 void SQLiteStore::clear()
445 QFile::remove(m_dbName);
448 void SQLiteStore::saveItem(const TransferHistoryItem &item)
450 if (sql().open()) {
451 if (!sql().tables().contains("transfer_history_item")) {
452 createTables();
455 QSqlQuery query = sql().exec("insert into transfer_history_item(source, dest, size, time, state)"
456 "values ('"+item.source()+"', '"+item.dest()+"', "
457 + QString::number(item.size()) + ", "
458 + QString::number(item.dateTime().toTime_t()) + ", '"
459 + QString::number(item.state())+"')");
461 if (query.lastError().isValid()) {
462 kDebug() << query.lastError().text();
465 sql().commit();
466 m_items << item;
468 sql().close();
470 emit saveFinished();
473 void SQLiteStore::deleteItem(const TransferHistoryItem &item)
475 if (sql().open()) {
476 if (!sql().tables().contains("transfer_history_item")) {
477 createTables();
480 QSqlQuery query = sql().exec("delete from transfer_history_item where "
481 " source = '" + item.source() + "';");
483 if (query.lastError().isValid()) {
484 kDebug() << query.lastError().text();
487 sql().commit();
488 m_items.removeAll(item);
490 sql().close();
492 emit deleteFinished();
495 QSqlDatabase SQLiteStore::sql()
497 if (!m_sql.isValid()) {
498 m_sql = QSqlDatabase::addDatabase("QSQLITE");
499 m_sql.setDatabaseName(m_dbName);
502 return m_sql;
505 void SQLiteStore::createTables()
507 QSqlQuery query = sql().exec("CREATE TABLE transfer_history_item(dest VARCHAR NOT NULL, "
508 "source VARCHAR NOT NULL, size int NOT NULL, time int not null, "
509 "state int, PRIMARY KEY(dest, source));");
511 if (query.lastError().isValid()) {
512 kDebug() << query.lastError().text();
515 #endif
517 #include "transferhistorystore.moc"
518 #include "transferhistorystore_xml_p.moc"
519 #ifdef HAVE_SQLITE
520 #include "transferhistorystore_sqlite_p.moc"
521 #endif