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.
 
 
 

190 lines
4.9 KiB

/**
* The code here is taken from accountdialog.cpp, which is:
* Copyright (C) 2000 Espen Sand, espe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "procmailparser.h"
#include <QDir>
#include <QTextStream>
#ifdef HAVE_PATHS_H
#include <paths.h> /* defines _PATH_MAILDIR */
#endif
#ifndef _PATH_MAILDIR
#define _PATH_MAILDIR "/var/spool/mail"
#endif
using namespace KMail;
ProcmailRCParser::ProcmailRCParser(const QString &filename)
: mProcmailrc(filename),
mStream(new QTextStream(&mProcmailrc))
{
// predefined
mVars.insert( "HOME", QDir::homePath() );
if( filename.isEmpty() ) {
mProcmailrc.setFileName(QDir::homePath() + "/.procmailrc");
}
QRegExp lockFileGlobal("^LOCKFILE=", Qt::CaseSensitive);
QRegExp lockFileLocal("^:0", Qt::CaseSensitive);
if( mProcmailrc.open(QIODevice::ReadOnly) ) {
QString s;
while( !mStream->atEnd() ) {
s = mStream->readLine().trimmed();
if( s[0] == '#' ) continue; // skip comments
int commentPos = -1;
if( (commentPos = s.indexOf('#')) > -1 ) {
// get rid of trailing comment
s.truncate(commentPos);
s = s.trimmed();
}
if( lockFileGlobal.indexIn(s) != -1 ) {
processGlobalLock(s);
} else if( lockFileLocal.indexIn(s) != -1 ) {
processLocalLock(s);
} else if( int i = s.indexOf('=') ) {
processVariableSetting(s,i);
}
}
}
QString default_Location = qgetenv("MAIL");
if (default_Location.isNull()) {
default_Location = _PATH_MAILDIR;
default_Location += '/';
default_Location += qgetenv("USER");
}
if ( !mSpoolFiles.contains(default_Location) )
mSpoolFiles << default_Location;
default_Location = default_Location + ".lock";
if ( !mLockFiles.contains(default_Location) )
mLockFiles << default_Location;
}
ProcmailRCParser::~ProcmailRCParser()
{
delete mStream;
}
void
ProcmailRCParser::processGlobalLock(const QString &s)
{
QString val = expandVars(s.mid(s.indexOf('=') + 1).trimmed());
if ( !mLockFiles.contains(val) )
mLockFiles << val;
}
void
ProcmailRCParser::processLocalLock(const QString &s)
{
QString val;
int colonPos = s.lastIndexOf(':');
if (colonPos > 0) { // we don't care about the leading one
val = s.mid(colonPos + 1).trimmed();
if ( val.length() ) {
// user specified a lockfile, so process it
//
val = expandVars(val);
if ( val[0] != '/' && mVars.contains("MAILDIR") )
val.insert(0, mVars["MAILDIR"] + '/');
} // else we'll deduce the lockfile name one we
// get the spoolfile name
}
// parse until we find the spoolfile
QString line, prevLine;
do {
prevLine = line;
line = mStream->readLine().trimmed();
} while ( !mStream->atEnd() &&
( line[0] == '*' ||
prevLine.length() > 0 && prevLine[prevLine.length() - 1] == '\\' ) );
if( line[0] != '!' && line[0] != '|' && line[0] != '{' ) {
// this is a filename, expand it
//
line = line.trimmed();
line = expandVars(line);
// prepend default MAILDIR if needed
if( line[0] != '/' && mVars.contains("MAILDIR") )
line.insert(0, mVars["MAILDIR"] + '/');
// now we have the spoolfile name
if ( !mSpoolFiles.contains(line) )
mSpoolFiles << line;
if( colonPos > 0 && val.isEmpty() ) {
// there is a local lockfile, but the user didn't
// specify the name so compute it from the spoolfile's name
val = line;
// append lock extension
if( mVars.contains("LOCKEXT") )
val += mVars["LOCKEXT"];
else
val += ".lock";
}
if ( !val.isNull() && !mLockFiles.contains(val) ) {
mLockFiles << val;
}
}
}
void
ProcmailRCParser::processVariableSetting(const QString &s, int eqPos)
{
if( eqPos == -1) return;
QString varName = s.left(eqPos),
varValue = expandVars(s.mid(eqPos + 1).trimmed());
mVars.insert( varName.toLatin1(), varValue );
}
QString
ProcmailRCParser::expandVars(const QString &s)
{
if( s.isEmpty()) return s;
QString expS = s;
for ( QHash<QByteArray, QString>::const_iterator it = mVars.constBegin(); it != mVars.constEnd(); ++it ) {
expS.replace( QString::fromLatin1("$") + it.key(), it.value() );
}
return expS;
}