From kfm-devel Sun Feb 28 19:33:00 1999 From: Dawit Alemayehu Date: Sun, 28 Feb 1999 19:33:00 +0000 To: kfm-devel Subject: Short URL support for KFM & Quick Mini Command Box X-MARC-Message: https://marc.info/?l=kfm-devel&m=92386536625733 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--Boundary-=_nWlrBbmQBhCDarzOwKkYHIDdqSCD" --Boundary-=_nWlrBbmQBhCDarzOwKkYHIDdqSCD Content-Type: text/plain Content-Transfer-Encoding: 8bit Hello, I have attached a patch that adds "short URL" support to KFM and minicli. With this enhancement the follwoing things are supported in kfm as well as the minicli ( CTRL-F2 ) command box: 1.) Ability to type in short url's such as "slashdot.org" etc 2.) Ability to use the short cut to your home directory, for example entering ~/.bashrc would open the file with the default app ( in most people's case kedit ) Please test it and send feedback for improvement, fixes, flames or otherwise. Thanks, Dawit A. --Boundary-=_nWlrBbmQBhCDarzOwKkYHIDdqSCD Content-Type: text/x-c++; name="kfm-patch-990228.diff" Content-Transfer-Encoding: 8bit Content-Description: patch Content-Disposition: attachment; filename="kfm-patch-990228.diff" --- /mnt/ext2/usr/local/src/kdebase/kfm/kfmgui.cpp Sat Feb 27 14:32:02 1999 +++ kdebase/kfm/kfmgui.cpp Sun Feb 28 13:23:48 1999 @@ -738,27 +749,48 @@ { QString tmp( QDir::homeDirPath().data() ); tmp += toolbarURL->getLinedText( TOOLBAR_URL_ID ) + 1; - KURL u( tmp ); - url = u.url().data(); + url = tmp.prepend("file:/").data(); } - // Does url begin with www? (sven) + //Valid URL? + // Do nothing if URL, for our purposes here, is VALID. (Dawit A.) + else if ( url.find("://") >= 0 || url.find("file:/") == 0 || + url.find ("news:") == 0 || url.find ("mailto:") == 0 ) ; + /* + // No protocol. Does url begin with www? (sven) else if (url.find("www") == 0) - url.prepend("http://"); + url.prepend("http://"); // Unecessary since we bind "http://" as default protocol. + */ - // Does url begin with "ftp."? (sven) + // No protocol. Does url begin with "ftp."? (sven) else if (url.find("ftp.") == 0) url.prepend("ftp://"); + /* + When all else fails, check if the entered file/dir exists on current + directory the local host. If it does not attach "http://" as a default + protocol. This allows users to type short URL addresses without the + protocol portion being explicitly specified, Ex. slashdot.org. (Dawit A) + */ + else + { + KURL path ( getURL() ); + QDir::setCurrent ( path.directory () ); + QFileInfo f ( QDir::currentDirPath().append( "/" ).append( url ).data() ); + debug ( f.filePath() ); + if ( f.exists() ) + url = f.filePath(); + else + url = url.prepend ("http://"); + } + KURL u( url.data() ); if ( u.isMalformed() ) { QString tmp; tmp << klocale->translate("Malformed URL\n") << toolbarURL->getLinedText( TOOLBAR_URL_ID ); - QMessageBox::critical( (QWidget*)0L, klocale->translate( "KFM Error" ), - tmp ); + QMessageBox::critical( (QWidget*)0L, klocale->translate( "KFM Error" ), tmp ); return; } - view->openURL( url.data() ); // update tree view Sep 5 rjakob if (url.left(5)=="file:") --- /mnt/ext2/usr/local/src/kdebase/kwm/minicli.C Sun Feb 28 12:44:36 1999 +++ kdebase/kwm/minicli.C Sun Feb 28 13:48:16 1999 @@ -2,6 +2,7 @@ // Copyright (C) 1997 Matthias Ettrich #include +#include #include #include #include @@ -27,19 +28,64 @@ QList *history = 0; QListIterator *it; +/* + Function determines whether what the user entered in the minicli + box is executable or not. This code is eniterly based on the C + version of the 'which' command in csh/bash. (Dawit A.) +*/ + +bool isCmdExecuteable ( const char *name ) +{ + QString test; + char *path = getenv( "PATH" ); + char *pc = path; + bool found = false; + + while ( *pc != '\0' && found == false ) + { + int len = 0; + while ( *pc != ':' && *pc != '\0' ) + { + len++; + pc++; + } + char save = *pc; + *pc = '\0'; + test.sprintf( "%s/%s", pc-len, name); + *pc = save; + if (*pc) { pc++; } + found = ( access(test.data(), 01) == 0 ); /* is it executable ? */ + } + if (found) debug ("%s : %s", test.data(), "is executeable" ); + else debug ("%s : %s", test.data(), "is not executeable" ); + return (found) ? true : false; +} +/* + Check for the existance of a local file/directory. + This function does not determine if a command can + be executed or not. (Dawit A.) +*/ +bool isLocalResource ( const char * res ) +{ + struct stat buff; + return ( stat( res, &buff ) == 0 && ( S_ISREG( buff.st_mode ) || + S_ISDIR( buff.st_mode ) ) ) ? true :false; +} + void execute( const char* cmd){ QString tmp; // Torben // WWW Adress ? - if ( strncmp( cmd, "www.", 4 ) == 0 ) { - tmp = "kfmclient openURL http://"; +/* if ( strncmp( cmd, "www.", 4 ) == 0 ) { + tmp = "kfmclient exec http://"; tmp += cmd; cmd = tmp.data(); - } + } Not necessary since we bind "http://" by default (Dawit A.) */ + // FTP Adress ? - else if ( strncmp( cmd, "ftp.", 4 ) == 0 ) { - tmp = "kfmclient openURL ftp://"; + if ( strncmp( cmd, "ftp.", 4 ) == 0 ) { + tmp = "kfmclient exec ftp://"; tmp += cmd; cmd = tmp.data(); } @@ -60,30 +106,45 @@ // Looks like an URL ? else if ( strstr( cmd, "://" ) != 0L ) { - tmp = "kfmclient openURL "; + tmp = "kfmclient exec "; tmp += cmd; cmd = tmp.data(); } // Usual file or directory else { - struct stat buff; const char *p = cmd; if ( strncmp( p, "file:", 5 ) == 0 ) - p = p + 5; - + p += 5; + // Home directory? + if ( *p == '~' ) + { + tmp = QDir::homeDirPath(); + tmp += (p + 1); // get rid off "~" + if ( isLocalResource ( tmp.data() ) ) + cmd = tmp.prepend( "kfmclient exec file:" ).data(); + } // An absolute path ? - if ( ( *p == '/') && - // Just a document ? - ( stat( p, &buff ) == 0 && ( S_ISREG( buff.st_mode ) || S_ISDIR( buff.st_mode ) ) ) ) + else if ( ( *p == '/') && isLocalResource ( p ) ) { // Tell KFM to open the document - tmp = "kfmclient openURL "; + tmp = "kfmclient exec "; + tmp += cmd; + cmd = tmp.data(); + } + /* Does not begin with '/' or '.', contains no spaces, + does not have a protocol specified and is not locally + executable. (Dawit A.) */ + else if ( (*p != '/') && (*p != '.') && strchr ( p, ' ') == 0L && + strstr ( cmd, ":/" ) == 0L && !isCmdExecuteable ( p ) ) + { + // Tell KFM to open the document by attaching + // "http://" as default protocol (Dawit A.) + tmp = "kfmclient exec http://"; tmp += cmd; cmd = tmp.data(); } } - KShellProcess proc; proc << cmd; proc.start(KShellProcess::DontCare); --- /mnt/ext2/usr/local/src/kdebase/kwm/minicli.h Sun Feb 28 12:47:45 1999 +++ kdebase/kwm/minicli.h Fri Feb 26 18:55:18 1999 @@ -3,12 +3,17 @@ // // Torben added command completion // 09.11.97 +// +// Dawit added short URL support +// 02.26.99 #include #include #include -void execute(const char* cmd); +void execute( const char* ); +bool isCmdExecuteable ( const char* ); +bool isLocalResource ( const char* ); class Minicli : public QFrame{ Q_OBJECT --Boundary-=_nWlrBbmQBhCDarzOwKkYHIDdqSCD--