diff options
Diffstat (limited to 'sw/source/uibase/dbui/dbmgr.cxx')
-rw-r--r-- | sw/source/uibase/dbui/dbmgr.cxx | 78 |
1 files changed, 66 insertions, 12 deletions
diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 6052e11b6c94..2d85ff75a1eb 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -136,6 +136,7 @@ #include <calc.hxx> #include <dbfld.hxx> #include <IDocumentState.hxx> +#include <imaildsplistener.hxx> #include <memory> #include <comphelper/propertysequence.hxx> @@ -300,10 +301,12 @@ void SwDataSourceRemovedListener::Dispose() struct SwDBManager_Impl { - SwDSParam* pMergeData; + SwDSParam *pMergeData; VclPtr<AbstractMailMergeDlg> pMergeDialog; ::rtl::Reference<SwConnectionDisposedListener_Impl> m_xDisposeListener; rtl::Reference<SwDataSourceRemovedListener> m_xDataSourceRemovedListener; + osl::Mutex m_aAllEmailSendMutex; + uno::Reference< mail::XMailMessage> m_xLastMessage; explicit SwDBManager_Impl(SwDBManager& rDBManager) :pMergeData(nullptr) @@ -1026,14 +1029,13 @@ static SfxObjectShell* lcl_CreateWorkingDocument( return xWorkObjectShell.get(); } -uno::Reference< mail::XMailMessage > lcl_CreateMailFromDoc( +static SwMailMessage* lcl_CreateMailFromDoc( const SwMergeDescriptor &rMergeDescriptor, const OUString &sFileURL, const OUString &sMailRecipient, const OUString &sMailBodyMimeType, rtl_TextEncoding sMailEncoding, const OUString &sAttachmentMimeType ) { SwMailMessage* pMessage = new SwMailMessage; - uno::Reference< mail::XMailMessage > xMessage = pMessage; if( rMergeDescriptor.pMailMergeConfigItem->IsMailReplyTo() ) pMessage->setReplyToAddress(rMergeDescriptor.pMailMergeConfigItem->GetMailReplyTo()); pMessage->addRecipient( sMailRecipient ); @@ -1056,7 +1058,7 @@ uno::Reference< mail::XMailMessage > lcl_CreateMailFromDoc( SvStream* pInStream = aMedium.GetInStream(); assert( pInStream && "no output file created?" ); if( !pInStream ) - return xMessage; + return pMessage; pInStream->SetStreamCharSet( sMailEncoding ); OString sLine; @@ -1076,10 +1078,39 @@ uno::Reference< mail::XMailMessage > lcl_CreateMailFromDoc( for( const OUString& sBccRecipient : rMergeDescriptor.aBlindCopiesTo ) pMessage->addBccRecipient( sBccRecipient ); - xMessage = pMessage; - return xMessage; + return pMessage; } +class SwDBManager::MailDispatcherListener_Impl : public IMailDispatcherListener +{ + SwDBManager &m_rDBManager; + +public: + explicit MailDispatcherListener_Impl( SwDBManager &rDBManager ) + : m_rDBManager( rDBManager ) {} + + virtual void started( ::rtl::Reference<MailDispatcher> ) override {}; + virtual void stopped( ::rtl::Reference<MailDispatcher> ) override {}; + virtual void idle( ::rtl::Reference<MailDispatcher> ) override {}; + + virtual void mailDelivered( ::rtl::Reference<MailDispatcher>, + uno::Reference< mail::XMailMessage> xMessage ) override + { + osl::MutexGuard aGuard( m_rDBManager.pImpl->m_aAllEmailSendMutex ); + if ( m_rDBManager.pImpl->m_xLastMessage == xMessage ) + m_rDBManager.pImpl->m_xLastMessage.clear(); + } + + virtual void mailDeliveryError( ::rtl::Reference<MailDispatcher> xMailDispatcher, + uno::Reference< mail::XMailMessage>, const OUString& ) override + { + osl::MutexGuard aGuard( m_rDBManager.pImpl->m_aAllEmailSendMutex ); + m_rDBManager.m_aMergeStatus = MergeStatus::ERROR; + m_rDBManager.pImpl->m_xLastMessage.clear(); + xMailDispatcher->stop(); + } +}; + /** * Please have a look at the README in the same directory, before you make * larger changes in this function! @@ -1126,7 +1157,8 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, nMaxDumpDocs = OUString(sMaxDumpDocs, strlen(sMaxDumpDocs), osl_getThreadTextEncoding()).toInt32(); } - ::rtl::Reference< MailDispatcher > xMailDispatcher; + ::rtl::Reference< MailDispatcher > xMailDispatcher; + ::rtl::Reference< IMailDispatcherListener > xMailListener; OUString sMailBodyMimeType; rtl_TextEncoding sMailEncoding = ::osl_getThreadTextEncoding(); @@ -1154,7 +1186,12 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, if( bMT_EMAIL ) { - xMailDispatcher.set( new MailDispatcher(rMergeDescriptor.xSmtpServer)); + // Reset internal mail accounting data + pImpl->m_xLastMessage.clear(); + + xMailDispatcher.set( new MailDispatcher(rMergeDescriptor.xSmtpServer) ); + xMailListener = new MailDispatcherListener_Impl( *this ); + xMailDispatcher->addListener( xMailListener ); if(!rMergeDescriptor.bSendAsAttachment && rMergeDescriptor.bSendAsHTML) { sMailBodyMimeType = "text/html; charset="; @@ -1491,6 +1528,8 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, sMailEncoding, pStoreToFilter->GetMimeType() ); if( xMessage.is() ) { + osl::MutexGuard aGuard( pImpl->m_aAllEmailSendMutex ); + pImpl->m_xLastMessage.set( xMessage ); xMailDispatcher->enqueueMailMessage( xMessage ); if( !xMailDispatcher->isStarted() ) xMailDispatcher->start(); @@ -1600,10 +1639,6 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, pProgressDlg.disposeAndClear(); - // remove the temporary files - for( const OUString &sFileURL : aFilesToRemove ) - SWUnoHelper::UCB_DeleteFile( sFileURL ); - // unlock all dispatchers pViewFrame = SfxViewFrame::GetFirst(pSourceDocSh); while (pViewFrame) @@ -1616,10 +1651,29 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, if( xMailDispatcher.is() ) { + if( IsMergeOk() ) + { + // TODO: Instead of polling via an AutoTimer, post an Idle event, + // if the main loop has been made thread-safe. + AutoTimer aEmailDispatcherPollTimer; + aEmailDispatcherPollTimer.SetDebugName( + "sw::SwDBManager aEmailDispatcherPollTimer" ); + aEmailDispatcherPollTimer.SetTimeout( 500 ); + aEmailDispatcherPollTimer.Start(); + while( IsMergeOk() && pImpl->m_xLastMessage.is() ) + Application::Yield(); + aEmailDispatcherPollTimer.Stop(); + } xMailDispatcher->stop(); xMailDispatcher->shutdown(); } + // remove the temporary files + // has to be done after xMailDispatcher is finished, as mails may be + // delivered as message attachments! + for( const OUString &sFileURL : aFilesToRemove ) + SWUnoHelper::UCB_DeleteFile( sFileURL ); + return !IsMergeError(); } |