diff options
Diffstat (limited to 'libkdepim/maillistdrag.cpp')
-rw-r--r-- | libkdepim/maillistdrag.cpp | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/libkdepim/maillistdrag.cpp b/libkdepim/maillistdrag.cpp new file mode 100644 index 000000000..2fb28328a --- /dev/null +++ b/libkdepim/maillistdrag.cpp @@ -0,0 +1,259 @@ +/* + This file is part of libkdepim. + + Copyright (c) 2003 Don Sanders <sanders@kde.org> + Copyright (c) 2005 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "maillistdrag.h" +#include <qbuffer.h> +#include <qdatastream.h> +#include <qeventloop.h> +#include <kapplication.h> +#include <klocale.h> +#include <kprogress.h> + +using namespace KPIM; + +MailSummary::MailSummary( Q_UINT32 serialNumber, QString messageId, + QString subject, QString from, QString to, + time_t date ) + : mSerialNumber( serialNumber ), mMessageId( messageId ), + mSubject( subject ), mFrom( from ), mTo( to ), mDate( date ) +{} + +Q_UINT32 MailSummary::serialNumber() const +{ + return mSerialNumber; +} + +QString MailSummary::messageId() +{ + return mMessageId; +} + +QString MailSummary::subject() +{ + return mSubject; +} + +QString MailSummary::from() +{ + return mFrom; +} + +QString MailSummary::to() +{ + return mTo; +} + +time_t MailSummary::date() +{ + return mDate; +} + +void MailSummary::set( Q_UINT32 serialNumber, QString messageId, + QString subject, QString from, QString to, time_t date ) +{ + mSerialNumber = serialNumber; + mMessageId = messageId; + mSubject = subject; + mFrom = from; + mTo = to; + mDate = date; +} + +MailListDrag::MailListDrag( MailList mailList, QWidget * parent, MailTextSource *src ) + : QStoredDrag( MailListDrag::format(), parent ), _src(src) +{ + setMailList( mailList ); +} + +MailListDrag::~MailListDrag() +{ + delete _src; + _src = 0; +} + +const char* MailListDrag::format() +{ + return "x-kmail-drag/message-list"; +} + +bool MailListDrag::canDecode( QMimeSource *e ) +{ + return e->provides( MailListDrag::format() ); +} + +// Have to define before use +QDataStream& operator<< ( QDataStream &s, MailSummary &d ) +{ + s << d.serialNumber(); + s << d.messageId(); + s << d.subject(); + s << d.from(); + s << d.to(); + s << d.date(); + return s; +} + +QDataStream& operator>> ( QDataStream &s, MailSummary &d ) +{ + Q_UINT32 serialNumber; + QString messageId, subject, from, to; + time_t date; + s >> serialNumber; + s >> messageId; + s >> subject; + s >> from; + s >> to; + s >> date; + d.set( serialNumber, messageId, subject, from, to, date ); + return s; +} + +QDataStream& operator<< ( QDataStream &s, MailList &mailList ) +{ + MailList::iterator it; + for (it = mailList.begin(); it != mailList.end(); ++it) { + MailSummary mailDrag = *it; + s << mailDrag; + } + return s; +} + +QDataStream& operator>> ( QDataStream &s, MailList &mailList ) +{ + mailList.clear(); + MailSummary mailDrag; + while (!s.atEnd()) { + s >> mailDrag; + mailList.append( mailDrag ); + } + return s; +} + +bool MailListDrag::decode( QDropEvent* e, MailList& mailList ) +{ + QByteArray payload = e->encodedData( MailListDrag::format() ); + QDataStream buffer( payload, IO_ReadOnly ); + if ( payload.size() ) { + e->accept(); + buffer >> mailList; + return TRUE; + } + return FALSE; +} + +bool MailListDrag::decode( QByteArray& payload, MailList& mailList ) +{ + QDataStream stream( payload, IO_ReadOnly ); + if ( payload.size() ) { + stream >> mailList; + return TRUE; + } + return FALSE; +} + +bool MailListDrag::decode( QDropEvent* e, QByteArray &a ) +{ + MailList mailList; + if (decode( e, mailList )) { + MailList::iterator it; + QBuffer buffer( a ); + buffer.open( IO_WriteOnly ); + QDataStream stream( &buffer ); + for (it = mailList.begin(); it != mailList.end(); ++it) { + MailSummary mailDrag = *it; + stream << mailDrag.serialNumber(); + } + buffer.close(); + return TRUE; + } + return FALSE; +} + +void MailListDrag::setMailList( MailList mailList ) +{ + QByteArray array; + QBuffer buffer( array ); + buffer.open( IO_WriteOnly); + QDataStream stream( array, IO_WriteOnly ); + stream << mailList; + buffer.close(); + setEncodedData( array ); +} + +const char *MailListDrag::format(int i) const +{ + if (_src) { + if (i == 0) { + return "message/rfc822"; + } else { + return QStoredDrag::format(i - 1); + } + } + + return QStoredDrag::format(i); +} + +bool MailListDrag::provides(const char *mimeType) const +{ + if (_src && QCString(mimeType) == "message/rfc822") { + return true; + } + + return QStoredDrag::provides(mimeType); +} + +QByteArray MailListDrag::encodedData(const char *mimeType) const +{ + if (QCString(mimeType) != "message/rfc822") { + return QStoredDrag::encodedData(mimeType); + } + + QByteArray rc; + if (_src) { + MailList ml; + QByteArray enc = QStoredDrag::encodedData(format()); + decode(enc, ml); + + KProgressDialog *dlg = new KProgressDialog(0, 0, QString::null, i18n("Retrieving and storing messages..."), true); + dlg->setAllowCancel(true); + dlg->progressBar()->setTotalSteps(ml.count()); + int i = 0; + dlg->progressBar()->setValue(i); + dlg->show(); + + QTextStream *ts = new QTextStream(rc, IO_WriteOnly); + for (MailList::ConstIterator it = ml.begin(); it != ml.end(); ++it) { + MailSummary mailDrag = *it; + *ts << _src->text(mailDrag.serialNumber()); + if (dlg->wasCancelled()) { + break; + } + dlg->progressBar()->setValue(++i); + kapp->eventLoop()->processEvents(QEventLoop::ExcludeSocketNotifiers); + } + + delete dlg; + delete ts; + } + return rc; +} + |