diff --git a/mobile/lib/kdeclarativeapplication.cpp b/mobile/lib/kdeclarativeapplication.cpp index eb8bbca..5e24edd 100644 --- a/mobile/lib/kdeclarativeapplication.cpp +++ b/mobile/lib/kdeclarativeapplication.cpp @@ -32,7 +32,7 @@ int staticInitKConfigGroupGui(); #endif static inline bool runPreApplicationSetup( const KCmdLineOptions & opts ) { - Q_UNUSED( opts ); + #ifdef _WIN32_WCE QThread::currentThread()->setPriority(QThread::HighPriority); #endif @@ -40,7 +40,7 @@ static inline bool runPreApplicationSetup( const KCmdLineOptions & opts ) { //This is needed to get KConfig working with QColor staticInitKConfigGroupGui(); #endif - KDeclarativeApplicationBase::preApplicationSetup(); + KDeclarativeApplicationBase::preApplicationSetup(opts); return true; // <-- default value of KApplication(bool) ctor } diff --git a/mobile/lib/kdeclarativeapplication.h b/mobile/lib/kdeclarativeapplication.h index 217dd4e..edeaffa 100644 --- a/mobile/lib/kdeclarativeapplication.h +++ b/mobile/lib/kdeclarativeapplication.h @@ -86,7 +86,7 @@ class KDeclarativeApplication : public KDeclarativeApplicationBase return 0; } - private: + protected: T* m_mainView; }; diff --git a/mobile/mail/kmailmobileoptions.h b/mobile/mail/kmailmobileoptions.h new file mode 100644 index 0000000..2e1db92 --- /dev/null +++ b/mobile/mail/kmailmobileoptions.h @@ -0,0 +1,38 @@ +/* +* Copyright 2011 Lamarque Souza +* +* 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.1 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 +*/ + +#ifndef KMAIL_MOBILE_OPTIONS_H +#define KMAIL_MOBILE_OPTIONS_H + +#include +#include + +static KCmdLineOptions kmailMobileOptions() +{ + KCmdLineOptions options; + options.add("t
", ki18n("Send message to 'address'")); + options.add("s ", ki18n("Set subject of message")); + options.add("c
", ki18n("Send CC: to 'address'")); + options.add("b
", ki18n("Send BCC: to 'address'")); + options.add("B ", ki18n("Set body of message")); + options.add("A ", ki18n("Add an attachment to the mail. This can be repeated")); + return options; +} + +#endif diff --git a/mobile/mail/main.cpp b/mobile/mail/main.cpp index df80253..9cb9707 100644 --- a/mobile/mail/main.cpp +++ b/mobile/mail/main.cpp @@ -20,9 +20,9 @@ */ #include "mainview.h" +#include "kmailmobileoptions.h" #include -#include #include #ifdef Q_OS_WINCE @@ -45,6 +45,31 @@ Q_IMPORT_PLUGIN(akonadi_serializer_kcalcore) extern bool ___MailTransport____INIT(); #endif +class KMailMobileApplication : public KDeclarativeApplication +{ +public: + KMailMobileApplication(); + explicit KMailMobileApplication( const KCmdLineOptions &applicationOptions ); + virtual int newInstance(); +}; + +KMailMobileApplication::KMailMobileApplication(): KDeclarativeApplication() +{ +}; + +KMailMobileApplication::KMailMobileApplication( const KCmdLineOptions &applicationOptions ): KDeclarativeApplication( applicationOptions ) +{ +}; + +int KMailMobileApplication::KMailMobileApplication::newInstance() +{ + KDeclarativeApplication::newInstance(); + if ( m_mainView ) { + m_mainView->handleCommandLine(); + } + return 0; +} + int main( int argc, char **argv ) { kWarning() << "Starting main function" << QDateTime::currentDateTime(); @@ -62,7 +87,11 @@ int main( int argc, char **argv ) aboutData.setProductName( "KMail Mobile" ); //has to match the bugzilla product name KCmdLineArgs::init( argc, argv, &aboutData ); - KDeclarativeApplication app; + KMailMobileApplication app( kmailMobileOptions() ); + + if ( !KMailMobileApplication::start() ) { + return 0; + } KGlobal::locale()->insertCatalog( "libakonadi-kmime" ); KGlobal::locale()->insertCatalog( "libmessagecore" ); diff --git a/mobile/mail/mainview.cpp b/mobile/mail/mainview.cpp index b3ddfdf..427937e 100644 --- a/mobile/mail/mainview.cpp +++ b/mobile/mail/mainview.cpp @@ -86,11 +86,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -180,6 +182,28 @@ MainView::~MainView() } } +void MainView::handleCommandLine() +{ + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + + if ( args->isSet("A") ) { + QMetaObject::invokeMethod( this, "openComposerAndAttach", Qt::QueuedConnection, + Q_ARG(QString, args->getOption("t")), + Q_ARG(QString, args->getOption("c")), + Q_ARG(QString, args->getOption("b")), + Q_ARG(QString, args->getOption("s")), + Q_ARG(QString, args->getOption("B")), + Q_ARG(QStringList, QStringList() << args->getOptionList("A")) ); + } else if ( args->isSet("t") ) { + QMetaObject::invokeMethod( this, "openComposer", Qt::QueuedConnection, + Q_ARG(QString, args->getOption("t")), + Q_ARG(QString, args->getOption("c")), + Q_ARG(QString, args->getOption("b")), + Q_ARG(QString, args->getOption("s")), + Q_ARG(QString, args->getOption("B")) ); + } +} + void MainView::setConfigWidget( ConfigWidget *configWidget ) { Q_ASSERT( configWidget ); @@ -215,6 +239,86 @@ int MainView::openComposer( const QString &to, const QString &cc, const QString return 0; } +int MainView::openComposerAndAttach( const QString &to, const QString &cc, const QString &bcc, + const QString &subject, const QString &body, + const QStringList &attachments ) +{ + if (attachments.isEmpty()) { + return openComposer( to, cc, bcc, subject, body ); + } + + // Set the multipart message. + KMime::Message::Ptr message = KMime::Message::Ptr( new KMime::Message ); + KMime::Headers::ContentType *ct = message->contentType(); + ct->setMimeType( "multipart/mixed" ); + ct->setBoundary( KMime::multiPartBoundary() ); + ct->setCategory( KMime::Headers::CCcontainer ); + message->contentTransferEncoding()->clear(); + + // Set the headers. + message->to()->fromUnicodeString( to, "utf-8" ); + message->cc()->fromUnicodeString( cc, "utf-8" ); + message->bcc()->fromUnicodeString( bcc, "utf-8" ); + message->date()->setDateTime( KDateTime::currentLocalDateTime() ); + message->subject()->fromUnicodeString( subject, "utf-8" ); + + // Set the first multipart, the body message. + KMime::Content *bodyMessage = new KMime::Content; + bodyMessage->contentType()->setMimeType( "text/plain" ); + bodyMessage->setBody( body.toUtf8() + "\n\n" ); + message->addContent( bodyMessage ); + + KUrl::List attachURLs = KUrl::List( attachments ); + for ( KUrl::List::ConstIterator it = attachURLs.constBegin(); it != attachURLs.constEnd(); ++it ) { + message->addContent( createAttachment( (*it) ) ); + } + + message->assemble(); + + ComposerView *composer = new ComposerView; + composer->setMessage( message ); + composer->show(); + composer->setIdentity( currentFolderIdentity() ); + + return 0; +} + +KMime::Content *MainView::createAttachment( const KUrl &url ) const +{ + KMimeType::Ptr mimeType = KMimeType::findByUrl(url, 0, true); + QString fileName = url.toLocalFile(); + QFile file(fileName); + + if ( !file.open(QIODevice::ReadOnly) ) { + kDebug() << "Error opening attachment file" << fileName; + return 0; + } + + // TODO: abort in case of huge file. + qint64 size = file.size(); + QByteArray contents = file.readAll(); + file.close(); + + if ( contents.size() < size ) { + kDebug() << "Short read while attaching file" << fileName; + } + + QByteArray coded = KCodecs::base64Encode( contents, true ); + KMime::Headers::ContentDisposition *d = new KMime::Headers::ContentDisposition; + d->setDisposition( KMime::Headers::CDattachment ); + d->setFilename( fileName.section('/', -1) ); + d->setDisposition( KMime::Headers::CDattachment ); + + KMime::Content *a = new KMime::Content(); + a->contentType()->fromUnicodeString( mimeType->name(), "utf-8" ); + a->setHeader( d ); + a->contentTransferEncoding()->setEncoding( KMime::Headers::CEbase64 ); + a->contentTransferEncoding()->setDecoded( false ); + a->setBody( coded + "\n\n" ); + + return a; +} + #define VIEW(model) { \ QTreeView *view = new QTreeView( this ); \ view->setWindowFlags( Qt::Window ); \ diff --git a/mobile/mail/mainview.h b/mobile/mail/mainview.h index f137944..8c22527 100644 --- a/mobile/mail/mainview.h +++ b/mobile/mail/mainview.h @@ -70,6 +70,15 @@ class MainView : public KDeclarativeMainView " \n" " \n" " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" " \n" "") @@ -80,6 +89,8 @@ class MainView : public KDeclarativeMainView ~MainView(); + void handleCommandLine(); + enum ForwardMode { InLine = 0, AsAttachment, @@ -120,6 +131,13 @@ class MainView : public KDeclarativeMainView const QString & bcc, const QString & subject, const QString & body ); + + Q_SCRIPTABLE int openComposerAndAttach( const QString & to, + const QString & cc, + const QString & bcc, + const QString & subject, + const QString & body, + const QStringList & attachments ); void mailActionStateUpdated(); Q_SIGNALS: @@ -202,6 +220,7 @@ class MainView : public KDeclarativeMainView MessageViewer::MessageViewItem *messageViewerItem(); uint currentFolderIdentity() const; QString itemStorageCollectionAsPath( const Akonadi::Item& ) const; + KMime::Content *createAttachment( const KUrl &url ) const; bool mAskingToGoOnline; QWidget *mTransportDialog;