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
00041 #include <kurl.h>
00042
00043 #include <algorithm>
00044 using std::for_each;
00045 using std::remove;
00046 using std::find;
00047
00048 KMail::URLHandlerManager * KMail::URLHandlerManager::self = 0;
00049
00050 namespace {
00051 class ShowHtmlSwitchURLHandler : public KMail::URLHandler {
00052 public:
00053 ShowHtmlSwitchURLHandler() : KMail::URLHandler() {}
00054 ~ShowHtmlSwitchURLHandler() {}
00055
00056 bool handleClick( const KURL &, KMReaderWin * ) const;
00057 bool handleContextMenuRequest( const KURL &, const QPoint &, KMReaderWin * ) const {
00058 return false;
00059 }
00060 QString statusBarMessage( const KURL &, KMReaderWin * ) const;
00061 };
00062
00063 class SMimeURLHandler : public KMail::URLHandler {
00064 public:
00065 SMimeURLHandler() : KMail::URLHandler() {}
00066 ~SMimeURLHandler() {}
00067
00068 bool handleClick( const KURL &, KMReaderWin * ) const;
00069 bool handleContextMenuRequest( const KURL &, const QPoint &, KMReaderWin * ) const {
00070 return false;
00071 }
00072 QString statusBarMessage( const KURL &, KMReaderWin * ) const;
00073 };
00074
00075 class GroupwareURLHandler : public KMail::URLHandler {
00076 public:
00077 GroupwareURLHandler() : KMail::URLHandler() {}
00078 ~GroupwareURLHandler() {}
00079
00080 bool handleClick( const KURL &, KMReaderWin * ) const;
00081 bool handleContextMenuRequest( const KURL &, const QPoint &, KMReaderWin * ) const {
00082 return false;
00083 }
00084 QString statusBarMessage( const KURL &, KMReaderWin * ) const;
00085 };
00086
00087 class MailToURLHandler : public KMail::URLHandler {
00088 public:
00089 MailToURLHandler() : KMail::URLHandler() {}
00090 ~MailToURLHandler() {}
00091
00092 bool handleClick( const KURL &, KMReaderWin * ) const { return false; }
00093 bool handleContextMenuRequest( const KURL &, const QPoint &, KMReaderWin * ) const {
00094 return false;
00095 }
00096 QString statusBarMessage( const KURL &, KMReaderWin * ) const;
00097 };
00098
00099 class HtmlAnchorHandler : public KMail::URLHandler {
00100 public:
00101 HtmlAnchorHandler() : KMail::URLHandler() {}
00102 ~HtmlAnchorHandler() {}
00103
00104 bool handleClick( const KURL &, KMReaderWin * ) const;
00105 bool handleContextMenuRequest( const KURL &, const QPoint &, KMReaderWin * ) const {
00106 return false;
00107 }
00108 QString statusBarMessage( const KURL &, KMReaderWin * ) const { return QString::null; }
00109 };
00110
00111 class AttachmentURLHandler : public KMail::URLHandler {
00112 public:
00113 AttachmentURLHandler() : KMail::URLHandler() {}
00114 ~AttachmentURLHandler() {}
00115
00116 bool handleClick( const KURL &, KMReaderWin * ) const;
00117 bool handleContextMenuRequest( const KURL &, const QPoint &, KMReaderWin * ) const;
00118 QString statusBarMessage( const KURL &, KMReaderWin * ) const;
00119 };
00120
00121 class FallBackURLHandler : public KMail::URLHandler {
00122 public:
00123 FallBackURLHandler() : KMail::URLHandler() {}
00124 ~FallBackURLHandler() {}
00125
00126 bool handleClick( const KURL &, KMReaderWin * ) const;
00127 bool handleContextMenuRequest( const KURL &, const QPoint &, KMReaderWin * ) const;
00128 QString statusBarMessage( const KURL & url, KMReaderWin * ) const {
00129 return url.prettyURL();
00130 }
00131 };
00132
00133
00134 }
00135
00136 KMail::URLHandlerManager::URLHandlerManager() {
00137 registerHandler( new ShowHtmlSwitchURLHandler() );
00138 registerHandler( new SMimeURLHandler() );
00139 registerHandler( new GroupwareURLHandler() );
00140 registerHandler( new MailToURLHandler() );
00141 registerHandler( new HtmlAnchorHandler() );
00142 registerHandler( new AttachmentURLHandler() );
00143 registerHandler( new FallBackURLHandler() );
00144 }
00145
00146 namespace {
00147 template <typename T> struct Delete {
00148 void operator()( const T * x ) { delete x; x = 0; }
00149 };
00150 }
00151
00152 KMail::URLHandlerManager::~URLHandlerManager() {
00153 for_each( mHandlers.begin(), mHandlers.end(), Delete<URLHandler>() );
00154 }
00155
00156 void KMail::URLHandlerManager::registerHandler( const URLHandler * handler ) {
00157 if ( !handler )
00158 return;
00159 unregisterHandler( handler );
00160 mHandlers.push_back( handler );
00161 }
00162
00163 void KMail::URLHandlerManager::unregisterHandler( const URLHandler * handler ) {
00164
00165 mHandlers.erase( remove( mHandlers.begin(), mHandlers.end(), handler ), mHandlers.end() );
00166 }
00167
00168 bool KMail::URLHandlerManager::handleClick( const KURL & url, KMReaderWin * w ) const {
00169 for ( const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00170 if ( (*it)->handleClick( url, w ) )
00171 return true;
00172 return false;
00173 }
00174
00175 bool KMail::URLHandlerManager::handleContextMenuRequest( const KURL & url, const QPoint & p, KMReaderWin * w ) const {
00176 for ( const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it )
00177 if ( (*it)->handleContextMenuRequest( url, p, w ) )
00178 return true;
00179 return false;
00180 }
00181
00182 QString KMail::URLHandlerManager::statusBarMessage( const KURL & url, KMReaderWin * w ) const {
00183 for ( const_iterator it = mHandlers.begin() ; it != mHandlers.end() ; ++it ) {
00184 const QString msg = (*it)->statusBarMessage( url, w );
00185 if ( !msg.isEmpty() )
00186 return msg;
00187 }
00188 return QString::null;
00189 }
00190
00191
00192
00193 #include "kmgroupware.h"
00194 #include "kmmessage.h"
00195 #include "kmkernel.h"
00196 #include "kmreaderwin.h"
00197 #include "partNode.h"
00198 #include "kmmsgpart.h"
00199
00200 #include <klocale.h>
00201 #include <kprocess.h>
00202 #include <kmessagebox.h>
00203 #include <khtml_part.h>
00204
00205 #include <qstring.h>
00206
00207 namespace {
00208 bool ShowHtmlSwitchURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00209 if ( url.protocol() != "kmail" || url.path() != "showHTML" )
00210 return false;
00211 if ( w ) {
00212 w->setHtmlOverride( !w->htmlOverride() );
00213 w->update( true );
00214 }
00215 return true;
00216 }
00217
00218 QString ShowHtmlSwitchURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const {
00219 return url.url() == "kmail:showHTML"
00220 ? i18n("Turn on HTML rendering for this message.")
00221 : QString::null ;
00222 }
00223 }
00224
00225
00226 extern bool foundSMIMEData( const QString aUrl, QString & displayName,
00227 QString & libName, QString & keyId );
00228
00229 namespace {
00230 bool SMimeURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00231 if ( !url.hasRef() )
00232 return false;
00233 QString displayName, libName, keyId;
00234 if ( !foundSMIMEData( url.path() + '#' + url.ref(), displayName, libName, keyId ) )
00235 return false;
00236 KProcess cmp;
00237 cmp << "kgpgcertmanager" << displayName << libName << "-query" << keyId;
00238 if ( !cmp.start( KProcess::DontCare ) )
00239 KMessageBox::error( w, i18n("Could not start certificate manager. "
00240 "Please check your installation."),
00241 i18n("KMail Error") );
00242 return true;
00243 }
00244
00245 QString SMimeURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const {
00246 QString displayName, libName, keyId;
00247 if ( !foundSMIMEData( url.path() + '#' + url.ref(), displayName, libName, keyId ) )
00248 return QString::null;
00249 return i18n("Show certificate 0x%1").arg( keyId );
00250 }
00251 }
00252
00253 namespace {
00254 bool GroupwareURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00255 if ( !kmkernel->groupware().isEnabled() )
00256 return false;
00257 return !w || kmkernel->groupware().handleLink( url, w->message() );
00258 }
00259
00260 QString GroupwareURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const {
00261 QString type, action, action2, dummy;
00262 if ( !KMGroupware::foundGroupwareLink( url.url(), type, action, action2, dummy ) )
00263 return QString::null;
00264 QString result = type + ' ' + action;
00265 if ( !action2.isEmpty() )
00266 result += ' ' + action2;
00267 return i18n("Groupware: \"%1\"").arg( result );
00268 }
00269 }
00270
00271 namespace {
00272 bool HtmlAnchorHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00273 if ( url.hasHost() || url.path() != "/" || !url.hasRef() )
00274 return false;
00275 if ( w && !w->htmlPart()->gotoAnchor( url.ref() ) )
00276 static_cast<QScrollView*>( w->htmlPart()->widget() )->ensureVisible( 0, 0 );
00277 return true;
00278 }
00279 }
00280
00281 namespace {
00282 QString MailToURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const {
00283 if ( url.protocol() != "mailto" )
00284 return QString::null;
00285 return KMMessage::decodeMailtoUrl( url.url() );
00286 }
00287 }
00288
00289 namespace {
00290 bool AttachmentURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00291 if ( !w || !w->message() )
00292 return false;
00293 const int id = KMReaderWin::msgPartFromUrl( url );
00294 if ( id <= 0 )
00295 return false;
00296 w->openAttachment( id, url.path() );
00297 return true;
00298 }
00299
00300 bool AttachmentURLHandler::handleContextMenuRequest( const KURL & url, const QPoint & p, KMReaderWin * w ) const {
00301 if ( !w || !w->message() )
00302 return false;
00303 const int id = KMReaderWin::msgPartFromUrl( url );
00304 if ( id <= 0 )
00305 return false;
00306 w->showAttachmentPopup( id, url.path(), p );
00307 return true;
00308 }
00309
00310 QString AttachmentURLHandler::statusBarMessage( const KURL & url, KMReaderWin * w ) const {
00311 if ( !w || !w->message() )
00312 return QString::null;
00313 const partNode * node = w->partNodeFromUrl( url );
00314 if ( !node )
00315 return QString::null;
00316 const KMMessagePart & msgPart = node->msgPart();
00317 QString name = msgPart.fileName();
00318 if ( name.isEmpty() )
00319 name = msgPart.name();
00320 if ( !name.isEmpty() )
00321 return i18n( "Attachment: %1" ).arg( name );
00322 return i18n( "Attachment #%1 (unnamed)" ).arg( KMReaderWin::msgPartFromUrl( url ) );
00323 }
00324 }
00325
00326 namespace {
00327 bool FallBackURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const {
00328 if ( w )
00329 w->emitUrlClicked( url, Qt::LeftButton );
00330 return true;
00331 }
00332
00333 bool FallBackURLHandler::handleContextMenuRequest( const KURL & url, const QPoint & p, KMReaderWin * w ) const {
00334 if ( w )
00335 w->emitPopupMenu( url, p );
00336 return true;
00337 }
00338 }