1
// -*- indent-tabs-mode:nil -*-
2
// vim: set ts=4 sts=4 sw=4 et:
3
/* This file is part of the KDE project
4
Copyright (C) 2000 David Faure <faure@kde.org>
5
Copyright (C) 2002-2003 Alexander Kellett <lypanov@kde.org>
7
This program is free software; you can redistribute it and/or
8
modify it under the terms of the GNU General Public
9
License version 2 as published by the Free Software Foundation.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; see the file COPYING. If not, write to
18
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19
Boston, MA 02110-1301, USA.
26
#include "bookmarkiterator.h"
34
#include <kcharsets.h>
35
#include <kbookmarkmanager.h>
39
TestLinkItrHolder *TestLinkItrHolder::s_self = 0;
41
TestLinkItrHolder::TestLinkItrHolder()
42
: BookmarkIteratorHolder() {
46
void TestLinkItrHolder::doItrListChanged() {
47
KEBApp::self()->setCancelTestsEnabled(count() > 0);
50
kdDebug()<<"Notifing managers "<<m_affectedBookmark<<endl;
51
CurrentMgr::self()->notifyManagers(CurrentMgr::bookmarkAt(m_affectedBookmark).toGroup());
52
m_affectedBookmark = QString::null;
56
void TestLinkItrHolder::addAffectedBookmark( const QString & address )
58
kdDebug()<<"addAffectedBookmark "<<address<<endl;
59
if(m_affectedBookmark.isNull())
60
m_affectedBookmark = address;
62
m_affectedBookmark = KBookmark::commonParent(m_affectedBookmark, address);
63
kdDebug()<<" m_affectedBookmark is now "<<m_affectedBookmark<<endl;
66
/* -------------------------- */
68
TestLinkItr::TestLinkItr(QValueList<KBookmark> bks)
69
: BookmarkIterator(bks) {
73
TestLinkItr::~TestLinkItr() {
75
// kdDebug() << "JOB kill\n";
76
curItem()->restoreStatus();
82
bool TestLinkItr::isApplicable(const KBookmark &bk) const {
83
return (!bk.isGroup() && !bk.isSeparator());
86
void TestLinkItr::doAction() {
89
m_job = KIO::get(curBk().url(), true, false);
90
m_job->addMetaData("errorPage", "true");
91
m_job->addMetaData( QString("cookies"), QString("none") );
93
connect(m_job, SIGNAL( result( KIO::Job *)),
94
this, SLOT( slotJobResult(KIO::Job *)));
95
connect(m_job, SIGNAL( data( KIO::Job *, const QByteArray &)),
96
this, SLOT( slotJobData(KIO::Job *, const QByteArray &)));
98
curItem()->setTmpStatus(i18n("Checking..."));
99
QString oldModDate = TestLinkItrHolder::self()->getMod(curBk().url().url());
100
curItem()->setOldStatus(oldModDate);
101
TestLinkItrHolder::self()->setMod(curBk().url().url(), i18n("Checking..."));
104
void TestLinkItr::slotJobData(KIO::Job *job, const QByteArray &data) {
105
KIO::TransferJob *transfer = (KIO::TransferJob *)job;
107
if (transfer->isErrorPage()) {
108
QStringList lines = QStringList::split('\n', data);
109
for (QStringList::Iterator it = lines.begin(); it != lines.end(); ++it) {
110
int open_pos = (*it).find("<title>", 0, false);
112
QString leftover = (*it).mid(open_pos + 7);
113
int close_pos = leftover.findRev("</title>", -1, false);
114
if (close_pos >= 0) {
115
// if no end tag found then just
116
// print the first line of the <title>
117
leftover = leftover.left(close_pos);
119
curItem()->nsPut(KCharsets::resolveEntities(leftover));
126
QString modDate = transfer->queryMetaData("modified");
127
if (!modDate.isEmpty()) {
128
curItem()->nsPut(QString::number(KRFCDate::parseDate(modDate)));
132
transfer->kill(false);
135
void TestLinkItr::slotJobResult(KIO::Job *job) {
137
if ( !curItem() ) return;
139
KIO::TransferJob *transfer = (KIO::TransferJob *)job;
140
QString modDate = transfer->queryMetaData("modified");
143
if (transfer->error()) {
144
// can we assume that errorString will contain no entities?
145
QString jerr = job->errorString();
146
if (!jerr.isEmpty()) {
147
jerr.replace("\n", " ");
148
curItem()->nsPut(jerr);
154
if (!modDate.isEmpty()) {
155
curItem()->nsPut(QString::number(KRFCDate::parseDate(modDate)));
156
} else if (!m_errSet) {
157
curItem()->nsPut(QString::number(KRFCDate::parseDate("0")));
161
curItem()->modUpdate();
162
holder()->addAffectedBookmark(KBookmark::parentAddress(curBk().address()));
163
delayedEmitNextOne();
166
/* -------------------------- */
168
const QString TestLinkItrHolder::getMod(const QString &url) const {
169
return m_modify.contains(url)
174
const QString TestLinkItrHolder::getOldVisit(const QString &url) const {
175
return self()->m_oldModify.contains(url)
176
? self()->m_oldModify[url]
180
void TestLinkItrHolder::setMod(const QString &url, const QString &val) {
184
void TestLinkItrHolder::setOldVisit(const QString &url, const QString &val) {
185
m_oldModify[url] = val;
188
void TestLinkItrHolder::resetToValue(const QString &url, const QString &oldValue) {
189
if (!oldValue.isEmpty()) {
190
m_modify[url] = oldValue;
192
m_modify.remove(url);
196
/* -------------------------- */
198
QString TestLinkItrHolder::calcPaintStyle(const QString &url, KEBListViewItem::PaintStyle &_style,
199
const QString &nVisit, const QString &Modify) {
200
bool newModValid = false;
203
bool initial = false;
204
bool oldError = false;
206
if (!Modify.isNull() && Modify == "1") {
210
// get new mod time if there is one
211
newModStr = self()->getMod(url);
213
// if no new mod time use previous one
214
if (newModStr.isNull()) {
219
if (!newModStr.isNull()) {
220
newMod = newModStr.toInt(&newModValid);
224
// kdDebug() << "TestLink " << url << " " << "booktime=" << nVisit << " urltime=" << newModStr <<
225
// " Modify=" << Modify << " init=" << initial << " newMod=" << newMod << "\n";
229
if (self()->getOldVisit(url).isNull()) {
232
if (!nVisit.isEmpty())
233
self()->setOldVisit(url, visitStr);
235
// may be reading a second bookmark with same url
236
QString oom = nVisit;
237
visitStr = self()->getOldVisit(url);
238
if (oom.toInt() > visitStr.toInt()) {
239
self()->setOldVisit(url, oom);
245
if (!visitStr.isNull())
246
visit = visitStr.toInt(); // TODO - check validity?
249
KEBListViewItem::PaintStyle style = KEBListViewItem::DefaultStyle;
251
// kdDebug() << "TestLink " << "isNull=" << newModStr.isNull() << "newModValid="
252
// << newModValid << "newMod > visit " << newMod << ">" << visit << "\n";
254
if (!newModStr.isNull() && !newModValid) {
255
// Current check has error
256
statusStr = newModStr;
258
style = KEBListViewItem::BoldStyle;
260
style = KEBListViewItem::DefaultStyle;
263
} else if (initial && oldError) {
264
// Previous check has error
265
style = KEBListViewItem::GreyStyle;
266
statusStr = i18n("Error ");
268
} else if (!initial && !newModStr.isNull() && (newMod == 0)) {
269
// Current check has no modify time
270
statusStr = i18n("Ok");
272
} else if (initial && !newModStr.isNull() && (newMod == 0)) {
273
// previous check has no modify time recorded
274
statusStr = QString::null;
276
} else if (!newModStr.isNull() && (newMod > visit)) {
277
// if modify time greater than last visit, show bold modify time
278
statusStr = CurrentMgr::makeTimeStr(newMod);
280
style = KEBListViewItem::GreyBoldStyle;
282
style = KEBListViewItem::BoldStyle;
285
} else if (visit != 0) {
286
// modify time not greater than last visit, show last visit time
287
statusStr = CurrentMgr::makeTimeStr(visit);
289
style = KEBListViewItem::GreyStyle;
291
style = KEBListViewItem::DefaultStyle;
295
statusStr = QString::null;
302
static void parseInfo (KBookmark &bk, QString &nVisited) {
304
NodeEditCommand::getNodeText(bk, QStringList() << "info" << "metadata"
307
// kdDebug() << " Visited=" << nVisited << "\n";
310
static void parseNsInfo(const QString &nsinfo, QString &nCreate, QString &nAccess, QString &nModify) {
311
QStringList sl = QStringList::split(' ', nsinfo);
313
for (QStringList::Iterator it = sl.begin(); it != sl.end(); ++it) {
314
QStringList spl = QStringList::split('"', (*it));
316
if (spl[0] == "LAST_MODIFIED=") {
318
} else if (spl[0] == "ADD_DATE=") {
320
} else if (spl[0] == "LAST_VISIT=") {
326
// Still use nsinfo for storing old modify time
327
static const QString updateNsInfoMod(const QString &_nsinfo, const QString &nm) {
328
QString nCreate, nAccess, nModify;
329
parseNsInfo(_nsinfo, nCreate, nAccess, nModify);
331
bool numValid = false;
335
tmp = "ADD_DATE=\"" + ((nCreate.isEmpty()) ? QString::number(time(0)) : nCreate) + "\"";
336
tmp += " LAST_VISIT=\"" + ((nAccess.isEmpty()) ? QString("0") : nAccess) + "\"";
337
tmp += " LAST_MODIFIED=\"" + ((numValid) ? nm : QString("1")) + "\"";
339
// if (!numValid) kdDebug() << tmp << "\n";
343
// KEBListViewItem !!!!!!!!!!!
344
void KEBListViewItem::nsPut(const QString &newModDate) {
345
static const QString NetscapeInfoAttribute = "netscapeinfo";
346
const QString info = m_bookmark.internalElement().attribute(NetscapeInfoAttribute);
347
QString blah = updateNsInfoMod(info, newModDate);
348
m_bookmark.internalElement().setAttribute(NetscapeInfoAttribute, blah);
349
TestLinkItrHolder::self()->setMod(m_bookmark.url().url(), newModDate);
350
setText(KEBListView::StatusColumn, newModDate);
353
// KEBListViewItem !!!!!!!!!!!
354
void KEBListViewItem::modUpdate() {
355
QString nCreate, nAccess, oldModify;
358
QString nsinfo = m_bookmark.internalElement().attribute("netscapeinfo");
359
if (!nsinfo.isEmpty()) {
360
parseNsInfo(nsinfo, nCreate, nAccess, oldModify);
363
parseInfo(m_bookmark, iVisit);
366
statusLine = TestLinkItrHolder::calcPaintStyle(m_bookmark.url().url(), m_paintStyle, iVisit, oldModify);
367
if (statusLine != "Error")
368
setText(KEBListView::StatusColumn, statusLine);
371
/* -------------------------- */
373
// KEBListViewItem !!!!!!!!!!!
374
void KEBListViewItem::setOldStatus(const QString &oldStatus) {
375
// kdDebug() << "KEBListViewItem::setOldStatus" << endl;
376
m_oldStatus = oldStatus;
379
// KEBListViewItem !!!!!!!!!!!
380
void KEBListViewItem::setTmpStatus(const QString &status) {
381
// kdDebug() << "KEBListViewItem::setTmpStatus" << endl;
382
m_paintStyle = KEBListViewItem::BoldStyle;
383
setText(KEBListView::StatusColumn, status);
386
// KEBListViewItem !!!!!!!!!!!
387
void KEBListViewItem::restoreStatus() {
388
if (!m_oldStatus.isNull()) {
389
// kdDebug() << "KEBListViewItem::restoreStatus" << endl;
390
TestLinkItrHolder::self()->resetToValue(m_bookmark.url().url(), m_oldStatus);
395
#include "testlink.moc"