summaryrefslogtreecommitdiff
path: root/sw/source/uibase/dbui/mailmergechildwindow.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/uibase/dbui/mailmergechildwindow.cxx')
-rw-r--r--sw/source/uibase/dbui/mailmergechildwindow.cxx666
1 files changed, 666 insertions, 0 deletions
diff --git a/sw/source/uibase/dbui/mailmergechildwindow.cxx b/sw/source/uibase/dbui/mailmergechildwindow.cxx
new file mode 100644
index 000000000000..b92593a4c1d6
--- /dev/null
+++ b/sw/source/uibase/dbui/mailmergechildwindow.cxx
@@ -0,0 +1,666 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+
+#include <cmdid.h>
+#include <swmodule.hxx>
+#include <view.hxx>
+#include <edtwin.hxx>
+#include <vcl/layout.hxx>
+#include <vcl/svapp.hxx>
+#include <mailmergechildwindow.hxx>
+#include <../../ui/dbui/mmoutputpage.hxx>
+#include <mmconfigitem.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/string.hxx>
+#include <com/sun/star/mail/XSmtpService.hpp>
+#include <com/sun/star/mail/MailServiceType.hpp>
+#include <rtl/ref.hxx>
+#include <maildispatcher.hxx>
+#include <imaildsplistener.hxx>
+#include <swunohelper.hxx>
+#include <svtools/svmedit.hxx>
+#include <vcl/msgbox.hxx>
+#include <vcl/image.hxx>
+#include <mailmergechildwindow.hrc>
+#include <dbui.hrc>
+#include <helpid.h>
+
+using namespace ::com::sun::star;
+
+SFX_IMPL_FLOATINGWINDOW( SwMailMergeChildWindow, FN_MAILMERGE_CHILDWINDOW )
+
+SwMailMergeChildWindow::SwMailMergeChildWindow( Window* _pParent,
+ sal_uInt16 nId,
+ SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo ) :
+ SfxChildWindow( _pParent, nId )
+{
+ pWindow = new SwMailMergeChildWin( pBindings, this, _pParent);
+
+ if (!pInfo->aSize.Width() || !pInfo->aSize.Height())
+ {
+ SwView* pActiveView = ::GetActiveView();
+ if(pActiveView)
+ {
+ const SwEditWin &rEditWin = pActiveView->GetEditWin();
+ pWindow->SetPosPixel(rEditWin.OutputToScreenPixel(Point(0, 0)));
+ }
+ else
+ pWindow->SetPosPixel(_pParent->OutputToScreenPixel(Point(0, 0)));
+ pInfo->aPos = pWindow->GetPosPixel();
+ pInfo->aSize = pWindow->GetSizePixel();
+ }
+
+ ((SwMailMergeChildWin *)pWindow)->Initialize(pInfo);
+ pWindow->Show();
+}
+
+SwMailMergeChildWin::SwMailMergeChildWin( SfxBindings* _pBindings,
+ SfxChildWindow* pChild,
+ Window *pParent) :
+ SfxFloatingWindow(_pBindings, pChild, pParent, SW_RES(DLG_MAILMERGECHILD)),
+ m_aBackTB(this, SW_RES( TB_BACK ))
+{
+ m_aBackTB.SetSelectHdl(LINK(this, SwMailMergeChildWin, BackHdl));
+ sal_uInt16 nIResId = ILIST_TBX;
+ ResId aResId( nIResId, *pSwResMgr );
+ ImageList aIList(aResId);
+ FreeResource();
+
+ m_aBackTB.SetItemImage( 1, aIList.GetImage(FN_SHOW_ROOT) );
+ m_aBackTB.SetButtonType( BUTTON_SYMBOLTEXT );
+ Size aSz = m_aBackTB.CalcWindowSizePixel(1);
+ m_aBackTB.SetPosSizePixel( Point(), aSz );
+ SetOutputSizePixel(aSz);
+ m_aBackTB.Show();
+}
+
+SwMailMergeChildWin::~SwMailMergeChildWin()
+{
+}
+
+IMPL_LINK_NOARG(SwMailMergeChildWin, BackHdl)
+{
+ GetBindings().GetDispatcher()->Execute(FN_MAILMERGE_WIZARD, SFX_CALLMODE_ASYNCHRON);
+ return 0;
+}
+
+void SwMailMergeChildWin::FillInfo(SfxChildWinInfo& rInfo) const
+{
+ SfxFloatingWindow::FillInfo(rInfo);
+ rInfo.aWinState = OString();
+ rInfo.bVisible = false;
+}
+
+struct SwSendMailDialog_Impl
+{
+ friend class SwSendMailDialog;
+ ::osl::Mutex aDescriptorMutex;
+
+ ::std::vector< SwMailDescriptor > aDescriptors;
+ sal_uInt32 nCurrentDescriptor;
+ sal_uInt32 nDocumentCount;
+ ::rtl::Reference< MailDispatcher > xMailDispatcher;
+ ::rtl::Reference< IMailDispatcherListener> xMailListener;
+ uno::Reference< mail::XMailService > xConnectedMailService;
+ uno::Reference< mail::XMailService > xConnectedInMailService;
+ Timer aRemoveTimer;
+
+ SwSendMailDialog_Impl() :
+ nCurrentDescriptor(0),
+ nDocumentCount(0)
+ {
+ aRemoveTimer.SetTimeout(500);
+ }
+
+ ~SwSendMailDialog_Impl()
+ {
+ // Shutdown must be called when the last reference to the
+ // mail dispatcher will be released in order to force a
+ // shutdown of the mail dispatcher thread.
+ // 'join' with the mail dispatcher thread leads to a
+ // deadlock (SolarMutex).
+ if( xMailDispatcher.is() && !xMailDispatcher->isShutdownRequested() )
+ xMailDispatcher->shutdown();
+ }
+ const SwMailDescriptor* GetNextDescriptor();
+};
+
+const SwMailDescriptor* SwSendMailDialog_Impl::GetNextDescriptor()
+{
+ ::osl::MutexGuard aGuard(aDescriptorMutex);
+ if(nCurrentDescriptor < aDescriptors.size())
+ {
+ ++nCurrentDescriptor;
+ return &aDescriptors[nCurrentDescriptor - 1];
+ }
+ return 0;
+}
+
+class SwMailDispatcherListener_Impl : public IMailDispatcherListener
+{
+ SwSendMailDialog* m_pSendMailDialog;
+
+public:
+ SwMailDispatcherListener_Impl(SwSendMailDialog& rParentDlg);
+ virtual ~SwMailDispatcherListener_Impl();
+
+ virtual void started(::rtl::Reference<MailDispatcher> xMailDispatcher) SAL_OVERRIDE;
+ virtual void stopped(::rtl::Reference<MailDispatcher> xMailDispatcher) SAL_OVERRIDE;
+ virtual void idle(::rtl::Reference<MailDispatcher> xMailDispatcher) SAL_OVERRIDE;
+ virtual void mailDelivered(::rtl::Reference<MailDispatcher> xMailDispatcher,
+ uno::Reference< mail::XMailMessage> xMailMessage) SAL_OVERRIDE;
+ virtual void mailDeliveryError(::rtl::Reference<MailDispatcher> xMailDispatcher,
+ uno::Reference< mail::XMailMessage> xMailMessage, const OUString& sErrorMessage) SAL_OVERRIDE;
+
+ static void DeleteAttachments( uno::Reference< mail::XMailMessage >& xMessage );
+};
+
+SwMailDispatcherListener_Impl::SwMailDispatcherListener_Impl(SwSendMailDialog& rParentDlg) :
+ m_pSendMailDialog(&rParentDlg)
+{
+}
+
+SwMailDispatcherListener_Impl::~SwMailDispatcherListener_Impl()
+{
+}
+
+void SwMailDispatcherListener_Impl::started(::rtl::Reference<MailDispatcher> /*xMailDispatcher*/)
+{
+}
+
+void SwMailDispatcherListener_Impl::stopped(
+ ::rtl::Reference<MailDispatcher> /*xMailDispatcher*/)
+{
+}
+
+void SwMailDispatcherListener_Impl::idle(::rtl::Reference<MailDispatcher> /*xMailDispatcher*/)
+{
+ SolarMutexGuard aGuard;
+ m_pSendMailDialog->AllMailsSent();
+}
+
+void SwMailDispatcherListener_Impl::mailDelivered(
+ ::rtl::Reference<MailDispatcher> /*xMailDispatcher*/,
+ uno::Reference< mail::XMailMessage> xMailMessage)
+{
+ SolarMutexGuard aGuard;
+ m_pSendMailDialog->DocumentSent( xMailMessage, true, 0 );
+ DeleteAttachments( xMailMessage );
+}
+
+void SwMailDispatcherListener_Impl::mailDeliveryError(
+ ::rtl::Reference<MailDispatcher> /*xMailDispatcher*/,
+ uno::Reference< mail::XMailMessage> xMailMessage,
+ const OUString& sErrorMessage)
+{
+ SolarMutexGuard aGuard;
+ m_pSendMailDialog->DocumentSent( xMailMessage, false, &sErrorMessage );
+ DeleteAttachments( xMailMessage );
+}
+
+void SwMailDispatcherListener_Impl::DeleteAttachments( uno::Reference< mail::XMailMessage >& xMessage )
+{
+ uno::Sequence< mail::MailAttachment > aAttachments = xMessage->getAttachments();
+
+ for(sal_Int32 nFile = 0; nFile < aAttachments.getLength(); ++nFile)
+ {
+ try
+ {
+ uno::Reference< beans::XPropertySet > xTransferableProperties( aAttachments[nFile].Data, uno::UNO_QUERY_THROW);
+ if( xTransferableProperties.is() )
+ {
+ OUString sURL;
+ xTransferableProperties->getPropertyValue("URL") >>= sURL;
+ if(!sURL.isEmpty())
+ SWUnoHelper::UCB_DeleteFile( sURL );
+ }
+ }
+ catch (const uno::Exception&)
+ {
+ }
+ }
+}
+
+class SwSendWarningBox_Impl : public MessageDialog
+{
+ VclMultiLineEdit *m_pDetailED;
+public:
+ SwSendWarningBox_Impl(Window* pParent, const OUString& rDetails);
+};
+
+SwSendWarningBox_Impl::SwSendWarningBox_Impl(Window* pParent, const OUString& rDetails)
+ : MessageDialog(pParent, "WarnEmailDialog", "modules/swriter/ui/warnemaildialog.ui")
+{
+ get(m_pDetailED, "errors");
+ m_pDetailED->SetMaxTextWidth(80 * m_pDetailED->approximate_char_width());
+ m_pDetailED->set_width_request(80 * m_pDetailED->approximate_char_width());
+ m_pDetailED->set_height_request(8 * m_pDetailED->GetTextHeight());
+ m_pDetailED->SetText(rDetails);
+}
+
+#define ITEMID_TASK 1
+#define ITEMID_STATUS 2
+
+SwSendMailDialog::SwSendMailDialog(Window *pParent, SwMailMergeConfigItem& rConfigItem) :
+ ModelessDialog /*SfxModalDialog*/(pParent, SW_RES(DLG_MM_SENDMAILS)),
+ m_aStatusFL( this, SW_RES( FL_STATUS )),
+ m_aStatusFT( this, SW_RES( FT_STATUS1 )),
+ m_aTransferStatusFL( this, SW_RES( FL_TRANSFERSTATUS )),
+ m_aTransferStatusFT( this, SW_RES( FT_TRANSFERSTATUS )),
+ m_PausedFI(this, SW_RES( FI_PAUSED )),
+ m_aProgressBar( this, SW_RES( PB_PROGRESS )),
+ m_aErrorStatusFT( this, SW_RES( FT_ERRORSTATUS )),
+ m_aDetailsPB( this, SW_RES( PB_DETAILS )),
+ m_aStatusHB( this, WB_BUTTONSTYLE | WB_BOTTOMBORDER ),
+ m_aStatusLB( this, SW_RES( LB_STATUS )),
+ m_aSeparatorFL( this, SW_RES( FL_SEPARATOR )),
+ m_aStopPB( this, SW_RES( PB_STOP )),
+ m_aClosePB( this, SW_RES( PB_CLOSE )),
+ m_sMore(m_aDetailsPB.GetText()),
+ m_sLess(SW_RES(ST_LESS)),
+ m_sContinue(SW_RES( ST_CONTINUE )),
+ m_sStop(m_aStopPB.GetText()),
+ m_sSend(SW_RES(ST_SEND)),
+ m_sTransferStatus(m_aTransferStatusFT.GetText()),
+ m_sErrorStatus( m_aErrorStatusFT.GetText()),
+ m_sSendingTo( SW_RES(ST_SENDINGTO )),
+ m_sCompleted( SW_RES(ST_COMPLETED )),
+ m_sFailed( SW_RES(ST_FAILED )),
+ m_sTerminateQuery( SW_RES( ST_TERMINATEQUERY )),
+ m_bCancel(false),
+ m_bDesctructionEnabled(false),
+ m_aImageList( SW_RES( ILIST ) ),
+ m_pImpl(new SwSendMailDialog_Impl),
+ m_pConfigItem(&rConfigItem),
+ m_nSendCount(0),
+ m_nErrorCount(0)
+{
+ m_nStatusHeight = m_aSeparatorFL.GetPosPixel().Y() - m_aStatusLB.GetPosPixel().Y();
+ OUString sTask(SW_RES(ST_TASK));
+ OUString sStatus(SW_RES(ST_STATUS));
+ m_aStatusLB.SetHelpId(HID_MM_SENDMAILS_STATUSLB);
+
+ FreeResource();
+
+ m_aDetailsPB.SetClickHdl(LINK( this, SwSendMailDialog, DetailsHdl_Impl));
+ m_aStopPB.SetClickHdl(LINK( this, SwSendMailDialog, StopHdl_Impl));
+ m_aClosePB.SetClickHdl(LINK( this, SwSendMailDialog, CloseHdl_Impl));
+
+ Size aLBSize(m_aStatusLB.GetSizePixel());
+ m_aStatusHB.SetSizePixel(aLBSize);
+ Size aHeadSize(m_aStatusHB.CalcWindowSizePixel());
+ aHeadSize.Width() = aLBSize.Width();
+ m_aStatusHB.SetSizePixel(aHeadSize);
+ Point aLBPos(m_aStatusLB.GetPosPixel());
+ m_aStatusHB.SetPosPixel(aLBPos);
+ aLBPos.Y() += aHeadSize.Height();
+ aLBSize.Height() -= aHeadSize.Height();
+ m_aStatusLB.SetPosSizePixel(aLBPos, aLBSize);
+
+ Size aSz(m_aStatusHB.GetOutputSizePixel());
+ long nPos1 = aSz.Width()/3 * 2;
+ long nPos2 = aSz.Width()/3;
+ m_aStatusHB.InsertItem( ITEMID_TASK, sTask,
+ nPos1,
+ HIB_LEFT | HIB_VCENTER );
+ m_aStatusHB.InsertItem( ITEMID_STATUS, sStatus,
+ nPos2,
+ HIB_LEFT | HIB_VCENTER );
+ m_aStatusHB.SetHelpId(HID_MM_ADDRESSLIST_HB );
+ m_aStatusHB.Show();
+
+ m_aStatusLB.SetHelpId(HID_MM_MAILSTATUS_TLB);
+ static long nTabs[] = {3, 0, nPos1, aSz.Width() };
+ m_aStatusLB.SetStyle( m_aStatusLB.GetStyle() | WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP );
+ m_aStatusLB.SetSelectionMode( SINGLE_SELECTION );
+ m_aStatusLB.SetTabs(&nTabs[0], MAP_PIXEL);
+ m_aStatusLB.SetSpaceBetweenEntries(3);
+
+ DetailsHdl_Impl( &m_aDetailsPB );
+ UpdateTransferStatus();
+}
+
+SwSendMailDialog::~SwSendMailDialog()
+{
+ if(m_pImpl->xMailDispatcher.is())
+ {
+ try
+ {
+ if(m_pImpl->xMailDispatcher->isStarted())
+ m_pImpl->xMailDispatcher->stop();
+ if(m_pImpl->xConnectedMailService.is() && m_pImpl->xConnectedMailService->isConnected())
+ m_pImpl->xConnectedMailService->disconnect();
+ if(m_pImpl->xConnectedInMailService.is() && m_pImpl->xConnectedInMailService->isConnected())
+ m_pImpl->xConnectedInMailService->disconnect();
+
+ uno::Reference<mail::XMailMessage> xMessage =
+ m_pImpl->xMailDispatcher->dequeueMailMessage();
+ while(xMessage.is())
+ {
+ SwMailDispatcherListener_Impl::DeleteAttachments( xMessage );
+ xMessage = m_pImpl->xMailDispatcher->dequeueMailMessage();
+ }
+ }
+ catch (const uno::Exception&)
+ {
+ }
+ }
+ delete m_pImpl;
+}
+
+void SwSendMailDialog::AddDocument( SwMailDescriptor& rDesc )
+{
+ ::osl::MutexGuard aGuard(m_pImpl->aDescriptorMutex);
+ m_pImpl->aDescriptors.push_back(rDesc);
+ // if the dialog is already running then continue sending of documents
+ if(m_pImpl->xMailDispatcher.is())
+ {
+ IterateMails();
+ }
+
+}
+
+void SwSendMailDialog::SetDocumentCount( sal_Int32 nAllDocuments )
+{
+ m_pImpl->nDocumentCount = nAllDocuments;
+ UpdateTransferStatus();
+}
+
+static void lcl_Move(Control& rCtrl, long nYOffset)
+{
+ Point aPos(rCtrl.GetPosPixel());
+ aPos.Y() += nYOffset;
+ rCtrl.SetPosPixel(aPos);
+}
+
+IMPL_LINK_NOARG(SwSendMailDialog, DetailsHdl_Impl)
+{
+ long nMove = 0;
+ if(m_aStatusLB.IsVisible())
+ {
+ m_aStatusLB.Hide();
+ m_aStatusHB.Hide();
+ nMove = - m_nStatusHeight;
+ m_aDetailsPB.SetText(m_sMore);
+ }
+ else
+ {
+ m_aStatusLB.Show();
+ m_aStatusHB.Show();
+ nMove = m_nStatusHeight;
+ m_aDetailsPB.SetText(m_sLess);
+ }
+ lcl_Move(m_aSeparatorFL, nMove);
+ lcl_Move(m_aStopPB, nMove);
+ lcl_Move(m_aClosePB, nMove);
+ Size aDlgSize = GetSizePixel(); aDlgSize.Height() += nMove; SetSizePixel(aDlgSize);
+
+ return 0;
+}
+
+IMPL_LINK( SwSendMailDialog, StopHdl_Impl, PushButton*, pButton )
+{
+ m_bCancel = true;
+ if(m_pImpl->xMailDispatcher.is())
+ {
+ if(m_pImpl->xMailDispatcher->isStarted())
+ {
+ m_pImpl->xMailDispatcher->stop();
+ pButton->SetText(m_sContinue);
+ m_PausedFI.Show();
+ }
+ else
+ {
+ m_pImpl->xMailDispatcher->start();
+ pButton->SetText(m_sStop);
+ m_PausedFI.Show(false);
+ }
+ }
+ return 0;
+}
+
+IMPL_LINK_NOARG(SwSendMailDialog, CloseHdl_Impl)
+{
+ ModelessDialog::Show( false );
+ return 0;
+}
+
+IMPL_STATIC_LINK_NOINSTANCE( SwSendMailDialog, StartSendMails, SwSendMailDialog*, pDialog )
+{
+ pDialog->SendMails();
+ return 0;
+}
+
+IMPL_STATIC_LINK( SwSendMailDialog, RemoveThis, Timer*, pTimer )
+{
+ if( pThis->m_pImpl->xMailDispatcher.is() )
+ {
+ if(pThis->m_pImpl->xMailDispatcher->isStarted())
+ pThis->m_pImpl->xMailDispatcher->stop();
+ if(!pThis->m_pImpl->xMailDispatcher->isShutdownRequested())
+ pThis->m_pImpl->xMailDispatcher->shutdown();
+ }
+
+ if( pThis->m_bDesctructionEnabled &&
+ (!pThis->m_pImpl->xMailDispatcher.is() ||
+ !pThis->m_pImpl->xMailDispatcher->isRunning()))
+ {
+ delete pThis;
+ }
+ else
+ {
+ pTimer->Start();
+ }
+ return 0;
+}
+
+IMPL_STATIC_LINK_NOINSTANCE( SwSendMailDialog, StopSendMails, SwSendMailDialog*, pDialog )
+{
+ if(pDialog->m_pImpl->xMailDispatcher.is() &&
+ pDialog->m_pImpl->xMailDispatcher->isStarted())
+ {
+ pDialog->m_pImpl->xMailDispatcher->stop();
+ pDialog->m_aStopPB.SetText(pDialog->m_sContinue);
+ pDialog->m_PausedFI.Show();
+ }
+ return 0;
+}
+
+void SwSendMailDialog::SendMails()
+{
+ if(!m_pConfigItem)
+ {
+ OSL_FAIL("config item not set");
+ return;
+ }
+ EnterWait();
+ //get a mail server connection
+ uno::Reference< mail::XSmtpService > xSmtpServer =
+ SwMailMergeHelper::ConnectToSmtpServer( *m_pConfigItem,
+ m_pImpl->xConnectedInMailService,
+ aEmptyOUStr, aEmptyOUStr, this );
+ bool bIsLoggedIn = xSmtpServer.is() && xSmtpServer->isConnected();
+ LeaveWait();
+ if(!bIsLoggedIn)
+ {
+ OSL_FAIL("create error message");
+ return;
+ }
+ m_pImpl->xMailDispatcher.set( new MailDispatcher(xSmtpServer));
+ IterateMails();
+ m_pImpl->xMailListener = new SwMailDispatcherListener_Impl(*this);
+ m_pImpl->xMailDispatcher->addListener(m_pImpl->xMailListener);
+ if(!m_bCancel)
+ {
+ m_pImpl->xMailDispatcher->start();
+ }
+}
+
+void SwSendMailDialog::IterateMails()
+{
+ const SwMailDescriptor* pCurrentMailDescriptor = m_pImpl->GetNextDescriptor();
+ while( pCurrentMailDescriptor )
+ {
+ if(!SwMailMergeHelper::CheckMailAddress( pCurrentMailDescriptor->sEMail ))
+ {
+ Image aInsertImg = m_aImageList.GetImage( FN_FORMULA_CANCEL );
+
+ OUString sMessage = m_sSendingTo;
+ OUString sTmp(pCurrentMailDescriptor->sEMail);
+ sTmp += "\t";
+ sTmp += m_sFailed;
+ m_aStatusLB.InsertEntry( sMessage.replaceFirst("%1", sTmp), aInsertImg, aInsertImg);
+ ++m_nSendCount;
+ ++m_nErrorCount;
+ UpdateTransferStatus( );
+ pCurrentMailDescriptor = m_pImpl->GetNextDescriptor();
+ continue;
+ }
+ SwMailMessage* pMessage = new SwMailMessage;
+ uno::Reference< mail::XMailMessage > xMessage = pMessage;
+ if(m_pConfigItem->IsMailReplyTo())
+ pMessage->setReplyToAddress(m_pConfigItem->GetMailReplyTo());
+ pMessage->addRecipient( pCurrentMailDescriptor->sEMail );
+ pMessage->SetSenderName( m_pConfigItem->GetMailDisplayName() );
+ pMessage->SetSenderAddress( m_pConfigItem->GetMailAddress() );
+ if(!pCurrentMailDescriptor->sAttachmentURL.isEmpty())
+ {
+ mail::MailAttachment aAttach;
+ aAttach.Data =
+ new SwMailTransferable(
+ pCurrentMailDescriptor->sAttachmentURL,
+ pCurrentMailDescriptor->sAttachmentName,
+ pCurrentMailDescriptor->sMimeType );
+ aAttach.ReadableName = pCurrentMailDescriptor->sAttachmentName;
+ pMessage->addAttachment( aAttach );
+ }
+ pMessage->setSubject( pCurrentMailDescriptor->sSubject );
+ uno::Reference< datatransfer::XTransferable> xBody =
+ new SwMailTransferable(
+ pCurrentMailDescriptor->sBodyContent,
+ pCurrentMailDescriptor->sBodyMimeType);
+ pMessage->setBody( xBody );
+
+ //CC and BCC are tokenized by ';'
+ if(!pCurrentMailDescriptor->sCC.isEmpty())
+ {
+ OUString sTokens( pCurrentMailDescriptor->sCC );
+ sal_uInt16 nTokens = comphelper::string::getTokenCount(sTokens, ';');
+ sal_Int32 nPos = 0;
+ for( sal_uInt16 nToken = 0; nToken < nTokens; ++nToken)
+ {
+ OUString sTmp = sTokens.getToken( 0, ';', nPos);
+ if( !sTmp.isEmpty() )
+ pMessage->addCcRecipient( sTmp );
+ }
+ }
+ if(!pCurrentMailDescriptor->sBCC.isEmpty())
+ {
+ OUString sTokens( pCurrentMailDescriptor->sBCC );
+ sal_uInt16 nTokens = comphelper::string::getTokenCount(sTokens, ';');
+ sal_Int32 nPos = 0;
+ for( sal_uInt16 nToken = 0; nToken < nTokens; ++nToken)
+ {
+ OUString sTmp = sTokens.getToken( 0, ';', nPos);
+ if( !sTmp.isEmpty() )
+ pMessage->addBccRecipient( sTmp );
+ }
+ }
+ m_pImpl->xMailDispatcher->enqueueMailMessage( xMessage );
+ pCurrentMailDescriptor = m_pImpl->GetNextDescriptor();
+ }
+ UpdateTransferStatus();
+}
+
+void SwSendMailDialog::ShowDialog()
+{
+ Application::PostUserEvent( STATIC_LINK( this, SwSendMailDialog,
+ StartSendMails ), this );
+ ModelessDialog::Show();
+}
+
+void SwSendMailDialog::StateChanged( StateChangedType nStateChange )
+{
+ ModelessDialog::StateChanged( nStateChange );
+ if(STATE_CHANGE_VISIBLE == nStateChange && !IsVisible())
+ {
+ m_pImpl->aRemoveTimer.SetTimeoutHdl( STATIC_LINK( this, SwSendMailDialog,
+ RemoveThis ) );
+ m_pImpl->aRemoveTimer.Start();
+ }
+}
+
+void SwSendMailDialog::DocumentSent( uno::Reference< mail::XMailMessage> xMessage,
+ bool bResult,
+ const OUString* pError )
+{
+ //sending should stop on send errors
+ if(pError &&
+ m_pImpl->xMailDispatcher.is() && m_pImpl->xMailDispatcher->isStarted())
+ {
+ Application::PostUserEvent( STATIC_LINK( this, SwSendMailDialog,
+ StopSendMails ), this );
+ }
+ Image aInsertImg = m_aImageList.GetImage( bResult ? FN_FORMULA_APPLY : FN_FORMULA_CANCEL );
+
+ OUString sMessage = m_sSendingTo;
+ OUString sTmp(xMessage->getRecipients()[0]);
+ sTmp += "\t";
+ sTmp += bResult ? m_sCompleted : m_sFailed;
+ m_aStatusLB.InsertEntry( sMessage.replaceFirst("%1", sTmp), aInsertImg, aInsertImg);
+ ++m_nSendCount;
+ if(!bResult)
+ ++m_nErrorCount;
+
+ UpdateTransferStatus( );
+
+ if (pError)
+ {
+ SwSendWarningBox_Impl* pDlg = new SwSendWarningBox_Impl(0, *pError);
+ pDlg->Execute();
+ delete pDlg;
+ }
+}
+
+void SwSendMailDialog::UpdateTransferStatus()
+{
+ OUString sStatus( m_sTransferStatus );
+ sStatus = sStatus.replaceFirst("%1", OUString::number(m_nSendCount) );
+ sStatus = sStatus.replaceFirst("%2", OUString::number(m_pImpl->aDescriptors.size()));
+ m_aTransferStatusFT.SetText(sStatus);
+
+ sStatus = m_sErrorStatus.replaceFirst("%1", OUString::number(m_nErrorCount) );
+ m_aErrorStatusFT.SetText(sStatus);
+
+ if(m_pImpl->aDescriptors.size())
+ m_aProgressBar.SetValue((sal_uInt16)(m_nSendCount * 100 / m_pImpl->aDescriptors.size()));
+ else
+ m_aProgressBar.SetValue(0);
+}
+
+void SwSendMailDialog::AllMailsSent()
+{
+ m_aStopPB.Enable(false);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */