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/korganizer/komailclient.cpp

302 lines
9.8 KiB

/*
This file is part of KOrganizer.
Copyright (c) 1998 Barry D Benowitz
Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
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.
As a special exception, permission is given to link this program
with any edition of Qt, and distribute the resulting executable,
without including the source code for Qt in the source distribution.
*/
#include <unistd.h>
#include <stdio.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <kdebug.h>
#include <kmessagebox.h>
#include <kurl.h>
#include <kapplication.h>
#include <dcopclient.h>
#include <kprocess.h>
#include <libkcal/event.h>
#include <libkcal/todo.h>
#include <libkcal/incidenceformatter.h>
#include "version.h"
#include "koprefs.h"
#include "komailclient.h"
KOMailClient::KOMailClient()
{
}
KOMailClient::~KOMailClient()
{
}
bool KOMailClient::mailAttendees(IncidenceBase *incidence,const QString &attachment)
{
Attendee::List attendees = incidence->attendees();
if (attendees.count() == 0) return false;
const QString from = incidence->organizer().fullName();
const QString organizerEmail = incidence->organizer().email();
QStringList toList;
for(uint i=0; i<attendees.count();++i) {
const QString email = (*attendees.at(i))->email();
// In case we (as one of our identities) are the organizer we are sending this
// mail. We could also have added ourselves as an attendee, in which case we
// don't want to send ourselves a notification mail.
if( organizerEmail != email )
toList << email;
}
if( toList.count() == 0 )
// Not really to be called a groupware meeting, eh
return false;
QString to = toList.join( ", " );
QString subject;
if(incidence->type()!="FreeBusy") {
Incidence *inc = static_cast<Incidence *>(incidence);
subject = inc->summary();
} else {
subject = "Free Busy Object";
}
QString body = IncidenceFormatter::mailBodyString(incidence);
bool bcc = KOPrefs::instance()->mBcc;
return send(from,to,subject,body,bcc,attachment);
}
bool KOMailClient::mailOrganizer(IncidenceBase *incidence,const QString &attachment, const QString &sub)
{
QString to = incidence->organizer().fullName();
QString from = KOPrefs::instance()->email();
QString subject = sub;
if(incidence->type()!="FreeBusy") {
Incidence *inc = static_cast<Incidence *>(incidence);
if ( subject.isEmpty() )
subject = inc->summary();
} else {
subject = "Free Busy Message";
}
QString body = IncidenceFormatter::mailBodyString(incidence);
bool bcc = KOPrefs::instance()->mBcc;
return send(from,to,subject,body,bcc,attachment);
}
bool KOMailClient::mailTo(IncidenceBase *incidence,const QString &recipients,
const QString &attachment)
{
QString from = KOPrefs::instance()->email();
QString subject;
if(incidence->type()!="FreeBusy") {
Incidence *inc = static_cast<Incidence *>(incidence);
subject = inc->summary();
} else {
subject = "Free Busy Message";
}
QString body = IncidenceFormatter::mailBodyString(incidence);
bool bcc = KOPrefs::instance()->mBcc;
kdDebug () << "KOMailClient::mailTo " << recipients << endl;
return send(from,recipients,subject,body,bcc,attachment);
}
bool KOMailClient::send(const QString &from,const QString &to,
const QString &subject,const QString &body,bool bcc,
const QString &attachment)
{
kdDebug(5850) << "KOMailClient::sendMail():\nFrom: " << from << "\nTo: " << to
<< "\nSubject: " << subject << "\nBody: \n" << body
<< "\nAttachment:\n" << attachment << endl;
if (KOPrefs::instance()->mMailClient == KOPrefs::MailClientSendmail) {
bool needHeaders = true;
QString command = KStandardDirs::findExe(QString::fromLatin1("sendmail"),
QString::fromLatin1("/sbin:/usr/sbin:/usr/lib"));
if (!command.isNull()) command += QString::fromLatin1(" -oi -t");
else {
command = KStandardDirs::findExe(QString::fromLatin1("mail"));
if (command.isNull()) return false; // give up
command.append(QString::fromLatin1(" -s "));
command.append(KProcess::quote(subject));
if (bcc) {
command.append(QString::fromLatin1(" -b "));
command.append(KProcess::quote(from));
}
command.append(" ");
command.append(KProcess::quote(to));
needHeaders = false;
}
FILE * fd = popen(command.local8Bit(),"w");
if (!fd)
{
kdError() << "Unable to open a pipe to " << command << endl;
return false;
}
QString textComplete;
if (needHeaders)
{
textComplete += QString::fromLatin1("From: ") + from + '\n';
textComplete += QString::fromLatin1("To: ") + to + '\n';
if (bcc) textComplete += QString::fromLatin1("Bcc: ") + from + '\n';
textComplete += QString::fromLatin1("Subject: ") + subject + '\n';
textComplete += QString::fromLatin1("X-Mailer: KOrganizer") + korgVersion + '\n';
}
textComplete += '\n'; // end of headers
textComplete += body;
textComplete += '\n';
textComplete += attachment;
fwrite(textComplete.local8Bit(),textComplete.length(),1,fd);
pclose(fd);
} else {
if (!kapp->dcopClient()->isApplicationRegistered("kmail")) {
if (KApplication::startServiceByDesktopName("kmail")) {
KMessageBox::error(0,i18n("No running instance of KMail found."));
return false;
}
}
if (attachment.isEmpty()) {
if (!kMailOpenComposer(to,"",bcc ? from : "",subject,body,0,KURL())) return false;
} else {
QString meth;
int idx = attachment.find("METHOD");
if (idx>=0) {
idx = attachment.find(':',idx)+1;
const int newline = attachment.find('\n',idx);
meth = attachment.mid(idx, newline - idx - 1);
meth = meth.lower().stripWhiteSpace();
} else {
meth = "publish";
}
if (!kMailOpenComposer(to,"",bcc ? from : "",subject,body,0,"cal.ics","7bit",
attachment.utf8(),"text","calendar","method",meth,
"attachment","utf-8")) return false;
}
}
return true;
}
int KOMailClient::kMailOpenComposer(const QString& arg0,const QString& arg1,
const QString& arg2,const QString& arg3,const QString& arg4,int arg5,
const KURL& arg6)
{
//kdDebug(5850) << "KOMailClient::kMailOpenComposer( "
// << arg0 << " , " << arg1 << arg2 << " , " << arg3
// << arg4 << " , " << arg5 << " , " << arg6 << " )" << endl;
int result = 0;
QByteArray data, replyData;
QCString replyType;
QDataStream arg( data, IO_WriteOnly );
arg << arg0;
arg << arg1;
arg << arg2;
arg << arg3;
arg << arg4;
arg << arg5;
arg << arg6;
#if KDE_IS_VERSION( 3, 2, 90 )
kapp->updateRemoteUserTimestamp( "kmail" );
#endif
if (kapp->dcopClient()->call("kmail","KMailIface","openComposer(QString,QString,QString,QString,QString,int,KURL)", data, replyType, replyData ) ) {
if ( replyType == "int" ) {
QDataStream _reply_stream( replyData, IO_ReadOnly );
_reply_stream >> result;
} else {
kdDebug(5850) << "kMailOpenComposer() call failed." << endl;
}
} else {
kdDebug(5850) << "kMailOpenComposer() call failed." << endl;
}
return result;
}
int KOMailClient::kMailOpenComposer( const QString& arg0, const QString& arg1,
const QString& arg2, const QString& arg3,
const QString& arg4, int arg5, const QString& arg6,
const QCString& arg7, const QCString& arg8,
const QCString& arg9, const QCString& arg10,
const QCString& arg11, const QString& arg12,
const QCString& arg13, const QCString& arg14 )
{
//kdDebug(5850) << "KOMailClient::kMailOpenComposer( "
// << arg0 << " , " << arg1 << arg2 << " , " << arg3
// << arg4 << " , " << arg5 << " , " << arg6
// << arg7 << " , " << arg8 << " , " << arg9
// << arg10<< " , " << arg11<< " , " << arg12
// << arg13<< " , " << arg14<< " )" << endl;
int result = 0;
QByteArray data, replyData;
QCString replyType;
QDataStream arg( data, IO_WriteOnly );
arg << arg0;
arg << arg1;
arg << arg2;
arg << arg3;
arg << arg4;
arg << arg5;
arg << arg6;
arg << arg7;
arg << arg8;
arg << arg9;
arg << arg10;
arg << arg11;
arg << arg12;
arg << arg13;
arg << arg14;
#if KDE_IS_VERSION( 3, 2, 90 )
kapp->updateRemoteUserTimestamp("kmail");
#endif
if ( kapp->dcopClient()->call("kmail","KMailIface",
"openComposer(QString,QString,QString,QString,QString,int,QString,QCString,QCString,QCString,QCString,QCString,QString,QCString,QCString)", data, replyType, replyData ) ) {
if ( replyType == "int" ) {
QDataStream _reply_stream( replyData, IO_ReadOnly );
_reply_stream >> result;
} else {
kdDebug(5850) << "kMailOpenComposer() call failed." << endl;
}
} else {
kdDebug(5850) << "kMailOpenComposer() call failed." << endl;
}
return result;
}