1 /**************************************************************************
2 * Copyright (C) 2003 by Hideki Ikemoto , (c)2004 by 421 *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 ***************************************************************************/
13 #include <qstringlist.h>
15 #include "datmanager.h"
17 #include "kita-utf8.h"
18 #include "kita-utf16.h"
22 #define DMANAGER_MAXQUEUE 16
24 /*-------------------------------------------------*/
25 /* DatManager manages all information about *.dat. */
27 DatInfoList DatManager::m_datInfo;
28 QMutex DatManager::m_mutex;
30 /* This function searches instance of DatInfo specified by url.
31 If instance does not exist, create instance. */ /* private */
32 DatInfo* DatManager::getDatInfo( const KURL& url )
34 if ( url.isEmpty() ) {
39 DatInfoList::Iterator it;
42 KURL inurl = url.protocol() + "://" + url.host() + url.path();
45 if ( m_datInfo.count() ) {
46 for ( it = m_datInfo.begin(); it != m_datInfo.end(); ++it, i++ ) {
50 if ( inurl == datInfo->url() ){
54 m_datInfo.remove( it );
55 m_datInfo.prepend( datInfo );
65 /*create new DatInfo and insert it into list. */
66 KURL daturl = url.protocol() + "://" + url.host() + url.path();
68 datInfo = new DatInfo( daturl );
69 if ( datInfo->getRawDat() == QString::null ) { /* cache does not exist */
75 m_datInfo.prepend( datInfo );
77 /* delete the last items of list */
78 if ( m_datInfo.count() > DMANAGER_MAXQUEUE ) {
80 /* collect unlocked datInfos */
81 typedef QValueList<KURL> DELETELIST;
82 DELETELIST deleteList;
84 for ( it = m_datInfo.at(DMANAGER_MAXQUEUE); it != m_datInfo.end(); ++it )
85 if(! (*it)->isLocked() ) deleteList += ( *it ) ->url();
87 /* delete unlocked datInfos */
88 for (DELETELIST::Iterator itdel = deleteList.begin(); itdel != deleteList.end(); ++itdel )
89 deleteDatInfoPrivate( (*itdel) );
96 /* get pointer of DatInfo */
99 /* It is very dangerous to access to DatInfo directly. */
100 /* Usually, access to it through DatManager. */ /* public */
101 DatInfo * DatManager::getDatInfoPointer( const KURL& url )
103 QMutexLocker locker( &m_mutex );
105 return getDatInfo( url );
111 void DatManager::deleteDatInfo( const KURL& url )
113 QMutexLocker locker( &m_mutex );
115 deleteDatInfoPrivate(url);
120 void DatManager::deleteDatInfoPrivate( const KURL& url ){
122 DatInfoList::Iterator it;
124 for ( it = m_datInfo.begin(); it != m_datInfo.end(); ++it ) {
125 if ( url == ( *it )->url() ){
127 if(! (*it)->isLocked() ){
128 m_datInfo.remove( it );
141 /*-------------------------------------------------------------*/
145 /*--------------------------------------*/
146 /* update cache, then return new lines */
148 /* If cache does not exist, then create
149 the new instance. */ /* public */
150 bool DatManager::updateCache( const KURL& url , const QObject* parent )
152 QMutexLocker locker( &m_mutex );
154 DatInfo * datInfo = getDatInfo( url );
156 /* create new DatInfo */
157 if ( datInfo == NULL ){
158 datInfo = new DatInfo( url );
159 m_datInfo.prepend( datInfo );
162 return datInfo->updateCache(parent);
167 int DatManager::getResponseCode( const KURL& url )
169 QMutexLocker locker( &m_mutex );
171 DatInfo * datInfo = getDatInfo( url );
172 if ( datInfo == NULL ) return 0;
174 return datInfo->getResponseCode();
178 int DatManager::getServerTime( const KURL& url )
180 QMutexLocker locker( &m_mutex );
182 DatInfo * datInfo = getDatInfo( url );
183 if ( datInfo == NULL ) return 0;
185 return datInfo->getServerTime();
190 bool DatManager::deleteCache( const KURL& url, QWidget* parent )
192 QMutexLocker locker( &m_mutex );
194 DatInfo * datInfo = getDatInfo( url );
195 if ( datInfo == NULL ) return FALSE;
197 return datInfo->deleteCache(parent);
202 bool DatManager::isLoadingNow( const KURL& url )
204 QMutexLocker locker( &m_mutex );
206 DatInfo * datInfo = getDatInfo( url );
207 if ( datInfo == NULL ) return FALSE;
209 return datInfo->isLoadingNow();
214 void DatManager::stopLoading( const KURL& url )
217 /* Don't use QMutexLocker here !!
218 It will cause deadlock , because
219 Kita::Access::stopJob() calls KitaThreadView::slotFinishLoad() back. */
221 DatInfo * datInfo = getDatInfo( url );
223 if ( datInfo == NULL ) return;
225 return datInfo->stopLoading();
230 /*----------------------*/
231 /* lock, unlock DatInfo */
233 /* If cache does not exist, then create
234 the new instance and lock it.
236 Don't forget to unlock it. */ /* public */
238 void DatManager::lock( const KURL& url )
240 QMutexLocker locker( &m_mutex );
242 DatInfo * datInfo = getDatInfo( url );
244 /* create new DatInfo */
245 if ( datInfo == NULL ){
246 datInfo = new DatInfo( url );
247 m_datInfo.prepend( datInfo );
253 void DatManager::unlock( const KURL& url )
255 QMutexLocker locker( &m_mutex );
257 DatInfo * datInfo = getDatInfo( url );
258 if ( datInfo == NULL ) return;
266 const QString& DatManager::getSubject( const KURL& url )
268 QMutexLocker locker( &m_mutex );
270 DatInfo * datInfo = getDatInfo( url );
271 if ( datInfo == NULL ) return QString::null;
273 return datInfo->getSubject();
278 const QString& DatManager::getRawDat( const KURL& url )
280 QMutexLocker locker( &m_mutex );
282 DatInfo * datInfo = getDatInfo( url );
283 if ( datInfo == NULL ) return QString::null;
285 return datInfo->getRawDat();
290 const QString& DatManager::getDat( const KURL& url, int num )
292 QMutexLocker locker( &m_mutex );
294 DatInfo * datInfo = getDatInfo( url );
295 if ( datInfo == NULL ) return QString::null;
297 return datInfo->getDat( num );
303 QString DatManager::getPlainBody( const KURL& url, int num )
305 QMutexLocker locker( &m_mutex );
307 DatInfo * datInfo = getDatInfo( url );
308 if ( datInfo == NULL ) return QString::null;
310 return datInfo->getPlainBody(num);
316 QString DatManager::getHtml( const KURL& url, int startnum, int endnum )
318 QMutexLocker locker( &m_mutex );
320 DatInfo * datInfo = getDatInfo( url );
321 if ( datInfo == NULL ) return QString::null;
323 return datInfo->getHtml(startnum,endnum);
329 QString DatManager::getHtmlByID(const KURL& url, const QString& strid, int &count )
331 QMutexLocker locker( &m_mutex );
333 DatInfo* datInfo = getDatInfo(url);
334 if(datInfo == NULL) return QString::null;
336 return datInfo->getHtmlByID(strid,count);
341 /* Get HTML document of res tree.*/ /* public */
342 QString DatManager::getTreeByRes(const KURL& url, const int rootnum, int &count)
344 QMutexLocker locker( &m_mutex );
346 DatInfo* datInfo = getDatInfo(url);
347 if(datInfo == NULL) return QString::null;
349 return datInfo->getTreeByRes(rootnum,count);
355 int DatManager::getMaxResNumber( const KURL& url )
357 QMutexLocker locker( &m_mutex );
359 DatInfo * datInfo = getDatInfo( url );
360 if ( datInfo == NULL ) return 0;
362 return datInfo->getMaxResNumber();
368 int DatManager::getNumByID( const KURL& url, const QString& strid )
370 QMutexLocker locker( &m_mutex );
372 DatInfo * datInfo = getDatInfo( url );
373 if ( datInfo == NULL ) return 0;
375 return datInfo->getNumByID(strid);
381 int DatManager::getKokoyonNum( const KURL& url )
383 QMutexLocker locker( &m_mutex );
385 DatInfo * datInfo = getDatInfo( url );
386 if ( datInfo == NULL ) return 0;
388 return datInfo->getKokoyonNum();
393 void DatManager::setKokoyonNum( const KURL& url , int num )
395 QMutexLocker locker( &m_mutex );
397 DatInfo * datInfo = getDatInfo( url );
398 if ( datInfo == NULL ) return;
400 return datInfo->setKokoyonNum(num);
405 int DatManager::getDatSize( const KURL& url )
407 QMutexLocker locker( &m_mutex );
409 DatInfo * datInfo = getDatInfo( url );
410 if ( datInfo == NULL ) return 0;
412 return datInfo->getDatSize();
419 bool DatManager::isResValid( const KURL& url,int num )
421 QMutexLocker locker( &m_mutex );
423 DatInfo * datInfo = getDatInfo( url );
424 if ( datInfo == NULL ) return FALSE;
426 return datInfo->isResValid(num);
431 bool DatManager::isBroken( const KURL& url )
433 QMutexLocker locker( &m_mutex );
435 DatInfo * datInfo = getDatInfo( url );
436 if ( datInfo == NULL ) return FALSE;
438 return datInfo->isBroken();
442 bool DatManager::isResBroken( const KURL& url,int num )
444 QMutexLocker locker( &m_mutex );
446 DatInfo * datInfo = getDatInfo( url );
447 if ( datInfo == NULL ) return FALSE;
449 return datInfo->isResBroken(num);
455 bool DatManager::checkID(const KURL& url, const QString& strid, int num )
457 QMutexLocker locker( &m_mutex );
459 DatInfo* datInfo = getDatInfo(url);
460 if(datInfo == NULL) return FALSE;
462 return datInfo->checkID(strid,num);
466 /* check keywords */ /* public */
467 bool DatManager::checkWord(const KURL& url,
468 QStringList& strlist, int num,
469 bool checkOR /* AND or OR search */
472 QMutexLocker locker( &m_mutex );
474 DatInfo* datInfo = getDatInfo(url);
475 if(datInfo == NULL) return FALSE;
477 return datInfo->checkWord(strlist,num,checkOR);
482 bool DatManager::checkAbone(const KURL& url, int num)
484 QMutexLocker locker( &m_mutex );
486 DatInfo* datInfo = getDatInfo(url);
487 if(datInfo == NULL) return FALSE;
489 return datInfo->checkAbone(num);
494 /*-----------------------------------*/
495 /* Wrapper functions for Thread class*/
497 /* They ara public */
499 const QString DatManager::thread_datID( const KURL& url )
501 QMutexLocker locker( &m_mutex );
503 DatInfo* datInfo = getDatInfo(url);
504 if(datInfo == NULL) return QString::null;
506 return datInfo->thread_datID();
509 const QString& DatManager::thread_name( const KURL& url )
511 QMutexLocker locker( &m_mutex );
513 DatInfo* datInfo = getDatInfo(url);
514 if(datInfo == NULL) return QString::null;
516 return datInfo->thread_name();
519 const QString& DatManager::thread_boardName( const KURL& url )
521 QMutexLocker locker( &m_mutex );
523 DatInfo* datInfo = getDatInfo(url);
524 if(datInfo == NULL) return QString::null;
526 return datInfo->thread_boardName();
529 const QString DatManager::thread_url( const KURL& url )
531 QMutexLocker locker( &m_mutex );
533 DatInfo* datInfo = getDatInfo(url);
534 if(datInfo == NULL) return QString::null;
536 return datInfo->thread_url();
539 const QString DatManager::thread_boardURL( const KURL& url )
541 QMutexLocker locker( &m_mutex );
543 DatInfo* datInfo = getDatInfo(url);
544 if(datInfo == NULL) return QString::null;
546 return datInfo->thread_boardURL();
549 const QString DatManager::thread_boardID( const KURL& url )
551 QMutexLocker locker( &m_mutex );
553 DatInfo* datInfo = getDatInfo(url);
554 if(datInfo == NULL) return QString::null;
556 return datInfo->thread_boardID();