00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifdef HAVE_CONFIG_H
00034 #include <config.h>
00035 #endif
00036
00037 #include "urlhandlermanager.h"
00038
00039 #include "interfaces/urlhandler.h"
00040 #include "interfaces/bodyparturlhandler.h"
00041 #include "partNode.h"
00042 #include "partnodebodypart.h"
00043 #include "kmreaderwin.h"
00044 #include "kmkernel.h"
00045 #include "callback.h"
00046 #include "stl_util.h"
00047
00048 #include <kstandarddirs.h>
00049 #include <kurldrag.h>
00050 #include <kimproxy.h>
00051 #include <kurl.h>
00052
00053 #include <algorithm>
00054 using std::for_each;
00055 using std::remove;
00056 using std::find;
00057
00058 KMail::URLHandlerManager * KMail::URLHandlerManager::self = 0;
00059
00060 namespace {
00061 class KMailProtocolURLHandler : public KMail::URLHandler {
00062 public:
00063 KMailProtocolURLHandler() : KMail::URLHandler() {}
00064 ~KMailProtocolURLHandler() {}
00065
00066 bool handleClick( const KURL &, KMReaderWin * ) const;
00067 bool handleContextMenuRequest( const KURL & url, const TQPoint &, KMReaderWin * ) const {
00068 return url.protocol() == "kmail";
00069 }
00070 TQString statusBarMessage( const KURL &, KMReaderWin * ) const;
00071 };
00072
00073 class ExpandCollapseQuoteURLManager : public KMail::URLHandler {
00074 public:
00075 ExpandCollapseQuoteURLManager() : KMail::URLHandler() {}
00076 ~ExpandCollapseQuoteURLManager() {}
00077
00078 bool handleClick( const KURL &, KMReaderWin * ) const;
00079 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const {
00080 return false;
00081 }
00082 TQString statusBarMessage( const KURL &, KMReaderWin * ) const;
00083
00084 };
00085
00086 class SMimeURLHandler : public KMail::URLHandler {
00087 public:
00088 SMimeURLHandler() : KMail::URLHandler() {}
00089 ~SMimeURLHandler() {}
00090
00091 bool handleClick( const KURL &, KMReaderWin * ) const;
00092 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const {
00093 return false;
00094 }
00095 TQString statusBarMessage( const KURL &, KMReaderWin * ) const;
00096 };
00097
00098 class MailToURLHandler : public KMail::URLHandler {
00099 public:
00100 MailToURLHandler() : KMail::URLHandler() {}
00101 ~MailToURLHandler() {}
00102
00103 bool handleClick( const KURL &, KMReaderWin * ) const { return false; }
00104 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const {
00105 return false;
00106 }
00107 TQString statusBarMessage( const KURL &, KMReaderWin * ) const;
00108 };
00109
00110 class HtmlAnchorHandler : public KMail::URLHandler {
00111 public:
00112 HtmlAnchorHandler() : KMail::URLHandler() {}
00113 ~HtmlAnchorHandler() {}
00114
00115 bool handleClick( const KURL &, KMReaderWin * ) const;
00116 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const {
00117 return false;
00118 }
00119 TQString statusBarMessage( const KURL &, KMReaderWin * ) const { return TQString(); }
00120 };
00121
00122 class AttachmentURLHandler : public KMail::URLHandler {
00123 public:
00124 AttachmentURLHandler() : KMail::URLHandler() {}
00125 ~AttachmentURLHandler() {}
00126
00127 bool handleClick( const KURL &, KMReaderWin * ) const;
00128 bool handleShiftClick( const KURL &url, KMReaderWin *window ) const;
00129 bool handleDrag( const KURL &url, const TQString& imagePath, KMReaderWin *window ) const;
00130 bool willHandleDrag( const KURL &url, const TQString& imagePath, KMReaderWin *window ) const;
00131 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const;
00132 TQString statusBarMessage( const KURL &, KMReaderWin * ) const;
00133 private:
00134 partNode* partNodeForUrl( const KURL &url, KMReaderWin *w ) const;
00135 bool attachmentIsInHeader( const KURL &url ) const;
00136 };
00137
00138 class ShowAuditLogURLHandler : public KMail::URLHandler {
00139 public:
00140 ShowAuditLogURLHandler() : KMail::URLHandler() {}
00141 ~ShowAuditLogURLHandler() {}
00142
00143 bool handleClick( const KURL &, KMReaderWin * ) const;
00144 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const;
00145 TQString statusBarMessage( const KURL &, KMReaderWin * ) const;
00146 };
00147
00148
00149
00150 class InternalImageURLHandler : public KMail::URLHandler {
00151 public:
00152 InternalImageURLHandler() : KMail::URLHandler()
00153 {}
00154 ~InternalImageURLHandler()
00155 {}
00156 bool handleDrag( const KURL &url, const TQString& imagePath, KMReaderWin *window ) const;
00157 bool willHandleDrag( const KURL &url, const TQString& imagePath, KMReaderWin *window ) const;
00158 bool handleClick( const KURL &, KMReaderWin * ) const
00159 { return false; }
00160 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const
00161 { return false; }
00162 TQString statusBarMessage( const KURL &, KMReaderWin * ) const
00163 { return TQString(); }
00164 };
00165
00166 class FallBackURLHandler : public KMail::URLHandler {
00167 public:
00168 FallBackURLHandler() : KMail::URLHandler() {}
00169 ~FallBackURLHandler() {}
00170
00171 bool handleClick( const KURL &, KMReaderWin * ) const;
00172 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const;
00173 TQString statusBarMessage( const KURL & url, KMReaderWin * ) const {
00174 return url.prettyURL();
00175 }
00176 };
00177
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187 class KMail::URLHandlerManager::BodyPartURLHandlerManager : public KMail::URLHandler {
00188 public:
00189 BodyPartURLHandlerManager() : KMail::URLHandler() {}
00190 ~BodyPartURLHandlerManager();
00191
00192 bool handleClick( const KURL &, KMReaderWin * ) const;
00193 bool handleContextMenuRequest( const KURL &, const TQPoint &, KMReaderWin * ) const;
00194 TQString statusBarMessage( const KURL &, KMReaderWin * ) const;
00195
00196 void registerHandler( const Interface::BodyPartURLHandler * handler );
00197 void unregisterHandler( const Interface::BodyPartURLHandler * handler );
00198
00199 private:
00200 typedef TQValueVector<const Interface::BodyPartURLHandler*> BodyPartHandlerList;
00201 BodyPartHandlerList mHandlers;
00202 };
00203
00204 KMail::URLHandlerManager::BodyPartURLHandlerManager::~BodyPartURLHandlerManager() {
00205 for_each( mHandlers.begin(), mHandlers.end(),
00206 DeleteAndSetToZero<Interface::BodyPartURLHandler>() );
00207 }
00208
00209 void KMail::URLHandlerManager::BodyPartURLHandlerManager::registerHandler( const Interface::BodyPartURLHandler * handler ) {
00210 if ( !handler )
00211 return;
00212 unregisterHandler( handler );
00213 mHandlers.push_back( handler );
00214 }
00215
00216 void KMail::URLHandlerManager::BodyPartURLHandlerManager::unregisterHandler( const Interface::BodyPartURLHandler * handler ) {
00217
00218 mHandlers.erase( remove( mHandlers.begin(), mHandlers.end(), handler ), mHandlers.end() );
00219 }
00220
00221 static partNode * partNodeFromXKMailUrl( const KURL & url, KMReaderWin * w, TQString * path ) {
00222 assert( path );
00223
00224 if ( !w || url.protocol() != "x-kmail" )
00225 return 0;
00226 const TQString urlPath = url.path();
00227
00228
00229
00230 kdDebug( 5006 ) << "BodyPartURLHandler: urlPath == \"" << urlPath << "\"" << endl;
00231 if ( !urlPath.startsWith( "/bodypart/" ) )
00232 return 0;
00233
00234 const TQStringList urlParts = TQStringList::split( '/', urlPath.mid( 10 ), true );
00235 if ( urlParts.size() != 3 )
00236 return 0;
00237 bool ok = false;
00238 const int part_id = urlParts[1].toInt( &ok );
00239 if ( !ok )
00240 return 0;
00241 *path = KURL::decode_string( urlParts[2] );
00242 return w->partNodeForId( part_id );
00243 }
00244
00245 bool KMail::URLHandlerManager::BodyPartURLHandlerManager::handleClick( const KURL & url, KMReaderWin * w ) const {
00246 TQString path;
00247 partNode * node = partNodeFromXKMailUrl( url, w, &path );
00248 if ( !node )
00249 return false;
00250 KMMessage *msg = w->message();
00251 if ( !msg ) return false;
00252 Callback callback( msg, w );
00253 KMail::PartNodeBodyPart part( *node, w->overrideCodec() );
00254 for ( BodyPartHandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00255 if ( (*it)->handleClick( &part, path, callback ) )
00256 return true;
00257 return false;
00258 }
00259
00260 bool KMail::URLHandlerManager::BodyPartURLHandlerManager::handleContextMenuRequest( const KURL & url, const TQPoint & p, KMReaderWin * w ) const {
00261 TQString path;
00262 partNode * node = partNodeFromXKMailUrl( url, w, &path );
00263 if ( !node )
00264 return false;
00265
00266 KMail::PartNodeBodyPart part( *node, w->overrideCodec() );
00267 for ( BodyPartHandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00268 if ( (*it)->handleContextMenuRequest( &part, path, p ) )
00269 return true;
00270 return false;
00271 }
00272
00273 TQString KMail::URLHandlerManager::BodyPartURLHandlerManager::statusBarMessage( const KURL & url, KMReaderWin * w ) const {
00274 TQString path;
00275 partNode * node = partNodeFromXKMailUrl( url, w, &path );
00276 if ( !node )
00277 return TQString();
00278
00279 KMail::PartNodeBodyPart part( *node, w->overrideCodec() );
00280 for ( BodyPartHandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it ) {
00281 const TQString msg = (*it)->statusBarMessage( &part, path );
00282 if ( !msg.isEmpty() )
00283 return msg;
00284 }
00285 return TQString();
00286 }
00287
00288
00289
00290
00291
00292
00293
00294 KMail::URLHandlerManager::URLHandlerManager() {
00295 registerHandler( new KMailProtocolURLHandler() );
00296 registerHandler( new ExpandCollapseQuoteURLManager() );
00297 registerHandler( new SMimeURLHandler() );
00298 registerHandler( new MailToURLHandler() );
00299 registerHandler( new HtmlAnchorHandler() );
00300 registerHandler( new AttachmentURLHandler() );
00301 registerHandler( mBodyPartURLHandlerManager = new BodyPartURLHandlerManager() );
00302 registerHandler( new ShowAuditLogURLHandler() );
00303 registerHandler( new InternalImageURLHandler );
00304 registerHandler( new FallBackURLHandler() );
00305 }
00306
00307 KMail::URLHandlerManager::~URLHandlerManager() {
00308 for_each( mHandlers.begin(), mHandlers.end(),
00309 DeleteAndSetToZero<URLHandler>() );
00310 }
00311
00312 void KMail::URLHandlerManager::registerHandler( const URLHandler * handler ) {
00313 if ( !handler )
00314 return;
00315 unregisterHandler( handler );
00316 mHandlers.push_back( handler );
00317 }
00318
00319 void KMail::URLHandlerManager::unregisterHandler( const URLHandler * handler ) {
00320
00321 mHandlers.erase( remove( mHandlers.begin(), mHandlers.end(), handler ), mHandlers.end() );
00322 }
00323
00324 void KMail::URLHandlerManager::registerHandler( const Interface::BodyPartURLHandler * handler ) {
00325 if ( mBodyPartURLHandlerManager )
00326 mBodyPartURLHandlerManager->registerHandler( handler );
00327 }
00328
00329 void KMail::URLHandlerManager::unregisterHandler( const Interface::BodyPartURLHandler * handler ) {
00330 if ( mBodyPartURLHandlerManager )
00331 mBodyPartURLHandlerManager->unregisterHandler( handler );
00332 }
00333
00334 bool KMail::URLHandlerManager::handleClick( const KURL & url, KMReaderWin * w ) const {
00335 for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00336 if ( (*it)->handleClick( url, w ) )
00337 return true;
00338 return false;
00339 }
00340
00341 bool KMail::URLHandlerManager::handleShiftClick( const KURL &url, KMReaderWin *window ) const
00342 {
00343 for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00344 if ( (*it)->handleShiftClick( url, window ) )
00345 return true;
00346 return false;
00347 }
00348
00349 bool KMail::URLHandlerManager::willHandleDrag( const KURL &url, const TQString& imagePath,
00350 KMReaderWin *window ) const
00351 {
00352 for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00353 if ( (*it)->willHandleDrag( url, imagePath, window ) )
00354 return true;
00355 return false;
00356 }
00357
00358 bool KMail::URLHandlerManager::handleDrag( const KURL &url, const TQString& imagePath,
00359 KMReaderWin *window ) const
00360 {
00361 for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00362 if ( (*it)->handleDrag( url, imagePath, window ) )
00363 return true;
00364 return false;
00365 }
00366
00367 bool KMail::URLHandlerManager::handleContextMenuRequest( const KURL & url, const TQPoint & p, KMReaderWin * w ) const {
00368 for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00369 if ( (*it)->handleContextMenuRequest( url, p, w ) )
00370 return true;
00371 return false;
00372 }
00373
00374 TQString KMail::URLHandlerManager::statusBarMessage( const KURL & url, KMReaderWin * w ) const {
00375 for ( HandlerList::const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it ) {
00376 const TQString msg = (*it)->statusBarMessage( url, w );
00377 if ( !msg.isEmpty() )
00378 return msg;
00379 }
00380 return TQString();
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392 #include "kmmessage.h"
00393 #include "kmreaderwin.h"
00394 #include "partNode.h"
00395 #include "kmmsgpart.h"
00396
00397 #include <ui/messagebox.h>
00398
00399 #include <klocale.h>
00400 #include <kprocess.h>
00401 #include <kmessagebox.h>
00402 #include <khtml_part.h>
00403
00404 #include <tqstring.h>
00405
00406 namespace {
00407 bool KMailProtocolURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00408 if ( url.protocol() == "kmail" ) {
00409 if ( !w )
00410 return false;
00411
00412 if ( url.path() == "showHTML" ) {
00413 w->setHtmlOverride( !w->htmlOverride() );
00414 w->update( true );
00415 return true;
00416 }
00417
00418 if ( url.path() == "loadExternal" ) {
00419 w->setHtmlLoadExtOverride( !w->htmlLoadExtOverride() );
00420 w->update( true );
00421 return true;
00422 }
00423
00424 if ( url.path() == "goOnline" ) {
00425 kmkernel->resumeNetworkJobs();
00426 return true;
00427 }
00428
00429 if ( url.path() == "decryptMessage" ) {
00430 w->setDecryptMessageOverwrite( true );
00431 w->update( true );
00432 return true;
00433 }
00434
00435 if ( url.path() == "showSignatureDetails" ) {
00436 w->setShowSignatureDetails( true );
00437 w->update( true );
00438 return true;
00439 }
00440
00441 if ( url.path() == "hideSignatureDetails" ) {
00442 w->setShowSignatureDetails( false );
00443 w->update( true );
00444 return true;
00445 }
00446
00447 if ( url.path() == "showAttachmentQuicklist" ) {
00448 w->saveRelativePosition();
00449 w->setShowAttachmentQuicklist( true );
00450 w->update( true );
00451 return true;
00452 }
00453
00454 if ( url.path() == "hideAttachmentQuicklist" ) {
00455 w->saveRelativePosition();
00456 w->setShowAttachmentQuicklist( false );
00457 w->update( true );
00458 return true;
00459 }
00460
00461 if ( url.path() == "showRawToltecMail" ) {
00462 w->saveRelativePosition();
00463 w->setShowRawToltecMail( true );
00464 w->update( true );
00465 return true;
00466 }
00467
00468
00469
00470
00471
00472
00473
00474 }
00475 return false;
00476 }
00477
00478 TQString KMailProtocolURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const {
00479 if ( url.protocol() == "kmail" )
00480 {
00481 if ( url.path() == "showHTML" )
00482 return i18n("Turn on HTML rendering for this message.");
00483 if ( url.path() == "loadExternal" )
00484 return i18n("Load external references from the Internet for this message.");
00485 if ( url.path() == "goOnline" )
00486 return i18n("Work online.");
00487 if ( url.path() == "decryptMessage" )
00488 return i18n("Decrypt message.");
00489 if ( url.path() == "showSignatureDetails" )
00490 return i18n("Show signature details.");
00491 if ( url.path() == "hideSignatureDetails" )
00492 return i18n("Hide signature details.");
00493 if ( url.path() == "hideAttachmentQuicklist" )
00494 return i18n( "Hide attachment list" );
00495 if ( url.path() == "showAttachmentQuicklist" )
00496 return i18n( "Show attachment list" );
00497 }
00498 return TQString() ;
00499 }
00500 }
00501
00502 namespace {
00503
00504 bool ExpandCollapseQuoteURLManager::handleClick(
00505 const KURL & url, KMReaderWin * w ) const
00506 {
00507
00508
00509 if ( url.protocol() == "kmail" && url.path()=="levelquote" )
00510 {
00511 TQString levelStr= url.query().mid( 1,url.query().length() );
00512 bool isNumber;
00513 int levelQuote= levelStr.toInt(&isNumber);
00514 if ( isNumber )
00515 w->slotLevelQuote( levelQuote );
00516 return true;
00517 }
00518 return false;
00519 }
00520 TQString ExpandCollapseQuoteURLManager::statusBarMessage(
00521 const KURL & url, KMReaderWin * ) const
00522 {
00523 if ( url.protocol() == "kmail" && url.path() == "levelquote" )
00524 {
00525 TQString query= url.query();
00526 if ( query.length()>=2 ) {
00527 if ( query[ 1 ] =='-' ) {
00528 return i18n("Expand all quoted text.");
00529 }
00530 else {
00531 return i18n("Collapse quoted text.");
00532 }
00533 }
00534 }
00535 return TQString() ;
00536 }
00537
00538 }
00539
00540
00541 extern bool foundSMIMEData( const TQString aUrl, TQString & displayName,
00542 TQString & libName, TQString & keyId );
00543
00544 namespace {
00545 bool SMimeURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00546 if ( !url.hasRef() )
00547 return false;
00548 TQString displayName, libName, keyId;
00549 if ( !foundSMIMEData( url.path() + '#' + url.ref(), displayName, libName, keyId ) )
00550 return false;
00551 KProcess cmp;
00552 cmp << "kleopatra" << "-query" << keyId;
00553 if ( !cmp.start( KProcess::DontCare ) )
00554 KMessageBox::error( w, i18n("Could not start certificate manager. "
00555 "Please check your installation."),
00556 i18n("KMail Error") );
00557 return true;
00558 }
00559
00560 TQString SMimeURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const {
00561 TQString displayName, libName, keyId;
00562 if ( !foundSMIMEData( url.path() + '#' + url.ref(), displayName, libName, keyId ) )
00563 return TQString();
00564 return i18n("Show certificate 0x%1").arg( keyId );
00565 }
00566 }
00567
00568 namespace {
00569 bool HtmlAnchorHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00570 if ( url.hasHost() || url.path() != "/" || !url.hasRef() )
00571 return false;
00572 if ( w && !w->htmlPart()->gotoAnchor( url.ref() ) )
00573 static_cast<TQScrollView*>( w->htmlPart()->widget() )->ensureVisible( 0, 0 );
00574 return true;
00575 }
00576 }
00577
00578 namespace {
00579 TQString MailToURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const {
00580 if ( url.protocol() != "mailto" )
00581 return TQString();
00582 return KMMessage::decodeMailtoUrl( url.url() );
00583 }
00584 }
00585
00586 namespace {
00587
00588 partNode* AttachmentURLHandler::partNodeForUrl( const KURL &url, KMReaderWin *w ) const
00589 {
00590 if ( !w || !w->message() )
00591 return 0;
00592 if ( url.protocol() != "attachment" )
00593 return 0;
00594
00595 bool ok;
00596 int nodeId = url.path().toInt( &ok );
00597 if ( !ok )
00598 return 0;
00599
00600 partNode * node = w->partNodeForId( nodeId );
00601 return node;
00602 }
00603
00604 bool AttachmentURLHandler::attachmentIsInHeader( const KURL &url ) const
00605 {
00606 bool inHeader = false;
00607 const TQString place = url.queryItem( "place" ).lower();
00608 if ( place != TQString() ) {
00609 inHeader = ( place == "header" );
00610 }
00611 return inHeader;
00612 }
00613
00614 bool AttachmentURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const
00615 {
00616 partNode * node = partNodeForUrl( url, w );
00617 if ( !node )
00618 return false;
00619
00620 const bool inHeader = attachmentIsInHeader( url );
00621 const bool shouldShowDialog = !node->isDisplayedEmbedded() || !inHeader;
00622 if ( inHeader )
00623 w->scrollToAttachment( node );
00624 if ( shouldShowDialog )
00625 w->openAttachment( node->nodeId(), w->tempFileUrlFromPartNode( node ).path() );
00626 return true;
00627 }
00628
00629 bool AttachmentURLHandler::handleShiftClick( const KURL &url, KMReaderWin *window ) const
00630 {
00631 partNode * node = partNodeForUrl( url, window );
00632 if ( !node )
00633 return false;
00634 if ( !window )
00635 return false;
00636 window->saveAttachment( window->tempFileUrlFromPartNode( node ) );
00637 return true;
00638 }
00639
00640 bool AttachmentURLHandler::willHandleDrag( const KURL &url, const TQString& imagePath,
00641 KMReaderWin *window ) const
00642 {
00643 Q_UNUSED( imagePath );
00644 return partNodeForUrl( url, window ) != 0;
00645 }
00646
00647 bool AttachmentURLHandler::handleDrag( const KURL &url, const TQString& imagePath,
00648 KMReaderWin *window ) const
00649 {
00650 Q_UNUSED( imagePath );
00651 const partNode * node = partNodeForUrl( url, window );
00652 if ( !node )
00653 return false;
00654
00655 KURL file = window->tempFileUrlFromPartNode( node ).path();
00656 if ( !file.isEmpty() ) {
00657 TQString icon = node->msgPart().iconName( KIcon::Small );
00658 KURLDrag* urlDrag = new KURLDrag( file, window );
00659 if ( !icon.isEmpty() ) {
00660 TQPixmap iconMap( icon );
00661 urlDrag->setPixmap( iconMap );
00662 }
00663 urlDrag->drag();
00664 return true;
00665 }
00666 else {
00667 return false;
00668 }
00669 }
00670
00671 bool AttachmentURLHandler::handleContextMenuRequest( const KURL & url, const TQPoint & p, KMReaderWin * w ) const
00672 {
00673 partNode * node = partNodeForUrl( url, w );
00674 if ( !node )
00675 return false;
00676
00677 w->showAttachmentPopup( node->nodeId(), w->tempFileUrlFromPartNode( node ).path(), p );
00678 return true;
00679 }
00680
00681 TQString AttachmentURLHandler::statusBarMessage( const KURL & url, KMReaderWin * w ) const
00682 {
00683 partNode * node = partNodeForUrl( url, w );
00684 if ( !node )
00685 return TQString();
00686
00687 const KMMessagePart & msgPart = node->msgPart();
00688 TQString name = msgPart.fileName();
00689 if ( name.isEmpty() )
00690 name = msgPart.name();
00691 if ( !name.isEmpty() )
00692 return i18n( "Attachment: %1" ).arg( name );
00693 return i18n( "Attachment #%1 (unnamed)" ).arg( KMReaderWin::msgPartFromUrl( url ) );
00694 }
00695 }
00696
00697 namespace {
00698 static TQString extractAuditLog( const KURL & url ) {
00699 if ( url.protocol() != "kmail" || url.path() != "showAuditLog" )
00700 return TQString();
00701 assert( !url.queryItem( "log" ).isEmpty() );
00702 return url.queryItem( "log" );
00703 }
00704
00705 bool ShowAuditLogURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00706 const TQString auditLog = extractAuditLog( url );
00707 if ( auditLog.isEmpty() )
00708 return false;
00709 Kleo::MessageBox::auditLog( w, auditLog );
00710 return true;
00711 }
00712
00713 bool ShowAuditLogURLHandler::handleContextMenuRequest( const KURL & url, const TQPoint &, KMReaderWin * w ) const
00714 {
00715 Q_UNUSED( w );
00716
00717 return !extractAuditLog( url ).isEmpty();
00718 }
00719
00720 TQString ShowAuditLogURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const {
00721 if ( extractAuditLog( url ).isEmpty() )
00722 return TQString();
00723 else
00724 return i18n("Show GnuPG Audit Log for this operation");
00725 }
00726 }
00727
00728 namespace {
00729 bool InternalImageURLHandler::handleDrag( const KURL &url, const TQString& imagePath,
00730 KMReaderWin *window ) const
00731 {
00732 Q_UNUSED( window );
00733 Q_UNUSED( url );
00734 const TQString kmailImagePath = locate( "data", "kmail/pics/" );
00735 if ( imagePath.contains( kmailImagePath ) ) {
00736
00737 return true;
00738 }
00739 return false;
00740 }
00741
00742 bool InternalImageURLHandler::willHandleDrag( const KURL &url, const TQString& imagePath,
00743 KMReaderWin *window ) const
00744 {
00745 Q_UNUSED( window );
00746 Q_UNUSED( url );
00747 const TQString kmailImagePath = locate( "data", "kmail/pics/" );
00748 return imagePath.contains( kmailImagePath );
00749 }
00750 }
00751
00752 namespace {
00753 bool FallBackURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00754 if ( w )
00755 w->emitUrlClicked( url, Qt::LeftButton );
00756 return true;
00757 }
00758
00759 bool FallBackURLHandler::handleContextMenuRequest( const KURL & url, const TQPoint & p, KMReaderWin * w ) const {
00760 if ( w )
00761 w->emitPopupMenu( url, p );
00762 return true;
00763 }
00764 }