diff --git a/SConstruct b/SConstruct index 40bcdb2b..811bd828 100644 --- a/SConstruct +++ b/SConstruct @@ -194,7 +194,7 @@ libvmime_messaging_sources = [ 'messaging/socket.hpp', 'messaging/store.hpp', 'messaging/timeoutHandler.hpp', - 'messaging/transport.hpp' + 'messaging/transport.cpp', 'messaging/transport.hpp' ] libvmime_messaging_proto_sources = [ diff --git a/src/messaging/smtp/SMTPTransport.cpp b/src/messaging/smtp/SMTPTransport.cpp index 6e7ab240..58e000ac 100644 --- a/src/messaging/smtp/SMTPTransport.cpp +++ b/src/messaging/smtp/SMTPTransport.cpp @@ -22,7 +22,6 @@ #include "vmime/exception.hpp" #include "vmime/platformDependant.hpp" #include "vmime/encoderB64.hpp" -#include "vmime/message.hpp" #include "vmime/mailboxList.hpp" #include "vmime/messaging/authHelper.hpp" @@ -258,77 +257,6 @@ void SMTPTransport::noop() } -static void extractMailboxes - (mailboxList& recipients, const addressList& list) -{ - for (int i = 0 ; i < list.getAddressCount() ; ++i) - { - mailbox* mbox = dynamic_cast (list.getAddressAt(i)->clone()); - - if (mbox != NULL) - recipients.appendMailbox(mbox); - } -} - - -void SMTPTransport::send(vmime::message* msg, progressionListener* progress) -{ - // Extract expeditor - mailbox expeditor; - - try - { - const mailboxField& from = dynamic_cast - (*msg->getHeader()->findField(fields::FROM)); - expeditor = from.getValue(); - } - catch (exceptions::no_such_field&) - { - throw exceptions::no_expeditor(); - } - - // Extract recipients - mailboxList recipients; - - try - { - const addressListField& to = dynamic_cast - (*msg->getHeader()->findField(fields::TO)); - extractMailboxes(recipients, to.getValue()); - } - catch (exceptions::no_such_field&) { } - - try - { - const addressListField& cc = dynamic_cast - (*msg->getHeader()->findField(fields::CC)); - extractMailboxes(recipients, cc.getValue()); - } - catch (exceptions::no_such_field&) { } - - try - { - const addressListField& bcc = dynamic_cast - (*msg->getHeader()->findField(fields::BCC)); - extractMailboxes(recipients, bcc.getValue()); - } - catch (exceptions::no_such_field&) { } - - // Generate the message, "stream" it and delegate the sending - // to the generic send() function. - std::ostringstream oss; - utility::outputStreamAdapter ossAdapter(oss); - - msg->generate(ossAdapter); - - const string& str(oss.str()); - - utility::inputStreamStringAdapter isAdapter(str); - - send(expeditor, recipients, isAdapter, str.length(), progress); -} - - void SMTPTransport::send(const mailbox& expeditor, const mailboxList& recipients, utility::inputStream& is, const utility::stream::size_type size, progressionListener* progress) diff --git a/src/messaging/transport.cpp b/src/messaging/transport.cpp new file mode 100644 index 00000000..1caa7fae --- /dev/null +++ b/src/messaging/transport.cpp @@ -0,0 +1,116 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002-2005 Vincent Richard +// +// 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include "vmime/messaging/transport.hpp" + +#include "vmime/utility/stream.hpp" +#include "vmime/mailboxList.hpp" +#include "vmime/message.hpp" + + +namespace vmime { +namespace messaging { + + +transport::transport(session* sess, const serviceInfos& infos, authenticator* auth) + : service(sess, infos, auth) +{ +} + + +static void extractMailboxes + (mailboxList& recipients, const addressList& list) +{ + for (int i = 0 ; i < list.getAddressCount() ; ++i) + { + mailbox* mbox = dynamic_cast (list.getAddressAt(i)->clone()); + + if (mbox != NULL) + recipients.appendMailbox(mbox); + } +} + + +void transport::send(vmime::message* msg, progressionListener* progress) +{ + // Extract expeditor + mailbox expeditor; + + try + { + const mailboxField& from = dynamic_cast + (*msg->getHeader()->findField(fields::FROM)); + expeditor = from.getValue(); + } + catch (exceptions::no_such_field&) + { + throw exceptions::no_expeditor(); + } + + // Extract recipients + mailboxList recipients; + + try + { + const addressListField& to = dynamic_cast + (*msg->getHeader()->findField(fields::TO)); + extractMailboxes(recipients, to.getValue()); + } + catch (exceptions::no_such_field&) { } + + try + { + const addressListField& cc = dynamic_cast + (*msg->getHeader()->findField(fields::CC)); + extractMailboxes(recipients, cc.getValue()); + } + catch (exceptions::no_such_field&) { } + + try + { + const addressListField& bcc = dynamic_cast + (*msg->getHeader()->findField(fields::BCC)); + extractMailboxes(recipients, bcc.getValue()); + } + catch (exceptions::no_such_field&) { } + + // Generate the message, "stream" it and delegate the sending + // to the generic send() function. + std::ostringstream oss; + utility::outputStreamAdapter ossAdapter(oss); + + msg->generate(ossAdapter); + + const string& str(oss.str()); + + utility::inputStreamStringAdapter isAdapter(str); + + send(expeditor, recipients, isAdapter, str.length(), progress); +} + + +const transport::Type transport::getType() const +{ + return (TYPE_TRANSPORT); +} + + +} // messaging +} // vmime + diff --git a/vmime/messaging/transport.hpp b/vmime/messaging/transport.hpp index 7b48883e..8ffe8ad2 100644 --- a/vmime/messaging/transport.hpp +++ b/vmime/messaging/transport.hpp @@ -42,8 +42,7 @@ class transport : public service { protected: - transport(session* sess, const serviceInfos& infos, authenticator* auth) - : service(sess, infos, auth) { } + transport(session* sess, const serviceInfos& infos, authenticator* auth); public: @@ -52,7 +51,7 @@ public: * @param msg message to send * @param progress progression listener, or NULL if not used */ - virtual void send(vmime::message* msg, progressionListener* progress = NULL) = 0; + virtual void send(vmime::message* msg, progressionListener* progress = NULL); /** Send a message over this transport service. * @@ -65,7 +64,7 @@ public: virtual void send(const mailbox& expeditor, const mailboxList& recipients, utility::inputStream& is, const utility::stream::size_type size, progressionListener* progress = NULL) = 0; - const Type getType() const { return (TYPE_TRANSPORT); } + const Type getType() const; };