void KNNetAccess::startJobSmtp() { if(smtpJobQueue.isEmpty()) return; currentSmtpJob = smtpJobQueue.first(); smtpJobQueue.remove(smtpJobQueue.begin()); currentSmtpJob->prepareForExecution(); if(currentSmtpJob->success()) { KNLocalArticle *art = static_cast<KNLocalArticle *>(currentSmtpJob->data()); // create url query part QString query("headers=0&from="); query += KURL::encode_string(art->from()->email()); QStrList emails; art->to()->emails(&emails); for(char *e = emails.first(); e; e = emails.next()) { query += "&to=" + KURL::encode_string(e); } // create url KURL destination; KNServerInfo *account = currentSmtpJob->account(); if(account->encryption() == KNServerInfo::SSL) destination.setProtocol("smtps"); else destination.setProtocol("smtp"); destination.setHost(account->server()); destination.setPort(account->port()); destination.setQuery(query); if(account->needsLogon()) { destination.setUser(account->user()); destination.setPass(account->pass()); } KIO::Job *job = KIO::storedPut(art->encodedContent(true), destination, -1, false, false, false); connect(job, SIGNAL(result(KIO::Job *)), SLOT(slotJobResult(KIO::Job *))); if(account->encryption() == KNServerInfo::TLS) job->addMetaData("tls", "on"); else job->addMetaData("tls", "off"); currentSmtpJob->setJob(job); kdDebug(5003) << "KNNetAccess::startJobSmtp(): job started" << endl; } else { threadDoneSmtp(); } }
void KNArticleManager::copyIntoFolder(KNArticle::List &l, KNFolder *f) { if(!f) return; KNLocalArticle *loc; KNLocalArticle::List l2; for ( KNArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) { if ( !(*it)->hasContent() ) continue; loc=new KNLocalArticle(0); loc->setEditDisabled(true); loc->setContent( (*it)->encodedContent() ); loc->parse(); l2.append(loc); } if ( !l2.isEmpty() ) { f->setNotUnloadable(true); if ( !f->isLoaded() && !knGlobals.folderManager()->loadHeaders( f ) ) { for ( KNLocalArticle::List::Iterator it = l2.begin(); it != l2.end(); ++it ) delete (*it); l2.clear(); f->setNotUnloadable(false); return; } if( !f->saveArticles( l2 ) ) { for ( KNLocalArticle::List::Iterator it = l2.begin(); it != l2.end(); ++it ) { if ( (*it)->isOrphant() ) delete (*it); // ok, this is ugly; we simply delete orphant articles else (*it)->KMime::Content::clear(); // no need to keep them in memory } KNHelper::displayInternalFileError(); } else { for ( KNLocalArticle::List::Iterator it = l2.begin(); it != l2.end(); ++it ) (*it)->KMime::Content::clear(); // no need to keep them in memory knGlobals.memoryManager()->updateCacheEntry(f); } f->setNotUnloadable(false); } }
void KNFolder::removeArticles( KNLocalArticle::List &l, bool del ) { if( !isLoaded() || l.isEmpty() ) return; int idx = 0, delCnt = 0, *positions; positions = new int[l.count()]; KNLocalArticle *a = 0; for ( KNLocalArticle::List::Iterator it = l.begin(); it != l.end(); ++it, ++idx ) { if ( (*it)->isLocked() ) positions[idx] = -1; else positions[idx] = a_rticles.indexForId( (*it)->id() ); } for ( idx = 0; idx < (int)(l.count()); ++idx ) { if(positions[idx]==-1) continue; a=at(positions[idx]); //update knGlobals.artFactory->deleteComposerForArticle(a); ArticleWindow::closeAllWindowsForArticle( a ); ArticleWidget::articleRemoved( a ); delete a->listItem(); //delete article a_rticles.remove( positions[idx], del ); delCnt++; if(!del) a->setId(-1); } if(delCnt>0) { compact(); c_ount-=delCnt; updateListItem(); i_ndexDirty=true; } delete[] positions; }
bool KNFolder::unloadHdrs(bool force) { if(l_ockedArticles>0) return false; if (!force && isNotUnloadable()) return false; KNLocalArticle *a; for(int idx=0; idx<length(); idx++) { a=at(idx); if (a->hasContent() && !knGlobals.articleManager()->unloadArticle(a, force)) return false; } syncIndex(); clear(); return true; }
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::doPostArticle() { KNLocalArticle *art = static_cast<KNLocalArticle *>(job->data()); sendSignal(TSsendArticle); if(art->messageID(false) != 0) { int rep; if(!sendCommand(QCString("STAT ") + art->messageID(false)->as7BitString(false), rep)) return; if(rep == 223) // 223 n <a> article retrieved - request text separately { #ifndef NDEBUG qDebug("knode: STAT successful, we have probably already sent this article."); #endif return; // the article is already on the server, lets put it silently into the send folder } } if(!sendCommandWCheck("POST", 340)) // 340 send article to be posted. End with <CR-LF>.<CR-LF> return; if(art->messageID(false) == 0) // article has no message ID => search for a ID in the response { QCString s = getCurrentLine(); int start = s.findRev(QRegExp("<[^\\s]*@[^\\s]*>")); if(start != -1) // post response includes a recommended id { int end = s.find('>', start); art->messageID()->from7BitString(s.mid(start, end - start + 1)); art->assemble(); #ifndef NDEBUG qDebug("knode: using the message-id recommended by the server: %s", s.mid(start, end - start + 1).data()); #endif } } if(!sendMsg(art->encodedContent(true))) return; if(!checkNextResponse(240)) // 240 article posted ok return; }
bool KNFolder::loadHdrs() { if(isLoaded()) { kDebug(5003) <<"KNFolder::loadHdrs() : already loaded"; return true; } if(!i_ndexFile.open(QIODevice::ReadOnly)) { kError(5003) <<"KNFolder::loadHdrs() : cannot open index-file!"; closeFiles(); return false; } if(!m_boxFile.open(QIODevice::ReadOnly)) { kError(5003) <<"KNFolder::loadHdrs() : cannot open mbox-file!"; closeFiles(); return false; } if(!resize(c_ount)) { closeFiles(); return false; } QByteArray tmp; KNLocalArticle *art; DynData dynamic; int pos1=0, pos2=0, cnt=0, byteCount; knGlobals.top->setCursorBusy(true); knGlobals.setStatusMsg(i18n(" Loading folder...")); knGlobals.top->secureProcessEvents(); while(!i_ndexFile.atEnd()) { //read index-data byteCount=i_ndexFile.read((char*)(&dynamic), sizeof(DynData)); if(byteCount!=sizeof(DynData)) { if( i_ndexFile.error() == QFile::NoError ) { kWarning(5003) <<"KNFolder::loadHeaders() : found broken entry in index-file: Ignored!"; continue; } else { kError(5003) <<"KNFolder::loadHeaders() : corrupted index-file, IO-error!"; closeFiles(); clear(); knGlobals.top->setCursorBusy( false ); return false; } } art=new KNLocalArticle(this); //set index-data dynamic.getData(art); //read overview if ( !m_boxFile.seek( art->startOffset() ) ) { kError(5003) <<"KNFolder::loadHdrs() : cannot set mbox file-pointer!"; closeFiles(); clear(); knGlobals.top->setCursorBusy( false ); return false; } tmp = m_boxFile.readLine(); if ( tmp.endsWith( '\n' ) ) tmp.resize( tmp.length() - 1 ); if(tmp.isEmpty()) { if( m_boxFile.error() == QFile::NoError ) { kWarning(5003) <<"found broken entry in mbox-file: Ignored!"; delete art; continue; } else { kError(5003) <<"KNFolder::loadHdrs() : corrupted mbox-file, IO-error!"; closeFiles(); clear(); knGlobals.top->setCursorBusy( false ); return false; } } //set overview bool end=false; pos1 = tmp.indexOf( ' ' ) + 1; pos2 = tmp.indexOf( '\t', pos1 ); if (pos2 == -1) { pos2=tmp.length(); end=true; } art->subject()->from7BitString(tmp.mid(pos1, pos2-pos1)); if (!end) { pos1=pos2+1; pos2 = tmp.indexOf( '\t', pos1 ); if (pos2 == -1) { pos2=tmp.length(); end=true; } art->newsgroups()->from7BitString(tmp.mid(pos1, pos2-pos1)); } if (!end) { pos1=pos2+1; pos2 = tmp.indexOf( '\t', pos1 ); if (pos2 == -1) { pos2=tmp.length(); end=true; } art->to()->from7BitString(tmp.mid(pos1,pos2-pos1)); } if (!end) { pos1=pos2+1; pos2=tmp.length(); art->lines()->from7BitString(tmp.mid(pos1,pos2-pos1)); } if(!append(art)) { kError(5003) <<"KNFolder::loadHdrs() : cannot append article!"; delete art; clear(); closeFiles(); knGlobals.setStatusMsg( QString() ); knGlobals.top->setCursorBusy(false); return false; } cnt++; } closeFiles(); setLastID(); c_ount=cnt; updateListItem(); knGlobals.setStatusMsg( QString() ); knGlobals.top->setCursorBusy(false); return true; }
void KNArticleManager::showHdrs(bool clear) { if(!g_roup && !f_older) return; bool setFirstChild=true; bool showThreads=knGlobals.settings()->showThreads(); bool expandThreads=knGlobals.settings()->defaultToExpandedThreads(); if(clear) v_iew->clear(); knGlobals.top->setCursorBusy(true); knGlobals.setStatusMsg(i18n(" Creating list...")); knGlobals.top->secureProcessEvents(); if(g_roup) { KNRemoteArticle *art, *ref, *current; current = static_cast<KNRemoteArticle*>( knGlobals.top->articleViewer()->article() ); if(current && (current->collection() != g_roup)) { current=0; knGlobals.top->articleViewer()->setArticle( 0 ); } if(g_roup->isLocked()) knGlobals.scheduler()->nntpMutex().lock(); if(f_ilter) f_ilter->doFilter(g_roup); else for(int i=0; i<g_roup->length(); i++) { art=g_roup->at(i); art->setFilterResult(true); art->setFiltered(true); ref=(art->idRef()!=0) ? g_roup->byId(art->idRef()) : 0; art->setDisplayedReference(ref); if(ref) ref->setVisibleFollowUps(true); } d_isableExpander=true; for(int i=0; i<g_roup->length(); i++) { art=g_roup->at(i); art->setThreadMode(showThreads); if(showThreads) { art->propagateThreadChangedDate(); if( !art->listItem() && art->filterResult() ) { // ### disable delayed header view item creation for now, it breaks // the quick search // since it doesn't seem to improve performance at all, it probably // could be removed entirely (see also slotItemExpanded(), etc.) /*if (!expandThreads) { if( (ref=art->displayedReference()) ) { if( ref->listItem() && ( ref->listItem()->isOpen() || ref->listItem()->childCount()>0 ) ) { art->setListItem(new KNHdrViewItem(ref->listItem())); art->initListItem(); } } else { art->setListItem(new KNHdrViewItem(v_iew)); art->initListItem(); } } else { // expandThreads == true */ createThread(art); if ( expandThreads ) art->listItem()->setOpen(true); // } } else if(art->listItem()) { art->updateListItem(); if (expandThreads) art->listItem()->setOpen(true); } } else { if(!art->listItem() && art->filterResult()) { art->setListItem(new KNHdrViewItem(v_iew)); art->initListItem(); } else if(art->listItem()) art->updateListItem(); } } if (current && !current->filterResult()) { // try to find a parent that is visible int idRef; while (current && !current->filterResult()) { idRef=current->idRef(); if (idRef == -1) break; current = g_roup->byId(idRef); } } if(current && current->filterResult()) { if(!current->listItem()) createCompleteThread(current); v_iew->setActive( current->listItem() ); setFirstChild=false; } d_isableExpander=false; if (g_roup->isLocked()) knGlobals.scheduler()->nntpMutex().unlock(); } else { //folder KNLocalArticle *art; if(f_ilter) { f_ilter->doFilter(f_older); } else { for(int i=0; i<f_older->length(); i++) { art=f_older->at(i); art->setFilterResult(true); } } for(int idx=0; idx<f_older->length(); idx++) { art=f_older->at(idx); if(!art->listItem() && art->filterResult()) { art->setListItem( new KNHdrViewItem(v_iew, art) ); art->updateListItem(); } else if(art->listItem()) art->updateListItem(); } } if(setFirstChild && v_iew->firstChild()) { v_iew->setCurrentItem(v_iew->firstChild()); knGlobals.top->articleViewer()->setArticle( 0 ); } knGlobals.setStatusMsg( QString() ); updateStatusString(); knGlobals.top->setCursorBusy(false); }