1 /***************************************************************************
2 * Copyright (C) 2004 by Kita Developers *
3 * ikemo@users.sourceforge.jp *
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 ***************************************************************************/
11 #include "boardmanager.h"
12 #include "qcp932codec.h"
13 #include "downloadmanager.h"
15 #include "favoritethreads.h"
17 #include "threadinfo.h"
18 #include "favoriteboards.h"
19 #include "kita_misc.h"
20 #include "threadindex.h"
22 #include <config.h> /* VERSION */
25 #include <kio/netaccess.h>
26 #include <kfilterdev.h>
27 #include <kio/slaveconfig.h>
28 #include <kdeversion.h>
33 #include <qdatetime.h>
34 #include <qeucjpcodec.h>
39 /*---------------------------------------------------------*/
43 BoardData::BoardData( const QString& boardName,
44 const QString& hostname,
45 const QString& rootPath,
46 const QString& delimiter,
47 const QString& bbsPath,
52 m_boardName = boardName;
53 m_rootPath = rootPath;
54 m_delimiter = delimiter;
59 /* set hostname and create URL of board */
60 setHostName( hostname );
62 /* create default key */
63 QStringList keyHosts = m_hostname;
64 createKeys( keyHosts );
66 /* reset SETTING.TXT */
67 setSettingLoaded( FALSE );
70 BoardData::~BoardData()
75 void BoardData::setHostName( const QString& hostName )
77 m_hostname = hostName;
79 /* m_basePath = (hostname)/(rootPath)/(bbsPath)/ */
80 m_basePath = m_hostname + m_rootPath + m_bbsPath + "/";
84 case Board_MachiBBS: /* m_cgiBasePath = (hostname)/(rootPath)/(delimiter)?BBS=(bbsPath) */
85 m_cgiBasePath = m_hostname + m_rootPath + m_delimiter + "?BBS=" + m_bbsPath.mid( 1 );
88 /* m_cgiBasePath = (hostname)/(rootPath)/(delimiter)/(bbsPath)/ */
90 m_cgiBasePath = m_hostname + m_rootPath + m_delimiter + m_bbsPath + "/";
96 /*---------------------------*/
100 const bool BoardData::readIdx() const
106 void BoardData::setReadIdx( bool idx )
112 const QString& BoardData::boardName() const
118 const QString& BoardData::hostName() const
124 const QString& BoardData::rootPath() const
130 const QString& BoardData::delimiter() const
136 const QString& BoardData::bbsPath() const
142 const QString& BoardData::ext() const
148 const int BoardData::type() const
154 const QString& BoardData::basePath() const
160 const QString& BoardData::cgiBasePath() const
162 return m_cgiBasePath;
166 /*---------------------------*/
170 const QString BoardData::settingURL() const
172 return m_basePath + "SETTING.TXT";
176 const bool BoardData::settingLoaded() const
178 return m_settingLoaded;
182 const QString& BoardData::defaultName() const
184 return m_defaultName;
188 const int BoardData::lineNum() const
194 const int BoardData::msgCount() const
200 const KURL& BoardData::titleImgURL() const
202 return m_titleImgURL;
206 void BoardData::setSettingLoaded( bool set )
208 m_settingLoaded = set;
210 m_defaultName = QString::null;
213 m_titleImgURL = QString::null;
218 void BoardData::setDefaultName( const QString& newName )
220 m_defaultName = newName;
224 void BoardData::setLineNum( int newLine )
230 void BoardData::setMsgCount( int msgCount )
232 m_msgCount = msgCount;
236 void BoardData::setTitleImgURL( const KURL& url )
242 /*---------------------------*/
245 /* create keys of DB */ /* public */
246 void BoardData::createKeys( const QStringList& keyHostList )
249 m_keyBasePathList.clear();
250 m_keyCgiBasePathList.clear();
251 m_keyHostList.clear();
253 m_keyHostList = keyHostList;
255 /* m_basePath = (hostname)/(rootPath)/(bbsPath)/ */
256 for( unsigned int i = 0; i < m_keyHostList.count(); ++i ){
257 if( m_keyHostList[i].length() > 0 )
258 m_keyBasePathList += m_keyHostList[i] + m_rootPath + m_bbsPath + "/";
263 case Board_MachiBBS: /* m_cgiBasePath = (hostname)/(rootPath)/(delimiter)?BBS=(bbsPath) */
264 for( unsigned int i = 0; i < m_keyHostList.count(); ++i )
265 m_keyCgiBasePathList += m_keyHostList[i] + m_rootPath + m_delimiter
266 + "?BBS=" + m_bbsPath.mid( 1 );
269 /* m_cgiBasePath = (hostname)/(rootPath)/(delimiter)/(bbsPath)/ */
271 for( unsigned int i = 0; i < m_keyHostList.count(); ++i )
272 m_keyCgiBasePathList += m_keyHostList[i] + m_rootPath + m_delimiter + m_bbsPath + "/";
278 const QStringList& BoardData::keyHostList() const
280 return m_keyHostList;
284 const QStringList& BoardData::keyBasePathList() const
286 return m_keyBasePathList;
290 const QStringList& BoardData::keyCgiBasePathList() const
292 return m_keyCgiBasePathList;
298 /*---------------------------------------------------------------*/
299 /*---------------------------------------------------------------*/
300 /*---------------------------------------------------------------*/
304 QCp932Codec* Kita::BoardManager::m_cp932Codec = NULL;
305 QEucJpCodec* Kita::BoardManager::m_eucJpCodec = NULL;
306 BoardDataList Kita::BoardManager::m_boardDataList;
307 BoardData* Kita::BoardManager::m_previousBoardData = NULL;
308 QString Kita::BoardManager::m_previousBoardURL;
311 BoardManager::BoardManager()
317 BoardManager::~BoardManager()
322 /* (hostname)/(rootPath)/(bbsPath)/ */ /* public */ /* static */
323 const QString BoardManager::boardURL( const KURL& url )
325 BoardData* bdata = getBoardData( url );
326 if( bdata == NULL ) return QString::null;
328 return bdata->basePath();
331 /* public */ /* static */
332 const QStringList BoardManager::allBoardURLList()
337 for ( BoardDataList::Iterator it = m_boardDataList.begin(); it != m_boardDataList.end(); ++it )
338 urlList += (*it)->basePath();
343 /* (hostname)/(rootPath) */ /* public */ /* static */
344 const QString BoardManager::boardRoot( const KURL& url )
346 BoardData* bdata = getBoardData( url );
347 if( bdata == NULL ) return QString::null;
349 return bdata->hostName() + bdata->rootPath();
352 /* (bbspath) */ /* public */ /* static */
353 const QString BoardManager::boardPath( const KURL& url )
355 BoardData* bdata = getBoardData( url );
356 if( bdata == NULL ) return QString::null;
358 return bdata->bbsPath();
361 /* ID of board for writing */ /* public */ /* static */
362 const QString BoardManager::boardID( const KURL& url )
364 BoardData* bdata = getBoardData( url );
365 if( bdata == NULL ) return QString::null;
367 return bdata->bbsPath().mid( 1 ); /* remove "/" */
371 /* (hostname)/(rootPath)/(bbsPath)/subject.txt */ /* public */ /* static */
372 const QString BoardManager::subjectURL( const KURL& url )
374 BoardData* bdata = getBoardData( url );
375 if( bdata == NULL ) return QString::null;
377 return bdata->basePath() + "subject.txt";
381 /* public */ /* static */
382 const QString BoardManager::boardName( const KURL& url )
384 BoardData* bdata = getBoardData( url );
385 if( bdata == NULL ) return QString::null;
387 return bdata->boardName();
391 /* public */ /* static */
392 const int BoardManager::type( const KURL& url )
394 BoardData* bdata = getBoardData( url );
395 if( bdata == NULL ) return Board_Unknown;
397 return bdata->type();
401 /*---------------------------*/
405 /* get list of pointers of Thread classes. */
410 oldLogs: If TRUE, search cache and get list of pointer of old threads.
411 online: online or offline mode.
415 threadList: list of pointers of Thread classes.
416 oldLogList: list of pointers of old threads.
418 */ /* public */ /* static */
419 void BoardManager::getThreadList(
427 QPtrList< Thread >& threadList,
428 QPtrList< Thread >& oldLogList )
433 /* get all obtained threads list from cache */
434 if ( url.prettyURL() == "http://virtual/obtained/" ) {
436 QStringList bbslist = allBoardURLList();
438 /* search all cache dirs */
439 for ( QStringList::iterator it = bbslist.begin() ; it != bbslist.end(); ++it ) {
441 getCachedThreadList( ( *it ), threadList );
447 /*-------------------------*/
449 BoardData* bdata = getBoardData( url );
450 if( bdata == NULL ) return;
452 /* download subject.txt */
456 QString cacheDir = Cache::baseDir() + Cache::serverDir( url ) + Cache::boardDir( url );
457 if( !Kita::mkdir( cacheDir ) ) return;
459 KIO::SlaveConfig::self() ->setConfigData( "http",
462 QString( "Monazilla/1.00 (Kita/%1)" ).arg( VERSION ) );
463 QString subjectPath = Cache::getSubjectPath( url );
464 #if KDE_IS_VERSION( 3, 2, 0 )
465 KIO::NetAccess::download( subjectURL( url ), subjectPath, NULL );
467 KIO::NetAccess::download( subjectURL( url ), subjectPath );
470 /* download SETTING.TXT */
471 loadBBSSetting( url );
474 /* open and read subject.txt */
475 readSubjectTxt( bdata, url, threadList );
480 QPtrList< Thread > tmpList;
482 getCachedThreadList( url, tmpList );
484 for ( unsigned i = 0; i < tmpList.count(); i++ ) {
486 if( threadList.contains( tmpList.at( i ) ) == 0 ) oldLogList.append( tmpList.at( i ) );
492 /* read the cache dir & get the list of all threads. */ /* private */ /* static */
493 void BoardManager::getCachedThreadList( const KURL& url, QPtrList< Thread >& threadList )
495 QString cacheDir = Cache::baseDir() + Cache::serverDir( url ) + Cache::boardDir( url );
499 /* get all file names */
500 QString ext = BoardManager::getBoardData( url )->ext();
501 QString boardURL = BoardManager::getBoardData( url )->basePath();
502 QStringList flist = d.entryList( "*" + ext );
504 for ( QStringList::iterator it = flist.begin(); it != flist.end(); ++it ) {
505 if ( ( *it ) == QString::null ) continue;
507 QString datURL = boardURL + "dat/" + ( *it );
510 Kita::Thread* thread = Kita::Thread::getByURLNew( datURL );
511 if( thread == NULL ){
513 thread = Kita::Thread::getByURL( datURL );
514 if( thread == NULL ) continue;
515 ThreadIndex::loadIndex( thread, datURL );
518 if( thread != NULL ) threadList.append( thread );
525 /* open subject.txt and get list of Thread classes */ /* private */ /* static */
526 bool BoardManager::readSubjectTxt( BoardData* bdata, const KURL& url, QPtrList< Thread >& threadList )
528 qDebug( "BoardManager::readSubjectTxt" );
530 /* get all names of cached files to read idx. */
531 QStringList cacheList;
532 if( !bdata->readIdx() ){
534 QString cacheDir = Cache::baseDir() + Cache::serverDir( url ) + Cache::boardDir( url );
537 QString ext = BoardManager::getBoardData( url )->ext();
538 cacheList = d.entryList( "*" + ext );
542 /* open subject.txt */
543 QString subjectPath = Cache::getSubjectPath( url );
544 QIODevice * device = KFilterDev::deviceForFile( subjectPath, "application/x-gzip" );
545 if( !device->open( IO_ReadOnly ) ) return FALSE;
547 QTextStream stream( device );
549 if ( BoardManager::type( url ) == Board_JBBS ) {
550 if ( !m_eucJpCodec ) m_eucJpCodec = new QEucJpCodec();
551 stream.setCodec( m_eucJpCodec );
553 if ( !m_cp932Codec ) m_cp932Codec = new QCp932Codec();
554 stream.setCodec( m_cp932Codec );
557 // parse subject.txt(only one format...)
558 // FIXME: need to refactoring
560 switch ( BoardManager::type( url ) ) {
564 regexp.setPattern( "(\\d+\\.cgi),(.*)\\((\\d+)\\)" );
568 regexp.setPattern( "(\\d+\\.dat)<>(.*)\\((\\d+)\\)" );
573 while ( ( line = stream.readLine() ) != QString::null ) {
574 int pos = regexp.search( line );
576 QString fname = regexp.cap( 1 );
577 QString subject = regexp.cap( 2 );
578 QString num = regexp.cap( 3 );
580 /* get pointer of Thread class */
581 QString datURL = boardURL( url ) + "dat/" + fname;
582 Kita::Thread* thread = Kita::Thread::getByURL( datURL );
583 threadList.append( thread );
585 /* set thread name */
586 thread->setThreadName( subject );
588 /* load index file */
589 if( !bdata->readIdx() ){
591 if( cacheList.contains( fname ) ) ThreadIndex::loadIndex( thread, datURL );
595 int newNum = num.toInt();
596 if( thread->readNum() ){ /* cache exists */
597 int oldNum = thread->resNum();
599 if( newNum > oldNum ){
600 qDebug( "update ResNum old -> new : %d -> %d", oldNum, newNum );
601 Kita::ThreadIndex::setResNum( datURL, newNum );
604 thread->setResNum( newNum );
609 bdata->setReadIdx( TRUE ); /* never read idx files again */
614 /*---------------------------*/
617 /* reset all BoardData */ /* public */ /* static */
618 void BoardManager::clearBoardData()
620 for ( BoardDataList::Iterator it = m_boardDataList.begin(); it != m_boardDataList.end(); ++it )
623 m_boardDataList.clear();
624 m_previousBoardData = NULL;
625 m_previousBoardURL = QString::null;
630 /* Input: board, boardName
633 If board is already enrolled, return Board_enrollEnrolled and oldURL is QString::null.
634 If board is new board, return Board_enrollNew and oldURL is QString::null.
635 If board is moved, return Board_enrollMoved, and oldURL is old URL.
637 Note that board is NOT enrolled when board is moved.
638 To enroll new URL, call BoardManager::moveBoard().
640 /* public */ /* static */
641 int BoardManager::enrollBoard( const KURL& url, const QString& boardName, QString& oldURL )
643 int type = Board_Unknown;
650 type = parseBoardURL( url, type, hostname, rootPath, delimiter, bbsPath, ext );
651 oldURL = QString::null;
653 if( type == Board_Unknown ) return Board_enrollFailed;
655 /* check if the board is enrolled or moved. */
656 for ( BoardDataList::Iterator it = m_boardDataList.begin(); it != m_boardDataList.end(); ++it ){
658 if( ( *it )->boardName() == boardName
659 && ( *it )->type() == type
660 && ( *it )->bbsPath() == bbsPath ){
662 if( ( *it )->hostName() == hostname
663 && ( *it )->rootPath() == rootPath ){ /* enrolled */
664 return Board_enrollEnrolled;
667 oldURL = ( *it )->basePath();
668 return Board_enrollMoved;
673 /* enroll new board */
674 BoardData* bdata = new BoardData( boardName, hostname, rootPath, delimiter, bbsPath, ext, type );
675 m_boardDataList.append( bdata );
677 return Board_enrollNew;
681 /* parse board URL */
682 /* output is board type. */ /* private */ /* static */
683 int BoardManager::parseBoardURL(
687 int type, /* If type = Board_Unknown, type will be decided according to url. */
696 hostname = url.protocol() + "://" + url.host();
697 rootPath = QString::null;
698 delimiter = QString::null;
699 bbsPath = QString::null;
703 if( type == Board_Unknown ){
705 if( url.host().contains( "machi.to" ) ) type = Board_MachiBBS;
706 else if( url.host().contains( "jbbs.livedoor.jp" ) ) type = Board_JBBS;
707 else if( url.host().contains( "oooug.jp" ) ) type = Board_FlashCGI;
708 else type = Board_2ch;
714 case Board_MachiBBS: /* MACHI : http:// *.machi.to/(bbsPath)/ */
716 delimiter = "/bbs/read.pl";
717 bbsPath = url.filename();
721 case Board_JBBS: /* JBBS : http://jbbs.livedoor.jp/(bbsPath)/ */
723 delimiter = "/bbs/read.cgi";
724 bbsPath = url.prettyURL().remove( hostname );
729 case Board_FlashCGI: /* test for Flash CGI/Mini Thread */
731 delimiter = "/test/read.cgi";
732 bbsPath = url.filename();
733 rootPath = url.prettyURL().remove( hostname + "/" ).remove( bbsPath + "/" );
734 if( rootPath.length() == 0 ) rootPath = QString::null;
738 default: /* 2ch : http://(hostname)/(rootPath)/(bbsPath)/ */
740 delimiter = "/test/read.cgi";
741 bbsPath = url.filename();
742 rootPath = url.prettyURL().remove( hostname + "/" ).remove( bbsPath + "/" );
743 if( rootPath.length() == 0 ) rootPath = QString::null;
749 /* For example, if bbsPath = "linux/", then m_bbsPath = "/linux" */
750 const QRegExp exp( "/$" );
751 rootPath.remove( exp );
752 bbsPath.remove( exp );
753 if( rootPath != QString::null && rootPath.at( 0 ) != '/' ) rootPath = "/" + rootPath;
754 if( bbsPath != QString::null && bbsPath.at( 0 ) != '/' ) bbsPath = "/" + bbsPath;
760 /* public */ /* static */
761 bool BoardManager::isEnrolled( const KURL& url )
763 if( getBoardData( url ) == NULL ) return FALSE;
768 /* public */ /* static */
769 BoardData* BoardManager::getBoardData( const KURL& url )
771 if( url.isEmpty() ) return NULL;
772 QString urlstr = url.prettyURL();
775 if( m_previousBoardData != NULL && m_previousBoardURL == urlstr ) return m_previousBoardData;
777 // qDebug( "getBoardData %s", urlstr.ascii());
779 for ( BoardDataList::Iterator it = m_boardDataList.begin(); it != m_boardDataList.end(); ++it ){
781 int count = (*it)->keyBasePathList().count();
782 for( int i = 0; i < count ; ++i ){
783 if( urlstr.contains( (*it)->keyBasePathList()[i] )
784 || urlstr.contains( (*it)->keyCgiBasePathList()[i] ) ){
787 m_previousBoardData = (*it);
788 m_previousBoardURL = urlstr;
800 /*--------------------------------*/
804 /* load the bbs history file ( BBSHISTORY ), and create keys of Data Base. */
805 /* Before calling this, enroll the board by enrollBoard(). */
807 ex) If the host of board moved like :
809 http:://aaa.com -> http://bbb.com -> http://ccc.com -> http://ddd.com
817 */ /* public */ /* static */
818 bool BoardManager::loadBBSHistory( const KURL& url )
820 BoardData* bdata = getBoardData( url );
821 if( bdata == NULL ) return FALSE;
823 QStringList keyHosts = bdata->hostName();
825 QFile file( Cache::getBBSHistoryPath( url ) );
826 if ( file.open( IO_ReadOnly ) ){
828 qDebug( "read BBSHISTRY : %s",Cache::getBBSHistoryPath( url ).ascii() );
830 QTextStream ts( &file );
835 line = ts.readLine();
836 qDebug("line: %s",line.ascii());
840 bdata->createKeys( keyHosts );
850 /* public */ /* static */
851 bool BoardManager::moveBoard( const KURL& fromURL, const KURL& toURL )
853 QString oldhost = fromURL.protocol() + "://" + fromURL.host();
854 QString newhost = toURL.protocol() + "://" + toURL.host();
856 const QRegExp exp( "/$" );
857 QString oldURL = fromURL.prettyURL();
858 QString newURL = toURL.prettyURL();
859 oldURL.remove( exp );
860 newURL.remove( exp );
864 qDebug( "moveBoard : %s -> %s", oldURL.ascii(), newURL.ascii() );
866 if( oldURL == newURL ) return FALSE;
868 /* Is oldURL enrolled? */
869 BoardData* bdata = getBoardData( oldURL );
872 /* Is newURL enrolled? */
873 bdata = getBoardData( newURL );
874 if( bdata == NULL ) return FALSE;
878 /*---------------------------*/
879 /* update BoardData */
881 /* get the path of old cache */
882 bdata->setHostName( oldhost );
883 QStringList keyHosts = bdata->keyHostList();
884 keyHosts.remove( oldhost );
885 keyHosts.prepend( oldhost );
886 bdata->createKeys( keyHosts );
887 QString oldCachePath = Cache::baseDir() + Cache::serverDir( bdata->basePath() )
888 + Cache::boardDir( bdata->basePath() );
891 bdata->setHostName( newhost );
894 /* The order of keyHosts will be like this:
902 keyHosts = bdata->keyHostList();
903 keyHosts.remove( oldhost );
904 keyHosts.prepend( oldhost );
905 keyHosts.remove( newhost );
906 keyHosts.prepend( newhost );
907 bdata->createKeys( keyHosts );
910 /*---------------------------*/
914 if( ! qdir.exists( oldCachePath ) ) return TRUE;
916 /* mkdir new server dir */
917 QString newCachePath = Cache::baseDir() + Cache::serverDir( bdata->basePath() );
918 Kita::mkdir( newCachePath );
921 newCachePath += Cache::boardDir( bdata->basePath() );
922 if( qdir.exists ( newCachePath ) ){
923 QString bkupPath = newCachePath;
924 bkupPath.truncate( bkupPath.length() -1 ); /* remove '/' */
925 bkupPath += "." + QString().setNum( QDateTime::currentDateTime().toTime_t() );
926 qDebug( "mv %s\n -> %s", newCachePath.ascii(), bkupPath.ascii() );
927 qdir.rename( newCachePath, bkupPath );
931 qDebug( "old: %s", oldCachePath.ascii() );
932 if( qdir.exists( oldCachePath ) ){
933 qDebug( "move: %s\n-> %s", oldCachePath.ascii(), newCachePath.ascii() );
934 qdir.rename( oldCachePath, newCachePath );
936 else Kita::mkdir( newCachePath );
939 if ( ! qdir.exists( oldCachePath ) ) {
940 Kita::mkdir( oldCachePath );
941 /* create BBS_MOVED */
942 QString movedPath = oldCachePath + "/BBS_MOVED";
943 QFile file( movedPath );
944 if ( file.open( IO_WriteOnly ) ) {
945 qDebug( "write BBS_MOVED : %s", movedPath.ascii() );
946 QTextStream stream( &file );
947 stream << newURL << endl;
952 /*---------------------------*/
953 /* update BBSHISTRY */
955 QFile file( Cache::getBBSHistoryPath( bdata->basePath() ) );
956 if ( file.open( IO_WriteOnly ) ){
958 qDebug( "write BBSHISTRY : %s", Cache::getBBSHistoryPath( bdata->basePath() ).ascii() );
959 QTextStream ts( &file );
961 keyHosts.remove( newhost );
962 for ( QStringList::iterator it = keyHosts.begin() ; it != keyHosts.end(); ++it ) {
970 /*---------------------------*/
971 /* update other information */
972 FavoriteThreads::replace( oldURL, newURL );
973 Kita::Thread::replace( oldURL, newURL );
974 KitaThreadInfo::replace( oldURL, newURL );
975 Kita::FavoriteBoards::replace( oldURL, newURL );
977 qDebug("%s",bdata->basePath().ascii() );
978 qDebug("%s",bdata->cgiBasePath().ascii() );
979 int count = bdata->keyBasePathList().count();
980 for( int i = 0; i < count ; ++i ){
981 qDebug("key: %s",bdata->keyBasePathList()[i].ascii() );
982 qDebug("key: %s",bdata->keyCgiBasePathList()[i].ascii() );
989 /*--------------------------------*/
993 /* public */ /* static */
994 bool BoardManager::loadBBSSetting( const KURL& url, bool reload )
996 /* Is board enrolled ? */
997 BoardData* bdata = getBoardData( url );
998 if( bdata == NULL ) return FALSE;
999 if( bdata->type() != Board_2ch ) return FALSE;
1001 KURL settingURL = bdata->settingURL();
1002 QString path = Cache::getSettingPath( url );
1005 if( DownloadManager::isLoadingNow( settingURL ) ) return FALSE;
1007 /* already loaded */
1008 if( bdata->settingLoaded() && !reload ) return TRUE;
1010 /* reset names, linenum, etc. */
1011 bdata->setSettingLoaded( FALSE );
1013 qDebug("LOAD SETTING.TXT : %s",settingURL.prettyURL().ascii());
1014 qDebug("path: %s",path.ascii());
1016 /* download SETTING.TXT.*/
1017 DownloadManager::download( settingURL, path );
1018 bdata->setSettingLoaded( TRUE );
1024 /* public */ /* static */
1025 QString BoardManager::getBBSDefaultName( const KURL& url )
1027 BoardData* bdata = openSettingTxt( url );
1028 if( bdata == NULL ) return QString::null;
1029 return bdata->defaultName();
1033 /* public */ /* static */
1034 int BoardManager::getBBSMaxLine( const KURL& url )
1036 BoardData* bdata = openSettingTxt( url );
1037 if( bdata == NULL ) return 0;
1038 return bdata->lineNum();
1041 /* public */ /* static */
1042 int BoardManager::getBBSMsgCount( const KURL& url )
1044 BoardData* bdata = openSettingTxt( url );
1045 if( bdata == NULL ) return 0;
1046 return bdata->msgCount();
1050 /* public */ /* static */
1051 const KURL BoardManager::titleImgURL( const KURL& url )
1053 BoardData* bdata = openSettingTxt( url );
1054 if( bdata == NULL ) return QString::null;
1055 return bdata->titleImgURL();
1058 /* open local SETTING.TXT, then get names, linenum, etc. */ /* private */ /* static */
1059 BoardData* BoardManager::openSettingTxt( const KURL& url )
1061 BoardData* bdata = getBoardData( url );
1062 if( bdata == NULL ) return NULL;
1063 if( !bdata->settingLoaded() ) return NULL;
1064 if( DownloadManager::isLoadingNow( bdata->settingURL() ) ) return NULL;
1065 if( bdata->defaultName() != QString::null ) return bdata;
1067 qDebug( "read SETTING.TXT");
1069 QFile file( Cache::getSettingPath( url ) );
1070 if ( file.open( IO_ReadOnly ) ){
1072 QTextStream ts( &file );
1073 if( m_cp932Codec == NULL) m_cp932Codec = new QCp932Codec();
1074 ts.setCodec( m_cp932Codec );
1079 line = ts.readLine();
1082 QString key = "BBS_NONAME_NAME=";
1083 if( line.find( key ) != -1 ) bdata->setDefaultName( line.remove( key ) );
1086 key = "NANASI_NAME=";
1087 if( line.find( key ) != -1 ) bdata->setDefaultName( line.remove( key ) );
1090 key = "BBS_LINE_NUMBER=";
1091 if( line.find( key ) != -1 ) bdata->setLineNum( line.remove( key ).toInt() * 2 );
1094 key = "BBS_MESSAGE_COUNT=";
1095 if( line.find( key ) != -1 ) bdata->setMsgCount( line.remove( key ).toInt() );
1098 key = "BBS_TITLE_PICTURE=";
1099 if( line.find( key ) != -1 ){
1100 QString path = line.remove( key );
1101 KURL titleImgURL = KURL( bdata->basePath(), path );
1102 bdata->setTitleImgURL( titleImgURL );
1109 if( bdata->defaultName() == QString::null ) bdata->setDefaultName( "(default name)" );
1111 qDebug( "name: %s", (const char *)bdata->defaultName().local8Bit());
1112 qDebug( "line num: %d", bdata->lineNum() );