void ImapSession::emitUpdates( Transaction * t ) { if ( d->emitting ) return; d->emitting = true; bool work = false; Scope x( d->l ); IntegerSet e; e.add( expunged() ); e.remove( d->expungesReported ); if ( !e.isEmpty() ) { d->expungesReported.add( e ); while ( !e.isEmpty() ) { (void)new ImapExpungeResponse( e.smallest(), this ); work = true; e.remove( e.smallest() ); } } emitFlagUpdates( t ); if ( d->uidnext < uidnext() ) { if ( !d->existsResponse ) { d->existsResponse = new ImapSessionData::ExistsResponse( this, d ); work = true; } if ( !d->recentResponse ) { d->recentResponse = new ImapSessionData::RecentResponse( this, d ); work = true; } if ( !d->uidnextResponse ) { d->uidnextResponse = new ImapSessionData::UidnextResponse( this, d ); work = true; } } if ( d->nms < nextModSeq() ) d->nms = nextModSeq(); if ( d->changed.isEmpty() ) d->cms = d->nms; if ( work ) d->i->unblockCommands(); d->i->emitResponses(); d->emitting = false; }
void MaildirMailbox::readSubDir( const EString & sub ) { DIR * dir = opendir( ( d->path + "/" + sub ).cstr() ); if ( !dir ) return; Map<EStringList> files; IntegerSet times; struct dirent * de = readdir( dir ); while ( de ) { if ( de->d_name[0] >= '0' && de->d_name[0] <= '9' ) { EString n( de->d_name ); int i = n.find( '.' ); bool ok = false; if ( i > 0 ) i = n.mid( 0, i ).number( &ok ); if ( ok ) { EString * f = new EString ( sub ); f->append( "/" ); f->append( n ); EStringList * l = 0; l = files.find( i ); if ( !l ) { l = new EStringList; files.insert( i, l ); times.add( i ); // XXX: how very evil } l->append( f ); } else { // no dot in the name... what is it? } } de = readdir( dir ); } closedir( dir ); while ( !times.isEmpty() ) { uint n = times.smallest(); times.remove( n ); EStringList * l = files.find( n ); EStringList::Iterator i( *l ); while ( i ) { d->messages.append( *i ); ++i; } } }