You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/kioslaves/mbox/readmbox.cc

205 lines
4.2 KiB

/*
* This is a simple kioslave to handle mbox-files.
* Copyright (C) 2004 Mart Kelder (mart.kde@hccnet.nl)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <config.h>
#include "readmbox.h"
#include "mbox.h"
#include "urlinfo.h"
#include <kdebug.h>
#include <kio/global.h>
#include <tqfile.h>
#include <tqfileinfo.h>
#include <tqstring.h>
#include <tqtextstream.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#include <utime.h>
ReadMBox::ReadMBox( const UrlInfo* info, MBoxProtocol* tqparent, bool onlynew, bool savetime )
: MBoxFile( info, tqparent ),
m_file( 0 ),
m_stream( 0 ),
m_current_line( new TQString( TQString() ) ),
m_current_id( new TQString( TQString() ) ),
m_atend( true ),
m_prev_time( 0 ),
m_only_new( onlynew ),
m_savetime( savetime ),
m_status( false ),
m_prev_status( false ),
m_header( true )
{
if( m_info->type() == UrlInfo::invalid )
m_mbox->emitError( KIO::ERR_DOES_NOT_EXIST, info->url() );
if( !open( savetime ) )
m_mbox->emitError( KIO::ERR_CANNOT_OPEN_FOR_READING, info->url() );
if( m_info->type() == UrlInfo::message )
if( !searchMessage( m_info->id() ) )
m_mbox->emitError( KIO::ERR_DOES_NOT_EXIST, info->url() );
}
ReadMBox::~ReadMBox()
{
delete m_current_line;
close();
}
TQString ReadMBox::currentLine() const
{
return *m_current_line;
}
TQString ReadMBox::currentID() const
{
return *m_current_id;
}
bool ReadMBox::nextLine()
{
if( !m_stream )
return true;
*m_current_line = m_stream->readLine();
m_atend = m_current_line->isNull();
if( m_atend ) // Cursor was at EOF
{
*m_current_id = TQString();
m_prev_status = m_status;
return true;
}
//New message
if( m_current_line->left( 5 ) == "From " )
{
*m_current_id = *m_current_line;
m_prev_status = m_status;
m_status = true;
m_header = true;
return true;
} else if( m_only_new )
{
if( m_header && m_current_line->left( 7 ) == "tqStatus:" &&
! m_current_line->tqcontains( "U" ) && ! m_current_line->tqcontains( "N" ) )
{
m_status = false;
}
}
if( m_current_line->stripWhiteSpace().isEmpty() )
m_header = false;
return false;
}
bool ReadMBox::searchMessage( const TQString& id )
{
if( !m_stream )
return false;
while( !m_atend && *m_current_id != id )
nextLine();
return *m_current_id == id;
}
unsigned int ReadMBox::skipMessage()
{
unsigned int result = m_current_line->length();
if( !m_stream )
return 0;
while( !nextLine() )
result += m_current_line->length();
return result;
}
void ReadMBox::rewind()
{
if( !m_stream )
return; //Rewinding not possible
m_stream->tqdevice()->reset();
m_atend = m_stream->atEnd();
}
bool ReadMBox::atEnd() const
{
if( !m_stream )
return true;
return m_atend || ( m_info->type() == UrlInfo::message && *m_current_id != m_info->id() );
}
bool ReadMBox::inListing() const
{
return !m_only_new || m_prev_status;
}
bool ReadMBox::open( bool savetime )
{
if( savetime )
{
TQFileInfo info( m_info->filename() );
m_prev_time = new utimbuf;
m_prev_time->actime = info.lastRead().toTime_t();
m_prev_time->modtime = info.lastModified().toTime_t();
}
if( m_file )
return false; //File already open
m_file = new TQFile( m_info->filename() );
if( !m_file->open( IO_ReadOnly ) )
{
delete m_file;
m_file = 0;
return false;
}
m_stream = new TQTextStream( m_file );
skipMessage();
return true;
}
void ReadMBox::close()
{
if( !m_stream )
return;
delete m_stream; m_stream = 0;
m_file->close();
delete m_file; m_file = 0;
if( m_prev_time )
utime( TQFile::encodeName( m_info->filename() ), m_prev_time );
}