13 #include "feeddetector.h"
15 #include <tdeio/job.h>
16 #include <tdeprocess.h>
17 #include <kstaticdeleter.h>
25 #include <tqstringlist.h>
38 class FileRetriever::Private
44 lastError(0), job(NULL)
56 static KStaticDeleter<TQString> userAgentsd;
57 static TQString* userAgent;
60 KStaticDeleter<TQString> FileRetriever::Private::userAgentsd;
61 TQString* FileRetriever::Private::userAgent = 0L;
72 bool FileRetriever::m_useCache =
true;
74 TQString FileRetriever::userAgent()
76 if (Private::userAgent == 0L)
77 FileRetriever::Private::userAgentsd.setObject(Private::userAgent,
new TQString);
78 return *Private::userAgent;
81 void FileRetriever::setUserAgent(
const TQString &ua)
83 if (Private::userAgent == 0L)
84 FileRetriever::Private::userAgentsd.setObject(Private::userAgent,
new TQString);
85 (*Private::userAgent) = ua;
88 void FileRetriever::setUseCache(
bool enabled)
98 d->buffer =
new TQBuffer;
99 d->buffer->open(IO_WriteOnly);
103 if (u.protocol()==
"feed")
104 u.setProtocol(
"http");
106 d->job = TDEIO::get(u,
false,
false);
107 d->job->addMetaData(
"cache", m_useCache ?
"refresh" :
"reload");
109 TQString ua = userAgent();
111 d->job->addMetaData(
"UserAgent", ua);
114 TQTimer::singleShot(1000*90,
this, TQ_SLOT(slotTimeout()));
116 connect(d->job, TQ_SIGNAL(data(TDEIO::Job *,
const TQByteArray &)),
117 TQ_SLOT(slotData(TDEIO::Job *,
const TQByteArray &)));
118 connect(d->job, TQ_SIGNAL(result(TDEIO::Job *)), TQ_SLOT(slotResult(TDEIO::Job *)));
120 TQ_SLOT(slotPermanentRedirection(TDEIO::Job *,
const KURL &,
const KURL &)));
123 void FileRetriever::slotTimeout()
130 d->lastError = TDEIO::ERR_SERVER_TIMEOUT;
140 void FileRetriever::slotData(TDEIO::Job *,
const TQByteArray &data)
142 d->buffer->writeBlock(data.data(), data.size());
145 void FileRetriever::slotResult(TDEIO::Job *job)
147 TQByteArray data = d->buffer->buffer();
153 d->lastError = job->error();
157 void FileRetriever::slotPermanentRedirection(TDEIO::Job *,
const KURL &,
const KURL &newUrl)
162 void FileRetriever::abort()
171 struct OutputRetriever::Private
173 Private() : process(NULL),
185 KShellProcess *process;
203 if (d->buffer || d->process)
206 d->buffer =
new TQBuffer;
207 d->buffer->open(IO_WriteOnly);
209 d->process =
new KShellProcess();
210 connect(d->process, TQ_SIGNAL(processExited(TDEProcess *)),
211 TQ_SLOT(slotExited(TDEProcess *)));
212 connect(d->process, TQ_SIGNAL(receivedStdout(TDEProcess *,
char *,
int)),
213 TQ_SLOT(slotOutput(TDEProcess *,
char *,
int)));
214 *d->process << url.path();
215 d->process->start(TDEProcess::NotifyOnExit, TDEProcess::Stdout);
223 void OutputRetriever::slotOutput(TDEProcess *,
char *data,
int length)
225 d->buffer->writeBlock(data, length);
228 void OutputRetriever::slotExited(TDEProcess *p)
230 if (!p->normalExit())
231 d->lastError = p->exitStatus();
233 TQByteArray data = d->buffer->buffer();
242 emit
dataRetrieved(data, p->normalExit() && p->exitStatus() == 0);
245 struct Loader::Private
247 Private() : retriever(NULL),
259 KURL discoveredFeedURL;
276 Loader::Loader() : d(new Private)
287 if (d->retriever != NULL)
291 d->retriever = retriever;
293 connect(d->retriever, TQ_SIGNAL(dataRetrieved(
const TQByteArray &,
bool)),
294 this, TQ_SLOT(slotRetrieverDone(
const TQByteArray &,
bool)));
296 d->retriever->retrieveData(url);
306 if (d && d->retriever)
308 d->retriever->abort();
316 const KURL &Loader::discoveredFeedURL()
const
318 return d->discoveredFeedURL;
321 void Loader::slotRetrieverDone(
const TQByteArray &data,
bool success)
323 d->lastError = d->retriever->errorCode();
329 Status status = Success;
339 const char *charData = data.data();
340 int len = data.count();
342 while (len && TQChar(*charData).isSpace()) {
347 if ( len > 3 && TQChar(*charData) == TQChar(0357) ) {
352 tmpData.setRawData(charData, len);
354 if (doc.setContent(tmpData))
359 discoverFeeds(tmpData);
365 discoverFeeds(tmpData);
369 tmpData.resetRawData(charData, len);
371 status = RetrieveError;
378 void Loader::discoverFeeds(
const TQByteArray &data)
380 TQString str = TQString(data).simplifyWhiteSpace();
386 for (FeedDetectorEntryList::ConstIterator it = list.begin(); it != list.end(); ++it)
388 feeds += (*it).url();
394 TQString feed = feeds.first();
395 TQString host = d->url.host();
398 TQStringList::Iterator end( feeds.end() );
399 for ( TQStringList::Iterator it = feeds.begin(); it != end; ++it)
402 if (testURL.host() == host)
409 d->discoveredFeedURL = feed.isNull() ? TQString() :
FeedDetector::fixRelativeURL(feed, d->url);
412 #include "loader.moc"