void KNNntpClient::doFetchArticle() { KNRemoteArticle *target = static_cast<KNRemoteArticle*>(job->data()); QCString cmd; sendSignal(TSdownloadArticle); errorPrefix = i18n("Article could not be retrieved.\nThe following error occurred:\n"); progressValue = 100; predictedLines = target->lines()->numberOfLines()+10; if (target->collection()) { QString groupName = static_cast<KNGroup*>(target->collection())->groupname(); if (currentGroup != groupName) { cmd="GROUP "; cmd+=groupName.utf8(); if (!sendCommandWCheck(cmd,211)) // 211 n f l s group selected return; currentGroup = groupName; } } if (target->articleNumber() != -1) { cmd.setNum(target->articleNumber()); cmd.prepend("ARTICLE "); } else { cmd = "ARTICLE " + target->messageID()->as7BitString(false); } if (!sendCommandWCheck(cmd,220)) { // 220 n <a> article retrieved - head and body follow int code = atoi(getCurrentLine()); if ( code == 430 || code == 423 ) { // 430 no such article found || 423 no such article number in this group QString msgId = target->messageID()->as7BitString( false ); // strip of '<' and '>' msgId = msgId.mid( 1, msgId.length() - 2 ); job->setErrorString( errorPrefix + getCurrentLine() + i18n("<br><br>The article you requested is not available on your news server." "<br>You could try to get it from <a href=\"http://groups.google.com/groups?selm=%1\">groups.google.com</a>.") .arg( msgId ) ); } return; } QStrList msg; if (!getMsg(msg)) return; progressValue = 1000; sendSignal(TSprogressUpdate); target->setContent(&msg); target->parse(); }
void KNArticleManager::setAllNotNew() { if ( !g_roup ) return; KNRemoteArticle *a; for ( int i = 0; i < g_roup->length(); ++i) { a = g_roup->at(i); if ( a->isNew() ) { a->setNew( false ); a->setChanged( true ); } } g_roup->setFirstNewIndex( -1 ); g_roup->setNewCount( 0 ); g_roup->updateThreadInfo(); }
void KNArticleManager::setAllThreadsOpen(bool b) { KNRemoteArticle *art; if(g_roup) { knGlobals.top->setCursorBusy(true); d_isableExpander = true; for(int idx=0; idx<g_roup->length(); idx++) { art = g_roup->at(idx); if (art->listItem()) art->listItem()->setOpen(b); else if (b && art->filterResult()) { createThread(art); art->listItem()->setOpen(true); } } d_isableExpander = false; knGlobals.top->setCursorBusy(false); } }
void KNArticleManager::processJob(KNJobData *j) { if(j->type()==KNJobData::JTfetchArticle && !j->canceled()) { KNRemoteArticle *a = static_cast<KNRemoteArticle*>( j->data() ); if(j->success()) { ArticleWidget::articleChanged( a ); if(!a->isOrphant()) //orphant articles are deleted by the displaying widget knGlobals.memoryManager()->updateCacheEntry(a); if(a->listItem()) a->updateListItem(); } else { if ( j->error() == KIO::ERR_DOES_NOT_EXIST ) { // article is not available at the server anymore QString msgId = a->messageID()->as7BitString( false ); // strip of '<' and '>' msgId = msgId.mid( 1, msgId.length() - 2 ); ArticleWidget::articleLoadError( a, i18n("The article you requested is not available on your news server." "<br />You could try to get it from <a href=\"http://groups.google.com/groups?selm=%1\">groups.google.com</a>.", msgId ) ); // mark article as read if ( knGlobals.settings()->autoMark() && !a->isOrphant() ) { KNRemoteArticle::List l; l.append( a ); setRead( l, true ); } } else ArticleWidget::articleLoadError( a, j->errorString() ); } } delete j; }
void KNArticleManager::updateListViewItems() { if(!g_roup && !f_older) return; if(g_roup) { KNRemoteArticle *art; for(int i=0; i<g_roup->length(); i++) { art=g_roup->at(i); if(art->listItem()) art->updateListItem(); } } else { //folder KNLocalArticle *art; for(int idx=0; idx<f_older->length(); idx++) { art=f_older->at(idx); if(art->listItem()) art->updateListItem(); } } }
void KNNntpClient::doFetchSource() { KNRemoteArticle *target = static_cast<KNRemoteArticle *>(job->data()); sendSignal(TSdownloadArticle); errorPrefix = i18n("Article could not be retrieved.\nThe following error occurred:\n"); progressValue = 100; predictedLines = target->lines()->numberOfLines() + 10; QCString cmd = "ARTICLE " + target->messageID()->as7BitString(false); if(!sendCommandWCheck(cmd, 220)) // 220 n <a> article retrieved - head and body follow return; QStrList msg; if(!getMsg(msg)) return; progressValue = 1000; sendSignal(TSprogressUpdate); target->setContent(&msg); }
void KNArticleManager::setAllRead( bool read, int lastcount ) { if ( !g_roup ) return; int groupLength = g_roup->length(); int newCount = g_roup->newCount(); int readCount = g_roup->readCount(); int offset = lastcount; if ( lastcount > groupLength || lastcount < 0 ) offset = groupLength; KNRemoteArticle *a; for ( int i = groupLength - offset; i < groupLength; i++ ) { a = g_roup->at( i ); if ( a->getReadFlag() != read && !a->isIgnored() ) { a->setRead( read ); a->setChanged( true ); if ( !read ) { readCount--; if ( a->isNew() ) newCount++; } else { readCount++; if ( a->isNew() ) newCount--; } } } g_roup->updateThreadInfo(); if ( lastcount < 0 && read ) { // HACK: try to hide the effects of the ignore/filter new/unread count bug g_roup->setReadCount( groupLength ); g_roup->setNewCount( 0 ); } else { g_roup->setReadCount( readCount ); g_roup->setNewCount( newCount ); } g_roup->updateListItem(); showHdrs( true ); }
bool KNArticleManager::toggleIgnored(KNRemoteArticle::List &l) { if(l.isEmpty()) return true; KNRemoteArticle *ref = 0; bool ignore = !l.first()->isIgnored(); KNGroup *g = static_cast<KNGroup*>( l.first()->collection() ); int changeCnt = 0, idRef = 0; for ( KNRemoteArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) { (*it)->setWatched(false); if ( (*it)->isIgnored() != ignore ) { (*it)->setIgnored( ignore ); if ( !(*it)->getReadFlag() ) { changeCnt++; idRef = (*it)->idRef(); while ( idRef != 0 ) { ref = g->byId( idRef ); if ( ignore ) { ref->decUnreadFollowUps(); if ( (*it)->isNew() ) ref->decNewFollowUps(); } else { ref->incUnreadFollowUps(); if ( (*it)->isNew() ) ref->incNewFollowUps(); } if(ref->listItem() && ((ref->unreadFollowUps()==0 || ref->unreadFollowUps()==1) || (ref->newFollowUps()==0 || ref->newFollowUps()==1))) ref->updateListItem(); idRef=ref->idRef(); } if ( ignore ) { g->incReadCount(); if ( (*it)->isNew() ) g->decNewCount(); } else { g->decReadCount(); if ( (*it)->isNew() ) g->incNewCount(); } } } (*it)->updateListItem(); (*it)->setChanged(true); } if(changeCnt>0) { g->updateListItem(); if(g==g_roup) updateStatusString(); } return ignore; }
void KNArticleManager::setRead(KNRemoteArticle::List &l, bool r, bool handleXPosts) { if ( l.isEmpty() ) return; KNRemoteArticle *ref = 0; KNGroup *g=static_cast<KNGroup*>( l.first()->collection() ); int changeCnt=0, idRef=0; for ( KNRemoteArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) { if( r && knGlobals.settings()->markCrossposts() && handleXPosts && (*it)->newsgroups()->isCrossposted() ) { QList<QByteArray> groups = (*it)->newsgroups()->groups(); KNGroup *targetGroup=0; KNRemoteArticle *xp=0; KNRemoteArticle::List al; QByteArray mid = (*it)->messageID()->as7BitString( false ); for ( QList<QByteArray>::Iterator it2 = groups.begin(); it2 != groups.end(); ++it2 ) { targetGroup = knGlobals.groupManager()->group(*it2, g->account()); if (targetGroup) { if (targetGroup->isLoaded() && (xp=targetGroup->byMessageId(mid)) ) { al.clear(); al.append(xp); setRead(al, r, false); } else { targetGroup->appendXPostID(mid); } } } } else if ( (*it)->getReadFlag() != r ) { (*it)->setRead( r ); (*it)->setChanged( true ); (*it)->updateListItem(); if ( !(*it)->isIgnored() ) { changeCnt++; idRef = (*it)->idRef(); while ( idRef != 0 ) { ref=g->byId(idRef); if(r) { ref->decUnreadFollowUps(); if ( (*it)->isNew() ) ref->decNewFollowUps(); } else { ref->incUnreadFollowUps(); if ( (*it)->isNew() ) ref->incNewFollowUps(); } if(ref->listItem() && ((ref->unreadFollowUps()==0 || ref->unreadFollowUps()==1) || (ref->newFollowUps()==0 || ref->newFollowUps()==1))) ref->updateListItem(); idRef=ref->idRef(); } if(r) { g->incReadCount(); if ( (*it)->isNew() ) g->decNewCount(); } else { g->decReadCount(); if ( (*it)->isNew() ) g->incNewCount(); } } } } if(changeCnt>0) { g->updateListItem(); if(g==g_roup) updateStatusString(); } }