1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sw.hxx" 26 27 28 #include <sfx2/viewfrm.hxx> 29 #include <sfx2/dispatch.hxx> 30 31 #include <cmdid.h> 32 #include <swmodule.hxx> 33 #include <view.hxx> 34 #include <edtwin.hxx> 35 #include <vcl/svapp.hxx> 36 #include <mailmergechildwindow.hxx> 37 #include <mmoutputpage.hxx> 38 #include <mmconfigitem.hxx> 39 #include <comphelper/processfactory.hxx> 40 #include "com/sun/star/mail/XSmtpService.hpp" 41 #include "com/sun/star/mail/MailServiceType.hpp" 42 #include <rtl/ref.hxx> 43 #include <maildispatcher.hxx> 44 #include <imaildsplistener.hxx> 45 #include <swunohelper.hxx> 46 #include <svtools/svmedit.hxx> 47 #include <vcl/msgbox.hxx> 48 #include <vcl/image.hxx> 49 #include <mailmergechildwindow.hrc> 50 #include <dbui.hrc> 51 #include <helpid.h> 52 53 using namespace ::com::sun::star; 54 55 SFX_IMPL_FLOATINGWINDOW( SwMailMergeChildWindow, FN_MAILMERGE_CHILDWINDOW ) 56 //SFX_IMPL_FLOATINGWINDOW( SwSendMailChildWindow, FN_MAILMERGE_SENDMAIL_CHILDWINDOW ) 57 58 /*------------------------------------------------------------------------ 59 Beschreibung: 60 ------------------------------------------------------------------------*/ 61 62 SwMailMergeChildWindow::SwMailMergeChildWindow( Window* _pParent, 63 sal_uInt16 nId, 64 SfxBindings* pBindings, 65 SfxChildWinInfo* pInfo ) : 66 SfxChildWindow( _pParent, nId ) 67 { 68 pWindow = new SwMailMergeChildWin( pBindings, this, _pParent); 69 70 if (!pInfo->aSize.Width() || !pInfo->aSize.Height()) 71 { 72 SwView* pActiveView = ::GetActiveView(); 73 if(pActiveView) 74 { 75 const SwEditWin &rEditWin = pActiveView->GetEditWin(); 76 pWindow->SetPosPixel(rEditWin.OutputToScreenPixel(Point(0, 0))); 77 } 78 else 79 pWindow->SetPosPixel(_pParent->OutputToScreenPixel(Point(0, 0))); 80 pInfo->aPos = pWindow->GetPosPixel(); 81 pInfo->aSize = pWindow->GetSizePixel(); 82 } 83 84 ((SwMailMergeChildWin *)pWindow)->Initialize(pInfo); 85 pWindow->Show(); 86 } 87 88 /*------------------------------------------------------------------------ 89 Beschreibung: 90 ------------------------------------------------------------------------*/ 91 92 SwMailMergeChildWin::SwMailMergeChildWin( SfxBindings* _pBindings, 93 SfxChildWindow* pChild, 94 Window *pParent) : 95 SfxFloatingWindow(_pBindings, pChild, pParent, SW_RES(DLG_MAILMERGECHILD)), 96 m_aBackTB(this, SW_RES( TB_BACK )) 97 { 98 m_aBackTB.SetSelectHdl(LINK(this, SwMailMergeChildWin, BackHdl)); 99 sal_uInt16 nIResId = GetSettings().GetStyleSettings().GetHighContrastMode() ? 100 ILIST_TBX_HC : ILIST_TBX; 101 ResId aResId( nIResId, *pSwResMgr ); 102 ImageList aIList(aResId); 103 FreeResource(); 104 105 m_aBackTB.SetItemImage( 1, aIList.GetImage(FN_SHOW_ROOT) ); 106 m_aBackTB.SetButtonType( BUTTON_SYMBOLTEXT ); 107 Size aSz = m_aBackTB.CalcWindowSizePixel(1); 108 m_aBackTB.SetPosSizePixel( Point(), aSz ); 109 SetOutputSizePixel(aSz); 110 m_aBackTB.Show(); 111 } 112 113 /*------------------------------------------------------------------------ 114 Beschreibung: 115 ------------------------------------------------------------------------*/ 116 117 SwMailMergeChildWin::~SwMailMergeChildWin() 118 { 119 } 120 121 /*-------------------------------------------------------------------- 122 Beschreibung: 123 --------------------------------------------------------------------*/ 124 125 IMPL_LINK( SwMailMergeChildWin, BackHdl, ToolBox *, EMPTYARG ) 126 { 127 GetBindings().GetDispatcher()->Execute(FN_MAILMERGE_WIZARD, SFX_CALLMODE_ASYNCHRON); 128 return 0; 129 } 130 131 /*-- 26.05.2004 10:12:44--------------------------------------------------- 132 133 -----------------------------------------------------------------------*/ 134 void SwMailMergeChildWin::FillInfo(SfxChildWinInfo& rInfo) const 135 { 136 SfxFloatingWindow::FillInfo(rInfo); 137 rInfo.aWinState.Erase(); 138 rInfo.bVisible = sal_False; 139 } 140 /*-- 21.05.2004 14:07:37--------------------------------------------------- 141 142 -----------------------------------------------------------------------*/ 143 struct SwSendMailDialog_Impl 144 { 145 friend class SwSendMailDialog; 146 ::osl::Mutex aDescriptorMutex; 147 148 ::std::vector< SwMailDescriptor > aDescriptors; 149 sal_uInt32 nCurrentDescriptor; 150 sal_uInt32 nDocumentCount; 151 ::rtl::Reference< MailDispatcher > xMailDispatcher; 152 ::rtl::Reference< IMailDispatcherListener> xMailListener; 153 uno::Reference< mail::XMailService > xConnectedMailService; 154 uno::Reference< mail::XMailService > xConnectedInMailService; 155 Timer aRemoveTimer; 156 157 158 SwSendMailDialog_Impl() : 159 nCurrentDescriptor(0), 160 nDocumentCount(0) 161 { 162 aRemoveTimer.SetTimeout(500); 163 } 164 165 ~SwSendMailDialog_Impl() 166 { 167 // Shutdown must be called when the last reference to the 168 // mail dispatcher will be released in order to force a 169 // shutdown of the mail dispatcher thread. 170 // 'join' with the mail dispatcher thread leads to a 171 // deadlock (SolarMutex). 172 if( xMailDispatcher.is() && !xMailDispatcher->isShutdownRequested() ) 173 xMailDispatcher->shutdown(); 174 } 175 const SwMailDescriptor* GetNextDescriptor(); 176 }; 177 178 const SwMailDescriptor* SwSendMailDialog_Impl::GetNextDescriptor() 179 { 180 ::osl::MutexGuard aGuard(aDescriptorMutex); 181 if(nCurrentDescriptor < aDescriptors.size()) 182 { 183 ++nCurrentDescriptor; 184 return &aDescriptors[nCurrentDescriptor - 1]; 185 } 186 return 0; 187 } 188 189 /*-- 23.06.2004 10:19:55--------------------------------------------------- 190 191 -----------------------------------------------------------------------*/ 192 class SwMailDispatcherListener_Impl : public IMailDispatcherListener 193 { 194 SwSendMailDialog* m_pSendMailDialog; 195 196 public: 197 SwMailDispatcherListener_Impl(SwSendMailDialog& rParentDlg); 198 ~SwMailDispatcherListener_Impl(); 199 200 virtual void started(::rtl::Reference<MailDispatcher> xMailDispatcher); 201 virtual void stopped(::rtl::Reference<MailDispatcher> xMailDispatcher); 202 virtual void idle(::rtl::Reference<MailDispatcher> xMailDispatcher); 203 virtual void mailDelivered(::rtl::Reference<MailDispatcher> xMailDispatcher, 204 uno::Reference< mail::XMailMessage> xMailMessage); 205 virtual void mailDeliveryError(::rtl::Reference<MailDispatcher> xMailDispatcher, 206 uno::Reference< mail::XMailMessage> xMailMessage, const rtl::OUString& sErrorMessage); 207 208 static void DeleteAttachments( uno::Reference< mail::XMailMessage >& xMessage ); 209 }; 210 211 /*-- 23.06.2004 10:04:48--------------------------------------------------- 212 213 -----------------------------------------------------------------------*/ 214 SwMailDispatcherListener_Impl::SwMailDispatcherListener_Impl(SwSendMailDialog& rParentDlg) : 215 m_pSendMailDialog(&rParentDlg) 216 { 217 } 218 /*-- 23.06.2004 10:04:48--------------------------------------------------- 219 220 -----------------------------------------------------------------------*/ 221 SwMailDispatcherListener_Impl::~SwMailDispatcherListener_Impl() 222 { 223 } 224 /*-- 23.06.2004 10:04:49--------------------------------------------------- 225 226 -----------------------------------------------------------------------*/ 227 void SwMailDispatcherListener_Impl::started(::rtl::Reference<MailDispatcher> /*xMailDispatcher*/) 228 { 229 } 230 /*-- 23.06.2004 10:04:49--------------------------------------------------- 231 232 -----------------------------------------------------------------------*/ 233 void SwMailDispatcherListener_Impl::stopped( 234 ::rtl::Reference<MailDispatcher> /*xMailDispatcher*/) 235 { 236 } 237 /*-- 23.06.2004 10:04:49--------------------------------------------------- 238 239 -----------------------------------------------------------------------*/ 240 void SwMailDispatcherListener_Impl::idle(::rtl::Reference<MailDispatcher> /*xMailDispatcher*/) 241 { 242 vos::OGuard aGuard(Application::GetSolarMutex()); 243 m_pSendMailDialog->AllMailsSent(); 244 } 245 /*-- 23.06.2004 10:04:50--------------------------------------------------- 246 247 -----------------------------------------------------------------------*/ 248 void SwMailDispatcherListener_Impl::mailDelivered( 249 ::rtl::Reference<MailDispatcher> /*xMailDispatcher*/, 250 uno::Reference< mail::XMailMessage> xMailMessage) 251 { 252 vos::OGuard aGuard(Application::GetSolarMutex()); 253 m_pSendMailDialog->DocumentSent( xMailMessage, true, 0 ); 254 DeleteAttachments( xMailMessage ); 255 } 256 /*-- 23.06.2004 10:04:51--------------------------------------------------- 257 258 -----------------------------------------------------------------------*/ 259 void SwMailDispatcherListener_Impl::mailDeliveryError( 260 ::rtl::Reference<MailDispatcher> /*xMailDispatcher*/, 261 uno::Reference< mail::XMailMessage> xMailMessage, 262 const rtl::OUString& sErrorMessage) 263 { 264 vos::OGuard aGuard(Application::GetSolarMutex()); 265 m_pSendMailDialog->DocumentSent( xMailMessage, false, &sErrorMessage ); 266 DeleteAttachments( xMailMessage ); 267 } 268 /*-- 23.06.2004 12:30:39--------------------------------------------------- 269 270 -----------------------------------------------------------------------*/ 271 void SwMailDispatcherListener_Impl::DeleteAttachments( uno::Reference< mail::XMailMessage >& xMessage ) 272 { 273 uno::Sequence< mail::MailAttachment > aAttachments = xMessage->getAttachments(); 274 275 for(sal_Int32 nFile = 0; nFile < aAttachments.getLength(); ++nFile) 276 { 277 try 278 { 279 uno::Reference< beans::XPropertySet > xTransferableProperties( aAttachments[nFile].Data, uno::UNO_QUERY_THROW); 280 if( xTransferableProperties.is() ) 281 { 282 ::rtl::OUString sURL; 283 xTransferableProperties->getPropertyValue( ::rtl::OUString::createFromAscii("URL") ) >>= sURL; 284 if(sURL.getLength()) 285 SWUnoHelper::UCB_DeleteFile( sURL ); 286 } 287 } 288 catch( const uno::Exception& rEx ) 289 { 290 (void)rEx; 291 } 292 } 293 } 294 /*-- 07.07.2004 13:45:51--------------------------------------------------- 295 296 -----------------------------------------------------------------------*/ 297 class SwSendWarningBox_Impl : public ModalDialog 298 { 299 FixedImage aWarningImageIM; 300 FixedInfo aWarningFI; 301 FixedText aDetailFT; 302 MultiLineEdit aDetailED; 303 FixedLine aSeparatorFL; 304 OKButton aOKPB; 305 306 public: 307 SwSendWarningBox_Impl(Window* pParent, const String& rDetails); 308 ~SwSendWarningBox_Impl(); 309 }; 310 /*-- 07.07.2004 13:52:41--------------------------------------------------- 311 312 -----------------------------------------------------------------------*/ 313 SwSendWarningBox_Impl::SwSendWarningBox_Impl(Window* pParent, const String& rDetails) : 314 ModalDialog(pParent, SW_RES( DLG_MM_SENDWARNING )), 315 aWarningImageIM(this, SW_RES( IM_WARNING )), 316 aWarningFI( this, SW_RES( FI_WARNING )), 317 aDetailFT( this, SW_RES( FT_DETAILS )), 318 aDetailED( this, SW_RES( ED_DETAILS )), 319 aSeparatorFL( this, SW_RES( FL_SEPARATOR )), 320 aOKPB( this, SW_RES(PB_OK)) 321 { 322 FreeResource(); 323 aWarningImageIM.SetImage(WarningBox::GetStandardImage()); 324 aDetailED.SetText(rDetails); 325 } 326 /*-- 07.07.2004 13:52:41--------------------------------------------------- 327 328 -----------------------------------------------------------------------*/ 329 SwSendWarningBox_Impl::~SwSendWarningBox_Impl() 330 { 331 } 332 333 /*-- 21.05.2004 14:10:39--------------------------------------------------- 334 335 -----------------------------------------------------------------------*/ 336 #define ITEMID_TASK 1 337 #define ITEMID_STATUS 2 338 339 SwSendMailDialog::SwSendMailDialog(Window *pParent, SwMailMergeConfigItem& rConfigItem) : 340 ModelessDialog /*SfxModalDialog*/(pParent, SW_RES(DLG_MM_SENDMAILS)), 341 #ifdef MSC 342 #pragma warning (disable : 4355) 343 #endif 344 m_aStatusFL( this, SW_RES( FL_STATUS )), 345 m_aStatusFT( this, SW_RES( FT_STATUS1 )), 346 m_aTransferStatusFL( this, SW_RES( FL_TRANSFERSTATUS )), 347 m_aTransferStatusFT( this, SW_RES( FT_TRANSFERSTATUS )), 348 m_PausedFI(this, SW_RES( FI_PAUSED )), 349 m_aProgressBar( this, SW_RES( PB_PROGRESS )), 350 m_aErrorStatusFT( this, SW_RES( FT_ERRORSTATUS )), 351 m_aDetailsPB( this, SW_RES( PB_DETAILS )), 352 m_aStatusHB( this, WB_BUTTONSTYLE | WB_BOTTOMBORDER ), 353 m_aStatusLB( this, SW_RES( LB_STATUS )), 354 m_aSeparatorFL( this, SW_RES( FL_SEPARATOR )), 355 m_aStopPB( this, SW_RES( PB_STOP )), 356 m_aClosePB( this, SW_RES( PB_CLOSE )), 357 #ifdef MSC 358 #pragma warning (default : 4355) 359 #endif 360 m_sMore(m_aDetailsPB.GetText()), 361 m_sLess(SW_RES(ST_LESS)), 362 m_sContinue(SW_RES( ST_CONTINUE )), 363 m_sStop(m_aStopPB.GetText()), 364 m_sSend(SW_RES(ST_SEND)), 365 m_sTransferStatus(m_aTransferStatusFT.GetText()), 366 m_sErrorStatus( m_aErrorStatusFT.GetText()), 367 m_sSendingTo( SW_RES(ST_SENDINGTO )), 368 m_sCompleted( SW_RES(ST_COMPLETED )), 369 m_sFailed( SW_RES(ST_FAILED )), 370 m_sTerminateQuery( SW_RES( ST_TERMINATEQUERY )), 371 m_bCancel(false), 372 m_bDesctructionEnabled(false), 373 m_aImageList( SW_RES( ILIST ) ), 374 m_aImageListHC( SW_RES( ILIST_HC ) ), 375 m_pImpl(new SwSendMailDialog_Impl), 376 m_pConfigItem(&rConfigItem), 377 m_nSendCount(0), 378 m_nErrorCount(0) 379 { 380 m_nStatusHeight = m_aSeparatorFL.GetPosPixel().Y() - m_aStatusLB.GetPosPixel().Y(); 381 String sTask(SW_RES(ST_TASK)); 382 String sStatus(SW_RES(ST_STATUS)); 383 m_aStatusLB.SetHelpId(HID_MM_SENDMAILS_STATUSLB); 384 385 FreeResource(); 386 387 m_aDetailsPB.SetClickHdl(LINK( this, SwSendMailDialog, DetailsHdl_Impl)); 388 m_aStopPB.SetClickHdl(LINK( this, SwSendMailDialog, StopHdl_Impl)); 389 m_aClosePB.SetClickHdl(LINK( this, SwSendMailDialog, CloseHdl_Impl)); 390 391 392 Size aLBSize(m_aStatusLB.GetSizePixel()); 393 m_aStatusHB.SetSizePixel(aLBSize); 394 Size aHeadSize(m_aStatusHB.CalcWindowSizePixel()); 395 aHeadSize.Width() = aLBSize.Width(); 396 m_aStatusHB.SetSizePixel(aHeadSize); 397 Point aLBPos(m_aStatusLB.GetPosPixel()); 398 m_aStatusHB.SetPosPixel(aLBPos); 399 aLBPos.Y() += aHeadSize.Height(); 400 aLBSize.Height() -= aHeadSize.Height(); 401 m_aStatusLB.SetPosSizePixel(aLBPos, aLBSize); 402 403 Size aSz(m_aStatusHB.GetOutputSizePixel()); 404 long nPos1 = aSz.Width()/3 * 2; 405 long nPos2 = aSz.Width()/3; 406 m_aStatusHB.InsertItem( ITEMID_TASK, sTask, 407 nPos1, 408 HIB_LEFT | HIB_VCENTER ); 409 m_aStatusHB.InsertItem( ITEMID_STATUS, sStatus, 410 nPos2, 411 HIB_LEFT | HIB_VCENTER ); 412 m_aStatusHB.SetHelpId(HID_MM_ADDRESSLIST_HB ); 413 m_aStatusHB.Show(); 414 415 m_aStatusLB.SetHelpId(HID_MM_MAILSTATUS_TLB); 416 static long nTabs[] = {3, 0, nPos1, aSz.Width() }; 417 m_aStatusLB.SetStyle( m_aStatusLB.GetStyle() | WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP ); 418 m_aStatusLB.SetSelectionMode( SINGLE_SELECTION ); 419 m_aStatusLB.SetTabs(&nTabs[0], MAP_PIXEL); 420 m_aStatusLB.SetSpaceBetweenEntries(3); 421 422 DetailsHdl_Impl( &m_aDetailsPB ); 423 UpdateTransferStatus(); 424 } 425 /*-- 21.05.2004 14:10:39--------------------------------------------------- 426 427 -----------------------------------------------------------------------*/ 428 SwSendMailDialog::~SwSendMailDialog() 429 { 430 if(m_pImpl->xMailDispatcher.is()) 431 { 432 try 433 { 434 if(m_pImpl->xMailDispatcher->isStarted()) 435 m_pImpl->xMailDispatcher->stop(); 436 if(m_pImpl->xConnectedMailService.is() && m_pImpl->xConnectedMailService->isConnected()) 437 m_pImpl->xConnectedMailService->disconnect(); 438 if(m_pImpl->xConnectedInMailService.is() && m_pImpl->xConnectedInMailService->isConnected()) 439 m_pImpl->xConnectedInMailService->disconnect(); 440 441 uno::Reference<mail::XMailMessage> xMessage = 442 m_pImpl->xMailDispatcher->dequeueMailMessage(); 443 while(xMessage.is()) 444 { 445 SwMailDispatcherListener_Impl::DeleteAttachments( xMessage ); 446 xMessage = m_pImpl->xMailDispatcher->dequeueMailMessage(); 447 } 448 } 449 catch(const uno::Exception&) 450 { 451 } 452 } 453 delete m_pImpl; 454 } 455 /*-- 21.05.2004 14:10:40--------------------------------------------------- 456 457 -----------------------------------------------------------------------*/ 458 void SwSendMailDialog::AddDocument( SwMailDescriptor& rDesc ) 459 { 460 ::osl::MutexGuard aGuard(m_pImpl->aDescriptorMutex); 461 m_pImpl->aDescriptors.push_back(rDesc); 462 // if the dialog is already running then continue sending of documents 463 if(m_pImpl->xMailDispatcher.is()) 464 { 465 IterateMails(); 466 } 467 468 } 469 /*-- 31.01.2005 08:59:35--------------------------------------------------- 470 471 -----------------------------------------------------------------------*/ 472 void SwSendMailDialog::SetDocumentCount( sal_Int32 nAllDocuments ) 473 { 474 m_pImpl->nDocumentCount = nAllDocuments; 475 UpdateTransferStatus(); 476 } 477 /*-- 21.05.2004 14:10:40--------------------------------------------------- 478 479 -----------------------------------------------------------------------*/ 480 void lcl_Move(Control& rCtrl, long nYOffset) 481 { 482 Point aPos(rCtrl.GetPosPixel()); 483 aPos.Y() += nYOffset; 484 rCtrl.SetPosPixel(aPos); 485 } 486 /*-- 21.05.2004 14:10:40--------------------------------------------------- 487 488 -----------------------------------------------------------------------*/ 489 IMPL_LINK( SwSendMailDialog, DetailsHdl_Impl, PushButton*, EMPTYARG ) 490 { 491 long nMove = 0; 492 if(m_aStatusLB.IsVisible()) 493 { 494 m_aStatusLB.Hide(); 495 m_aStatusHB.Hide(); 496 nMove = - m_nStatusHeight; 497 m_aDetailsPB.SetText(m_sMore); 498 } 499 else 500 { 501 m_aStatusLB.Show(); 502 m_aStatusHB.Show(); 503 nMove = m_nStatusHeight; 504 m_aDetailsPB.SetText(m_sLess); 505 } 506 lcl_Move(m_aSeparatorFL, nMove); 507 lcl_Move(m_aStopPB, nMove); 508 lcl_Move(m_aClosePB, nMove); 509 Size aDlgSize = GetSizePixel(); aDlgSize.Height() += nMove; SetSizePixel(aDlgSize); 510 511 return 0; 512 } 513 /*-- 21.05.2004 14:10:40--------------------------------------------------- 514 515 -----------------------------------------------------------------------*/ 516 IMPL_LINK( SwSendMailDialog, StopHdl_Impl, PushButton*, pButton ) 517 { 518 m_bCancel = true; 519 if(m_pImpl->xMailDispatcher.is()) 520 { 521 if(m_pImpl->xMailDispatcher->isStarted()) 522 { 523 m_pImpl->xMailDispatcher->stop(); 524 pButton->SetText(m_sContinue); 525 m_PausedFI.Show(); 526 } 527 else 528 { 529 m_pImpl->xMailDispatcher->start(); 530 pButton->SetText(m_sStop); 531 m_PausedFI.Show(sal_False); 532 } 533 } 534 return 0; 535 } 536 /*-- 21.05.2004 14:10:40--------------------------------------------------- 537 538 -----------------------------------------------------------------------*/ 539 IMPL_LINK( SwSendMailDialog, CloseHdl_Impl, PushButton*, EMPTYARG ) 540 { 541 ModelessDialog::Show( sal_False ); 542 return 0; 543 } 544 /*-- 14.06.2004 09:48:30--------------------------------------------------- 545 546 -----------------------------------------------------------------------*/ 547 IMPL_STATIC_LINK_NOINSTANCE( SwSendMailDialog, StartSendMails, SwSendMailDialog*, pDialog ) 548 { 549 pDialog->SendMails(); 550 return 0; 551 } 552 /*-- 14.06.2004 09:48:30--------------------------------------------------- 553 554 -----------------------------------------------------------------------*/ 555 IMPL_STATIC_LINK( SwSendMailDialog, RemoveThis, Timer*, pTimer ) 556 { 557 if( pThis->m_pImpl->xMailDispatcher.is() ) 558 { 559 if(pThis->m_pImpl->xMailDispatcher->isStarted()) 560 pThis->m_pImpl->xMailDispatcher->stop(); 561 if(!pThis->m_pImpl->xMailDispatcher->isShutdownRequested()) 562 pThis->m_pImpl->xMailDispatcher->shutdown(); 563 } 564 565 if( pThis->m_bDesctructionEnabled && 566 (!pThis->m_pImpl->xMailDispatcher.is() || 567 !pThis->m_pImpl->xMailDispatcher->isRunning())) 568 { 569 delete pThis; 570 } 571 else 572 { 573 pTimer->Start(); 574 } 575 return 0; 576 } 577 /*-- 07.07.2004 14:34:05--------------------------------------------------- 578 579 -----------------------------------------------------------------------*/ 580 IMPL_STATIC_LINK_NOINSTANCE( SwSendMailDialog, StopSendMails, SwSendMailDialog*, pDialog ) 581 { 582 if(pDialog->m_pImpl->xMailDispatcher.is() && 583 pDialog->m_pImpl->xMailDispatcher->isStarted()) 584 { 585 pDialog->m_pImpl->xMailDispatcher->stop(); 586 pDialog->m_aStopPB.SetText(pDialog->m_sContinue); 587 pDialog->m_PausedFI.Show(); 588 } 589 return 0; 590 } 591 /*-- 14.06.2004 10:38:04--------------------------------------------------- 592 593 -----------------------------------------------------------------------*/ 594 void SwSendMailDialog::SendMails() 595 { 596 if(!m_pConfigItem) 597 { 598 DBG_ERROR("config item not set"); 599 return; 600 } 601 String sErrorMessage; 602 bool bIsLoggedIn = false; 603 EnterWait(); 604 //get a mail server connection 605 uno::Reference< mail::XSmtpService > xSmtpServer = 606 SwMailMergeHelper::ConnectToSmtpServer( *m_pConfigItem, 607 m_pImpl->xConnectedInMailService, 608 aEmptyStr, aEmptyStr, this ); 609 bIsLoggedIn = xSmtpServer.is() && xSmtpServer->isConnected(); 610 LeaveWait(); 611 if(!bIsLoggedIn) 612 { 613 DBG_ERROR("create error message"); 614 return; 615 } 616 m_pImpl->xMailDispatcher.set( new MailDispatcher(xSmtpServer)); 617 IterateMails(); 618 m_pImpl->xMailListener = new SwMailDispatcherListener_Impl(*this); 619 m_pImpl->xMailDispatcher->addListener(m_pImpl->xMailListener); 620 if(!m_bCancel) 621 { 622 m_pImpl->xMailDispatcher->start(); 623 } 624 } 625 /* -----------------28.01.2005 10:17----------------- 626 627 --------------------------------------------------*/ 628 void SwSendMailDialog::IterateMails() 629 { 630 const SwMailDescriptor* pCurrentMailDescriptor = m_pImpl->GetNextDescriptor(); 631 while( pCurrentMailDescriptor ) 632 { 633 if(!SwMailMergeHelper::CheckMailAddress( pCurrentMailDescriptor->sEMail )) 634 { 635 ImageList& rImgLst = GetSettings().GetStyleSettings().GetHighContrastMode() ? 636 m_aImageListHC : m_aImageList; 637 Image aInsertImg = rImgLst.GetImage( FN_FORMULA_CANCEL ); 638 639 String sMessage = m_sSendingTo; 640 String sTmp(pCurrentMailDescriptor->sEMail); 641 sTmp += '\t'; 642 sTmp += m_sFailed; 643 sMessage.SearchAndReplaceAscii("%1", sTmp); 644 m_aStatusLB.InsertEntry( sMessage, aInsertImg, aInsertImg); 645 ++m_nSendCount; 646 ++m_nErrorCount; 647 UpdateTransferStatus( ); 648 pCurrentMailDescriptor = m_pImpl->GetNextDescriptor(); 649 continue; 650 } 651 SwMailMessage* pMessage = 0; 652 uno::Reference< mail::XMailMessage > xMessage = pMessage = new SwMailMessage; 653 if(m_pConfigItem->IsMailReplyTo()) 654 pMessage->setReplyToAddress(m_pConfigItem->GetMailReplyTo()); 655 pMessage->addRecipient( pCurrentMailDescriptor->sEMail ); 656 pMessage->SetSenderName( m_pConfigItem->GetMailDisplayName() ); 657 pMessage->SetSenderAddress( m_pConfigItem->GetMailAddress() ); 658 if(pCurrentMailDescriptor->sAttachmentURL.getLength()) 659 { 660 mail::MailAttachment aAttach; 661 aAttach.Data = 662 new SwMailTransferable( 663 pCurrentMailDescriptor->sAttachmentURL, 664 pCurrentMailDescriptor->sAttachmentName, 665 pCurrentMailDescriptor->sMimeType ); 666 aAttach.ReadableName = pCurrentMailDescriptor->sAttachmentName; 667 pMessage->addAttachment( aAttach ); 668 } 669 pMessage->setSubject( pCurrentMailDescriptor->sSubject ); 670 uno::Reference< datatransfer::XTransferable> xBody = 671 new SwMailTransferable( 672 pCurrentMailDescriptor->sBodyContent, 673 pCurrentMailDescriptor->sBodyMimeType); 674 pMessage->setBody( xBody ); 675 676 //CC and BCC are tokenized by ';' 677 if(pCurrentMailDescriptor->sCC.getLength()) 678 { 679 String sTokens( pCurrentMailDescriptor->sCC ); 680 sal_uInt16 nTokens = sTokens.GetTokenCount( ';' ); 681 xub_StrLen nPos = 0; 682 for( sal_uInt16 nToken = 0; nToken < nTokens; ++nToken) 683 { 684 String sTmp = sTokens.GetToken( 0, ';', nPos); 685 if( sTmp.Len() ) 686 pMessage->addCcRecipient( sTmp ); 687 } 688 } 689 if(pCurrentMailDescriptor->sBCC.getLength()) 690 { 691 String sTokens( pCurrentMailDescriptor->sBCC ); 692 sal_uInt16 nTokens = sTokens.GetTokenCount( ';' ); 693 xub_StrLen nPos = 0; 694 for( sal_uInt16 nToken = 0; nToken < nTokens; ++nToken) 695 { 696 String sTmp = sTokens.GetToken( 0, ';', nPos); 697 if( sTmp.Len() ) 698 pMessage->addBccRecipient( sTmp ); 699 } 700 } 701 m_pImpl->xMailDispatcher->enqueueMailMessage( xMessage ); 702 pCurrentMailDescriptor = m_pImpl->GetNextDescriptor(); 703 } 704 UpdateTransferStatus(); 705 } 706 /*-- 27.08.2004 10:50:17--------------------------------------------------- 707 708 -----------------------------------------------------------------------*/ 709 void SwSendMailDialog::ShowDialog() 710 { 711 Application::PostUserEvent( STATIC_LINK( this, SwSendMailDialog, 712 StartSendMails ), this ); 713 ModelessDialog::Show(); 714 } 715 /*-- 27.08.2004 10:50:17--------------------------------------------------- 716 717 -----------------------------------------------------------------------*/ 718 void SwSendMailDialog::StateChanged( StateChangedType nStateChange ) 719 { 720 ModelessDialog::StateChanged( nStateChange ); 721 if(STATE_CHANGE_VISIBLE == nStateChange && !IsVisible()) 722 { 723 m_pImpl->aRemoveTimer.SetTimeoutHdl( STATIC_LINK( this, SwSendMailDialog, 724 RemoveThis ) ); 725 m_pImpl->aRemoveTimer.Start(); 726 } 727 } 728 729 /*-- 23.06.2004 10:14:22--------------------------------------------------- 730 731 -----------------------------------------------------------------------*/ 732 void SwSendMailDialog::DocumentSent( uno::Reference< mail::XMailMessage> xMessage, 733 bool bResult, 734 const ::rtl::OUString* pError ) 735 { 736 //sending should stop on send errors 737 if(pError && 738 m_pImpl->xMailDispatcher.is() && m_pImpl->xMailDispatcher->isStarted()) 739 { 740 Application::PostUserEvent( STATIC_LINK( this, SwSendMailDialog, 741 StopSendMails ), this ); 742 } 743 ImageList& rImgLst = GetSettings().GetStyleSettings().GetHighContrastMode() ? 744 m_aImageListHC : m_aImageList; 745 Image aInsertImg = rImgLst.GetImage( bResult ? FN_FORMULA_APPLY : FN_FORMULA_CANCEL ); 746 747 String sMessage = m_sSendingTo; 748 String sTmp(xMessage->getRecipients()[0]); 749 sTmp += '\t'; 750 sTmp += bResult ? m_sCompleted : m_sFailed; 751 sMessage.SearchAndReplaceAscii("%1", sTmp); 752 m_aStatusLB.InsertEntry( sMessage, aInsertImg, aInsertImg); 753 ++m_nSendCount; 754 if(!bResult) 755 ++m_nErrorCount; 756 757 UpdateTransferStatus( ); 758 if(pError) 759 { 760 SwSendWarningBox_Impl* pDlg = new SwSendWarningBox_Impl(0, *pError); 761 pDlg->Execute(); 762 delete pDlg; 763 } 764 } 765 /*-- 23.06.2004 11:25:31--------------------------------------------------- 766 767 -----------------------------------------------------------------------*/ 768 void SwSendMailDialog::UpdateTransferStatus() 769 { 770 String sStatus( m_sTransferStatus ); 771 sStatus.SearchAndReplaceAscii("%1", String::CreateFromInt32(m_nSendCount) ); 772 sStatus.SearchAndReplaceAscii("%2", String::CreateFromInt32(m_pImpl->nDocumentCount)); 773 m_aTransferStatusFT.SetText(sStatus); 774 775 sStatus = m_sErrorStatus; 776 sStatus.SearchAndReplaceAscii("%1", String::CreateFromInt32(m_nErrorCount) ); 777 m_aErrorStatusFT.SetText(sStatus); 778 779 if(m_pImpl->aDescriptors.size()) 780 m_aProgressBar.SetValue((sal_uInt16)(m_nSendCount * 100 / m_pImpl->aDescriptors.size())); 781 else 782 m_aProgressBar.SetValue(0); 783 } 784 /*-- 23.06.2004 11:18:50--------------------------------------------------- 785 786 -----------------------------------------------------------------------*/ 787 void SwSendMailDialog::AllMailsSent() 788 { 789 m_aStopPB.Enable(sal_False); 790 } 791 792 793