You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/konqueror/keditbookmarks/testlink.cpp

396 lines
12 KiB

// -*- indent-tabs-mode:nil -*-
// vim: set ts=4 sts=4 sw=4 et:
/* This file is part of the KDE project
Copyright (C) 2000 David Faure <faure@kde.org>
Copyright (C) 2002-2003 Alexander Kellett <lypanov@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License version 2 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "toplevel.h"
#include "listview.h"
#include "testlink.h"
#include "commands.h"
#include "bookmarkiterator.h"
#include <tqtimer.h>
#include <tqpainter.h>
#include <kdebug.h>
#include <krfcdate.h>
#include <kcharsets.h>
#include <kbookmarkmanager.h>
#include <kaction.h>
TestLinkItrHolder *TestLinkItrHolder::s_self = 0;
TestLinkItrHolder::TestLinkItrHolder()
: BookmarkIteratorHolder() {
// do stuff
}
void TestLinkItrHolder::doItrListChanged() {
KEBApp::self()->setCancelTestsEnabled(count() > 0);
if(count() == 0)
{
kdDebug()<<"Notifing managers "<<m_affectedBookmark<<endl;
CurrentMgr::self()->notifyManagers(CurrentMgr::bookmarkAt(m_affectedBookmark).toGroup());
m_affectedBookmark = TQString::null;
}
}
void TestLinkItrHolder::addAffectedBookmark( const TQString & address )
{
kdDebug()<<"addAffectedBookmark "<<address<<endl;
if(m_affectedBookmark.isNull())
m_affectedBookmark = address;
else
m_affectedBookmark = KBookmark::commonParent(m_affectedBookmark, address);
kdDebug()<<" m_affectedBookmark is now "<<m_affectedBookmark<<endl;
}
/* -------------------------- */
TestLinkItr::TestLinkItr(TQValueList<KBookmark> bks)
: BookmarkIterator(bks) {
m_job = 0;
}
TestLinkItr::~TestLinkItr() {
if (m_job) {
// kdDebug() << "JOB kill\n";
curItem()->restoreStatus();
m_job->disconnect();
m_job->kill(false);
}
}
bool TestLinkItr::isApplicable(const KBookmark &bk) const {
return (!bk.isGroup() && !bk.isSeparator());
}
void TestLinkItr::doAction() {
m_errSet = false;
m_job = KIO::get(curBk().url(), true, false);
m_job->addMetaData("errorPage", "true");
m_job->addMetaData( TQString("cookies"), TQString("none") );
connect(m_job, TQT_SIGNAL( result( KIO::Job *)),
this, TQT_SLOT( slotJobResult(KIO::Job *)));
connect(m_job, TQT_SIGNAL( data( KIO::Job *, const TQByteArray &)),
this, TQT_SLOT( slotJobData(KIO::Job *, const TQByteArray &)));
curItem()->setTmpStatus(i18n("Checking..."));
TQString oldModDate = TestLinkItrHolder::self()->getMod(curBk().url().url());
curItem()->setOldStatus(oldModDate);
TestLinkItrHolder::self()->setMod(curBk().url().url(), i18n("Checking..."));
}
void TestLinkItr::slotJobData(KIO::Job *job, const TQByteArray &data) {
KIO::TransferJob *transfer = (KIO::TransferJob *)job;
if (transfer->isErrorPage()) {
TQStringList lines = TQStringList::split('\n', data);
for (TQStringList::Iterator it = lines.begin(); it != lines.end(); ++it) {
int open_pos = (*it).find("<title>", 0, false);
if (open_pos >= 0) {
TQString leftover = (*it).mid(open_pos + 7);
int close_pos = leftover.findRev("</title>", -1, false);
if (close_pos >= 0) {
// if no end tag found then just
// print the first line of the <title>
leftover = leftover.left(close_pos);
}
curItem()->nsPut(KCharsets::resolveEntities(leftover));
m_errSet = true;
break;
}
}
} else {
TQString modDate = transfer->queryMetaData("modified");
if (!modDate.isEmpty()) {
curItem()->nsPut(TQString::number(KRFCDate::parseDate(modDate)));
}
}
transfer->kill(false);
}
void TestLinkItr::slotJobResult(KIO::Job *job) {
m_job = 0;
if ( !curItem() ) return;
KIO::TransferJob *transfer = (KIO::TransferJob *)job;
TQString modDate = transfer->queryMetaData("modified");
bool chkErr = true;
if (transfer->error()) {
// can we assume that errorString will contain no entities?
TQString jerr = job->errorString();
if (!jerr.isEmpty()) {
jerr.replace("\n", " ");
curItem()->nsPut(jerr);
chkErr = false;
}
}
if (chkErr) {
if (!modDate.isEmpty()) {
curItem()->nsPut(TQString::number(KRFCDate::parseDate(modDate)));
} else if (!m_errSet) {
curItem()->nsPut(TQString::number(KRFCDate::parseDate("0")));
}
}
curItem()->modUpdate();
holder()->addAffectedBookmark(KBookmark::parentAddress(curBk().address()));
delayedEmitNextOne();
}
/* -------------------------- */
const TQString TestLinkItrHolder::getMod(const TQString &url) const {
return m_modify.contains(url)
? m_modify[url]
: TQString::null;
}
const TQString TestLinkItrHolder::getOldVisit(const TQString &url) const {
return self()->m_oldModify.contains(url)
? self()->m_oldModify[url]
: TQString::null;
}
void TestLinkItrHolder::setMod(const TQString &url, const TQString &val) {
m_modify[url] = val;
}
void TestLinkItrHolder::setOldVisit(const TQString &url, const TQString &val) {
m_oldModify[url] = val;
}
void TestLinkItrHolder::resetToValue(const TQString &url, const TQString &oldValue) {
if (!oldValue.isEmpty()) {
m_modify[url] = oldValue;
} else {
m_modify.remove(url);
}
}
/* -------------------------- */
TQString TestLinkItrHolder::calcPaintStyle(const TQString &url, KEBListViewItem::PaintStyle &_style,
const TQString &nVisit, const TQString &Modify) {
bool newModValid = false;
int newMod = 0;
TQString newModStr;
bool initial = false;
bool oldError = false;
if (!Modify.isNull() && Modify == "1") {
oldError = true;
}
// get new mod time if there is one
newModStr = self()->getMod(url);
// if no new mod time use previous one
if (newModStr.isNull()) {
newModStr = Modify;
initial = true;
}
if (!newModStr.isNull()) {
newMod = newModStr.toInt(&newModValid);
}
// kdDebug() << "TestLink " << url << " " << "booktime=" << nVisit << " urltime=" << newModStr <<
// " Modify=" << Modify << " init=" << initial << " newMod=" << newMod << "\n";
TQString visitStr;
if (self()->getOldVisit(url).isNull()) {
// first time
visitStr = nVisit;
if (!nVisit.isEmpty())
self()->setOldVisit(url, visitStr);
} else {
// may be reading a second bookmark with same url
TQString oom = nVisit;
visitStr = self()->getOldVisit(url);
if (oom.toInt() > visitStr.toInt()) {
self()->setOldVisit(url, oom);
visitStr = oom;
}
}
int visit = 0;
if (!visitStr.isNull())
visit = visitStr.toInt(); // TODO - check validity?
TQString statusStr;
KEBListViewItem::PaintStyle style = KEBListViewItem::DefaultStyle;
// kdDebug() << "TestLink " << "isNull=" << newModStr.isNull() << "newModValid="
// << newModValid << "newMod > visit " << newMod << ">" << visit << "\n";
if (!newModStr.isNull() && !newModValid) {
// Current check has error
statusStr = newModStr;
if (oldError) {
style = KEBListViewItem::BoldStyle;
} else {
style = KEBListViewItem::DefaultStyle;
}
} else if (initial && oldError) {
// Previous check has error
style = KEBListViewItem::GreyStyle;
statusStr = i18n("Error ");
} else if (!initial && !newModStr.isNull() && (newMod == 0)) {
// Current check has no modify time
statusStr = i18n("Ok");
} else if (initial && !newModStr.isNull() && (newMod == 0)) {
// previous check has no modify time recorded
statusStr = TQString::null;
} else if (!newModStr.isNull() && (newMod > visit)) {
// if modify time greater than last visit, show bold modify time
statusStr = CurrentMgr::makeTimeStr(newMod);
if (initial) {
style = KEBListViewItem::GreyBoldStyle;
} else {
style = KEBListViewItem::BoldStyle;
}
} else if (visit != 0) {
// modify time not greater than last visit, show last visit time
statusStr = CurrentMgr::makeTimeStr(visit);
if (initial) {
style = KEBListViewItem::GreyStyle;
} else {
style = KEBListViewItem::DefaultStyle;
}
} else {
statusStr = TQString::null;
}
_style = style;
return statusStr;
}
static void parseInfo (KBookmark &bk, TQString &nVisited) {
nVisited =
NodeEditCommand::getNodeText(bk, TQStringList() << "info" << "metadata"
<< "time_visited" );
// kdDebug() << " Visited=" << nVisited << "\n";
}
static void parseNsInfo(const TQString &nsinfo, TQString &nCreate, TQString &nAccess, TQString &nModify) {
TQStringList sl = TQStringList::split(' ', nsinfo);
for (TQStringList::Iterator it = sl.begin(); it != sl.end(); ++it) {
TQStringList spl = TQStringList::split('"', (*it));
if (spl[0] == "LAST_MODIFIED=") {
nModify = spl[1];
} else if (spl[0] == "ADD_DATE=") {
nCreate = spl[1];
} else if (spl[0] == "LAST_VISIT=") {
nAccess = spl[1];
}
}
}
// Still use nsinfo for storing old modify time
static const TQString updateNsInfoMod(const TQString &_nsinfo, const TQString &nm) {
TQString nCreate, nAccess, nModify;
parseNsInfo(_nsinfo, nCreate, nAccess, nModify);
bool numValid = false;
nm.toInt(&numValid);
TQString tmp;
tmp = "ADD_DATE=\"" + ((nCreate.isEmpty()) ? TQString::number(time(0)) : nCreate) + "\"";
tmp += " LAST_VISIT=\"" + ((nAccess.isEmpty()) ? TQString("0") : nAccess) + "\"";
tmp += " LAST_MODIFIED=\"" + ((numValid) ? nm : TQString("1")) + "\"";
// if (!numValid) kdDebug() << tmp << "\n";
return tmp;
}
// KEBListViewItem !!!!!!!!!!!
void KEBListViewItem::nsPut(const TQString &newModDate) {
static const TQString NetscapeInfoAttribute = "netscapeinfo";
const TQString info = m_bookmark.internalElement().attribute(NetscapeInfoAttribute);
TQString blah = updateNsInfoMod(info, newModDate);
m_bookmark.internalElement().setAttribute(NetscapeInfoAttribute, blah);
TestLinkItrHolder::self()->setMod(m_bookmark.url().url(), newModDate);
setText(KEBListView::StatusColumn, newModDate);
}
// KEBListViewItem !!!!!!!!!!!
void KEBListViewItem::modUpdate() {
TQString nCreate, nAccess, oldModify;
TQString iVisit;
TQString nsinfo = m_bookmark.internalElement().attribute("netscapeinfo");
if (!nsinfo.isEmpty()) {
parseNsInfo(nsinfo, nCreate, nAccess, oldModify);
}
parseInfo(m_bookmark, iVisit);
TQString statusLine;
statusLine = TestLinkItrHolder::calcPaintStyle(m_bookmark.url().url(), m_paintStyle, iVisit, oldModify);
if (statusLine != "Error")
setText(KEBListView::StatusColumn, statusLine);
}
/* -------------------------- */
// KEBListViewItem !!!!!!!!!!!
void KEBListViewItem::setOldStatus(const TQString &oldStatus) {
// kdDebug() << "KEBListViewItem::setOldStatus" << endl;
m_oldStatus = oldStatus;
}
// KEBListViewItem !!!!!!!!!!!
void KEBListViewItem::setTmpStatus(const TQString &status) {
// kdDebug() << "KEBListViewItem::setTmpStatus" << endl;
m_paintStyle = KEBListViewItem::BoldStyle;
setText(KEBListView::StatusColumn, status);
}
// KEBListViewItem !!!!!!!!!!!
void KEBListViewItem::restoreStatus() {
if (!m_oldStatus.isNull()) {
// kdDebug() << "KEBListViewItem::restoreStatus" << endl;
TestLinkItrHolder::self()->resetToValue(m_bookmark.url().url(), m_oldStatus);
modUpdate();
}
}
#include "testlink.moc"