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"
17 #include <QDomDocument>
24 #include "core/transferhistorystore_sqlite_p.h"
25 #include <QSqlDatabase>
32 #include <kio/global.h>
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()
53 setSource(item
.source());
54 setState(item
.state());
56 setDateTime(item
.dateTime());
59 void TransferHistoryItem::setDest(const QString
&dest
)
64 void TransferHistoryItem::setSource(const QString
&source
)
69 void TransferHistoryItem::setState(int state
)
74 void TransferHistoryItem::setSize(int size
)
79 void TransferHistoryItem::setDateTime(const QDateTime
&dateTime
)
81 m_dateTime
= dateTime
;
84 QString
TransferHistoryItem::dest() const
89 QString
TransferHistoryItem::source() const
94 int TransferHistoryItem::state() const
99 int TransferHistoryItem::size() const
104 QDateTime
TransferHistoryItem::dateTime() const
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());
120 bool TransferHistoryItem::operator==(const TransferHistoryItem
& item
)
122 return dest() == item
.dest() && source() == item
.source();
125 TransferHistoryStore::TransferHistoryStore() : QObject(),
130 TransferHistoryStore::~TransferHistoryStore()
134 QList
<TransferHistoryItem
> TransferHistoryStore::items() const
139 TransferHistoryStore
*TransferHistoryStore::getStore()
141 switch(Settings::historyBackend())
143 case TransferHistoryStore::SQLite
:
145 return new SQLiteStore(KStandardDirs::locateLocal("appdata", "transferhistory.db"));
148 case TransferHistoryStore::Xml
:
150 return new XmlStore(KStandardDirs::locateLocal("appdata", "transferhistory.kgt"));
154 XmlStore::SaveThread::SaveThread(QObject
*parent
, const QString
&url
, const QList
<TransferHistoryItem
> &list
) : QThread(parent
),
161 XmlStore::SaveThread::SaveThread(QObject
*parent
, const QString
&url
, const TransferHistoryItem
&item
) : QThread(parent
),
168 void XmlStore::SaveThread::run()
176 doc
= new QDomDocument("Transfers");
177 root
= doc
->createElement("Transfers");
178 doc
->appendChild(root
);
182 doc
= new QDomDocument();
183 doc
->setContent(&file
);
185 root
= doc
->documentElement();
186 doc
->appendChild(root
);
189 QDomElement e
= doc
->createElement("Transfer");
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 );
206 XmlStore::DeleteThread::DeleteThread(QObject
*parent
, const QString
&url
, const TransferHistoryItem
&item
) : QThread(parent
),
213 void XmlStore::DeleteThread::run()
215 QDomDocument
doc("tempHistory");
223 if (!doc
.setContent(&file
, &error
, &line
, &column
))
225 kDebug(5001) << "Error1" << error
<< line
<< column
;
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
);
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());
254 if (file
.open(QFile::WriteOnly
| QFile::Truncate
)) {
255 QTextStream
stream( &file
);
262 XmlStore::LoadThread::LoadThread(QObject
*parent
, const QString
&url
) : QThread(parent
),
267 void XmlStore::LoadThread::run()
269 qRegisterMetaType
<TransferHistoryItem
>("TransferHistoryItem");
270 QDomDocument
doc("tempHistory");
278 if (!doc
.setContent(&file
, &error
, &line
, &column
))
280 kDebug(5001) << "Error1" << error
<< line
<< column
;
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
);
306 TransferHistoryItem item
;
308 emit
elementLoaded(total
, total
, item
);
309 kDebug(5001) << "Load file" << m_url
;
312 XmlStore::XmlStore(const QString
&url
) : TransferHistoryStore(),
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();
336 delete m_deleteThread
;
339 void XmlStore::load()
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
)
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
)
383 m_items
.append(item
);
386 void XmlStore::slotDeleteElement()
389 m_items
<< m_deleteThread
->items();
395 SQLiteStore::SQLiteStore(const QString
&database
) : TransferHistoryStore(),
401 SQLiteStore::~SQLiteStore()
403 if (m_sql
.isOpen()) {
408 void SQLiteStore::load()
412 if (!sql().tables().contains("transfer_history_item")) {
416 QSqlQuery query
= sql().exec("SELECT * FROM transfer_history_item");
418 if (query
.lastError().isValid()) {
419 kDebug() << query
.lastError().text();
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());
433 emit
elementLoaded(query
.at(), query
.size(), item
);
443 void SQLiteStore::clear()
445 QFile::remove(m_dbName
);
448 void SQLiteStore::saveItem(const TransferHistoryItem
&item
)
451 if (!sql().tables().contains("transfer_history_item")) {
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();
473 void SQLiteStore::deleteItem(const TransferHistoryItem
&item
)
476 if (!sql().tables().contains("transfer_history_item")) {
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();
488 m_items
.removeAll(item
);
492 emit
deleteFinished();
495 QSqlDatabase
SQLiteStore::sql()
497 if (!m_sql
.isValid()) {
498 m_sql
= QSqlDatabase::addDatabase("QSQLITE");
499 m_sql
.setDatabaseName(m_dbName
);
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();
517 #include "transferhistorystore.moc"
518 #include "transferhistorystore_xml_p.moc"
520 #include "transferhistorystore_sqlite_p.moc"